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?


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.


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.


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.


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; }

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;

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;
}

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;

}

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>


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


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 :)


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.


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>

Warum nicht einfach text-indentzum <select>Tag hinzufügen , wie @marc carreras sagte?
Munim Munna


3

Versuche dies :

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

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.


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.


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.


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!


-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;
    }
});

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.