Element Plus implementiert Affix

Element Plus implementiert Affix

1. Komponenteneinführung

Affixierungskomponenten werden verwendet, um Seitenelemente in einem bestimmten visuellen Bereich zu fixieren.

1.1 Eigenschaften

  • position: Gibt die Position des Pins an, die auf oben oder unten eingestellt werden kann. Die Standardeinstellung ist oben
  • Offset: Legen Sie den Offset-Abstand fest, der Standardwert ist 0
  • Ziel: Gibt den Container (CSS-Selektor) an, um die Stecknadel immer im Container zu behalten. Wenn sie den Bereich überschreitet, wird sie ausgeblendet. Der Standardcontainer ist document.documentElement.
  • z-index: Die Ebene des Pins, Standard ist 100

1.2 Veranstaltungen

  • scrollen: Löst das Ereignis aus, wenn der Container scrollt. Die Parameter sind: der ScrollTop-Wert und der Status des festen Pins (ob er fixiert ist).
  • ändern: Wird ausgelöst, wenn sich der Zustand des festen Pins ändert. Der Parameter ist, ob sich der feste Pin derzeit im festen Zustand befindet

2. Quellcode-Analyse

2.1 Vorlage

<Vorlage>
  <div ref="root" Klasse="el-affix" :style="rootStyle">
    <div :class="{'el-affix--fixed': state.fixed}" :style="affixStyle">
      <Steckplatz></Steckplatz>
    </div>
  </div>
</Vorlage>

Der Vorlagenteil ist sehr einfach und empfängt Inhalte über den Slot

2.2 Skript

// Bei einigen Kerncodes wird die Codereihenfolge angepasst setup(props, { emit }) {
    // Zielcontainer-Referenz
    const Ziel = ref(null) 
    // Ref reparieren und mit dem Ref-Attribut in der Vorlage zusammenarbeiten, um das HTML-Element const root = ref(null) zu erhalten.
    // Scroll-Container-Referenz
    const scrollContainer = ref(null)
    
    // Fester Zustand const state = reactive({
      behoben: falsch,
      Höhe: 0, // Höhe der Wurzel
      width: 0, // Breite der Wurzel
      scrollTop: 0, // ScrollTop des Dokumentelements
      clientHeight: 0, // Clienthöhe des Dokumentelements
      transformieren: 0,
    })
    
    beimMounted(() => {
      // Bestimmen Sie den Zielcontainer basierend auf dem eingehenden Ziel, wenn (props.target) {
        Zielwert = Dokument.Abfrageselektor(Eigenschaften.Ziel)
        wenn (!ziel.wert) {
          neuen Fehler werfen („Ziel existiert nicht: ${props.target}“)
        }
      } anders {
        Zielwert = Dokument.Dokumentelement
      }
      
      // Finde den Scroll-Container nach oben, basierend auf dem festen Element scrollContainer.value = getScrollContainer(root.value)
      // Auf das Scroll-Ereignis des Scroll-Containers warten on(scrollContainer.value, 'scroll', onScroll)
      // Auf das Größenänderungsereignis des festen Elements warten addResizeListener(root.value, updateState)
    })
    
    // Die Antwortfunktion des Scroll-Ereignisses des Scroll-Containers const onScroll = () => {
      // Den festen Status aktualisieren updateState()
      
      emittieren('scrollen', {
        scrollTop: Zustand.scrollTop,
        behoben: status.behoben,
      })
    }
    
    // Aktualisieren Sie die feste Statusfunktion const updateState = () => {
      const rootRect = root.value.getBoundingClientRect()
      const targetRect = target.value.getBoundingClientRect()
      Zustandshöhe = Wurzelrechteckhöhe
      Zustand.Breite = rootRect.Breite
      state.scrollTop = scrollContainer.value === Fenster ? document.documentElement.scrollTop : scrollContainer.value.scrollTop
      Zustand.Clienthöhe = Dokument.Dokumentelement.Clienthöhe

      wenn (Eigenschaften.Position === 'oben') {
        wenn (Eigenschaften.Ziel) {
          Konstante Differenz = Zielrechteck.unten - Eigenschaften.Offset - Zustand.Höhe
          // targetRect.bottom > 0 bedeutet, dass der feste Pin immer im Container bleibt und ausgeblendet wird, wenn er den Bereich überschreitet state.fixed = props.offset > rootRect.top && targetRect.bottom > 0
          // Wird verwendet, um das Szenario zu handhaben: Wenn während des Scrollvorgangs der sichtbare Bereich des Zielcontainers nicht ausreicht, um den gesamten Pin anzuzeigen, sollte der Pin entsprechend versetzt werden, um nur einen Teil davon anzuzeigen. state.transform = difference < 0 ? difference : 0
        } anders {
          Zustand.fest = Eigenschaften.Offset > rootRect.top
        }
      } anders {
        wenn (Eigenschaften.Ziel) {
          Konstante Differenz = Zustand.Clienthöhe - Zielrechteck.oben - Eigenschaften.Offset - Zustand.Höhe
          state.fixed = state.clientHeight - props.offset < rootRect.bottom und state.clientHeight > targetRect.top
          Zustand.Transformation = Differenz < 0? -Differenz: 0
        } anders {
          Zustand.fixiert = Zustand.Clienthöhe - Eigenschaften.Offset < rootRect.bottom
        }
      }
    }
    // Überwachen Sie die feste Statusänderung und geben Sie Änderungsereignisse aus watch(() => state.fixed, () => {
      emittieren('ändern', Status.behoben)
    })
    
    // Berechnen Sie die Eigenschaft und aktualisieren Sie den Stil des Nagels automatisch entsprechend dem Zustand des Nagels const affixStyle = computed(() => {
      wenn (!state.fixiert) {
        zurückkehren
      }
      const offset = props.offset ? `${props.offset}px` : 0
      const transform = state.transform ? `translateY(${state.transform}px)` : ''

      zurückkehren {
        Höhe: `${state.height}px`,
        Breite: `${state.width}px`,
        oben: props.position === 'oben'? Offset: '',
        unten: props.position === 'unten'? Offset: '',
        transformieren: transformieren,
        zIndex: props.zIndex,
      }
    })
}

2.3 Zusammenfassung der Umsetzung:

  • Durch Überwachen des Bildlaufereignisses des Bildlaufcontainers (und des Größenänderungsereignisses des Pins selbst);
  • In der Ereignisantwortfunktion werden die DOM-Attribute des Pins und des Zielcontainers dynamisch abgerufen und zum Berechnen des Status des Pins verwendet.
  • Verwenden Sie berechnete Eigenschaften, um den Stil des Pins automatisch zu aktualisieren.

Dies ist das Ende dieses Artikels über die Implementierung von Affix-Pinning durch Element Plus. Weitere relevante Inhalte zum Element-Affix-Pinning finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung zur Verwendung von Affix-Steuerelementen in BootStrap und wie das Layout schön gehalten wird
  • Beispiel für ein Bootstrap-Plugin für zusätzliche Navigation (Affix) mit ausführlicher Erläuterung
  • Umfassende Analyse der Verwendung von Transition und Affix in Bootstrap
  • Bootstraps Affix-Plugin

<<:  Eine Sammlung möglicher Probleme bei der Migration von SQLite3 nach MySQL

>>:  VMware- und CentOS-Systeminstallationsmethode zum Zurücksetzen des Root-Passworts

Artikel empfehlen

Serviceverwaltung der Quellpaketinstallation unter Linux

Inhaltsverzeichnis 1. Startverwaltung des Quellpa...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 8.0.20 winx64

In diesem Artikel erfahren Sie mehr über die Inst...

Dynamische SQL-Anweisungsanalyse in Mybatis

Dieser Artikel stellt hauptsächlich die dynamisch...

Erläuterung der MySQL-Leistungsprüfung durch den Befehl „show processlist“

Der Befehl „show processlist“ ist sehr nützlich. ...

Lösung für die Baidu-Site-Suche, die https nicht unterstützt (getestet)

Seit kurzem ist https auch auf dem Handy möglich....

Vue3 setup() - Erweiterte Verwendungsbeispiele - ausführliche Erklärung

Inhaltsverzeichnis 1. Unterschiede zwischen Optio...

4 Möglichkeiten zum Ändern des MySQL-Root-Passworts (Zusammenfassung)

Methode 1: Verwenden Sie den Befehl SET PASSWORD ...

Vue implementiert den Schnittstellen-Gleiteffekt

In diesem Artikelbeispiel wird der spezifische Co...

Vue+openlayer5-Methode zum Abrufen der Koordinaten des aktuellen Mauszeigers

Vorwort: Wie erhält man die Koordinaten der aktue...

Detaillierte Erklärung zur Konfiguration einer statischen IP in Centos8

Nach der Installation von CentOS 8 wird beim Neus...

Beispielcode für die programmgesteuerte Verarbeitung von CSS-Stilen

Vorteile eines programmatischen Ansatzes 1. Globa...

Zusammenfassung der sieben MySQL JOIN-Typen

Bevor wir beginnen, erstellen wir zwei Tabellen, ...

Warum brauchen wir Map, wenn wir in JavaScript bereits Object haben?

Inhaltsverzeichnis 1. Behandeln Sie Objekte nicht...