Gibt es eine <select>
reine CSS-Möglichkeit, ein Dropdown zu gestalten?
Ich muss ein <select>
Formular so weit wie möglich ohne JavaScript formatieren. Welche Eigenschaften kann ich dazu in CSS verwenden?
Dieser Code muss mit allen gängigen Browsern kompatibel sein:
- Internet Explorer 6, 7 und 8
- Feuerfuchs
- Safari
Ich weiß, dass ich es mit JavaScript schaffen kann: Beispiel .
Und ich spreche nicht von einfachem Styling. Ich möchte wissen, was wir nur mit CSS am besten können.
Ich habe ähnliche Fragen zum Stapelüberlauf gefunden.
Und dieser auf Doctype.com.
Antworten:
Hier sind drei Lösungen:
Lösung Nr. 1 - Erscheinungsbild: Keine - mit Internet Explorer 10 - 11-Problemumgehung ( Demo )
- -
Um den Standardpfeil
appearance: none
für das Auswahlelement auszublenden , fügen Sie Ihren eigenen benutzerdefinierten Pfeil mit hinzubackground-image
Browser-Unterstützung:
appearance: none
hat eine sehr gute Browser-Unterstützung ( caniuse ) - mit Ausnahme von Internet Explorer 11 (und höher) und Firefox 34 (und höher).Wir können diese Technik verbessern und durch Hinzufügen Unterstützung für Internet Explorer 10 und Internet Explorer 11 hinzufügen
Wenn Internet Explorer 9 ein Problem darstellt, können wir den Standardpfeil nicht entfernen (was bedeuten würde, dass wir jetzt zwei Pfeile haben), aber wir könnten einen funky Internet Explorer 9-Selektor verwenden.
Um zumindest unseren benutzerdefinierten Pfeil rückgängig zu machen, lassen Sie den Standardauswahlpfeil intakt.
Alle zusammen:
Code-Snippet anzeigen
Diese Lösung ist einfach und bietet eine gute Browserunterstützung - sie sollte im Allgemeinen ausreichen.
Wenn Browserunterstützung für Internet Explorer 9 (und höher) und Firefox 34 (und höher) erforderlich ist, lesen Sie weiter ...
Lösung 2 Schneiden Sie das Auswahlelement ab, um den Standardpfeil ( Demo ) auszublenden.
- -
(Lesen Sie hier mehr)
Wickeln Sie das
select
Element in ein div mit einer festen Breite undoverflow:hidden
.Geben Sie dem
select
Element dann eine Breite von etwa 20 Pixel, die größer als das div ist .Das Ergebnis ist, dass der Standard-Dropdown-Pfeil des
select
Elements (aufgrund desoverflow:hidden
auf dem Container) ausgeblendet wird und Sie jedes gewünschte Hintergrundbild auf der rechten Seite des Div platzieren können.Der Vorteil dieses Ansatzes besteht darin, dass er browserübergreifend ist (Internet Explorer 8 und höher, WebKit und Gecko ). Der Nachteil dieses Ansatzes ist jedoch, dass das Options-Dropdown-Menü auf der rechten Seite herausragt (um die 20 Pixel, die wir ausgeblendet haben ... weil die Optionselemente die Breite des Auswahlelements annehmen).
[Es sollte jedoch beachtet werden, dass, wenn das benutzerdefinierte Auswahlelement nur für mobile Geräte erforderlich ist - das oben genannte Problem nicht auftritt -, da jedes Telefon das Auswahlelement nativ öffnet. Für Mobilgeräte ist dies möglicherweise die beste Lösung.]
Code-Snippet anzeigen
Wenn der benutzerdefinierte Pfeil in Firefox - vor Version 35 - erforderlich ist , Sie jedoch keine alten Versionen von Internet Explorer unterstützen müssen, lesen Sie weiter ...
Lösung 3 - Verwenden Sie die
pointer-events
Eigenschaft ( Demo )- -
(Lesen Sie hier mehr)
Die Idee hier ist, ein Element über den nativen Dropdown-Pfeil zu legen (um unser benutzerdefiniertes zu erstellen) und dann Zeigerereignisse darauf zu verbieten.
Vorteil: Es funktioniert gut in WebKit und Gecko. Es sieht auch gut aus (keine hervorstehenden
option
Elemente).Nachteil: Internet Explorer (Internet Explorer 10 und niedriger) wird nicht unterstützt
pointer-events
, dh Sie können nicht auf den benutzerdefinierten Pfeil klicken. Ein weiterer (offensichtlicher) Nachteil dieser Methode ist, dass Sie Ihr neues Pfeilbild nicht mit einem Hover-Effekt oder einem Handcursor anvisieren können, da wir gerade Zeigerereignisse deaktiviert haben!Mit dieser Methode können Sie jedoch Modernizer oder bedingte Kommentare verwenden, um Internet Explorer auf den integrierten Standardpfeil zurückzusetzen.
NB: Da Internet Explorer 10 nicht mehr unterstützt wird
conditional comments
: Wenn Sie diesen Ansatz verwenden möchten, sollten Sie wahrscheinlich Modernizr verwenden . Es ist jedoch weiterhin möglich, das Zeigerereignis-CSS mit einem hier beschriebenen CSS-Hack aus Internet Explorer 10 auszuschließen .Code-Snippet anzeigen
quelle
Es ist möglich, aber leider meistens in WebKit-basierten Browsern, soweit wir als Entwickler dies benötigen. Hier ist das Beispiel für das CSS-Styling, das im Chrome-Optionsfeld über den integrierten Inspektor für Entwicklertools erfasst wurde und an die derzeit unterstützten CSS-Eigenschaften in den meisten modernen Browsern angepasst wurde:
Wenn Sie diesen Code auf einer beliebigen Seite in einem WebKit-basierten Browser ausführen, sollte sich das Erscheinungsbild des Auswahlfelds ändern, der Standard-OS-Pfeil entfernt und ein PNG-Pfeil hinzugefügt werden. Stellen Sie vor und nach dem Etikett einen Abstand ein, fast alles, was Sie möchten.
Der wichtigste Teil ist die
appearance
Eigenschaft, die das Verhalten des Elements ändert.Es funktioniert perfekt in fast allen WebKit-basierten Browsern, einschließlich mobilen Browsern, obwohl Gecko
appearance
anscheinend nicht so gut wie WebKit unterstützt.quelle
text-indent: 0.01px; text-overflow: "";
, wird es noch besser funktionierenDas Auswahlelement und seine Dropdown-Funktion sind schwer zu formatieren .
Stilattribute für ausgewähltes Element von Chris Heilmann bestätigen, was Ryan Dohery in einem Kommentar zur ersten Antwort gesagt hat:
quelle
Ich hatte genau dieses Problem, außer dass ich keine Bilder verwenden konnte und nicht durch die Browserunterstützung eingeschränkt war. Dies sollte «auf Spezifikation» sein und mit etwas Glück irgendwann überall funktionieren .
Es werden geschichtete gedrehte Hintergrundebenen verwendet, um einen Dropdown-Pfeil «auszuschneiden», da Pseudoelemente für das ausgewählte Element nicht funktionieren würden.
Bearbeiten: In dieser aktualisierten Version verwende ich CSS-Variablen und ein winziges Themensystem.
quelle
-moz-appearance: none;
Die größte Inkonsistenz, die ich beim Stylen ausgewählter Dropdowns festgestellt habe, ist das Rendern von Safari und Google Chrome (Firefox kann vollständig über CSS angepasst werden). Nach einigem Durchsuchen der dunklen Tiefen des Internets stieß ich auf Folgendes, das meine Bedenken mit WebKit fast vollständig löst:
Safari und Google Chrome beheben :
Dadurch wird jedoch der Dropdown-Pfeil entfernt. Sie können einen Dropdown-Pfeil in der Nähe
div
mit einem Hintergrund, einem negativen Rand oder absolut über dem ausgewählten Dropdown- Pfeil hinzufügen.* Weitere Informationen und andere Variablen finden Sie in der CSS-Eigenschaft: -webkit-Erscheinungsbild .
quelle
<select>
Tags können wie jedes andere HTML-Element auf einer in einem Browser gerenderten HTML-Seite über CSS gestaltet werden. Unten finden Sie ein (zu einfaches) Beispiel, mit dem ein ausgewähltes Element auf der Seite positioniert und der Text der Optionen blau dargestellt wird.Beispiel-HTML-Datei (selectExample.html):
Beispiel-CSS-Datei (selectExample.css):
quelle
Der Blog-Beitrag Wie man ein CSS-Formular im Dropdown-Stil erstellt, funktioniert kein JavaScript für mich, aber es schlägt in Opera fehl :
quelle
Hier ist eine Version, die in allen modernen Browsern funktioniert. Der Schlüssel wird verwendet,
appearance:none
wodurch die Standardformatierung entfernt wird. Da die gesamte Formatierung weg ist, müssen Sie den Pfeil wieder hinzufügen, der die Auswahl visuell von der Eingabe unterscheidet.Arbeitsbeispiel: https://jsfiddle.net/gs2q1c7p/
quelle
Ich bin mit Bootstrap zu Ihrem Fall gekommen . Dies ist die einfachste Lösung, die funktioniert:
Hinweis: Das base64-Zeug ist
fa-chevron-down
in SVG.quelle
In modernen Browsern ist es relativ schmerzlos, das
<select>
in CSS zu stylen. Mitappearance: none
dem einzigen schwierigen Teil auf den Pfeil ersetzt (wenn das , was Sie wollen). Hier ist eine Lösung, die einen Inline-data:
URI mit Klartext-SVG verwendet:Der Rest des Stils (Ränder, Polster, Farben usw.) ist ziemlich einfach.
Dies funktioniert in allen Browsern, die ich gerade ausprobiert habe (Firefox 50, Chrome 55, Edge 38 und Safari 10). Ein Hinweis zu Firefox ist, dass Sie, wenn Sie das
#
Zeichen in der Daten-URI verwenden möchten (z. B.fill: #000
), es maskieren müssen (fill: %23000
).quelle
height
und / oderwidth
dem<svg>
Tag anstelle der CSS-Eigenschaft festlegenbackground-size
.quelle
Benutzerdefiniert Wählen Sie CSS-Stile aus
Getestet in Internet Explorer (10 und 11), Edge, Firefox und Chrome
quelle
background-position: right 15px center, right 10px center;
Verwenden Sie die
clip
Eigenschaft, um die Ränder und den Pfeil desselect
Elements zuzuschneiden, und fügen Sie dem Wrapper dann Ihre eigenen Ersatzstile hinzu:Verwenden Sie eine zweite Auswahl mit einer Deckkraft von Null, um die Schaltfläche anklickbar zu machen:
Die Koordinaten unterscheiden sich zwischen Webkit und anderen Browsern, es handelt sich jedoch um eine @ media-Abfrage kann dies abdecken.
Verweise
quelle
Ein sehr schönes Beispiel, das den Trick verwendet
:after
und:before
ausführt, ist das Styling Select Box mit CSS3 | CSSDeckquelle
Das Bearbeiten dieses Elements wird nicht empfohlen, aber wenn Sie es ausprobieren möchten, ist es wie jedes andere HTML-Element.
Beispiel bearbeiten:
quelle
Dies verwendet eine Hintergrundfarbe für ausgewählte Elemente und ich habe das Bild entfernt.
quelle
Ja. Sie können jedes HTML-Element anhand seines Tag-Namens wie folgt formatieren:
Natürlich können Sie auch eine CSS-Klasse verwenden, um sie wie jedes andere Element zu formatieren:
quelle
Hier ist eine Lösung, die auf meinen Lieblingsideen aus dieser Diskussion basiert. Dies ermöglicht das direkte Stylen eines <select> -Elements ohne zusätzliches Markup.
Es funktioniert mit Internet Explorer 10 (und höher) mit einem sicheren Fallback für Internet Explorer 8/9. Eine Einschränkung für diese Browser ist, dass das Hintergrundbild positioniert und klein genug sein muss, um sich hinter dem nativen Erweiterungssteuerelement zu verstecken.
HTML
SCSS
CodePen
http://codepen.io/ralgh/pen/gpgbGx
quelle
Ab Internet Explorer 10 können Sie mit der
::-ms-expand
Pseudoelementauswahl das Dropdown-Pfeilelement formatieren und ausblenden.Das verbleibende Design sollte anderen Browsern ähneln.
Hier ist eine grundlegende Abzweigung von Danields jsfiddle, die die Unterstützung für IE10 anwendet
quelle
Es gibt einen einfachen Weg.
Überprüfen Sie diese Geige und verzeihen Sie mir das Overstyling: https://jsfiddle.net/dkellner/7ac9us70/
Der Trick dahinter: Sobald das <select> -Tag eine Eigenschaft namens "size" erhält, verhält es sich wie eine Liste mit fester Höhe und ermöglicht es Ihnen plötzlich aus irgendeinem Grund, die Hölle daraus zu machen. Genau genommen ist die feste Liste ein Nebeneffekt - aber sie hilft uns nur mehr, weil wir sie für den "Dropdown-Look" verwenden.
Ein minimales Beispiel:
(Um es einfach zu halten, habe ich es mit jQuery gemacht - aber Sie können das gleiche auch ohne machen)
Randnotizen
Diese Lösung bietet Ihnen mehr als nur eine Auswahl: Der Wert kann auch manuell bearbeitet werden. Verwenden Sie die Eigenschaft readonly, wenn Sie die standardmäßige Auswahl mit eingeschränkter Auswahl bevorzugen.
Um die Styling-Möglichkeiten zu maximieren, werden <optgroup> -Tags nicht verwendet um ihre Kinder, sind sie bewegt , bevor sie. Es ist beabsichtigt, es ist visuell klarer und sie arbeiten gerne so, keine Sorge.
Javascripts: Ja, ich weiß, dass das OP "kein Javascript" sagte, aber ich habe es so verstanden, dass Sie sich bitte nicht mit Plugins beschäftigen , was in Ordnung ist. Sie brauchen keine Bibliotheken für diese. Nicht einmal jQuery, wie gesagt, es dient nur der Klarheit des Beispiels.
quelle
Sie sollten es auf jeden Fall wie in Styling Select, Optgroup und Optionen mit CSS tun . In vielerlei Hinsicht sind Hintergrundfarbe und Farbe genau das, was Sie normalerweise zum Stylen von Optionen benötigen, nicht die gesamte Auswahl.
quelle
Sie können der Dropdown-Liste auch einen Schwebestil hinzufügen.
quelle
Die dritte Methode in Danields Antwort kann verbessert werden, um mit Hover-Effekten und anderen Mausereignissen zu arbeiten. Stellen Sie einfach sicher, dass das "button" -Element direkt nach dem select-Element im Markup steht. Richten Sie es dann mit dem + CSS-Selektor aus:
HTML:
CSS:
Dies zeigt jedoch den Hover-Effekt, wenn Sie irgendwo über dem Auswahlelement schweben, nicht nur über der "Schaltfläche".
Ich verwende diese Methode in Kombination mit Angular (da mein Projekt ohnehin eine Angular-Anwendung ist), um das gesamte Auswahlelement abzudecken, und lasse Angular den Text der ausgewählten Option im "button" -Element anzeigen. In diesem Fall ist es durchaus sinnvoll, dass der Hover-Effekt angewendet wird, wenn Sie irgendwo über der Auswahl schweben.
Ohne JavaScript funktioniert dies jedoch nicht. Wenn Sie dies tun möchten und Ihre Site ohne JavaScript arbeiten muss, sollten Sie sicherstellen, dass Ihr Skript die für die Erweiterung erforderlichen Elemente und Klassen hinzufügt. Auf diese Weise erhält ein Browser ohne JavaScript einfach eine normale, nicht gestaltete Auswahl anstelle eines gestalteten Abzeichens, das nicht korrekt aktualisiert wird.
quelle
Eine Lösung nur für CSS und HTML
Es scheint mit Chrome, Firefox und Internet Explorer 11 kompatibel zu sein. Bitte hinterlassen Sie jedoch Ihr Feedback zu anderen Webbrowsern.
Wie in Danields Antwort vorgeschlagen , verpacke ich meine Auswahl in ein Div (sogar zwei Divs aus Gründen der X-Browser-Kompatibilität), um das erwartete Verhalten zu erhalten.
Siehe http://jsfiddle.net/bjap2/
HTML:
Beachten Sie die beiden Div-Wrapper.
Beachten Sie auch das zusätzliche Div, das hinzugefügt wurde, um den Pfeil nach unten zu platzieren, wo immer Sie möchten (absolut positioniert). Hier platzieren wir ihn links.
CSS
quelle