Maison > interface Web > js tutoriel > le corps du texte

Créez une navigation redimensionnable avec Stimulus

DDD
Libérer: 2024-09-13 06:17:10
original
910 Les gens l'ont consulté

Cet article a été initialement publié sur Rails Designer : bibliothèque de composants d'interface utilisateur pour l'application Rails, construite avec ViewComponent, conçue avec Tailwind CSS et améliorée avec Hotwire.


Si votre application dispose d'une barre de navigation latérale, ce qui est assez courant, la plupart des écrans étant suffisamment larges pour être pris en charge de nos jours, la rendre redimensionnable pourrait être une fonctionnalité intéressante à ajouter. Donner cette personnalisation permet à vos utilisateurs de modifier l’écran en fonction de la tâche à accomplir. Peut-être qu'ils veulent se concentrer sur l'écriture de leur prochain gros morceau ou peut-être qu'ils divisent leur écran, ce qui rend la largeur par défaut un peu trop large.

Create a Resizable Navigation with Stimulus

Quelle que soit la raison, redimensionner la barre de navigation latérale (ou tout autre composant) est facile avec JavaScript et donc avec Stimulus. Allons droit au but. Définissons les bases en HTML :

<main data-controller="resizer" class="flex">
  <nav data-resizer-target="container" class="relative w-1/6">
    <!-- Imagine some nav items here -->
  </nav>

  <div class="w-5/6">
    <p>Content for your app here</p>
  </div>
</main>
Copier après la connexion

Ci-dessus, HTML utilise les classes CSS Tailwind, mais ce n'est pas obligatoire pour cet exemple. Vous pouvez bien sûr le styliser comme bon vous semble.

Maintenant le contrôleur de stimulus. Comme vous l'avez remarqué ci-dessus, le handler (l'élément qui peut être glissé pour redimensionner) n'est pas ajouté dans le HTML, il sera plutôt injecté avec JS.

import { Controller } from "@hotwired/stimulus"

// Connects to data-controller="resizer"
export default class extends Controller {
  static targets = ["container"];
  static values = {
    resizing: { type: Boolean, default: false },
    maxWidth: { type: Number, default: 360 } // in px
  };

  connect() {
    this.containerTarget.insertAdjacentHTML("beforeend", this.#handler);
  }

  // private

  get #handler() {
    return `
      <span
        data-action="mousedown->resizer#setup"
        class="absolute top-0 w-1 h-full bg-gray-200 -right-px cursor-col-resize hover:bg-gray-300"
      ></span>
    `
  }
}
Copier après la connexion

Cela injectera le handler à côté de l'élément de navigation (position absolue). Il a également une action pour déclencher setup() lors de l'événement mousedown. Ajoutons-le.

export default class extends Controller {
  // …
  connect() {
    this.containerTarget.insertAdjacentHTML("beforeend", this.#handler);

    this.resize = this.#resize.bind(this);
    this.stop = this.#stop.bind(this);
  }

  setup() {
      this.resizingValue = true;

      document.addEventListener('mousemove', this.resize);
      document.addEventListener('mouseup', this.stop);
  }
  // …
}
Copier après la connexion

Que se passe-t-il ici ? Pourquoi ne pas ajouter les #resize() et #stop() respectivement sur les événements mousemove et mouseup. Cela permet de garantir que cela fait référence à l'instance du contrôleur lorsque resize et stop sont appelés en tant qu'écouteurs d'événements, préservant ainsi l'accès aux propriétés et méthodes du contrôleur.

Ajoutons les fonctions privées #resize() et #stop().

export default class extends Controller {
  // …

  // private

  #resize(event) {
    if (!this.resizingValue) return;

    const width = event.clientX - this.containerTarget.offsetLeft;

    if (width <= this.maxWidthValue) {
      this.containerTarget.style.width = `${width}px`;
    } else {
      this.containerTarget.style.width = `${this.maxWidthValue}px`;
    }
  }

  #stop() {
    this.resizingValue = false;

    document.removeEventListener('mousemove', this.resize);
    document.removeEventListener('mouseup', this.stop);
  }

  // …
}
Copier après la connexion

La fonction #resize() calcule la nouvelle largeur du conteneur en fonction de la position de la souris (event.clientX) et met à jour la largeur du conteneur, en s'assurant qu'elle ne dépasse pas la largeur maximale autorisée (définie dans les valeurs). La fonction #stop() arrête le processus de redimensionnement en définissant resizingValue sur false et en supprimant les écouteurs d'événements.

Si vous accédez à votre navigateur, vous pouvez désormais redimensionner le navigateur et ne pas le rendre plus large que la valeur définie comme maxWidth (360 px par défaut).

Génial ! ? C'est tout ce dont vous avez besoin pour redimensionner un élément de votre application à l'aide de Stimulus. À partir de là, vous pouvez améliorer en stockant la valeur dans les paramètres de l'utilisateur (par exemple via Redis) pour qu'elle soit la même dans tous les navigateurs ou en la stockant dans LocalStorage du navigateur pour la stocker pour cette session (Rails Designer vous aide en fournissant des utilitaires JS pour cela).

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!