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

Einführung in die Generierung von Kubernetes-Zertifikaten mit OpenSSL

Kubernetes unterstützt drei Arten der Authentifiz...

Lösung zur Codeaufteilung im Vue-Projekt

Inhaltsverzeichnis Hintergrund Zweck Vor der Spal...

Über Zabbix Admin-Login vergessen Passwort zurücksetzen

Das Problem beim Zurücksetzen des Passworts für d...

Die Vorteile von Div+CSS und Web-Standardseiten

Das Div-Element wird verwendet, um Struktur und Hi...

Probleme und Lösungen bei der Installation und Verwendung von VMware

Die virtuelle Maschine wird verwendet oder es kan...

So verwenden Sie CURRENT_TIMESTAMP in MySQL

Inhaltsverzeichnis Verwendung von CURRENT_TIMESTA...

SQL-Implementierung von LeetCode (181. Angestellte verdienen mehr als Manager)

[LeetCode] 181.Mitarbeiter verdienen mehr als ihr...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 8.0.15 winx64

In diesem Artikel wird die Installations- und Kon...

Schreiben Sie ein MySQL-Datensicherungsskript mithilfe der Shell

Ideen Eigentlich ist es ganz einfach Schreiben Si...