Ist es möglich, Text im Auswahlfeld zu zentrieren?

198

Ich habe es versucht: http://jsfiddle.net/ilyaD/KGcC3/

HTML:

<select name="state" class="ddList">
    <option value="">(please select a state)</option>
    <option class="lt" value="--">none</option>
    <option class="lt" value="AL">Alabama</option>
    <option class="lt" value="AK">Alaska</option>
    <option class="lt" value="AZ">Arizona</option>
    <option class="lt" value="AR">Arkansas</option>
    <option class="lt" value="CA">California</option>
    <option class="lt" value="CO">Colorado</option>
</select>

CSS:

select { width: 400px; text-align: center; }
select .lt { text-align: center; }

Wie Sie sehen können, funktioniert es nicht. Gibt es eine reine CSS-Möglichkeit, Text im Auswahlfeld zu zentrieren?

ilyo
quelle
5
In meinem Firefox funktioniert es richtig :)
Mateusz Rogulski
10
Funktioniert nicht auf Chrom.
Emmanuel
4
@Blazemonger Ich kann mir viele Situationen vorstellen, in denen ein symmetrisch aussehendes Design wichtiger ist als linksbündige Optionen zur Erleichterung des lexikografischen Scannens durch Menschen. Wenn ich beispielsweise eine Option zur Auswahl des Geschlechts haben möchte, die den Bildschirm auf einem mobilen Gerät zu 100% horizontal ausfüllt, sieht es sehr seltsam aus, dass die Texte "Männlich" und "Weiblich" ganz nach links verschoben werden.
Kent Munthe Caspersen
versuchen Sie es mit text-align-last: center;
Ari

Antworten:

29

Ich befürchte, dass dies mit einfachem CSS nicht möglich ist und nicht vollständig browserübergreifend kompatibel gemacht werden kann.

Mit einem jQuery-Plugin können Sie jedoch das Dropdown-Menü gestalten:

https://www.filamentgroup.com/lab/jquery-ui-selectmenu-an-aria-accessible-plugin-for-styling-a-html-select.html

Dieses Plugin verbirgt das selectElement und erstellt spanElemente usw. im laufenden Betrieb, um einen benutzerdefinierten Dropdown-Listenstil anzuzeigen. Ich bin mir ziemlich sicher, dass Sie die Stile in den Bereichen usw. ändern können, um die Elemente mittig auszurichten.

Curt
quelle
web.archive.org/web/20160328192510/http://filamentgroup.com/lab/… Hier ist die verbesserte Version, da die Filamentgruppen nicht mehr verwaltet werden. github.com/fnagel/jquery-ui
cdignam
386

Für Chrome gibt es eine Teillösung :

select { width: 400px; text-align-last:center; }

Die ausgewählte Option wird zentriert, nicht jedoch die Optionen in der Dropdown-Liste.

Julian Cardenas
quelle
18
Nicht unterstützt auf Safari
Buts
1
Wird auch von Edge nicht unterstützt.
Mortenpi
13
Funktioniert nicht in Firefox, aber was in Firefox funktioniert, ist text-align: center.
Noitidart
3
widthist nicht nötig.
Vahid Amiri
3
Verdammt, das ist perfekt, funktioniert auch mit dem neuesten Firefox ... + rep
w411 3
81

Das ist für die richtige Ausrichtung. Versuch es:

select{
    text-align-last:right;
    padding-right: 29px;
    direction: rtl;
}

Die Browserunterstützung für das text-align-lastAttribut finden Sie hier: https://www.w3schools.com/cssref/css3_pr_text-align-last.asp Es sieht so aus, als ob nur Safari es noch nicht unterstützt.

Aly-Elgarhy
quelle
7
Dies sollte die beste Antwort sein, eine einfache und reine CSS-Lösung, die perfekt für mich funktioniert hat (obwohl ich text-align-last: right;zu centerden Labels in der Mitte gewechselt habe ).
JVG
Diese Antwort rockt! Nirgendwo sonst habe ich eine so einfache Lösung gefunden.
Udog
Vielen Dank, diese Antwort sollte ausgewählt werden, da dies völlig funktioniert!
Nick
1
text-align-last: center; allein arbeitet für mich in Chrom und Firefox. nicht in Rand und ich würde auch nicht auf Safari wetten.
Dennis Heiden
1
Dies funktioniert in keinem mobilen Browser. An dieser Stelle möchte ich vor allem, dass es funktioniert.
Entwicklung
58

Sie müssen die CSS-Regel in die Auswahlklasse einfügen.

Verwenden Sie CSS-Texteinzug

Beispiel

<select class="day"> /* option 1 option 2 option 3 option 4 option 5 here */ </select>

CSS-Code

select { text-indent: 5px; }
Marc Carreras
quelle
2
Entweder habe ich es nicht verstanden, oder es funktioniert einfach nicht zum Ausrichten des Textes
Matanster
Text-Einzug ... Interessant, ich wusste nichts über diese Eigenschaft. Vielen Dank!
Froxx
9
Dies funktioniert nur für eine bestimmte Option. Der Texteinzug hängt davon ab, wie viel horizontaler Raum der Text der Option im Verhältnis zur Breite des Auswahlfelds einnimmt. Dies ist also eine unvollständige Antwort. Ich bin erstaunt, dass er 43 positive Stimmen erhalten hat, die richtige Antwort Die Verwendung von Texteinzug wurde von Herrn Smee oben bereitgestellt.
Lu Roman
Eine interessante Idee, aber sie funktioniert nicht mit einem Prozentsatz. Wie können Sie also jedes einzelne Element zentrieren?
Buts
Dies ist die richtige Antwort. Verwenden von Texteinzug: 50% zentriert die Option für Sie innerhalb der Auswahl.
John Smith
49

Ja, es ist möglich. Sie können text-align-last verwenden

text-align-last: center;
Manjeet Kumar Nai
quelle
1
Dies scheint den in der Auswahl angezeigten Wert zu zentrieren, wenn er geschlossen wird. Die Optionen in der Dropdown-Liste sind immer noch links ausgerichtet (zumindest in Chrome ab September 2019)
bjg222
1
Ja, ich möchte in der Mitte anzeigen und es ist korrekt
Pritesh
24

2020, ich benutze:

select {
    text-align: center;
    text-align-last: center;
    -moz-text-align-last: center;
}
jzuhri
quelle
Leider funktioniert dies auf Safari nicht ... und ab Mai 2020 zwingt Apple alle anderen Browser unter iOS, die Render-Engine von Safari zu verwenden ...
Doomd
22

nur mit diesem:

select {

text-align-last: center;
padding-right: 29px;

}
Amine_Dev
quelle
3
Sie müssen nicht "padding-right: 29px;" wenn Sie "center" verwenden. Ich vermute, Sie haben, weil Sie Aly-Elgarhys Antwort vom 25. Oktober 16 kopiert haben.
Jayden Lawson
Wenn Sie aus der Antwort einer Person kopieren, sollten Sie deren Namen angeben.
Munim Munna
Nein, ich habe das direkt aus meinem Code kopiert, so wie es ist. Deshalb habe ich das Auffüllen richtig eingestellt. Vielleicht habe ich die Lösung von einem anderen in meinen Code kopiert und dann die Lösung von meinem Code in den Stackoverflow kopiert.
Amine_Dev
21

select {
  text-align: center;
  text-align-last: center;
}
option {
  text-align: left;
}
<select>
   <option value="">(please select a state)</option>
   <option class="lt" value="--">none</option>
   <option class="lt" value="AL">Alabama</option>
   <option class="lt" value="AK">Alaska</option>
   <option class="lt" value="AZ">Arizona</option>
   <option class="lt" value="AR">Arkansas</option>
   <option class="lt" value="CA">California</option>
   <option class="lt" value="CO">Colorado</option>
</select>

Jamie Hutber
quelle
1
Dies war die einzige Lösung, die mir geholfen hat +1
Mai 2020 - Dies funktioniert nicht auf Safari (oder einem Browser auf allen iOS-Geräten)
Doomd
16

Diese JS-Funktion sollte für Sie funktionieren

function getTextWidth(txt) {
  var $elm = $('<span class="tempforSize">'+txt+'</span>').prependTo("body");
  var elmWidth = $elm.width();
  $elm.remove();
  return elmWidth;
}
function centerSelect($elm) {
    var optionWidth = getTextWidth($elm.children(":selected").html())
    var emptySpace =   $elm.width()- optionWidth;
    $elm.css("text-indent", (emptySpace/2) - 10);// -10 for some browers to remove the right toggle control width
}
// on start 
$('.centerSelect').each(function(){
  centerSelect($(this));
});
// on change
$('.centerSelect').on('change', function(){
  centerSelect($(this));
});

Vollständiger Codepen hier: http://codepen.io/anon/pen/NxyovL

Herr Smee
quelle
9

Ich bin immer mit dem folgenden Hack durchgekommen, damit es nur mit CSS funktioniert.

padding-left: 45%;
font-size: 50px;

Das Auffüllen zentriert den Text und kann an die Textgröße angepasst werden :)

Dies ist aus Sicht der Validierung offensichtlich nicht 100% korrekt, aber es macht den Job :)

Ben Pretorius
quelle
7

Alternative "gefälschte" Lösung, wenn Sie eine Liste mit Optionen haben, deren Textlänge ähnlich ist (z. B. Seitenauswahl):

padding-left: calc(50% - 1em);

Dies funktioniert in Chrome, Firefox und Edge. Der Trick besteht darin, den Text von links in die Mitte zu verschieben und dann die Hälfte der Länge in px, em oder was auch immer des Optionstextes zu subtrahieren.

Geben Sie hier die Bildbeschreibung ein

Beste Lösung IMO (im Jahr 2017) ersetzt weiterhin die Auswahl über JS und erstellt Ihr eigenes gefälschtes Auswahlfeld mit divs oder was auch immer und bindet Klickereignisse für die browserübergreifende Unterstützung darauf.

Dennis Heiden
quelle
1
Funktioniert in Chrome, aber im IE sieht es etwas schlechter aus als in der Mitte.
user3366706
5

Nicht ganz zentriert, aber anhand des obigen Beispiels können Sie im Auswahlfeld einen linken Rand erstellen.

<style>.UName { text-indent: 5px; }</style><br>

<select  name="UserName" id="UserName" size="1">
    <option class="UName" selected value="select">Select User</option>
    <option class="UName" value="User1">User 1 Name</option>
    <option class="UName" value="User2">User 2 Name </option>
    <option class="UName" value="User3">User 3 Name</option>
</select>
Richard
quelle
Warum nicht einfach text-indentzum <select>Tag hinzufügen , wie @marc carreras sagte?
Munim Munna
5

das hat bei mir funktioniert:

text-align: center;
text-align-last: center;
Diego Santa Cruz Mendezú
quelle
3

Versuche dies :

select {
    padding-left: 50% !important;
    width: 100%;
}
hmahdavi
quelle
2

Sie können nicht wirklich anpassen <select>oder <option>viel. Die einzige Möglichkeit (browserübergreifend) besteht darin, manuell ein Dropdown-Menü mit divs und css / js zu erstellen, um etwas Ähnliches zu erstellen.

Emmanuel
quelle
2

Wenn Sie keine Lösung gefunden haben, können Sie diesen Trick für AngularJS oder Js verwenden, um den ausgewählten Wert mit einem Text auf dem Div abzubilden. Diese Lösung ist vollständig CSS-konform für Angular, benötigt jedoch eine Zuordnung zwischen Select und Div:

var myApp = angular.module('myApp', []);

myApp.controller('selectCtrl', ['$scope',
  function($scope) {
    $scope.value = '';


  }
]);
.ghostSelect {
  opacity: 0.1;
  /* Should be 0 to avoid the select visibility but not visibility:hidden*/
  display: block;
  width: 200px;
  position: absolute;
}
.select {
  border: 1px solid black;
  height: 20px;
  width: 200px;
  text-align: center;
  border-radius: 5px;
  display: block;
}
<!doctype html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Example - example-guide-concepts-1-production</title>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
</head>
<body ng-app="myApp">
  <div ng-app ng-controller="selectCtrl">
    <div class=select>
      <select ng-model="value" class="ghostSelect">
        <option value="Option 1">Option 1</option>
        <option value="Option 2">Option 2</option>
        <option value="Option 3">Option 3</option>
      </select>
      <div>{{value}}
      </div>
    </div>
  </div>
</body>

Ich hoffe, dies könnte für jemanden nützlich sein, da ich einen Tag gebraucht habe, um diese Lösung auf Phonegap zu finden.

jup31
quelle
Es ist nicht in der Mitte!
Qui-Gon Jinn
1

Während Sie den Optionstext nicht innerhalb einer Auswahl zentrieren können, können Sie ein absolut positioniertes Div über die Auswahl legen, um denselben Effekt zu erzielen:

#centered
{
  position: absolute;
  top: 10px;
  left: 10px;
  width: 818px;
  height: 37px;
  text-align: center;
  font: bold 24pt calibri;
  background-color: white;
  z-index: 100;
}

#selectToCenter
{
  position: absolute;
  top: 10px;
  left: 10px;
  width: 840px;
  height: 40px;
  font: bold 24pt calibri;
}

$('#selectToCenter').on('change', function () {
    $('#centered').text($(this).find('option:selected').text());
});

<select id="selectToCenter"></select>
<div id="centered"></div>

Stellen Sie sicher, dass sowohl div als auch select feste Positionen im Dokument haben.

szozz
quelle
0

Es ist noch nicht 100%, aber Sie können dieses Snippet verwenden!

text-align-last: center; // Für Chrome Textausrichtung: Mitte; // Für Firefox

Funktioniert momentan nicht auf Safari oder Edge!

user3645907
quelle
-3

Wenn die Optionen statisch sind, können Sie in Ihrem Auswahlfeld auf das Änderungsereignis warten und für jedes einzelne Element eine Auffüllung hinzufügen

$('#id').change(function() {
    var select = $('#id');
    var val = $(this).val();

    switch(val) {
        case 'ValOne':
            select.css('padding-left', '30px');
            break;
        case 'ValTwoLonger':
            select.css('padding-left', '20px');
             break;
        default:
            return;
    }
});
Brian Parks
quelle
Es ist keine gute Idee, für jedes Wort eine Auffüllung nach links zu setzen. Wie wäre es mit diesen Wörtern, die aus der Datenbank kommen und dynamisch sind?
user3645907
-5

füge & nbsp so hinzu ...

    <option value="0"> &nbsp&nbsp&nbsp&nbsp&nbsp--Select Name--</option>

bis du einen Effekt von mittig ausgerichtetem Text bekommst

Ajesh Ajayan
quelle