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?


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.


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.


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.


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

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;

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

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;

}

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>


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


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


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.


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>

Pourquoi ne pas simplement ajouter text-indentà <select>tag comme Carreras de @marc dit?
Munim Munna


3

essaye ça :

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

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.


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.


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.


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!


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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.