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

So konfigurieren Sie einen Pfadalias für das React-Scaffolding

Die React-Version beim Schreiben dieses Artikels ...

Projektpraxis zum Bereitstellen von Docker-Containern mit Portainer

Inhaltsverzeichnis 1. Hintergrund 2. Bedienungssc...

So stellen Sie FastDFS in Docker bereit

Installieren Sie Fastdfs auf Docker Mount-Verzeic...

Vue + Element UI realisiert Ankerpositionierung

In diesem Artikelbeispiel wird der spezifische Co...

Detailliertes Tutorial zum Aufbau eines lokalen Ideenaktivierungsservers

Vorwort Der Blogger verwendet die Idea IDE. Da di...

So stellen Sie zabbix_agent in Docker bereit

zabbix_agent-Bereitstellung: Empfehlung: zabbix_a...

Eine kurze Analyse von Patroni in Docker-Containern

Inhaltsverzeichnis Erstellen eines Images Dateist...

Detaillierte Schritte zur schnellen Installation von Openshift

Der schnellste Weg, die neueste Version von OpenS...

MySQL-Sortierung – Chinesische Details und Beispiele

Detaillierte Erklärung zur MySQL-Sortierung chine...

Lösung für die Upload-Einschränkung von Element-ui-Uploaddateien

Frage Die Angabe des Typs der hochgeladenen Datei...

JavaScript zum Wechseln zwischen mehreren Bildern

In diesem Artikel wird der spezifische JavaScript...

Attribute und Verwendung von INS- und DEL-Tags

ins und del wurden in HTML 4.0 eingeführt, um Auto...

So laden Sie Flash in HTML (2 Implementierungsmethoden)

Erste Methode : CSS Code: Code kopieren Der Code l...