Est-il possible de centrer le texte dans la case de sélection?

198

J'ai essayé ceci: 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; }

Comme vous pouvez le voir, cela ne fonctionne pas. Existe-t-il un moyen CSS uniquement de centrer le texte dans la zone de sélection?

ilyo
la source
5
Dans mon Firefox, cela fonctionne correctement :)
Mateusz Rogulski
10
Ne fonctionne pas sur le chrome.
Emmanuel
4
@Blazemonger Je peux imaginer de nombreuses situations dans lesquelles avoir un design qui semble symétrique est plus important que les options alignées à gauche pour faciliter le balayage lexicographique par les humains. Par exemple, si je veux avoir une option de sélection du genre qui remplit l'écran à 100% horizontalement sur un appareil mobile, il semble très étrange que les textes «Homme» et «Femme» soient poussés à fond à gauche.
Kent Munthe Caspersen,
essayez text-align-last: center;
Ari

Réponses:

29

Je crains que ce ne soit pas possible avec du CSS simple et qu'il ne soit pas possible de rendre complètement compatible avec tous les navigateurs.

Cependant, en utilisant un plugin jQuery, vous pouvez styliser la liste déroulante:

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

Ce plugin masque l' selectélément et crée des spanéléments, etc. à la volée pour afficher un style de liste déroulante personnalisé. Je suis assez confiant que vous seriez en mesure de modifier les styles sur les portées, etc. pour aligner les éléments au centre.

Sec
la source
web.archive.org/web/20160328192510/http://filamentgroup.com/lab/… Voici la version améliorée maintenant que filamentgroup n'est plus maintenu. github.com/fnagel/jquery-ui
cdignam
386

Il existe une solution partielle pour Chrome :

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

Il centre l'option sélectionnée, mais pas les options à l'intérieur de la liste déroulante.

Julian Cardenas
la source
18
Non pris en charge sur Safari
Buts
1
Non pris en charge sur Edge non plus.
mortenpi
13
Ne fonctionne pas dans Firefox, mais ce qui fonctionne dans Firefox l'est text-align: center.
Noitidart
3
widthn'est pas nécessaire.
Vahid Amiri
3
Merde, c'est parfait, fonctionne également sur le dernier Firefox ... + rep
w411 3
81

C'est pour aligner à droite. Essayez-le:

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

le support du navigateur pour l' text-align-lastattribut peut être trouvé ici: https://www.w3schools.com/cssref/css3_pr_text-align-last.asp Il semble que seul Safari ne le supporte toujours pas.

Aly-Elgarhy
la source
7
Cela devrait être la réponse de haut, une simple et pure solution CSS qui a parfaitement fonctionné pour moi (même si je l' ai changé text-align-last: right;pour centerque je voulais les étiquettes au milieu).
JVG
Cette réponse est géniale! Nulle part ailleurs je n'ai trouvé une solution aussi simple.
udog
Merci beaucoup, cette réponse doit être sélectionnée car cela fonctionne totalement!
Nick
1
text-align-last: centre; seul fonctionne pour moi dans Chrome et Firefox. pas dans le bord et je parierais sur safari non plus.
Dennis Heiden
1
Cela ne fonctionne dans aucun navigateur mobile. C'est là que j'aimerais surtout que ça marche.
evolross
58

Vous devez mettre la règle CSS dans la classe select.

Utiliser le retrait de texte CSS

Exemple

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

Code CSS

select { text-indent: 5px; }
marc carreras
la source
2
Soit je ne l'ai pas compris, soit cela ne fonctionne tout simplement pas pour aligner le texte
matanster
text-indent ... Intéressant, je ne connaissais pas cette propriété. Merci beaucoup!
Froxx
9
Cela ne fonctionnera que pour une option spécifique, le retrait de texte dépend de la quantité d'espace horizontal qui prend le texte de l'option par rapport à la largeur de la boîte de sélection, donc c'est une réponse incomplète, je suis étonné qu'il ait obtenu 43 votes positifs, la bonne réponse le retrait du texte a été fourni par M. Smee ci-dessus.
Lu Roman
Une idée intéressante, mais elle ne fonctionnera pas avec un pourcentage, alors comment centrer chaque élément?
Buts
Ceci est la bonne réponse. Utilisation du retrait de texte: 50% centrera l'option pour vous dans la sélection.
John Smith,
49

Oui c'est possible. Vous pouvez utiliser text-align-last

text-align-last: center;
Manjeet Kumar Nai
la source
1
Cela semble centrer la valeur affichée dans la sélection lorsqu'elle est fermée. Les options de la liste déroulante sont toujours alignées à gauche (au moins dans Chrome à partir de septembre 2019)
bjg222
1
Oui, je veux afficher au centre et c'est correct
Pritesh
24

2020, j'utilise:

select {
    text-align: center;
    text-align-last: center;
    -moz-text-align-last: center;
}
jzuhri
la source
Malheureusement, cela ne fonctionne pas en safari ... et depuis mai 2020, Apple force toujours tous les autres navigateurs sur iOS à utiliser le moteur de rendu de Safari ...
Doomd
22

juste en utilisant ceci:

select {

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

}
Amine_Dev
la source
3
Vous n'avez pas besoin d'inclure "padding-right: 29px;" si vous utilisez "centre". Je suppose que vous l'avez parce que vous avez copié la réponse d'Aly-Elgarhy du 25 octobre 16.
Jayden Lawson,
Lorsque vous copiez la réponse de quelqu'un, vous devez mentionner son nom.
Munim Munna
Non, j'ai copié cela directement à partir de mon code tel qu'il est, c'est pourquoi j'ai mis le padding-right, peut-être ai-je copié la solution d'un autre dans mon code, puis j'ai copié la solution de mon code dans 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
la source
1
C'était la seule solution qui m'a aidé +1
Mai 2020 - Cela ne fonctionne pas sur Safari (ou n'importe quel navigateur sur tous les appareils iOS)
Doomd
16

Cette fonction JS devrait fonctionner pour vous

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

M. Smee
la source
9

Je me suis toujours éloigné du hack suivant pour le faire fonctionner avec css uniquement.

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

le rembourrage centre le texte et peut être modifié pour la taille du texte :)

Ce n'est évidemment pas correct à 100% du point de vue de la validation, je suppose, mais ça fait l'affaire :)

Ben Pretorius
la source
7

Solution alternative "fausse" si vous avez une liste avec des options similaires en longueur de texte (sélection de page par exemple):

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

Cela fonctionne dans Chrome, Firefox et Edge. L'astuce consiste ici à pousser le texte de gauche à centre, puis à soustraire la moitié de la longueur en px, em ou quoi que ce soit du texte de l'option.

entrez la description de l'image ici

La meilleure solution IMO (en 2017) est toujours en train de remplacer la sélection via JS et de créer votre propre fausse boîte de sélection avec des divs ou autre chose et de lier des événements de clic dessus pour une prise en charge multi-navigateur.

Dennis Heiden
la source
1
Fonctionne dans Chrome, mais dans IE, il semble un peu plus à droite qu'à centre.
user3366706
5

Pas tout à fait Centrage mais en utilisant l'exemple ci-dessus, vous pouvez faire une marge gauche dans la zone de sélection.

<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
la source
Pourquoi ne pas simplement ajouter text-indentà <select>tag comme Carreras de @marc dit?
Munim Munna
5

cela a fonctionné pour moi:

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

essaye ça :

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

Vous ne pouvez pas vraiment personnaliser <select>ou <option>beaucoup. La seule façon (cross-browser) serait de créer manuellement une liste déroulante avec divs et css / js pour créer quelque chose de similaire.

Emmanuel
la source
2

Si vous n'avez trouvé aucune solution, vous pouvez utiliser cette astuce sur angularjs ou utiliser js pour mapper la valeur sélectionnée avec un texte sur le div, cette solution est entièrement compatible CSS sur angular mais nécessite un mappage entre select et 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>

J'espère que cela pourrait être utile pour quelqu'un car il m'a fallu un jour pour trouver cette solution sur phonegap.

jup31
la source
son non au milieu!
Qui-Gon Jinn du
1

Bien que vous ne puissiez pas centrer le texte de l'option dans une sélection, vous pouvez placer un div absolument positionné sur le dessus de la sélection pour le même effet:

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

Assurez-vous que les deux div et select ont des positions fixes dans le document.

szozz
la source
0

Ce n'est pas encore à 100%, mais vous pouvez utiliser cet extrait!

text-align-last: centre; // Pour Chrome text-align: center; // Pour Firefox

Ne fonctionne pas sur Safari ou Edge, pour l'instant!

user3645907
la source
-3

si les options sont statiques, vous pouvez écouter l'événement de changement sur votre boîte de sélection et ajouter un remplissage pour chaque élément individuel

$('#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
la source
Ce n'est pas une bonne idée de mettre un padding à gauche pour chaque mot. Que diriez-vous de ces mots provenant de la base de données et sont dynamiques?
user3645907
-5

ajoutez & nbsp comme ceci ...

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

jusqu'à ce que vous obteniez un effet de texte aligné au centre

Ajesh Ajayan
la source