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.
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
Inhaltsverzeichnis 1. Variablenübersicht 1.1 Spei...
Auf den Seiten von Webanwendungen werden häufig T...
Im Internet kursieren viele scheinbar wahre „Gerü...
In letzter Zeit habe ich jeden Tag an meinen Absch...
1. MySQL Workbench herunterladen Workbench ist ei...
Das mobile Vue-Terminal bestimmt die Richtung, in...
Unterschiede zwischen Docker und Docker Machine D...
Während des täglichen Optimierungsprozesses stell...
Inhaltsverzeichnis Vorwort Frühere Iterationen It...
Sie müssen CSS gleichzeitig auf Div oder Span anwe...
Inhaltsverzeichnis Überblick CommonJS-Spezifikati...
Inhaltsverzeichnis Warum einen Debugger verwenden...
1. Verschiedene CSS-Symbole Es gibt drei Möglichk...
mysqldump-Befehl Einführung: Ein Datenbank-Backup...
1. Die Bedeutung persistenter statistischer Infor...