É possível centralizar o texto na caixa de seleção?

198

Eu tentei isso: 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; }

Como você pode ver, não funciona. Existe uma maneira somente CSS de centralizar o texto na caixa de seleção?

ilyo
fonte
5
Na minha Firefox funciona :) correta
Mateusz Rogulski
10
Não funciona no chrome.
Emmanuel
4
@ Blazemonger Posso imaginar muitas situações nas quais ter um design que pareça simétrico é mais importante do que as opções alinhadas à esquerda para facilitar a digitalização lexicográfica por seres humanos. Por exemplo, se eu quiser ter uma opção de seleção de gênero que preencha a tela 100% horizontalmente em um dispositivo móvel, parece muito estranho que os textos 'Masculino' e 'Feminino' sejam empurrados para a esquerda.
Kent Munthe Caspersen
tente alinhar texto por último: centro;
Ari #

Respostas:

29

Receio que isso não seja possível com CSS simples e não seja possível tornar completamente compatível com vários navegadores.

No entanto, usando um plugin jQuery, você pode estilizar o menu suspenso:

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

Este plugin oculta o selectelemento e cria spanelementos etc. rapidamente para exibir um estilo de lista suspensa personalizado. Estou bastante confiante de que você poderá alterar os estilos nos vãos, etc., para alinhar os itens no centro.

Curt
fonte
web.archive.org/web/20160328192510/http://filamentgroup.com/lab/… Aqui está a versão aprimorada agora que o grupo de filamentos não é mais mantido. github.com/fnagel/jquery-ui
cdignam
386

Existe uma solução parcial para o Chrome :

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

Ele centraliza a opção selecionada, mas não as opções dentro da lista suspensa.

Julian Cardenas
fonte
18
Não suportado no Safari
Buts
1
Também não é suportado no Edge.
mortenpi
13
Não funciona no Firefox, mas o que funciona no Firefox é text-align: center.
Noitidart 11/03
3
widthnão é necessário.
Vahid Amiri
3
Porra, isso é perfeito, também funciona no Firefox mais recente ... + rep
w411 3
81

Isso é para alinhar corretamente. Tente:

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

o suporte do navegador para o text-align-lastatributo pode ser encontrado aqui: https://www.w3schools.com/cssref/css3_pr_text-align-last.asp Parece que apenas o Safari ainda não o suporta.

Aly-Elgarhy
fonte
7
Essa deve ser a resposta principal, uma solução CSS simples e pura que funcionou perfeitamente para mim (embora eu mudei text-align-last: right;para centercomo queria os rótulos no meio).
JVG
Essa resposta é demais! Em nenhum outro lugar encontrei uma solução tão simples.
udog
Muito obrigado, esta resposta deve ser selecionada, pois isso funciona totalmente!
Nick
1
alinhamento de texto último: centro; sozinho funciona para mim no chrome e firefox. não na borda e eu não apostaria no safari.
Dennis Heiden
1
Isso não funciona em nenhum navegador móvel. Qual é o local onde eu gostaria que funcionasse.
evolross
58

Você precisa colocar a regra CSS na classe select.

Usar recuo de texto CSS

Exemplo

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

Código CSS

select { text-indent: 5px; }
marc carreras
fonte
2
Ou eu não consegui-lo, ou ele simplesmente não funciona para alinhar o texto
matanster
recuo do texto ... Interessante, eu não sabia sobre essa propriedade. Muito obrigado!
Froxx 07/07
9
Isso funcionará apenas para uma opção específica; o recuo do texto depende de quanto espaço horizontal ocupa o texto da opção em relação à largura da caixa de seleção; portanto, essa é uma resposta incompleta. usando recuo de texto foi fornecido pelo Sr. Smee acima.
Lu Roman
Uma ideia interessante, mas não funcionará com uma porcentagem. Como você pode centralizar todos os itens?
Buts
Essa é a resposta correta. Usando o recuo do texto: 50% centralizará a opção dentro da seleção.
John Smith
49

Sim, é possível. Você pode usar o último alinhamento de texto

text-align-last: center;
Manjeet Kumar Nai
fonte
1
Isso parece centralizar o valor exibido na seleção quando fechado. As opções no menu suspenso ainda estão alinhadas à esquerda (pelo menos em cromo como de setembro de 2019)
bjg222
1
Sim, eu quero exibir no centro e está correto #
Pritesh
24

2020, estou usando:

select {
    text-align: center;
    text-align-last: center;
    -moz-text-align-last: center;
}
jzuhri
fonte
Infelizmente, isso não funciona no safari ... e a partir de maio de 2020, a Apple ainda força todos os outros navegadores no iOS a usar o mecanismo de renderização do Safari ...
Doomd
22

apenas usando isso:

select {

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

}
Amine_Dev
fonte
3
Você não precisa incluir "padding-right: 29px;" se você estiver usando "center". Suspeito que sim, porque copiou a resposta de Aly-Elgarhy de 25 de outubro de 16.
Jayden Lawson
Quando você copiar da resposta de alguém, mencione o nome deles.
Munim Munna
Não, eu copiei isso diretamente do meu código, é por isso que coloquei o padding-right, pode ser que eu copiei a solução de outra para o meu código e copiei a solução do meu código para o stackoverflow.
Amine_Dev 8/01/19
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
fonte
1
Esta foi a única solução que me ajudou com +1
Maio de 2020 - Isso não funciona no Safari (ou em qualquer navegador de todos os dispositivos iOS)
Doomd
16

Essa função JS deve funcionar para você

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 aqui: http://codepen.io/anon/pen/NxyovL

Mr. Smee
fonte
9

Eu sempre tive o seguinte hack para fazê-lo funcionar apenas com css.

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

o preenchimento centralizará o texto e poderá ser ajustado para o tamanho do texto :)

Obviamente, isso não é 100% correto do ponto de vista da validação, eu acho, mas ele faz o trabalho :)

Ben Pretorius
fonte
7

Solução "falsa" alternativa se você tiver uma lista com opções semelhantes no tamanho do texto (por exemplo, seleção de página):

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

Isso funciona no Chrome, Firefox e Edge. O truque está aqui para empurrar o texto da esquerda para o centro e subtrair a metade do comprimento em px, em ou qualquer que seja o texto da opção.

insira a descrição da imagem aqui

Melhor solução A IMO (em 2017) ainda está substituindo o select via JS e construa sua própria caixa de seleção falsa com divs ou qualquer outra coisa e vincule eventos de clique nele para suporte entre navegadores.

Dennis Heiden
fonte
1
Funciona no Chrome, mas no IE parece um pouco para a direita do que no centro.
User3366706
5

Não muito centralizado, mas usando o exemplo acima, você pode criar uma margem esquerda na caixa de seleção.

<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
fonte
Por que não adicionar text-indentà <select>tag como @marc carreras disse?
Munim Munna
5

isso funcionou para mim:

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

tente isto:

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

Você não pode realmente personalizar <select>ou <option>muito. A única maneira (entre navegadores) seria criar manualmente uma lista suspensa com divs e css / js para criar algo semelhante.

Emmanuel
fonte
2

Se você não encontrou nenhuma solução, pode usar este truque em angularjs ou js para mapear o valor selecionado com um texto na div, esta solução é totalmente compatível com css em angular, mas precisa de um mapeamento entre 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>

Espero que isso possa ser útil para alguém, pois levei um dia para encontrar essa solução no phonegap.

jup31
fonte
não é no meio!
Qui-Gon Jinn
1

Embora não seja possível centralizar o texto da opção em uma seleção, você pode colocar uma div absolutamente posicionada sobre a parte superior da seleção para o mesmo efeito:

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

Certifique-se de que a div e a select tenham posições fixas no documento.

szozz
fonte
0

Ainda não é 100%, mas você pode usar esse trecho!

alinhamento de texto último: centro; // Para o alinhamento de texto do Chrome: center; // Para Firefox

Não funciona no Safari ou Edge, por enquanto!

user3645907
fonte
-3

se as opções forem estáticas, você poderá ouvir o evento de alteração na caixa de seleção e adicionar preenchimento para cada item individual

$('#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
fonte
Não é uma boa ideia colocar a esquerda para cada palavra. Que tal essas palavras vindas do banco de dados e são dinâmicas?
user3645907 15/06
-5

adicione & nbsp assim ...

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

até obter um efeito de texto alinhado ao centro

Ajesh Ajayan
fonte