È possibile centrare il testo nella casella di selezione?


198

Ho provato questo: 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; }

Come puoi vedere, non funziona. Esiste un modo solo CSS per centrare il testo nella casella di selezione?


5
Nel mio Firefox funziona correttamente :)
Mateusz Rogulski

10
Non funziona su Chrome.
Emmanuel,

4
@Blazemonger Posso immaginare molte situazioni in cui avere un design simmetrico è più importante delle opzioni allineate a sinistra per facilitare la scansione lessicografica da parte dell'uomo. Ad esempio, se voglio avere un'opzione di selezione del genere che riempia lo schermo al 100% in orizzontale su un dispositivo mobile, sembra molto strano che i testi 'Maschio' e 'Femmina' siano spinti completamente a sinistra.
Kent Munthe Caspersen,

prova text-align-last: center;
Ari,

Risposte:


29

Temo che ciò non sia possibile con i semplici CSS e non sarà possibile rendere completamente compatibile il cross-browser.

Tuttavia, utilizzando un plug-in jQuery, è possibile definire il menu a discesa:

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

Questo plug-in nasconde l' selectelemento e crea spanelementi ecc. Al volo per visualizzare uno stile di elenco a discesa personalizzato. Sono abbastanza sicuro che saresti in grado di cambiare gli stili sulle campate ecc. Per allineare gli oggetti al centro.


web.archive.org/web/20160328192510/http://filamentgroup.com/lab/… Ecco la versione migliorata ora che il filamentgroup non è più mantenuto. github.com/fnagel/jquery-ui
cdignam

386

Esiste una soluzione parziale per Chrome :

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

Centra l'opzione selezionata, ma non le opzioni all'interno del menu a discesa.


18
Non supportato su Safari
Buts

1
Nemmeno supportato su Edge.
mortenpi,

13
Non funziona in Firefox, ma ciò che funziona in Firefox è text-align: center.
Noitidart,

3
widthnon è necessario.
Vahid Amiri,

3
Accidenti, questo è perfetto, funziona anche con l'ultimo Firefox ... + rappresentante
w411 3

81

Questo è per allineare a destra. Provalo:

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

il supporto del browser per l' text-align-lastattributo è disponibile qui: https://www.w3schools.com/cssref/css3_pr_text-align-last.asp Sembra che solo Safari non lo supporti ancora.


7
Questa dovrebbe essere la risposta in alto, una soluzione CSS pura semplice e che ha funzionato perfettamente per me (anche se ho cambiato text-align-last: right;per centercome volevo le etichette nel mezzo).
JVG,

Questa risposta è incredibile! In nessun altro posto ho trovato una soluzione così semplice.
udog

Grazie mille, questa risposta dovrebbe essere selezionata in quanto funziona totalmente!
Nick,

1
text-align-last: center; da solo funziona per me in Chrome e Firefox. non in vantaggio e non scommetterei nemmeno su Safari.
Dennis Heiden,

1
Questo non funziona in nessun browser mobile. È dove principalmente vorrei che funzionasse.
evoluto il

58

Devi inserire la regola CSS nella classe select.

Usa rientro di testo CSS

Esempio

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

Codice CSS

select { text-indent: 5px; }

2
O non l'ho capito, o semplicemente non funziona per allineare il testo
matanster

rientro del testo ... Interessante, non sapevo di quella proprietà. Molte grazie!
Froxx,

9
Funzionerà solo per un'opzione specifica, il rientro del testo dipende da quanto spazio orizzontale occupa il testo dell'opzione in relazione alla larghezza della casella selezionata, quindi questa è una risposta incompleta, sono stupito che abbia ottenuto 43 voti positivi, la risposta corretta usando il rientro del testo è stato fornito dal sig. Smee sopra.
Lu Roman,

Un'idea interessante, ma non funzionerà con una percentuale, quindi come puoi centrare ogni singolo elemento?
Ma

Questa è la risposta corretta Usando il rientro del testo: il 50% centrerà l'opzione per te all'interno della selezione.
John Smith,

49

Sì, è possibile. Puoi usare text-align-last

text-align-last: center;

1
Questo sembra centrare il valore visualizzato nella selezione quando chiuso. Le opzioni nel menu a discesa sono ancora allineate a sinistra (almeno in Chrome a partire da settembre 2019)
bjg222

1
Sì, voglio visualizzare al centro ed è corretto
Pritesh

24

2020, sto usando:

select {
    text-align: center;
    text-align-last: center;
    -moz-text-align-last: center;
}

Sfortunatamente, questo non funziona in Safari ... e a partire da maggio 2020, Apple impone ancora a tutti gli altri browser su iOS di utilizzare il motore di rendering di Safari ...
Doomd

22

solo usando questo:

select {

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

}

3
Non è necessario includere "padding-right: 29px;" se si utilizza "center". Sospetto che l'abbia fatto perché hai copiato la risposta di Aly-Elgarhy dal 25 ottobre 16.
Jayden Lawson,

Quando copi dalla risposta di qualcuno dovresti menzionare i loro nomi.
Munim Munna,

No, l'ho copiato direttamente dal mio codice così com'è, ecco perché ho messo il padding-right, forse ho copiato la soluzione da un'altra nel mio codice, e quindi ho copiato la soluzione dal mio codice in 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>


1
Questa è stata l'unica soluzione che mi ha aiutato +1

Maggio 2020 - Questo non funziona su Safari (o nessun browser su tutti i dispositivi iOS)
Doomd

16

Questa funzione JS dovrebbe funzionare per te

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

Codepen completo qui: http://codepen.io/anon/pen/NxyovL


9

Mi sono sempre sbarazzato del seguente hack per farlo funzionare solo con CSS.

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

l'imbottitura centrerà il testo e può essere ottimizzata per le dimensioni del testo :)

Questo ovviamente non è corretto al 100% dal punto di vista della convalida, ma fa il lavoro :)


7

Soluzione "falsa" alternativa se si dispone di un elenco con opzioni simili nella lunghezza del testo (selezione della pagina, ad esempio):

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

Funziona con Chrome, Firefox e Edge. Il trucco è qui per spingere il testo da sinistra al centro, quindi sottrarre la metà della lunghezza in px, em o qualsiasi altra opzione del testo.

inserisci qui la descrizione dell'immagine

La migliore soluzione IMO (nel 2017) sta ancora sostituendo la selezione tramite JS e crea la tua finta casella di selezione con div o qualsiasi altra cosa e associa eventi click su di essa per il supporto cross-browser.


1
Funziona in Chrome, ma in IE sembra un po 'a destra rispetto al centro.
user3366706

5

Non abbastanza centrare ma usando l'esempio sopra puoi creare un margine sinistro nella casella di selezione.

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

Perché non è sufficiente aggiungere text-indental <select>tag come Carreras @ Marc ha detto?
Munim Munna,


3

prova questo :

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

2

Non puoi davvero personalizzare <select>o <option>molto. L'unico modo (cross-browser) sarebbe quello di creare manualmente un menu a discesa con div e css / js per creare qualcosa di simile.


2

Se non hai trovato alcuna soluzione, puoi usare questo trucco su angularjs o usare js per mappare il valore selezionato con un testo sul div, questa soluzione è completamente css conforme ad angolare ma necessita di una mappatura tra select e 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>

Spero che questo possa essere utile per qualcuno, visto che mi è servito un giorno per trovare questa soluzione su phonegap.


non è nel mezzo!
Qui-Gon Jinn,

1

Sebbene non sia possibile centrare il testo dell'opzione all'interno di una selezione, è possibile posizionare un div assolutamente posizionato sopra la selezione allo stesso effetto:

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

Assicurarsi che sia il div che la selezione abbiano posizioni fisse nel documento.


0

Non è ancora al 100%, ma puoi usare questo frammento!

text-align-last: center; // Per Chrome text-align: center; // Per Firefox

Non funziona su Safari o Edge, per ora!


-3

se le opzioni sono statiche, è possibile ascoltare l'evento change nella casella selezionata e aggiungere il riempimento per ogni singolo elemento

$('#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;
    }
});

Non è una buona ideia mettere imbottitura a sinistra per ogni parola. Che ne dici di queste parole che provengono da de database e sono dinamiche?
user3645907,

-5

aggiungi & nbsp in questo modo ...

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

fino a quando non si ottiene un effetto del testo allineato al centro

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.