¿Es posible centrar el texto en el cuadro de selección?

198

Intenté esto: 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 puede ver, no funciona. ¿Hay una manera solo de CSS para centrar el texto en el cuadro de selección?

ilyo
fuente
55
En mi Firefox funciona correctamente :)
Mateusz Rogulski
10
No funciona en cromo.
Emmanuel
44
@Blazemonger Puedo imaginar muchas situaciones en las que tener un diseño que se vea simétrico es más importante que las opciones alineadas a la izquierda para facilitar el escaneo lexicográfico por parte de los humanos. Por ejemplo, si quiero tener una opción de selección de género que llene la pantalla 100% horizontalmente en un dispositivo móvil, parece muy extraño que los textos 'Masculino' y 'Femenino' se presionen completamente hacia la izquierda.
Kent Munthe Caspersen
pruebe text-align-last: center;
Ari

Respuestas:

29

Me temo que esto no es posible con CSS simple, y no será posible hacer completamente compatible con todos los navegadores.

Sin embargo, utilizando un complemento jQuery, puede diseñar el menú desplegable:

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

Este complemento oculta el selectelemento y crea spanelementos, etc. sobre la marcha para mostrar un estilo de lista desplegable personalizado. Estoy bastante seguro de que podrá cambiar los estilos en los tramos, etc. para alinear los elementos al centro.

Brusco
fuente
web.archive.org/web/20160328192510/http://filamentgroup.com/lab/… Aquí está la versión mejorada ahora que ya no se mantiene el grupo de filamentos. github.com/fnagel/jquery-ui
cdignam
386

Hay una solución parcial para Chrome :

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

Centra la opción seleccionada, pero no las opciones dentro del menú desplegable.

Julián Cárdenas
fuente
18
No es compatible con Safari
Buts
1
No es compatible con Edge tampoco.
mortenpi
13
No funciona en Firefox, pero lo que funciona en Firefox es text-align: center.
Noitidart
3
widthno es necesario.
Vahid Amiri
3
Maldición, esto es perfecto, también funciona en la última
versión de
81

Eso es para alinear bien. Intentalo:

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

el soporte del navegador para el text-align-lastatributo se puede encontrar aquí: https://www.w3schools.com/cssref/css3_pr_text-align-last.asp Parece que solo Safari todavía no lo admite.

Aly-Elgarhy
fuente
77
Esta debería ser la respuesta principal, una solución CSS simple y pura que funcionó perfectamente para mí (aunque cambié text-align-last: right;a centercomo quería las etiquetas en el medio).
JVG
¡Esta respuesta es genial! En ningún otro lugar encontré una solución tan simple.
udog
¡Muchas gracias, esta respuesta debe ser la seleccionada ya que esto funciona totalmente!
Nick
1
text-align-last: centro; solo funciona para mí en Chrome y Firefox. no en el límite y apostaría por el safari tampoco.
Dennis Heiden
1
Esto no funciona en ningún navegador móvil. Que es donde principalmente me gustaría que funcione.
Evolross
58

Tienes que poner la regla CSS en la clase select.

Usar sangría de texto CSS

Ejemplo

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

Código CSS

select { text-indent: 5px; }
marc carreras
fuente
2
O no lo entendí, o simplemente no funciona para alinear el texto
matanster
sangría de texto ... Interesante, no sabía sobre esa propiedad. ¡Muchas gracias!
Froxx
9
Esto solo funcionará para una opción específica, la sangría de texto depende de cuánto espacio horizontal ocupa el texto de la opción en relación con el ancho del cuadro de selección, por lo que esta es una respuesta incompleta, me sorprende que haya 43 votos a favor, la respuesta correcta utilizando el guión de texto fue proporcionado por el Sr. Smee arriba.
Lu Roman
Una idea interesante, pero no funcionará con un porcentaje, entonces, ¿cómo puede centrar cada elemento?
Buts
Esta es la respuesta correcta. Usando sangría de texto: 50% centrará la opción dentro de la selección.
John Smith
49

Sí, es posible. Puedes usar text-align-last

text-align-last: center;
Manjeet Kumar Nai
fuente
1
Esto parece centrar el valor que se muestra en la selección cuando está cerrado. Las opciones en el menú desplegable todavía están alineadas a la izquierda (al menos en Chrome a partir de septiembre de 2019)
bjg222
1
Sí, quiero mostrar en el centro y es correcto
Pritesh
24

2020, estoy usando:

select {
    text-align: center;
    text-align-last: center;
    -moz-text-align-last: center;
}
jzuhri
fuente
Desafortunadamente, esto no funciona en safari ... y a partir de mayo de 2020, Apple todavía obliga a todos los demás navegadores en iOS a usar el motor de renderizado de Safari ...
Doomd
22

solo usando esto:

select {

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

}
Amine_Dev
fuente
3
No necesita incluir "padding-right: 29px;" si está usando "centro". Sospecho que sí porque copiaste la respuesta de Aly-Elgarhy del 25 de octubre de 2016.
Jayden Lawson
Cuando copie de la respuesta de alguien, debe mencionar sus nombres.
Munim Munna
No, lo copié directamente de mi Código tal como está, es por eso que puse el relleno a la derecha, puedo copiar la solución de otro en mi código, y luego copié la solución de mi código en 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
fuente
1
Esta fue la única solución que me ayudó a +1
Mayo de 2020: esto no funciona en Safari (o cualquier navegador en todos los dispositivos iOS)
Doomd
16

Esta función JS debería funcionar para usted

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

Señor smee
fuente
9

Siempre me salí con la suya para que funcione solo con CSS.

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

el relleno centrará el texto y se puede ajustar para el tamaño del texto :)

Obviamente, esto no es 100% correcto desde el punto de vista de la validación, supongo, pero hace el trabajo :)

Ben Pretorius
fuente
7

Solución alternativa "falsa" si tiene una lista con opciones similares en longitud de texto (selección de página, por ejemplo):

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

Esto funciona en Chrome, Firefox y Edge. El truco está aquí para empujar el texto de la izquierda al centro, luego restar la mitad de la longitud en px, em o lo que sea del texto de la opción.

ingrese la descripción de la imagen aquí

La mejor solución IMO (en 2017) todavía está reemplazando la selección a través de JS y construye tu propio cuadro de selección falso con divs o lo que sea y vincula los eventos de clic en él para soporte de navegador cruzado.

Dennis Heiden
fuente
1
Funciona en Chrome, pero en IE parece un poco a la derecha que en el centro.
user3366706
5

No del todo centrado, pero usando el ejemplo anterior puede hacer un margen izquierdo en el cuadro de selección.

<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>
Ricardo
fuente
¿Por qué no simplemente agregar text-indenta la <select>etiqueta como dijo @marc carreras?
Munim Munna
5

esto funcionó para mí:

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

prueba esto :

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

Realmente no se puede personalizar <select>o <option>mucho. La única forma (cross-browser) sería crear manualmente un menú desplegable con divs y css / js para crear algo similar.

Emmanuel
fuente
2

Si no encontró ninguna solución, puede usar este truco en angularjs o usar js para asignar el valor seleccionado con un texto en el div, esta solución es totalmente compatible con css en angular pero necesita una asignación entre select y 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 esto pueda ser útil para alguien, ya que me llevó un día encontrar esta solución en phonegap.

jup31
fuente
no está en el medio!
Qui-Gon Jinn el
1

Si bien no puede centrar el texto de la opción dentro de una selección, puede colocar un div absolutamente posicionado sobre la parte superior de la selección para el mismo efecto:

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

Asegúrese de que tanto el div como el select tengan posiciones fijas en el documento.

szozz
fuente
0

Todavía no es 100%, ¡pero puedes usar este fragmento!

text-align-last: centro; // Para Chrome text-align: center; // Para Firefox

¡No funciona en Safari o Edge, por ahora!

usuario3645907
fuente
-3

Si las opciones son estáticas, puede escuchar el evento de cambio en su cuadro de selección y agregar relleno para cada elemento 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
fuente
No es una buena idea poner relleno para cada palabra. ¿Qué tal estas palabras que provienen de la base de datos y son dinámicas?
user3645907
-5

agregar & nbsp como este ...

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

hasta que obtenga un efecto de texto alineado al centro

Ajesh Ajayan
fuente