Lernen Sie, wie Sie in 2 Minuten ein kreisförmiges/fächerförmiges Menü erstellen (Basisversion)

Lernen Sie, wie Sie in 2 Minuten ein kreisförmiges/fächerförmiges Menü erstellen (Basisversion)

Vorwort

Für das Projekt ist ein kreisförmiges Menü erforderlich. Ich habe online danach gesucht, aber kein passendes gefunden, also habe ich selbst ein sehr einfaches geschrieben und werde es später optimieren.

Diese Komponente basiert auf React, aber das Prinzip ist dasselbe.

Der Expansionseffekt ist wie folgt:

erreichen

CSS (weniger)

@centerIconSize: 30px;

.flex(@justify: flex-start, @align: center) {
    Inhalt begründen: @justify;
    Elemente ausrichten: @align;
    Anzeige: Flex;
}
.Sektor-Menü-Wrapper {
    Position: relativ;
    Breite: @centerIconSize;
    Rand: automatisch;

    .center-Symbol {
        .flex(Mitte);
        Breite: @centerIconSize;
        Höhe: @centerIconSize;
        Randradius: 50 %;
        Hintergrund: rgba(0, 0, 0, 0,3);
        Farbe: weiß;
        Cursor: Zeiger;
    }

    .Sektor-Element {
        Position: absolut;
        .flex(Mitte);
        Breite: @centerIconSize;
        Höhe: @centerIconSize;
        Randradius: 50 %;
        Hintergrund: rgba(0, 0, 0, 0,3);
        Cursor: Zeiger;
        Farbe: weiß;
        oben: 0;
        links: 0;
        Übergang: alles linear 0,5 s;
        transformieren: übersetzen(0, 0);
        // Anzeige: keine;
        Sichtbarkeit: versteckt;
    }

    .Sektor-Liste {
        &.Sektorliste-aktiv {
            Übergang: alles linear 0,5 s;
            .Sektor-Element {
                .flex(Mitte);
                Übergang: alles linear 0,5 s;
                transformieren: übersetzen(0, 0);
                Sichtbarkeit: sichtbar;

                &:erstes-Kind {
                    transformieren: übersetzen(0, -@centerIconSize * 1,5);
                }
        
                &:n-tes-Kind(2) {
                    transformieren: übersetzen(-@centerIconSize * 1,5, 0);
                }
        
                &:n-tes-Kind(3) {
                    transformieren: übersetzen(0, @centerIconSize * 1,5);
                    
                }
            }
        }
    }
}

SektorMenu.js

importiere React von „react“;

exportiere Standardklasse SectorMenu erweitert React.Component {
    Zustand = {
        Richtung: 'links',
        SektorMenüSichtbar: false,
        centerIconSize: 30,
        SektorArtikelgröße: 30,
    }

    /**
     * Radialmenü anzeigen */
    Sektormenü anzeigen = () => {
        const { SektorMenuVisible } = dieser.Zustand;
        dies.setState({
            SektorMenüSichtbar: !SektorMenüSichtbar,
        })
    }

    beiKlick aufSectorMenuItem = (Index) => {
        const { sectorMenuItemFunctions } = this.props;
        wenn (!SectorMenuItemFunctions || Typ von (SectorMenuItemFunctions[Index]) !== 'Funktion') {
            zurückkehren;
        }
        SektorMenüelementFunktionen[index]();
    }

    getSectorJsx = () => {
        const { SektorMenuItems } = this.props;

        wenn (!sectorMenuItems || !Array.isArray(sectorMenuItems) || sectorMenuItems.length === 0) {
            zurückkehren;
        }

        const Stile = {};
        const { SektorMenuVisible } = dieser.Zustand;

        returniere SektorMenüElemente.map((Element, i) => {
            // const Stile = {
            // transformieren: übersetzen(0, -centerIconSize * 2);
            // };

            zurück (<div
                Klassenname = {`Sektorelement ${SektorMenuVisible && 'Sektorelement-aktiv'}`}
                Stil={Stile}
                beiKlick={() => this.onClickSectorMenuItem(i)}
                Schlüssel={i}
            >
                {Artikel}
            </div>)
        });
    }
    rendern() {
        const { SektorMenuVisible } = dieser.Zustand;
        zurückkehren (
            <div Klassenname = "Sektor-Menü-Wrapper">
                <div className="center-icon" onClick={this.showSectorMenu}>
                    {
                        SektorMenüSichtbar ? 'x' : '···'
                    }
                </div>
                <div className={`Sektorliste ${sectorMenuVisible && 'Sektorliste-active'}`}>
                    {this.getSectorJsx()}
                </div>
            </div>
        )
    }
}

Anruf

<SektorMenü
    SektorMenüelemente={['A1', 'A2', 'A3']}
    SektorMenuItemFunctions={[Funktion () {console.log(0)}, Funktion () {console.log(1)}, Funktion () {console.log(2)}]}
/>

erwarten

Ursprünglich wollte ich eine flexible Verteilung schreiben, bin aber bei der Berechnung der Position nicht weitergekommen. Die Projektzeit ist knapp, daher werde ich an einem anderen Tag Zeit finden, sie zu optimieren.

  1. Flexibles Layout des Sektormenüelements
  2. Flexible Anzeige der Sektormenüposition (links, rechts, oben, unten …)

Fallstricke

Die Übergangsanimation funktionierte erst, als mir klar wurde, dass es daran lag, dass ich in der Sektorelementklasse display:none verwendet hatte. Stattdessen musste ich einfach die Sichtbarkeitseigenschaft verwenden.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

<<:  So übergeben Sie den Wert des Auswahl-Dropdown-Felds an die ID, um den Code zu implementieren

>>:  So verwenden Sie React-Color zum Implementieren des Front-End-Farbwählers

Artikel empfehlen

JavaScript-Grundlagenvariablen

Inhaltsverzeichnis 1. Variablenübersicht 1.1 Spei...

Adaptive Breitentabelle für HTML-Seiten

Auf den Seiten von Webanwendungen werden häufig T...

Vergleich der Leistung von int, char und varchar in MySQL

Im Internet kursieren viele scheinbar wahre „Gerü...

Verwenden Sie js, um js-Funktionen in Iframe-Seiten aufzurufen

In letzter Zeit habe ich jeden Tag an meinen Absch...

MySQL Workbench herunterladen und verwenden Tutorial detaillierte Erklärung

1. MySQL Workbench herunterladen Workbench ist ei...

Ausführliche Erklärung zur Docker-Maschine

Unterschiede zwischen Docker und Docker Machine D...

Der Prozess der schnellen Konvertierung eines MySQL-Left-Joins in einen Inner-Join

Während des täglichen Optimierungsprozesses stell...

Ausführliche Erklärung der Iteratoren in ECMAScript

Inhaltsverzeichnis Vorwort Frühere Iterationen It...

Quellcodeanalyse des Nodejs-Modulsystems

Inhaltsverzeichnis Überblick CommonJS-Spezifikati...

CSS-Pickup-Pfeile, Kataloge, Icons Implementierungscode

1. Verschiedene CSS-Symbole Es gibt drei Möglichk...

Detaillierte Erläuterung der persistenten MySQL-Statistiken

1. Die Bedeutung persistenter statistischer Infor...