Чи можливо центрувати текст у полі вибору?


199

Я спробував це: 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% по горизонталі на мобільному пристрої, виглядає дуже дивним, що тексти "Чоловік" і "Жіночий" висуваються повністю вліво.
Кент Мунт Касперсен

спробуйте вирівняти текст-останній: центр;
Арі

Відповіді:


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 все ще не підтримує його.


7
Це повинно бути головною відповіддю, простий і чистий розчин CSS , який прекрасно працював для мене (хоча я змінив , text-align-last: right;щоб centerя хотів мітки в середині).
JVG

Ця відповідь хитається! Ніде більше я не знайшов такого простого рішення.
udog

Велике спасибі, ця відповідь повинна бути обрана, оскільки це повністю працює!
Нік

1
text-align-last: центр; поодинці працює для мене в хромі та firefox. не в краю, і я б не ставку на сафарі.
Денніс Хайден

1
Це не працює в будь-яких мобільних браузерах. Саме там, в першу чергу, я хотів би, щоб це працювало.
еволюція

58

Вам потрібно поставити правило CSS у клас вибору.

Використовуйте текстовий відступ 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
Це буде працювати лише для одного конкретного варіанту, відступ тексту залежить від того, скільки горизонтального простору займає текст опції щодо ширини вибору, тому це неповна відповідь, я вражений, що отримав 43 відгуки, правильна відповідь Використання текстового відступу було надано містом Смієм вище.
Лу Роман

Цікава ідея, але вона не працюватиме з відсотком, тож як можна зосередити кожен окремий предмет?
Бут

Це правильна відповідь. Використання текстового відступу: 50% відзначить параметр для вас усередині вибору.
Джон Сміт

51

Так, можливо. Ви можете використовувати вирівнювання тексту останнім

text-align-last: center;

1
Це, здається, центрує значення, яке відображається у виборі, коли закривається. Параметри в спадному меню все ще вирівнюються зліва (принаймні в Chrome станом на вересень 2019 року)
bjg222

1
Так , я хочу , щоб відобразити в центрі , і це правильно
Pritesh

25

2020 рік, я використовую:

select {
    text-align: center;
    text-align-last: center;
    -moz-text-align-last: center;
}

1
На жаль, це не працює в сафарі ... і станом на травень 2020 року Apple все ще змушує всіх інших браузерів на iOS використовувати двигун візуалізації Safari ...
Doomd

22

просто використовуючи це:

select {

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

}

3
Вам не потрібно включати "padding-right: 29px;" якщо ви використовуєте "центр". Я підозрюю, що у вас є, тому що ви скопіювали відповідь Елі-Елгархі від 25 жовтня 1616 року.
Джейден Лоусон

Коли ви копіюєте з чиєїсь відповіді, ви повинні згадати їх імена.
Мунім Мунна

Ні, я скопіював це прямо з мого коду таким, яким він є, ось чому я перекинув накладку вправо, може бути, я скопіював рішення з іншого в свій код, а потім я скопіював рішення з мого коду в 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 році) все ще є заміна вибору за допомогою JS та створення власної підробленої скриньки вибору з дівками чи будь-яким іншим чином та прив’язування подій клацання до неї для підтримки крос-браузера.


1
Працює в Chrome, але в IE це виглядає трохи вправо, ніж в центрі.
користувач3366706

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 Каррерас сказав?
Мунім Мунна



2

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


2

Якщо ви не знайшли жодного рішення, ви можете скористатися цим фокусом на angularjs або за допомогою js для відображення вибраного значення з текстом у діві, це рішення є повним css, сумісним у кутовому, але потрібно зіставити між 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>

Сподіваюся, це може бути корисним для когось, оскільки мені знадобилося одного дня, щоб знайти це рішення на фонегапі.


його не в середині!
Qui-Gon Jinn

1

Хоча ви не можете зафіксувати текст опції в межах вибору, ви можете закласти абсолютно розміщений розділовий елемент у верхній частині вибору для того ж ефекту:

#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 мають фіксовані позиції в документі.


0

Це ще не на 100%, але ви можете використовувати цей фрагмент!

text-align-last: центр; // Для вирівнювання тексту Chrome: center; // Для Firefox

Наразі не працює на Safari чи Edge!


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

Це не дуже гарна ідея, що вкладає ліворуч для кожного слова. Як щодо цих слів, що надходять із бази даних та є динамічними?
користувач3645907

-5

додати & nbsp, як це ...

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

поки ви не отримаєте ефект тексту, вирівняного по центру

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.