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

Analyse und Praxis des serverseitigen Rendering-Prinzips von React

Die meisten Leute haben schon einmal vom Konzept ...

So installieren Sie MySQL für Anfänger (erwiesenermaßen effektiv)

1. Software-Download MySQL-Download und -Installa...

Detaillierte Erklärung dieses Zeigeproblems in JavaScript

Vorwort Der This-Zeiger in JS hat Anfängern schon...

Erweiterte Verwendungsbeispiele für den Befehl mv in Linux

Vorwort Der Befehl mv ist die Abkürzung für move ...

Detaillierte Erklärung der CSS-Stil-Kaskadierungsregeln

Der Syntaxstil der CSS-Stilregel ist die Grundein...

3 Möglichkeiten, die maximale Anzahl von Verbindungen in MySQL richtig zu ändern

Wir alle wissen, dass die standardmäßige MySQL-Da...

So entwickeln Sie Uniapp mit vscode

Da ich immer vscode zur Entwicklung von Front-End...

MySQL vollständig deinstallieren. Persönlicher Test!

MySQL sauber deinstallieren. Persönlich getestet,...

So erstellen Sie geplante Aufgaben mit dem Crond-Tool in Linux

Vorwort Crond ist ein Tool zur geplanten Ausführu...

React-Tipps zeigen Ihnen, wie Sie Probleme mit Hook-Abhängigkeiten beseitigen

Ein sehr häufiges Szenario in react -Projekten: c...

Implementierung des Vue-Zählers

Inhaltsverzeichnis 1. Implementierung des Zählers...

Drei Verwendungszwecke und Unterschiede von MySQL sind nicht gleich

Urteilssymbole werden in MySQL häufig verwendet, ...