Czy można wyśrodkować tekst w polu wyboru?

213

Próbowałem tego: 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; }

Jak widać, to nie działa. Czy istnieje sposób wyśrodkowania tekstu w polu wyboru (tylko CSS)?

ilyo
źródło
6
W moim Firefoksie działa poprawnie :)
Mateusz Rogulski
12
Nie działa na Chrome.
Emmanuel
5
@Blazemonger Mogę sobie wyobrazić wiele sytuacji, w których projekt, który wygląda symetrycznie, jest ważniejszy niż opcje wyrównane do lewej, ułatwiające skanowanie leksykograficzne przez ludzi. Np. Jeśli chcę mieć opcję wyboru płci, która wypełnia ekran w 100% w poziomie na urządzeniu mobilnym, wygląda to bardzo dziwnie, że teksty „Mężczyzna” i „Kobieta” są przesunięte maksymalnie w lewo.
Kent Munthe Caspersen
1
spróbuj text-align-last: center;
Ari

Odpowiedzi:

30

Obawiam się, że nie jest to możliwe w przypadku zwykłego CSS i nie będzie możliwe uzyskanie pełnej zgodności z różnymi przeglądarkami.

Jednak używając wtyczki jQuery, możesz stylizować menu:

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

Ta wtyczka ukrywa selectelement i tworzy spanelementy itp. W locie, aby wyświetlić niestandardowy styl listy rozwijanej. Jestem pewien, że byłbyś w stanie zmienić style przęseł itp., Aby wyśrodkować elementy.

Lakoniczny
źródło
1
web.archive.org/web/20160328192510/http://filamentgroup.com/lab/… Oto ulepszona wersja, która nie jest już obsługiwana. github.com/fnagel/jquery-ui
cdignam
412

Istnieje częściowe rozwiązanie dla Chrome :

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

Wyśrodkowuje wybraną opcję, ale nie opcje w menu rozwijanym.

Julian Cardenas
źródło
19
Nie jest obsługiwany w przeglądarce Safari
Buts
1
Nie jest również obsługiwany w Edge.
mortenpi
17
Nie działa w Firefoksie, ale działa w Firefoksie text-align: center.
Noitidart
4
widthto nie jest konieczne.
Vahid Amiri
3
Cholera, to jest idealne, działa również na najnowszym Firefoksie ... + rep
w411 3
89

To do wyrównania w prawo. Spróbuj:

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

obsługę tego text-align-lastatrybutu przez przeglądarkę można znaleźć tutaj: https://www.w3schools.com/cssref/css3_pr_text-align-last.asp Wygląda na to, że tylko Safari nadal go nie obsługuje.

Aly-Elgarhy
źródło
7
Powinno to być górna odpowiedź, proste i czyste rozwiązanie CSS, które działało idealnie dla mnie (choć zmieniło text-align-last: right;się center, jak chciałem etykiet w środku).
JVG,
Ta odpowiedź rządzi! Nigdzie indziej nie znalazłem tak prostego rozwiązania.
udog
Wielkie dzięki, ta odpowiedź powinna być wybrana, ponieważ to całkowicie działa!
Nick
1
text-align-last: center; sam działa dla mnie w Chrome i Firefox. nie na krawędzi i obstawiałbym też na safari.
Dennis Heiden
1
To nie działa w żadnych przeglądarkach mobilnych. I właśnie tam chciałbym, żeby to działało.
evolross
60

Musisz umieścić regułę CSS w wybranej klasie.

Użyj wcięcia tekstu CSS

Przykład

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

Kod CSS

select { text-indent: 5px; }
marc carreras
źródło
3
Albo nie rozumiem, albo po prostu nie działa przy wyrównywaniu tekstu
matanster
wcięcie tekstu ... Interesujące, nie wiedziałem o tej właściwości. Wielkie dzięki!
Froxx,
9
To zadziała tylko dla jednej konkretnej opcji, wcięcie tekstu zależy od tego, ile poziomego miejsca zajmie tekst opcji w stosunku do szerokości pola wyboru, więc to jest niekompletna odpowiedź, jestem zdumiony, że otrzymałem 43 głosy za, poprawna odpowiedź posługiwanie się wcięciem w tekście zostało przedstawione przez pana Smee powyżej.
Lu Roman
Ciekawy pomysł, ale nie zadziała z wartością procentową, więc jak wyśrodkować każdy element?
Ale
To jest poprawna odpowiedź. Korzystanie z wcięcia tekstu: 50% wyśrodkuje opcję wewnątrz zaznaczenia.
John Smith
55

Tak to mozliwe. Możesz użyć text-align-last

text-align-last: center;
Manjeet Kumar Nai
źródło
1
Wydaje się, że po zamknięciu wyśrodkowuje wartość wyświetlaną w zaznaczeniu. Opcje w menu są nadal wyrównane do lewej (przynajmniej w Chrome od września 2019 r.)
bjg222
1
Tak, chcę wyświetlić na środku i jest to poprawne
Pritesh
34

2020, używam:

select {
    text-align: center;
    text-align-last: center;
    -moz-text-align-last: center;
}
jzuhri
źródło
2
Niestety to nie działa w safari ... i od maja 2020 roku Apple nadal zmusza wszystkie inne przeglądarki na iOS do korzystania z silnika renderującego Safari ...
Doomd
Apple wpycha nam rzeczy do gardła? Jestem zszokowany!
Eduardo López
Nadal nie działa w Safari od października 2020 r. 😢
Alfrex92
22

po prostu używając tego:

select {

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

}
Amine_Dev
źródło
3
Nie musisz uwzględniać „padding-right: 29px;” jeśli używasz „centrum”. Podejrzewam, że tak, ponieważ skopiowałeś odpowiedź Aly-Elgarhy z 25 października 2016.
Jayden Lawson
Kiedy kopiujesz czyjąś odpowiedź, powinieneś podać jej nazwiska.
Munim Munna
Nie, skopiowałem to bezpośrednio z mojego kodu w obecnej postaci, dlatego ustawiłem dopełnienie w prawo, mogę skopiować rozwiązanie z innego do mojego kodu, a następnie skopiować rozwiązanie z mojego kodu do stackoverflow.
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
źródło
1
To było jedyne rozwiązanie, które pomogło mi +1
Maj 2020 - To nie działa w Safari (ani żadnej przeglądarce na wszystkich urządzeniach z iOS)
Doomd
17

Ta funkcja JS powinna działać dla Ciebie

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

Pełny kod Codepen tutaj: http://codepen.io/anon/pen/NxyovL

Panie Smee
źródło
Działa we wszystkich przeglądarkach Safari nawet po zmianach z maja 2020 r.
Andrew Novikov
9

Zawsze udawałem się z następującym hackiem, aby działał tylko z CSS.

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

dopełnienie wyśrodkuje tekst i można je dostosować do rozmiaru tekstu :)

To oczywiście nie jest w 100% poprawne z punktu widzenia walidacji, ale chyba spełnia swoje zadanie :)

Ben Pretorius
źródło
7

Alternatywne „fałszywe” rozwiązanie, jeśli masz listę z opcjami podobnymi pod względem długości tekstu (na przykład wybierz stronę):

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

Działa to w Chrome, Firefox i Edge. Sztuczka polega na tym, aby przesunąć tekst od lewej do środka, a następnie odjąć połowę długości w px, em lub cokolwiek innego z tekstu opcji.

wprowadź opis obrazu tutaj

Najlepsze rozwiązanie IMO (w 2017 r.) Nadal zastępuje selekcję przez JS i buduje własne fałszywe pole wyboru z elementami div lub czymkolwiek i wiąże zdarzenia kliknięcia na nim w celu obsługi wielu przeglądarek.

Dennis Heiden
źródło
1
Działa w Chrome, ale w IE wygląda trochę na prawo niż w środku.
user3366706
5

Niezupełnie wyśrodkowane, ale korzystając z powyższego przykładu, możesz zrobić lewy margines w polu wyboru.

<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
źródło
Dlaczego po prostu nie dodać text-indentdo <select>tagu, jak powiedział @marc carreras?
Munim Munna
5

to zadziałało dla mnie:

text-align: center;
text-align-last: center;
Diego Santa Cruz Mendezú
źródło
4

Spróbuj tego :

select {
    padding-left: 50% !important;
    width: 100%;
}
hmahdavi
źródło
od października 2020 r. to rozwiązanie działa w przeglądarkach Chrome, Safari i Brave. (Nie testowałem w innych przeglądarkach). Wielkie dzięki hmahdavi
Alfrex92
2

Nie możesz tak naprawdę dostosować <select>ani <option>dużo. Jedynym sposobem (w różnych przeglądarkach) byłoby ręczne utworzenie listy rozwijanej z elementami div i css / js, aby utworzyć coś podobnego.

Emmanuel
źródło
2

Jeśli nie znalazłeś żadnego rozwiązania, możesz użyć tej sztuczki na angularjs lub użyć js do zmapowania wybranej wartości z tekstem na div, to rozwiązanie jest w pełni zgodne z CSS na angular, ale wymaga mapowania między select i 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>

Mam nadzieję, że to może być przydatne dla kogoś, ponieważ znalezienie tego rozwiązania na phonegap zajęło mi pewnego dnia.

jup31
źródło
jej nie w środku!
Qui-Gon Jinn
1

Chociaż nie możesz wyśrodkować tekstu opcji w zaznaczeniu, możesz umieścić absolutnie umieszczony element div na górze zaznaczenia, aby uzyskać ten sam efekt:

#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>

Upewnij się, że zarówno element div, jak i select mają ustalone pozycje w dokumencie.

szozz
źródło
0

Nie jest jeszcze w 100%, ale możesz użyć tego fragmentu!

text-align-last: center; // Wyrównywanie tekstu w Chrome: center; // W przeglądarce Firefox

Na razie nie działa w Safari ani Edge!

user3645907
źródło
-3

jeśli opcje są statyczne, możesz nasłuchiwać zdarzenia zmiany w polu wyboru i dodać dopełnienie dla każdego pojedynczego elementu

$('#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
źródło
Nie jest dobrym pomysłem umieszczanie dopełnienia z lewej strony dla każdego słowa. A co powiesz na te słowa pochodzące z bazy danych i są dynamiczne?
user3645907
-5

dodaj & nbsp w ten sposób ...

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

aż uzyskasz efekt wyśrodkowanego tekstu

Ajesh Ajayan
źródło