Можно ли центрировать текст в поле выбора?

200

Я попробовал это: 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; }

Как видите, это не работает. Есть ли CSS-способ для центрирования текста в окне выбора?

Ильи
источник
5
В моем Firefox все работает правильно :)
Матеуш Рогульский
10
Не работает на хроме.
Эммануил
4
@Blazemonger Я могу представить себе множество ситуаций, в которых дизайн, который выглядит симметрично, является более важным, чем выравнивание по левому краю для облегчения лексикографического сканирования людьми. Например, если я хочу иметь опцию выбора пола, которая заполняет экран на 100% по горизонтали на мобильном устройстве, выглядит очень странно, что тексты «Мужской» и «Женский» выталкиваются полностью влево.
Кент Мунте Касперсен
попробуйте text-align-last: center;
Ари

Ответы:

30

Я боюсь, что это невозможно с простым CSS, и не будет возможности сделать полностью кросс-браузерную совместимой.

Однако, используя плагин jQuery, вы можете стилизовать выпадающий список:

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

Этот плагин скрывает selectэлемент, создает spanэлементы и т. Д. Для отображения собственного стиля выпадающего списка. Я вполне уверен, что вы сможете изменить стили на пролетах и ​​т. Д., Чтобы выровнять по центру элементы.

односложный
источник
web.archive.org/web/20160328192510/http://filamentgroup.com/lab/… Вот улучшенная версия теперь, когда filamentgroup больше не поддерживается. github.com/fnagel/jquery-ui
cdignam
390

Для Chrome есть частичное решение :

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

Он центрирует выбранную опцию, но не опции внутри выпадающего меню.

Джулиан Карденас
источник
18
Не поддерживается в Safari
Buts
1
Также не поддерживается на Edge.
mortenpi
13
Не работает в Firefox, но работает в Firefox text-align: center.
Noitidart
3
widthне обязательно.
Вахид Амири
3
Черт, это прекрасно, также работает на последнем Firefox ... + rep
w411 3
81

Это для выравнивания справа. Попытайся:

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

поддержка text-align-lastатрибута в браузере может быть найдена здесь: https://www.w3schools.com/cssref/css3_pr_text-align-last.asp Похоже, что только Safari все еще не поддерживает его.

Aly-Elgarhy
источник
7
Это должен быть главный ответ, простое и чистое CSS-решение, которое идеально для меня работало (хотя я перешел text-align-last: right;на то, centerкак я хотел, чтобы ярлыки были посередине).
JVG
Этот ответ потрясающий! Нигде больше я не нашел такого простого решения.
Удог
Большое спасибо, этот ответ должен быть выбран, так как это полностью работает!
Ник
1
выравнивания текста, последний: центр; у меня один работает в chrome и firefox. не в краю, и я бы поставил на сафари.
Деннис Хайден
1
Это не работает ни в одном мобильном браузере. Вот где в первую очередь я бы хотел, чтобы это работало.
evolross
58

Вы должны поместить правило CSS в класс select.

Использовать CSS-отступ

пример

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

Код CSS

select { text-indent: 5px; }
Марк Каррерас
источник
2
Либо я не получил его, либо он просто не работает для выравнивания текста
matanster
текстовый отступ ... Интересно, я не знал об этом свойстве. Большое спасибо!
Froxx
9
Это будет работать только для одной конкретной опции, текстовый отступ зависит от того, сколько горизонтального пространства занимает текст опции по отношению к ширине selectbox, так что это неполный ответ, я поражен, что получил 43 отзыва, правильный ответ текстовый отступ был предоставлен г-ном Сми выше.
Лу Роман,
Интересная идея, но она не будет работать с процентами, так как вы можете центрировать каждый элемент?
Бутс
Это правильный ответ. Используя текстовый отступ: 50% будет центрировать опцию для вас внутри выбора.
Джон Смит
51

Да, это возможно. Вы можете использовать text-align-last

text-align-last: center;
Манджит Кумар Най
источник
1
Кажется, это центрирует значение, отображаемое в выбранном, когда оно закрыто. Параметры в раскрывающемся списке по-прежнему выровнены влево (по крайней мере, в Chrome по состоянию на сентябрь 2019 г.)
bjg222
1
Да, я хочу показать в центре, и это правильно
Pritesh
26

2020, я использую:

select {
    text-align: center;
    text-align-last: center;
    -moz-text-align-last: center;
}
jzuhri
источник
1
К сожалению, это не работает в Safari ... и по состоянию на май 2020 года Apple по-прежнему заставляет все другие браузеры на iOS использовать движок рендеринга Safari ...
Doomd
22

просто используя это:

select {

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

}
Amine_Dev
источник
3
Вам не нужно включать "padding-right: 29px;" если вы используете "центр". Я подозреваю, что у вас есть, потому что вы скопировали ответ Али-Элгархи от 25 октября 16 года.
Джейден Лоусон
Когда вы копируете чей-то ответ, вы должны упомянуть его имена.
Муним Мунна
Нет, я скопировал это прямо из моего кода как есть, поэтому я добавил отступ справа, может быть, я скопировал решение из другого в мой код, а затем скопировал решение из моего кода в 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
Это было единственное решение, которое помогло мне +1
Май 2020 - Это не работает в Safari (или любом браузере на всех устройствах iOS)
Doomd
16

Эта функция JS должна работать для вас

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 здесь: http://codepen.io/anon/pen/NxyovL

Мистер Сми
источник
9

Мне всегда удавалось использовать следующий хак, чтобы заставить его работать только с CSS.

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

отступ будет центрировать текст и может быть настроен для размера текста :)

Я думаю, это не на 100% правильно с точки зрения валидации, но это делает работу :)

Бен Преториус
источник
7

Альтернативное «поддельное» решение, если у вас есть список с опциями, аналогичными по длине текста (например, выберите страницу):

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

Это работает в Chrome, Firefox и Edge. Хитрость здесь в том, чтобы переместить текст слева в центр, а затем вычесть половину длины в px, em или любую другую часть текста опции.

введите описание изображения здесь

Лучшее решение IMO (в 2017 году) по-прежнему заменяет select через JS и создает свой собственный фальшивый флажок выбора с помощью div или чего-либо еще и связывает события клика на нем для поддержки кросс-браузерной работы.

Деннис Хайден
источник
1
Работает в Chrome, но в IE выглядит немного правее, чем в центре.
user3366706
5

Не совсем Центрирование, но используя пример выше, вы можете сделать левое поле в поле выбора.

<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>
Ричард
источник
Почему бы просто не добавить text-indentв <select>тег, как сказал @marc carreras?
Муним Мунна
5

это сработало для меня:

text-align: center;
text-align-last: center;
Диего Санта Круз Мендесу
источник
3

попробуй это :

select {
    padding-left: 50% !important;
    width: 100%;
}
hmahdavi
источник
2

Вы не можете настроить <select>или <option>многое другое. Единственный способ (кросс-браузерный) - вручную создать выпадающий список с помощью divs и css / js, чтобы создать нечто подобное.

Эммануэль
источник
2

Если вы не нашли никакого решения, вы можете использовать этот трюк на angularjs или js, чтобы отобразить выбранное значение с текстом на div, это решение полностью соответствует CSS для angular, но требуется сопоставление между select и 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>

Надеюсь, что это может быть полезно для кого-то, так как мне потребовался один день, чтобы найти это решение в телефонной пробке.

jup31
источник
его не в середине!
Куай-Гон Джинн
1

Хотя вы не можете центрировать текст опции внутри выделения, вы можете поместить абсолютно позиционированный div поверх верхней части выбора с тем же эффектом:

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

Убедитесь, что div и select имеют фиксированные позиции в документе.

szozz
источник
0

Это еще не 100%, но вы можете использовать этот фрагмент!

text-align-last: center; // Для Chrome text-align: center; // Для Firefox

Пока не работает на Safari или Edge!

user3645907
источник
-3

если параметры статичны, вы можете прослушать событие изменения в поле выбора и добавить заполнение для каждого отдельного элемента

$('#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;
    }
});
Брайан Паркс
источник
Это не очень хорошая идея ставить отступы слева для каждого слова. Как насчет слов, поступающих из базы данных и являющихся динамическими?
user3645907
-5

добавить вот так ...

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

пока вы не получите эффект выравнивания текста по центру

Ажеш Аджаян
источник