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

CSS-Stil zum Zentrieren des HTML-Tags im Browser

CSS-Stil: Code kopieren Der Code lautet wie folgt:...

Einführung und Installation von vue-cli

Inhaltsverzeichnis 1. Einleitung 2. Einführung in...

Beispiel für die Implementierung einer eingebetteten Tabelle mit vue+elementUI

Während meines Praktikums im letzten Studienjahr ...

Deaktivieren der AutoVervollständigen-Funktion im Eingabefeld

Jetzt können wir ein Eingabeattribut namens „Autov...

So verbergen Sie Elemente im Web und ihre Vor- und Nachteile

Beispiel-Quellcode: https://codepen.io/shadeed/pe...

MySQL-Fall bei der Verwendungsbeispielanalyse

Zuerst erstellen wir die Datenbanktabelle: Tabell...

JavaScript zum Erreichen eines einfachen Message Board-Falls

Verwenden Sie Javascript, um ein Message Board-Be...

MySQL 5.7.20 Green Edition Installation Detailliertes grafisches Tutorial

Lassen Sie uns zunächst verstehen, was MySQL ist....

Eine einfache Möglichkeit zum Erstellen einer Docker-Umgebung

Lassen Sie uns zunächst verstehen, was Docker ist...

Tutorial zum Zurücksetzen des Root-Passworts von Mac MySQL

Haftungsausschluss: Mit dieser Methode zum Zurück...

Detailliertes Beispiel zum Entfernen doppelter Daten in MySQL

Detailliertes Beispiel zum Entfernen doppelter Da...