Vue implementiert Tab-Beschriftung (Beschriftung übertrifft automatisches Scrollen)

Vue implementiert Tab-Beschriftung (Beschriftung übertrifft automatisches Scrollen)

Wenn die erstellte Registerkartenbeschriftung den sichtbaren Bereich der Seite überschreitet, wird automatisch eine Registerkartenbeschriftungsdistanz gescrollt, und Sie können klicken, um die Registerkartenbeschriftung manuell zu scrollen. Den Effekt sehen Sie im GIF-Bild.

Effektvorschau GIF

<Vorlage>
    <div Klasse="Hauptbox">
        <button @click="add">Hinzufügen</button>
        <div Klasse="Haupt-Box-Tab">
            <i @click="vorheriges"><<</i>
            <i @click="weiter">>></i>
            <div Klasse="Haupt-Box-Tab-Inhalt" ref="Tabs">
                <div Klasse="main-box-tab-roll">
                    <div v-for="(Element, Index) in Tabs" :Schlüssel="Index"
                         :Klasse="{'tab-item-action':actionName === item.name ,'tab-item':actionName !== item.name}"
                         @click.stop="KlickTab(Elementname,Index)">
                        <span>{{item.meta.title}}</span>
                        <i class="el-icon-close" @click.stop="schließen(item.name)"></i>
                    </div>
                </div>
            </div>
        </div>
        <div Klasse="Hauptbox-Inhalt">
            <div>{{Aktionsname}}</div>
        </div>
    </div>
</Vorlage>
<Skript>
    Standard exportieren {
        Name: "Index",
        Daten() {
            zurückkehren {
                Registerkarten: [],
                BewegungX: 0,
                Anzahl: 1,
                unbesetzt: 0,
                Anzahl der Tabs: 0,
                Aktionsname: "test1"
            }
        },
        betrachten:
            Aktionsname(Wert) {
                lass len = this.tabs.length
                // Wenn doppelte Daten vorhanden sind, beenden Sie die nachfolgende Funktionsausführung for (let i = 0; i < len; i++) {
                    wenn (diese.tabs[i].name === val) {
                        dies.$nextTick(() => {
                            dies.translateX((i + 1 - dies.tabsCount) * dies.width - dies.unoccupied)
                        })
                        zurückkehren
                    }
                }

                dies.tabs.push({
                    Name: `test${this.count}`,
                    Meta: {
                        Titel: `test${this.count}`
                    }
                })
                dies.$nextTick(() => {
                  // (Wie viele Registerkarten gibt es insgesamt – die Anzahl der Elemente, die sichtbar sind, wenn sie nicht versetzt sind) * Länge eines einzelnen Registerkartenbeschriftungselements – Breite des sichtbaren Teils des verdeckten Registerkartenelements this.translateX((this.tabs.length – this.tabsCount) * this.width – this.unoccupied)
                })
            }
        },
        montiert() {
            dies.tabs.push({
                Name: `test${this.count}`,
                Meta: {
                    Titel: `test${this.count}`
                }
            })
            dies.$nextTick(() => {
                let tabs = dies.$refs.tabs
                let getStyle = getComputedStyle(tabs.children[0].children[0], null)
                let marginLeft = parseFloat(getStyle.marginLeft.substr(0, getStyle.marginLeft.length - 2))
                let marginRight = parseFloat(getStyle.marginRight.substr(0, getStyle.marginRight.length - 2))
                // Tatsächliche Breite des Elements = Elementbreite + Rand this.width = marginLeft + marginRight + tabs.children[0].children[0].offsetWidth

                /**
                 * Die folgende Kommentarberechnungsmethode wird verwendet, um die Implementierungslogik zu verstehen**/
                // // Wie viele Elemente können im sichtbaren Bereich platziert werden = Breite des sichtbaren Bereichs / tatsächliche Breite des Unterelements // let num = tabs.offsetWidth / this.width

                // // Die Breite des sichtbaren Teils des verdeckten Registerkartenelements = die Breite des sichtbaren Bereichs - (tatsächliche Breite des untergeordneten Elements * in eine Ganzzahl umgewandelte Zahl)
                // this.unoccupied = tabs.offsetWidth - (this.width * parseInt(num))

                //Zum Schluss zum Rest vereinfacht (das Ergebnis ist das gleiche wie bei der Berechnung oben)
                dies.unbesetzt = tabs.offsetWidth % dies.width
                // In Ganzzahl umwandeln this.tabsCount = parseInt(tabs.offsetWidth / this.width)
            })
        },
        Methoden: {
            hinzufügen() {
                dies.zählen++
                this.actionName = `test${this.count}`
            },

            /**
             * Registerkarte wechseln**/
            KlickTab(Name) {
                wenn (dieser.Aktionsname !== Name) {
                    this.actionName = Name
                }
            },

            /**
             * Schließen Sie die Registerkarte**/
            schließen(Name) {
                lass len = this.tabs.length
                let jumpName = null
                wenn (Länge > 1) {
                    für (sei i = 0; i < len; i++) {
                        wenn (diese.tabs[i].name === name) {
                            dies.tabs.splice(i, 1)

                            Sprungname = diese.Tabs[i ? i - 1 : 0].Name
                            wenn (dieser.Aktionsname !== Sprungname && Name === dieser.Aktionsname) {
                                this.actionName = Sprungname
                            }

                            dies.$nextTick(() => {
                                dies.vorheriges()
                            })
                            zurückkehren
                        }
                    }
                }
            },

            /**
             * Nach rechts verschieben**/
            nächste() {
                // scrollWidth ist nicht genau // Verwenden Sie this.width * this.tabs.length um die Gesamtlänge zu berechnen let totalWidth = this.width * this.tabs.length

                dies.$nextTick(() => {
                    let dom = dies.$refs.tabs
                    // Sichtbarer Bereich < Scrollbereich (Scrollbereich kann nur verschoben werden, wenn er größer als der sichtbare Bereich ist)
                    // Bewegungsdistanz + sichtbarer Bereich = Breite des Scrollbereichs (die letzte Breite, die tatsächliche Breite beim Klicken) < Scrollbereichif (dom.clientWidth < Gesamtbreite && this.moveX + dom.clientWidth < Gesamtbreite) {
                        // this.moveX ist 0 minus der Breite des unbesetzten Raums this.moveX += this.moveX ? this.width : this.width - this.unoccupied
                        dies.übersetzenX(dies.verschiebenX)
                    }
                })
            },

            /**
             * Linker Versatz**/
            vorherige() {
                wenn (diese.moveX > 0) {
                    dies.moveX -= diese.width
                    dies.übersetzenX(dies.verschiebenX)
                }
            },

            /**
             * Beginnen Sie, Dom zu bewegen
             **/
            übersetzeX(x) {
                dies.moveX = x < 0 ? 0 : x
                dies.$refs.tabs.children[0].style.transform = ``übersetzenX(-${this.moveX}px)``
            }
        }
    }
</Skript>

<style lang="scss" scoped>
    .Hauptbox {
        Höhe: 500px;
        Breite: 500px;
        Polsterung: 10px 20px 20px 20px;

        .Hauptbox-Tab {
            Position: relativ;
            Polsterung: 10px 20px;
            Überlauf: versteckt;

            & > ich {
                Position: absolut;
                Cursor: Zeiger;
                unten: 15px;

                &:n-tes-Kind(1) {
                    links: 0;
                }

                &:n-tes-Kind(2) {
                    rechts: 0;
                }
            }

            .main-box-tab-content {
                Überlauf: versteckt;

                .main-box-tab-roll {
                    Übergang: Transformation 0,5 s;
                    Anzeige: Flex;
                    Elemente ausrichten: zentrieren;

                    div {
                        Flex-Schrumpfen: 0;
                        Cursor: Zeiger;
                        Breite: 130px;
                        Höhe: 25px;
                        Rand: 0,5px;
                        Anzeige: Flex;
                        Elemente ausrichten: zentrieren;
                        Inhalt ausrichten: Abstand dazwischen;

                        Spanne, ich {
                            Schriftgröße: 12px;
                        }

                        Spanne {
                            Rand links: 10px;
                            Überlauf: versteckt;
                            Leerzeichen: Nowrap;
                            Textüberlauf: Auslassungspunkte;
                        }

                        ich {
                            Rand rechts: 10px;
                        }
                    }
                }
            }

            .tab-item {
                Farbe: #cccccc;
                Hintergrundfarbe: rgba(255, 255, 255, .5);
                Rahmenradius: 0 1px 0 1px;
                Rand: 1px durchgezogen #052141;
            }

            .tab-item-action {
                Farbe: #ffffff;
                Hintergrund: rgba (0, 180, 255, 0,8);
                Rahmenradius: 0 1px 0 1px;
                Rand: 1px durchgezogen #1E2088;
            }

        }

        .Hauptbox-Inhalt {
            Höhe: berechnet (100 % – 70 Pixel);
            Polsterung: 10px;
            Rand: 1px sattelbraun durchgezogen;
            Hintergrundgröße: 100 % 100 %;
        }
    }
</Stil>

Dies ist das Ende dieses Artikels über die Implementierung von Tab-Tags in Vue (Tabs überschreiten das automatische Scrollen). Weitere relevante Inhalte zu Vue-Tab-Tags 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:
  • Lösen Sie das Cache-Problem, wenn Vue-Router Tab-Tags wechselt und schließt
  • Vue implementiert den Tab-Tag-Routing-Effekt und verwendet Animate.css, um Übergangsanimationseffekte zu erstellen
  • vuex + keep-alive zur Implementierung der Caching-Funktion für Registerkarten
  • Beispiel für einen von Vue2.0 implementierten Tab-Umschalteffekt (Inhalt kann angepasst werden)
  • Vue2.0 So fügen Sie Tab-Registerkarten und Seitenwechselübergängen Stile hinzu
  • Detaillierte Erläuterung der Registerkarte „Vue-Router-Implementierung“ (einzelne Seite)

<<:  Allgemeine Linux-Befehle chmod zum Ändern der Dateiberechtigungen 777 und 754

>>:  MySQL Server IO 100 % Analyse- und Optimierungslösung

Artikel empfehlen

Webdesign-Tutorial (3): Designschritte und Denkweise

<br />Vorheriges Tutorial: Webdesign-Tutoria...

SQL GROUP BY ausführliche Erklärung und einfaches Beispiel

Die GROUP BY-Anweisung wird in Verbindung mit der...

So verwenden Sie async und await in JS

Inhaltsverzeichnis 1. asynchron 2. warten: 3. Umf...

Diagramm zur Installation von VMware 14 unter Windows 10

Software-Download Link zum Herunterladen der Soft...

Implementierungscode für die adaptive IFrame-Größe

Seitendomänenbeziehung: Die Hauptseite a.html gehö...

mysql5.7 Installations- und Konfigurationstutorial unter Centos7.3

In diesem Artikel finden Sie das Installations- u...

JavaScript zum Erzielen eines Texterweiterungs- und -reduzierungseffekts

Die Implementierung des Erweiterns und Reduzieren...

Verwenden von Zabbix zum Überwachen des Ogg-Prozesses (Linux-Plattform)

Der Ogg-Prozess einer vor einiger Zeit erstellten...

So installieren und konfigurieren Sie MySQL 5.7.19 unter CentOS 6.5

Die detaillierten Schritte zur Installation von m...

CSS3 realisiert den verschiebbaren Zauberwürfel-3D-Effekt

Hauptsächlich verwendete Wissenspunkte: •CSS3 3D-...

Vue implementiert ein einfaches Einkaufswagenbeispiel

In diesem Artikel wird der spezifische Code von V...

Lernen Sie, wie Sie mit vscode eine React-Native-Entwicklungsumgebung erstellen

Frage Der Code hat keine Eingabeaufforderung: Vie...