Benutzerdefinierte Menünavigation im WeChat-Applet zum Erzielen eines Treppeneffekts

Benutzerdefinierte Menünavigation im WeChat-Applet zum Erzielen eines Treppeneffekts

Designabsichten

Beim Entwickeln einer Seite müssen Sie beim Klicken auf das Navigationsmenü auf der Seite häufig zur entsprechenden Position scrollen und durch die Seite scrollen, um die Menüoptionen hervorzuheben. In der HTML-Entwicklung können wir die A-Tag-Ankerimplementierung verwenden und sie mit einer JQ-Animation kombinieren, um einen ähnlichen Effekt zu erzielen. Im Rahmen dessen erzielt das Vant UI Framework diesen Effekt auch für uns.

Wie implementiere ich ein WeChat-Miniprogramm? ?

Effektanzeige

  • Wenn die Menünavigation zum Anfang der Seite scrollt, bleibt das Menü hängen
  • Durch Klicken auf die Menüschaltfläche wird in den entsprechenden Bereich gewechselt (Übergang in diesen Bereich mit Animationseffekt)
  • Wenn der Inhaltsbereich zu einem bestimmten Bereich scrollt, wird die Menüschaltfläche des entsprechenden Bereichs hervorgehoben

Gestaltungsideen

1. Realisierung des Deckeneffekts

  • Ermitteln Sie den Abstand zwischen der Menünavigation und dem oberen Seitenrand wx.createSelectorQuery()
  • Seiten-Scroll-Überwachung
  • Vergleichen Sie die Scrolldistanz mit der Ausgangsposition des Menüs

1) Entfernung

const query = wx.createSelectorQuery()
Abfrage.Auswahl('.menu_nav').boundingClientRect(Funktion(res) {
    let obj = {}
    wenn (res && res.top) {
        obj[item.attr] = parseInt(res.top)
    }
}).exec()

①wx.createSelectorQuery()
Gibt eine SelectorQuery-Objektinstanz zurück. In benutzerdefinierten Komponenten oder Seiten, die benutzerdefinierte Komponenten enthalten, sollte stattdessen this.createSelectorQuery() verwendet werden.

②SelectorQuery.select (Zeichenfolgenselektor)
Wählt den ersten Knoten aus, der dem Selektor-Selektor auf der aktuellen Seite entspricht. Gibt eine NodesRef-Objektinstanz zurück, die zum Abrufen von Knoteninformationen verwendet werden kann.

Selektorsyntax
Selector ähnelt CSS-Selektoren, unterstützt aber nur die folgende Syntax.

Eigentum Typ veranschaulichen
Ausweis Schnur Knoten-ID
Datensatz Objekt Knotendatensatz
links Nummer Die linke Randkoordinate des Knotens
Rechts Nummer Die rechte Randkoordinate des Knotens
Spitze Nummer Die obere Grenzkoordinate des Knotens
unten Nummer Die unteren Grenzkoordinaten des Knotens
Breite Nummer Breite des Knotens
Höhe Nummer Die Höhe des Knotens

③NodesRef.boundingClientRect (Funktionsrückruf)
Fügt eine Abfrageanforderung für die Layoutposition eines Knotens hinzu. Relativ zur Anzeigefläche, in Pixeln. Seine Funktion ist ähnlich zu getBoundingClientRect von DOM. Gibt die SelectorQuery zurück, die dem NodesRef entspricht.

Eigenschaft Typ Beschreibung id Zeichenfolge ID des Knotens Datensatz Objekt Datensatz des Knotens left Nummer linke Grenzkoordinate des Knotens right Nummer rechte Grenzkoordinate des Knotens top Nummer obere Grenzkoordinate des Knotens bottom Nummer untere Grenzkoordinate des Knotens width Nummer Breite des Knotens height Nummer Höhe des Knotens

④SelectorQuery.exec (Funktionsrückruf)
Alle Anfragen ausführen. Die Anforderungsergebnisse werden in der angeforderten Reihenfolge in einem Array organisiert und im ersten Parameter des Rückrufs zurückgegeben.

2) Seiten-Scroll-Überwachung

  • Initialisieren in Daten – tabFixed=false (gibt an, ob es sich um eine feste Positionierung handelt)
  • Wenn die Scroll-Distanz der Bildlaufleiste die Anfangsdistanz des Menüs überschreitet, tabFixed=true die Positionierung
// Auf Seiten-Scrollen achten onPageScroll: function(e) {
    lass hTop = parseInt(e.scrollTop)
        // Muss das Menü oben positioniert werden? if (hTop > this.data.menu_top) {
        dies.setData({
            tabFixed: true
        })
    } anders {
        dies.setData({
            tabFixed: false
        })
    }
}

onPageScroll(Objektobjekt))
Achten Sie auf Seitenverschiebungsereignisse des Benutzers.

ParametersObject-Objekt:

Eigentum Typ veranschaulichen
nach oben Nummer Die Distanz, die die Seite vertikal gescrollt hat (in px)

Hinweis: Bitte definieren Sie diese Methode auf der Seite nur, wenn es notwendig ist, und definieren Sie keine leere Methode. Um die Auswirkungen unnötiger Ereignisverteilungen auf die Kommunikation zwischen Rendering-Layer und Logik-Layer zu reduzieren. Hinweis: Vermeiden Sie es, Vorgänge wie „setData“ zu häufig in „onPageScroll“ auszuführen, da dies zu einer Kommunikation zwischen der Logikebene und der Renderingebene führen kann. Insbesondere wenn jedes Mal eine große Datenmenge übertragen wird, wirkt sich dies auf die Kommunikationszeit aus.

2. Wechseln Sie in den entsprechenden Bereich

  • Das aktuell angeklickte Menü aufzeichnen und hervorheben
  • Ermitteln Sie die anfängliche Entfernung jedes Bereichs vom oberen Seitenrand
  • Legen Sie die Position der Bildlaufleiste der aktuellen Seite fest und legen Sie die Übergangszeit fest

// Einstellungen für den Navigationsleistenschalter setSelectType(event) {
    let index = Ereignis.aktuellesTarget.dataset.type
    dies.setData({
        tabIndex: Index,
    })
    let arr = ['Panel1_oben', 'Panel2_oben', 'Panel3_oben', 'Panel4_oben']
    lass _dies = dies
    wx.pageScrollTo({
        scrollTop: _this.data[arr[index]],
        Dauer: 500
    })
},

wx.pageScrollTo(Objektobjekt)
Scrollen Sie die Seite zur Zielposition. Dabei werden zwei Positionierungsmethoden unterstützt: Auswahl und Scrolldistanz

Eigentum Typ Standardwert Erforderlich veranschaulichen
nach oben Nummer keiner NEIN Scrollen Sie zur Zielposition der Seite, in px
Dauer Nummer 300 NEIN Die Dauer der Scroll-Animation in ms
Wähler Schnur keiner NEIN Selektoren 2.7.3
Erfolg Funktion keiner NEIN Callback-Funktion für erfolgreichen Schnittstellenaufruf
scheitern Funktion keiner NEIN Rückruffunktion für fehlgeschlagene Schnittstellenaufrufe
vollständig Salbung keiner NEIN Die Callback-Funktion für das Ende des Schnittstellenaufrufs (wird ausgeführt, wenn der Aufruf erfolgreich ist oder fehlschlägt)

3) Wenn Sie zu einem bestimmten Bereich scrollen, wird die Menüschaltfläche des entsprechenden Bereichs hervorgehoben

Ermitteln Sie den anfänglichen Abstand zwischen der Fläche und der Spitze

lass arr = [
         { Name: '.menu-nav', Attr: 'menu_top', AddNum: 0 },
         { Name: '.panel1', Attr: 'panel1_top', AddNum: 0 },
         { Name: '.panel2', Attr: 'panel2_top', AddNum: 0 },
         { Name: '.panel3', Attr: 'panel3_top', AddNum: 0 },
         { Name: '.panel4', Attr: 'panel4_top', AddNum: 0 },
     ]
     arr.forEach((item, i) => {
         wx.createSelectorQuery().select(item.name).boundingClientRect(function(res) {
             let obj = {}
             wenn (res && res.top) {
                 obj[item.attr] = parseInt(res.top)

                 wenn (Artikel.AddNum) {
                     obj[item.attr] += item.addNum
                 }
                 dass.setData({
                     ...obj
                 })
             }

         }).exec()

     })

Überprüfen Sie, ob das Scrollen den Bereich überschreitet

// Auf Seiten-Scrollen achten onPageScroll: function(e) {
     lass hTop = parseInt(e.scrollTop)
     // Menü automatisch wechseln let tab=0
      wenn (hTop >= (this.data['panel4_top'] - this.data.menu_top)) {
        tab=3
     }sonst wenn (hTop >= (this.data['panel3_top'] - this.data.menu_top)){
        tab=2
     }
     sonst wenn (hTop >= (this.data['panel2_top'] - this.data.menu_top)){
         tab=1
     }
     dies.setData({
         tabIndex: Registerkarte,
     })
 },

Vollständiger Code

index.js

// Seiten/index/index.js
Seite({

  /**
   * Ausgangsdaten der Seite */
  Daten: {
    tabIndex: 0, // Aktuelles Menü menuList: ['Menü 1', 'Menü 2', 'Menü 3', 'Menü 4'], // Navigationsmenü tabFixed: false, // Ob positioniert werden soll// Der Abstand vom oberen Rand der Startseite menu_top: 0,
    panel1_top: 0,
    panel2_top: 0,
    panel3_top: 0,
    panel4_top: 0,
  },

  /**
   * Lebenszyklusfunktion - auf Seitenladen warten*/
  onLoad: Funktion (Optionen) {

  },
  onShow:Funktion (Optionen){
    dies.getTopDistance()
  },
  // Höhe vom oberen Rand der Seite ermitteln getTopDistance() {
    lass das = dies
    lass arr = [{
        Name: '.menu-nav',
        attr: 'Menü oben',
        Zusatznummer: 0
      },
      {
        Name: '.panel1',
        attr: 'panel1_top',
        Zusatznummer: 0
      },
      {
        Name: '.panel2',
        attr: 'panel2_top',
        Zusatznummer: 0
      },
      {
        Name: '.panel3',
        attr: 'panel3_top',
        Zusatznummer: 0
      },
      {
        Name: '.panel4',
        attr: 'panel4_top',
        Zusatznummer: 0
      },
    ]
    arr.forEach((item, i) => {
      wx.createSelectorQuery().select(item.name).boundingClientRect(Funktion (res) {
        let obj = {}
        wenn (res && res.top) {
          obj[item.attr] = parseInt(res.top)

          wenn (Artikel.AddNum) {
            obj[item.attr] += item.addNum
          }
          dass.setData({
            ...obj
          })
        }

      }).exec()

    })
  },
  // Einstellungen für den Navigationsleistenschalter setSelectType(event) {
    let index = Ereignis.aktuellesTarget.dataset.type
    dies.setData({
      tabIndex: Index,
    })
    let arr = ['Panel1_oben', 'Panel2_oben', 'Panel3_oben', 'Panel4_oben']
    lass _dies = dies
    wx.pageScrollTo({
      scrollTop: _this.data[arr[index]],
      Dauer: 500
    })
  },
  // Auf Seiten-Scrollen achten onPageScroll: function (e) {
    lass hTop = parseInt(e.scrollTop)

    // Muss das Menü oben positioniert werden? if (hTop > this.data.menu_top) {
      dies.setData({
        tabFixed: true
      })
    } anders {
      dies.setData({
        tabFixed: false
      })
    }

    // Menü automatisch wechseln, wenn (hTop >= (this.data['panel4_top'] - this.data.menu_top)) {
      dies.setData({
        tabIndex: 3,
      })
    }sonst wenn (hTop >= (this.data['panel3_top'] - this.data.menu_top)){
      dies.setData({
        tabIndex: 2,
      })
    }
    sonst wenn (hTop >= (this.data['panel2_top'] - this.data.menu_top)){
      dies.setData({
        tabIndex: 1,
      })
    }anders{
      dies.setData({
        tabIndex: 0,
      })
    }
  },
})

index.wxml

<Ansichtsklasse="Main">
    <Klasse anzeigen="Kopf">
        Ich bin der Kopfbereich</view>
    <view class="{{tabFixed?'is-fixed':''}} Menü-Navigation">
        <text wx:for="{{menuList}}" class="{{tabIndex==index?'is-select':''}}" bind:tap="setSelectType" data-type='{{index}}'>{{item}}</text>
        
    </Ansicht>
    <Klasse anzeigen="Inhalt">
        <view class="panel1 panel">Seite 1</view>
        <view class="panel2 panel">Seite 2</view>
        <view class="panel3 panel">Seite 3</view>
        <view class="panel4 panel">Seite 4</view>
    </Ansicht>
</Ansicht>

index.wxss

.Menü-Navigation {
  Anzeige: Flex;
  Elemente ausrichten: zentrieren;
  Inhalt ausrichten: Abstand herum;
  Farbe: Schwarz;
  Polsterung: 10px 0;
  Breite: 100 %;
  Hintergrundfarbe: weiß;
}

.ist-Auswahl {
  Farbe: rot;
}

.Kopf {
  Anzeige: Flex;
  Elemente ausrichten: zentrieren;
  Inhalt ausrichten: zentriert;
  Schriftgröße: 40px;
  Höhe: 120px;
  Hintergrundfarbe: grüngelb;
}

.ist behoben {
  Position: fest;
  oben: 0;
}

.Panel {
  Anzeige: Flex;
  Elemente ausrichten: zentrieren;
  Inhalt ausrichten: zentriert;
  Schriftgröße: 20px;
}

.panel1 {
  Höhe: 800rpx;
  Hintergrundfarbe: Rebeccapurple;
}

.panel2 {
  Höhe: 700rpx;
  Hintergrundfarbe: blau;
}

.panel3 {
  Höhe: 1000rpx;
  Hintergrundfarbe: orange;
}

.panel4 {
  Höhe: 1200rpx;
  Hintergrundfarbe: rosa;
}

Dies ist das Ende dieses Artikels über das WeChat Mini-Programm – Angepasste Menünavigation (Realisierung des Treppeneffekts). Weitere relevante Inhalte zur angepassten Menünavigation des WeChat Mini-Programms finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den verwandten Artikeln weiter unten. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Beispiel für ein seitlich verschiebbares Navigationsmenü im WeChat-Applet MUI (Popup-Popup, nach links verschieben, nach rechts nicht verschieben)
  • Beispiel für ein seitlich verschiebbares WeChat Mini-Programm-MUI-Navigationsmenü (Popup-Popup, linke Seite fixiert, rechte Seite verschiebbar)

<<:  Analyse und Lösung der Gründe, warum geplante MySQL-Aufgaben nicht normal ausgeführt werden können

>>:  So konvertieren Sie Chinesisch in HTML in UTF-8

Artikel empfehlen

Vergleichen von Dokumentspeicherorten

<br />Ein toller Blogbeitrag von PPK vor zwe...

Lösung für zu große Mysql-Binlog-Protokolldateien

Inhaltsverzeichnis 1. Verwandte Binlog-Konfigurat...

W3C Tutorial (15): W3C SMIL Aktivitäten

SMIL fügt Unterstützung für Timing und Mediensync...

Lernhinweise zum WeChat-Applet: Seitenkonfiguration und -routing

Ich habe kürzlich die Entwicklung kleiner Program...

Umfassendes Verständnis von Zeilenhöhe und vertikaler Ausrichtung

Vorherige Wörter Zeilenhöhe, Schriftgröße und vert...

Nginx-Server fügt benutzerdefinierte Systemd-Dienstprozessanalyse hinzu

1. Nehmen Sie nginx als Beispiel Nginx mit dem Be...

Detaillierte Erklärung des Befehlsmodus in der Javascript-Praxis

Inhaltsverzeichnis Definition Struktur Beispiele ...

Der Unterschied zwischen Schlüssel und Index in MySQL

Schauen wir uns zunächst den Code an: ALTER TABLE...

JavaScript-Flusskontrolle (Schleife)

Inhaltsverzeichnis 1. for-Schleife 2. Doppelte fo...

Detaillierte Erläuterung der Nginx-Anti-Hotlink- und Anti-Crawler-Konfiguration

Erstellen Sie eine neue Konfigurationsdatei (gehe...

Detaillierte Erklärung der Verwendung des Bash-Befehls

Unter Linux wird Bash als Standard übernommen, wa...