Как изменить размер option css

For example,in the code,"option"is too low,I want to make it higher only with css(no javascript). Beijing ShangHai ...

For example,in the code,»option»is too low,I want to make it higher only with css(no javascript).

<select>
    <option>Beijing</option>
    <option>ShangHai</option>
    <option>WuHan</option>
  </select>

Ganesh Salunkhe's user avatar

asked Mar 25, 2015 at 13:19

王晨阳's user avatar

6

Since that <option> (and <select>) elements are rendered by the browser as a dropdown list, unfortunately you cannot style them, because their style is only controlled by the browser itself.

answered Mar 25, 2015 at 13:24

Marco Bonelli's user avatar

Marco BonelliMarco Bonelli

60.9k20 gold badges119 silver badges123 bronze badges

Change select > option to ul > li list and you can style as you want it yourself with Cross browser compatibility

answered Mar 25, 2015 at 13:26

Michal Kucaj's user avatar

You can use ul as alternative to style as you want, check this answer.

You can only make options bold or change the font-size, but it’s not possible to change the space of the option.

option{font-size:20px;font-weight:bold;}
<select>
    <option>Beijing</option>
    <option>ShangHai</option>
    <option>WuHan</option>
  </select>

Options are rendered by the OS, not HTML, so the styling is limited.

Community's user avatar

answered Mar 25, 2015 at 13:26

Nima's user avatar

NimaNima

2,0912 gold badges23 silver badges32 bronze badges

0

line-height can be useful
-webkit-appearance: menulist-button this one can be used both will work

answered Mar 25, 2015 at 13:24

Sagar Naliyapara's user avatar

Sagar NaliyaparaSagar Naliyapara

3,8635 gold badges39 silver badges61 bronze badges

Try this:

option{
     padding:10px 0;
   }

JSFIDDLE DEMO

Also you can use the <optgroup> element to make it run in Chrome.

EDIT:-

Just saw that it is not reliable and cant be addressed perfectly for cross browser solutions.

MDN says:

Some elements simply can’t be styled using CSS. These include all
advanced user interface widgets such as range, color, or date controls
as well as all the dropdown widgets, including , , and elements. The
file picker widget is also known not to be stylable at all. The new
and elements also fall in this category.

Alternative other than Javascript:

If possible then use Bootstrap’s Dropdown.

answered Mar 25, 2015 at 13:23

Rahul Tripathi's user avatar

Rahul TripathiRahul Tripathi

166k31 gold badges272 silver badges328 bronze badges

5

If you’re concerning about the mobile friendliness or the Google’s mobile first SEO guidelines where the tappable items must not close to each other, then don’t worry, modern mobile web browser will auto-adjust the item height for you.

answered Jul 22, 2020 at 9:17

Antonio Ooi's user avatar

Antonio OoiAntonio Ooi

1,42516 silver badges29 bronze badges

Try This: change the height px to what you wish.

.a option { height: 50px; }

Soner Gönül's user avatar

Soner Gönül

96k102 gold badges205 silver badges356 bronze badges

answered Mar 25, 2015 at 13:30

Sonam's user avatar

SonamSonam

2,3222 gold badges13 silver badges5 bronze badges

2

enter image description here

In the picture, the width of option is larger than the select box. I want to set width of those options as same as select box & for those larger options set text-overflow as ellipsis. Any help would be appreciated.

Here is what I tried:

Html

<select>
    <option>Select your University</option>
    <option>Bangladesh University of Engineering and Technology</option>
    <option>Mawlana Bhashani Science and Technology University</option>
</select>

Css

select, option {
    width: 250px;
}

option {
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
}

Fiddle: https://jsfiddle.net/3bsbcqfz/

isherwood's user avatar

isherwood

56.5k16 gold badges109 silver badges151 bronze badges

asked Apr 17, 2016 at 12:47

Mahedi Sabuj's user avatar

Mahedi SabujMahedi Sabuj

2,8443 gold badges14 silver badges27 bronze badges

2

I tried to find a solution from CSS. But I failed to do it. Doesn’t matter, I have written a simple javascript code for it. This is can do it something for it.

function shortString(selector) {
  const elements = document.querySelectorAll(selector);
  const tail = '...';
  if (elements && elements.length) {
    for (const element of elements) {
      let text = element.innerText;
      if (element.hasAttribute('data-limit')) {
        if (text.length > element.dataset.limit) {
          element.innerText = `${text.substring(0, element.dataset.limit - tail.length).trim()}${tail}`;
        }
      } else {
        throw Error('Cannot find attribute 'data-limit'');
      }
    }
  }
}

window.onload = function() {
  shortString('.short');
};
select {
  width: 250px;
}

option {
  width: 250px;
}
<select name="select" id="select">
  <option class='short' data-limit='37' value="Select your University">Select your University</option>
  <option class='short' data-limit='37' value="Bangladesh University of Engineering and Technology">Bangladesh University of Engineering and Technology</option>
  <option class='short' data-limit='37' value="Mawlana Bhashani Science and Technology University">Mawlana Bhashani Science and Technology University</option>
</select>

answered Apr 17, 2016 at 15:34

0xdw's user avatar

1

You can use javascript to make the length of the option text to be less so as that it matches the length of the option. I found no solution for only using css

var e=document.querySelectorAll('option')
e.forEach(x=>{
if(x.textContent.length>20)
x.textContent=x.textContent.substring(0,20)+'...';
})
select
{
width:160px;
}
<select>
<option>fwefwefwefwe</option>
<option>fwefwefwefwefwefwefwefwefwefwefwefwefwefwefwefwefwefwefwefwefwefwefwefwefwefwefwefwe</option>
</select>

answered Jan 29, 2020 at 6:25

ellipsis's user avatar

ellipsisellipsis

11.9k2 gold badges15 silver badges33 bronze badges

Another simple jquery solution is to rewrite the option’s length manually to get the wanted size as follow :

$('option').each(function() {
  var optionText = this.text;
  var newOption = optionText.substring(0, 36);
  $(this).text(newOption + '...');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js"></script>
<select style="width:250px">
    <option>Select your University</option>
    <option>Bangladesh University of Engineering and Technology</option>
    <option>Mawlana Bhashani Science and Technology University</option>
</select>

answered Jan 10, 2019 at 12:32

Alexandre Elshobokshy's user avatar

At last, I come up with the solution by creating Custom Drop-down using ul, li. Here is the solution:

FIDDLE DEMO

HTML

 $(document).ready(function (){
  $("div.selected").on("click", function () {
      var hasActiveClass = $("div.select-box").hasClass("active");

      if (hasActiveClass === false) {
          var windowHeight = $(window).outerHeight();
          var dropdownPosition = $(this).offset().top;
          var dropdownHeight = 95; // dropdown height

          if (dropdownPosition + dropdownHeight + 50 > windowHeight) {
              $("div.select-box").addClass("drop-up");
          }
          else {
             $("div.select-box").removeClass("drop-up");
          }

          var currentUniversity = $(this).find('text').text().trim();

          $.each($("ul.select-list li"), function () {
              var university = $(this).text().trim();
              if (university === currentUniversity)
                  $(this).addClass("active");
              else
                  $(this).removeClass("active");
          });
      }

      $("div.select-box").toggleClass("active");
  });

  $("ul.select-list li").on("click", function () {
      var university = $(this).html();
      $("span.text").html(university);
      $("div.select-box").removeClass("active");
  });

  $("ul.select-list li").hover(function () {
      $("ul.select-list li").removeClass("active");
  });

  $(document).click(function (event) {
      if ($(event.target).closest("div.custom-select").length < 1) {
          $("div.select-box").removeClass("active");
      }
  });

});
div.custom-select 
{
    height: 40px;
    width: 400px;
    position: relative;
    background-color: #F2F2F2;
    border: 1px solid #E4E4E4;
}

div.selected
{
    width: inherit;
    cursor: pointer;
    line-height: 20px;
    display: inline-block;
}

div.selected > .text
{
    padding: 10px;
    display: block;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
}

div.select-box
{
    display: none;
    width: 100%;
    z-index: 10029;
    position: absolute;
    border-radius: 3px;
    box-shadow: 0 8px 20px #000000;
    box-shadow: 0 8px 20px rgba(0,0,0,.35)
}

div.select-box.active
{
    display: block;
}

div.select-box.drop-up
{
    top: auto;
    bottom: 100%;
}

ul.select-list
{
    margin: 0;
    padding: 10px;
    list-style-type: none;
}

ul.select-list li
{
    cursor: pointer;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
}

ul.select-list li:hover,
ul.select-list li.active
{
    background-color: #999999;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='custom-select'>
    <div class="selected">
       <span class='text'>Select</span>
    </div>
    <div class='select-box'>
       <ul class='select-list'>
          <li data-row='0' data-value=''>
              Select
          </li>
          <li data-row='1' data-value='BUET'>
              Bangladesh University of Engineering and Technology
          </li>
          <li data-row='2' data-value='MBSTU'>
              Mawlana Bhashani Science and Technology University
          </li>
       </ul>
    </div>
</div>

MaxiGui's user avatar

MaxiGui

6,1054 gold badges16 silver badges33 bronze badges

answered Jun 2, 2016 at 20:37

Mahedi Sabuj's user avatar

Mahedi SabujMahedi Sabuj

2,8443 gold badges14 silver badges27 bronze badges

If you don’t mind using jQuery, here is a simple solution. Just run it at the beginning of your code and it’s applicable to every select

$('select').change(function(){
  var text = $(this).find('option:selected').text()
  var $aux = $('<select/>').append($('<option/>').text(text))
  $(this).after($aux)
  $(this).width($aux.width())
  $aux.remove()
}).change()
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select>
  <option>Select your University</option>
  <option>Bangladesh University of Engineering and Technology</option>
  <option>Mawlana Bhashani Science and Technology University</option>
</select>

answered Dec 15, 2021 at 21:32

João Pimentel Ferreira's user avatar

1

This may be a little late, but I found that using CodeIgniter’s word_limiter() function may do what you need, for example:

<option><?php echo word_limiter("Bangladesh University of Engineering and Technology",1); ?></option>

If you’re not using CodeIgniter, you may just look up the function.

Hope this helps!

answered Sep 14, 2022 at 15:36

Daniel Rg's user avatar

Стандартный вид

<select>
    <option value="" hidden disabled selected>Выбрать</option>
    <option>Мальчик</option>
    <option>Девочка</option>
</select>

Далее полигон для испытаний (в течении месяца после написания статьи перестало работать то, что раньше работало в Mozilla Firefox).

Стили, применяемые к <select>

<style>
select { 
  font-size: 120%;
  width: 100%;
}
</style>

Убрать у <select> стрелку

<style>
select {
  -moz-appearance: none;
  -webkit-appearance: none;
  appearance: none;
}
select::-ms-expand {  
    display: none;
}
</style>

Псевдоэлементы (::before, ::after и др.) у <select>

<style>
select::after { 
  content: " after";
}
</style>

Стили, применяемые к <option>

<style>
option:nth-child(3)::after {
  content: " " url(http://www.blogger.com/img/icon_28_followers.png);
  vertical-align: middle;
}
</style>
<select>
    <option value="" hidden disabled selected>Выбрать</option>
    <option>Яблоко</option>
    <option>Груша</option>
    <option>Мандарин</option>
    <option>Апельсин</option>
    <option>Лимон</option>
    <option>Абрикос</option>
    <option>Персик</option>
</select>
<style>
option:nth-child(3)::after {
  content: " " url(http://www.blogger.com/img/icon_28_followers.png);
  vertical-align: middle;
}
</style>
<select size="2">
    <option>Яблоко</option>
    <option>Груша</option>
    <option>Мандарин</option>
    <option>Апельсин</option>
    <option>Лимон</option>
    <option>Абрикос</option>
    <option>Персик</option>
</select>

Стиль выбранного пункта

<style>
option:checked {
  background: olive linear-gradient(olive, olive);
  color: blue;
}
</style>
<select>
    <option>Яблоко</option>
    <option>Груша</option>
    <option>Мандарин</option>
    <option>Апельсин</option>
    <option>Лимон</option>
    <option>Абрикос</option>
    <option>Персик</option>
</select>

Стиль hover-пункта, на который наведен курсор мыши

<style>
option:hover {
  background: olive linear-gradient(olive, olive);
  color: blue;
}
</style>
<select>
    <option>Яблоко</option>
    <option>Груша</option>
    <option>Мандарин</option>
    <option>Апельсин</option>
    <option>Лимон</option>
    <option>Абрикос</option>
    <option>Персик</option>
</select>

Разный стиль у <select> и <option>

<style>
select:invalid:not(:focus) {
  color: gray;
}
select:invalid:focus {
  color: transparent;
}
select:focus option {
  color: initial;
}
</style>
<select required>
    <option value="" hidden disabled selected>Выбрать</option>
    <option>Мальчик</option>
    <option>Девочка</option>
</select>

Изображения в <option>

Тег <img> не поддерживается, так как его нельзя вставить в атрибут <label>

<select>
    <option value="" hidden disabled selected>Выбрать</option>
    <option>Мальчик</option>
    <option>Девочка <img alt="Иконка группы человек" src="http://www.blogger.com/img/icon_28_followers.png" height="28" width="28"></option>
</select>

Свойство background-image для <option>

<style>
option {
  padding: 6px 28px 6px 0;
}
option:nth-child(3) {
  background: url(http://www.blogger.com/img/icon_28_followers.png) 100% 50% no-repeat;
}
</style>
<select>
    <option value="" hidden disabled selected>Выбрать</option>
    <option>Яблоко</option>
    <option>Груша</option>
    <option>Мандарин</option>
    <option>Апельсин</option>
    <option>Лимон</option>
    <option>Абрикос</option>
    <option>Персик</option>
</select>
<style>
option {
  padding: 6px 28px 6px 0;
}
option:nth-child(2) {
  background: url(http://www.blogger.com/img/icon_28_followers.png) 100% 50% no-repeat;
}
</style>
<select size="2">
    <option>Яблоко</option>
    <option>Груша</option>
    <option>Мандарин</option>
    <option>Апельсин</option>
    <option>Лимон</option>
    <option>Абрикос</option>
    <option>Персик</option>
</select>

Вместо картинок можно использовать символы emoji или подключить файл со своим шрифтом, подменяющим символы на рисунки

<select>
    <option value="" hidden disabled selected>Выбрать</option>
    <option>Мальчик</option>
    <option>Девочка ❤️‍</option>
</select>
  • Теги <select>, <optgroup> и <option> | HTML
  • Стилизация <progress> и <input type=»range»/>

my selectbox is showing scroll when number of options are more than 20 i just want to show scrol in when options are more than 10

 <select>
    <option>1</option>
    <option>2</option>
    <option>3</option>
    <option>4</option>
    <option>5</option>
    <option>6</option>
    <option>7</option>
    <option>8</option>
    <option>9</option>
    <option>10</option>
    <option>11</option>
  </select>

asked May 8, 2014 at 6:35

Atif Azad's user avatar

5

Try adding this to the <select> element:

onfocus='this.size=10;' 
onblur='this.size=1;' 
onchange='this.size=1; this.blur();

like:

   <select onfocus='this.size=10;' onblur='this.size=1;' 
        onchange='this.size=1; this.blur();'>

SAMPLE DEMO

John's user avatar

John

12.3k12 gold badges94 silver badges163 bronze badges

answered May 8, 2014 at 6:41

reuelab's user avatar

reuelabreuelab

1,9761 gold badge18 silver badges28 bronze badges

3

Seriously guys, there is a size attribute for the select element:

<select size="10">
    <option>1</option>
    <option>2</option>
    <option>3</option>
    <option>4</option>
    <option>5</option>
    <option>6</option>
    <option>7</option>
    <option>8</option>
    <option>9</option>
    <option>10</option>
    <option>11</option>
</select>

FIDDLE: http://jsfiddle.net/UR46N/

John's user avatar

John

12.3k12 gold badges94 silver badges163 bronze badges

answered May 8, 2014 at 6:46

Vince C's user avatar

Vince CVince C

8586 silver badges16 bronze badges

1

In Case of setting size (height/width) and fitting the selection list in the pop up then try the following in VFPage- Salesforce:

<apex:selectList onclick="this.size=5;" required="true" id="form-element-05" value="{!scheduleBatchWrapper.hour}" size="1" styleClass="slds-select selectObj  slds-m-left_medium slds-m-top_medium schTime" style="max-width:50%; margin-bottom:5% margin-top:5%,max-height:20%" >
                                                                            <apex:selectOptions value="{!scheduleBatchWrapper.hoursList}"></apex:selectOptions>
                                                                        </apex:selectList>

// here onclick=»this.size=5;» will set the size to 5 when you click on the selectList.
//it works fine for Chrome,Firefox,Edge.

Thanks

answered May 27, 2020 at 12:22

Seemu Saikia's user avatar

As much as I see, none of the former answers explain the Options box.
As much as I know, we don’t have accessibility to manipulate options in a select box.
We just can change the colors and background color at the same time, add a new font and that’s all we could do.
If we add padding or margin to the Options, the drop-down list will be still the same as its initial condition.

The only way to do so is to design a select-box on your own( by using radio buttons, prevent their default style, and add a background color to it. )

answered Apr 27, 2021 at 11:13

Ahmad Khanzadeh's user avatar

<select>
    <option value="volvo">Volvo</option>
    <option value="saab">Saab</option>
    <option value="mercedes">Mercedes</option>
    <option value="audi">Audi</option>
</select>

option {
    padding: 5px 0;
}

answered Feb 1, 2020 at 7:42

Senthil Kumar's user avatar

1

I am using Bootstrap and this answer helped me.

.dropdown-menu {
    max-height: 280px;
    overflow-y: auto;
}

answered Oct 27, 2021 at 9:46

Anupam's user avatar

AnupamAnupam

14.6k18 gold badges66 silver badges93 bronze badges

1

use below css

select{ padding:5px;}

answered May 8, 2014 at 6:41

Amit's user avatar

AmitAmit

1,81119 silver badges36 bronze badges

my selectbox is showing scroll when number of options are more than 20 i just want to show scrol in when options are more than 10

 <select>
    <option>1</option>
    <option>2</option>
    <option>3</option>
    <option>4</option>
    <option>5</option>
    <option>6</option>
    <option>7</option>
    <option>8</option>
    <option>9</option>
    <option>10</option>
    <option>11</option>
  </select>

asked May 8, 2014 at 6:35

Atif Azad's user avatar

5

Try adding this to the <select> element:

onfocus='this.size=10;' 
onblur='this.size=1;' 
onchange='this.size=1; this.blur();

like:

   <select onfocus='this.size=10;' onblur='this.size=1;' 
        onchange='this.size=1; this.blur();'>

SAMPLE DEMO

John's user avatar

John

12.3k12 gold badges94 silver badges163 bronze badges

answered May 8, 2014 at 6:41

reuelab's user avatar

reuelabreuelab

1,9761 gold badge18 silver badges28 bronze badges

3

Seriously guys, there is a size attribute for the select element:

<select size="10">
    <option>1</option>
    <option>2</option>
    <option>3</option>
    <option>4</option>
    <option>5</option>
    <option>6</option>
    <option>7</option>
    <option>8</option>
    <option>9</option>
    <option>10</option>
    <option>11</option>
</select>

FIDDLE: http://jsfiddle.net/UR46N/

John's user avatar

John

12.3k12 gold badges94 silver badges163 bronze badges

answered May 8, 2014 at 6:46

Vince C's user avatar

Vince CVince C

8586 silver badges16 bronze badges

1

In Case of setting size (height/width) and fitting the selection list in the pop up then try the following in VFPage- Salesforce:

<apex:selectList onclick="this.size=5;" required="true" id="form-element-05" value="{!scheduleBatchWrapper.hour}" size="1" styleClass="slds-select selectObj  slds-m-left_medium slds-m-top_medium schTime" style="max-width:50%; margin-bottom:5% margin-top:5%,max-height:20%" >
                                                                            <apex:selectOptions value="{!scheduleBatchWrapper.hoursList}"></apex:selectOptions>
                                                                        </apex:selectList>

// here onclick=»this.size=5;» will set the size to 5 when you click on the selectList.
//it works fine for Chrome,Firefox,Edge.

Thanks

answered May 27, 2020 at 12:22

Seemu Saikia's user avatar

As much as I see, none of the former answers explain the Options box.
As much as I know, we don’t have accessibility to manipulate options in a select box.
We just can change the colors and background color at the same time, add a new font and that’s all we could do.
If we add padding or margin to the Options, the drop-down list will be still the same as its initial condition.

The only way to do so is to design a select-box on your own( by using radio buttons, prevent their default style, and add a background color to it. )

answered Apr 27, 2021 at 11:13

Ahmad Khanzadeh's user avatar

<select>
    <option value="volvo">Volvo</option>
    <option value="saab">Saab</option>
    <option value="mercedes">Mercedes</option>
    <option value="audi">Audi</option>
</select>

option {
    padding: 5px 0;
}

answered Feb 1, 2020 at 7:42

Senthil Kumar's user avatar

1

I am using Bootstrap and this answer helped me.

.dropdown-menu {
    max-height: 280px;
    overflow-y: auto;
}

answered Oct 27, 2021 at 9:46

Anupam's user avatar

AnupamAnupam

14.6k18 gold badges66 silver badges93 bronze badges

1

use below css

select{ padding:5px;}

answered May 8, 2014 at 6:41

Amit's user avatar

AmitAmit

1,81119 silver badges36 bronze badges

Когда речь заходит о кастомизации полей формы, наибольшую сложность представляет стилизация HTML-элемента select. В этом случае разработчики часто обращаются за библиотекой или фреймворком, в которых не всегда удачно и в полном объёме воспроизводится вся функциональность нативного элемента управления.

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

Ниже будет показано, что и как можно сделать с внешним видом select с помощью обычного CSS, оставаясь в рамках требований WCAG к доступности (читаемость, контрастность, пользовательские настройки), а также вариантов написания: справа-налево и слева-направо.

Основные стили

Сперва сбросим параметры текста.

select {
  font: inherit;
  letter-spacing: inherit;
  word-spacing: inherit;
}

font

Свойство font наследует все стили от контейнера(ов). Иногда при сбросе CSS указывают размер шрифта font-size, но в этом нет необходимости. font будет наследовать стили всех своих параметров: font-size, font-family, font-style, font-variant, font-weight, font-stretch и font-height (если установлено). Ещё он добавляет высоту строки line-height. В-общем, шрифт будет адаптироваться к изменениям, которые касаются всей страницы, либо с помощью надстроек, либо через настройки браузера/системы.

letter-spacing

Если пользователь (или автор) изменяет параметры текста, чтобы повлиять на расстояние между буквами, это не будет касаться предустановленных для поля значений. Наследование параметров font не повлияет на межбуквенное расстояние, поэтому нужно явно указать необходимость наследования значения letter-spacing: inherit. Это поможет соответствовать требованиям WCAG 2.1 Success Criterion 1.4.12: Text Spacing

word-spacing

Аналогично межбуквенному letter-spacing, значение word-spacing для управления интервалами между словами не будет наследоваться, если это не объявить явным образом. WCAG 1.4.12 применяется и для расстояния между словами.

line-height

Обратите внимание, что в коде не устанавливается высота строки line-height. Это значение нормально наследуется вместе с остальными параметрами шрифта в свойстве font. Если обнаружится, что это не так (например, из-за явной установки высоты строки ) можно добавить line-height: inherit, чтобы соответствовать WCAG 1.4.12.

Пример

В этом примере демонстрируется применение этого минимального набора стилей.

See this code Простой Select on x.xhtml.ru.

Как настроить стрелку для select

Часто, стрелка (индикатор того, что это выпадашка — поле выбора значений) по умолчанию плохо вписывается в дизайн и её лучше заменить на что-нибудь более подходящее. Вот необходимый минимум стилей, с помощью которых можно заменить стрелку у select:

select {
  font: inherit;
  letter-spacing: inherit;
  word-spacing: inherit;
  -moz-appearance: none;
  -webkit-appearance: none;
  appearance: none;
}

select:not([multiple]) {
  padding-right: 1.2em;
  background-repeat: no-repeat;
  background-position: calc(100% - 0.25em) 0.35em;
  background-size: 0.85em auto;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 80 80'%3E%3Cpath d='M70.3 13.8L40 66.3 9.7 13.8z' fill='%23000'%3E%3C/path%3E%3C/svg%3E");
}

/* скроет иконку стрелки в IE */
select::-ms-expand {
  display: none;
}

Здесь удаляются стили, устанавливаемые браузером, освобождается место для графической стрелки, а затем новая картинка стрелки вставляется в качестве фона. Это должно применяться только в том случае, если select обычный и предназначен для выбора одиночного значения, а не нескольких (multiple).

See this code Select с измененной стрелкой on x.xhtml.ru.

Этот пример демонстрирует замену стрелки по умолчанию элементу select.

Продолжение настройки select

Стоит обратить внимание, что интервалы у текста не очень хороши. Потенциально можно сделать их более привлекательными, удобными и доступными для пользователей с помощью всего нескольких дополнительных стилей. Например, можно настроить border и padding. Эти два свойства расширяют базовые стили, описанные выше, чтобы сделать текстовые поля более удобными.

select {
  font: inherit;
  letter-spacing: inherit;
  word-spacing: inherit;
  -moz-appearance: none;
  -webkit-appearance: none;
  appearance: none;
  /* рамка и отступы */
  border: 0.1em solid;
  padding: 0 0.2em;
}

border

Изменение значений CSS-свойств для рамки поля сопряжено с риском. Согласно WCAG (SC 1.4.11: Non-text Contrast), если для элемента формы не вносить изменений в стили по умолчанию, то это никак не повлияет на контрастность. Тем не менее, с помощью border: 0.1em solid будет установлена толщина рамки на основе размера шрифта. Теперь рамка поля выбора будет масштабироваться вместе с текстом. Заодно она становится толще, чем используется по умолчанию в большинстве браузеров.

Здесь умышленно не установлен цвет рамки, чтобы позволить браузеру сделать это самостоятельно. Конечно, если фон страницы не белый, можно изменить цвет рамки.

padding

Трогать padding для select не обязательно. Однако, содержимое поля будет немного легче читать и использовать, если немного его настроить. Это поможет сделать отступы в select ближе к аналогичным в textarea и input, если их тоже предстоит настраивать.

Стилизация состояний select

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

Отключено disabled

Отключенные поля исключаются из требований к контрастности WCAG, как и элементы управления интерфейса по умолчанию. Если ничего не делать, браузер самостоятельно сделает всё необходимое. Поэтому здесь не стоит что-то менять в настройках цвета фона поля или текста, достаточно позволить браузеру выполнить эту работу по его усмотрению.

Сфокусировано focused

WCAG SC 2.4.7 не рекомендует здесь ничего делать, согласно Technique G149, потому что браузер добавляет свой собственный стиль для фокуса. Тем не менее, можно сделать его ещё более очевидным, например, использовать синий контур с хорошим контрастом к белому и добавить тень:

select:focus {
  outline: 0.15em solid #00f;
  box-shadow: 0 0 0.2em #00f;
}

Только для чтения readonly

Нативный элемент <select> не поддерживает атрибут readonly.

Обязательное поле required

Пока label указывает, что поле обязательное (вместе с атрибутом required), нет большой необходимости стилизовать select как-то особенно. Но, например, можно увеличить обязательному полю толщину границы слева. В совокупности с оформлением других полей это может дать достаточно информации. Можно не менять цвет рамки, позволяя наследование (по умолчанию от стилей пользовательского агента).

select[required] {
  border-left-width: 0.3em;
}

Поле с ошибками

Одной красной рамки тут будет недостаточно (из-за сбоев WCAG по контрасту и только по цвету), а массивные тени могут испачкать всю страницу. Слишком много усилий по привлечению внимания к ошибкам создают шум, требующий от пользователей больших усилий для их устранения. Вместо этого можно добавить небольшой индикатор в углу поля. Градиент, образующий красную метку, устанавливает белый цвет фона поля. Обратите внимание, здесь в первый раз полю select явно задаётся цвет фона.

Здесь не будет использоваться селектор :invalid, потому что он может негативно влиять на нативное представление ошибок в браузере. Вместо этого можно использовать наличие-отсутствие aria-invalid, не просто переключая его с true на false, а добавляя или удаляя этот атрибут. Поскольку стрелка, как было решено выше, также является фоновым изображением, её здесь придётся повторно установить, если речь об обычном select без множественного выбора (multiple).

select[aria-invalid] {
  background: linear-gradient(
    135deg,
    rgba(255, 0, 0, 1) 0,
    rgba(255, 0, 0, 1) 0.4em,
    rgba(255, 255, 255, 0) 0.4em
  );
}

select[aria-invalid]:not([multiple]) {
  background-repeat: no-repeat, no-repeat;
  background-position: 0 0, calc(100% - 0.25em) 0.35em;
  background-size: 0.85em auto;
  background-image: linear-gradient(
      135deg,
      rgba(255, 0, 0, 1) 0,
      rgba(255, 0, 0, 1) 0.4em,
      rgba(255, 255, 255, 0) 0.4em
    ),
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 80 80'%3E%3Cpath d='M70.3 13.8L40 66.3 9.7 13.8z' fill='%23000'%3E%3C/path%3E%3C/svg%3E");
}

Стили для интернационализации

Чтобы не сильно усложнять, здесь речь пойдёт только о стилях написания справа налево, а при необходимости, будет не трудно разобраться и адаптировать это.

Для нативного поля выбора select достаточно поправить только стили, которые написаны, исходя из ожиданий для языков с написанием слева направо, а именно: стрелка, индикаторы обязательности и ошибки, которые позиционируются в зависимости от того, с какой стороны пользователь начинает читать. Здесь достаточно переместить стрелку, красную метку и более толстую границу на противоположную сторону.

*[dir="rtl"] select:not([multiple]) {
  padding-right: 0.2em;
  padding-left: 1.2em;
  background-position: 0.25em 0.35em;
}

*[dir="rtl"] select[required] {
  border-left-width: 0.1em;
  border-right-width: 0.3em;
}

*[dir="rtl"] select[aria-invalid] {
  background: linear-gradient(
    225deg,
    rgba(255, 0, 0, 1) 0,
    rgba(255, 0, 0, 1) 0.4em,
    rgba(255, 255, 255, 0) 0.4em
  );
}

*[dir="rtl"] select[aria-invalid]:not([multiple]) {
  background: linear-gradient(
    225deg,
    rgba(255, 0, 0, 1) 0,
    rgba(255, 0, 0, 1) 0.4em,
    rgba(255, 255, 255, 0) 0.4em
  ),
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 80 80'%3E%3Cpath d='M70.3 13.8L40 66.3 9.7 13.8z' fill='%23000'%3E%3C/path%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-size: auto, 0.85em auto;
  background-position: 0 0, 0.25em 0.35em;
}

Стили режима высокой контрастности Windows

Поскольку используются нативные элементы управления, нет вмешательства в цвета и стили для критически важных функций, которые отсутствуют в WHCM, т.е. в основном были применены системные стили — в этом направлении особо ничего делать не нужно.

Стиль подсветки контура outline здесь хорошо адаптируется. Переключение в disabled работает, как и должно по умолчанию. Стили border не затрагивают цвет и не повлияют работу с любой контрастностью.

Единственное, что может теряться — это индикация ошибки. При таком небольшом количестве цветов (система WHCM) может понадобиться акцент на другом визуальном индикаторе ошибок. Например, использовать label, чтобы четко указать на ошибки.

Стили для печати

Толщина границы масштабируется в зависимости от размера шрифта — это можно игнорировать. Пользователь, скорее всего, выберет размер шрифта, который будет разборчивым. Фоном отключенных полей и полей с ошибками можно управлять в настройках печати. Размер текста для поля не изменялся, наследуется. Здесь ничего не надо делать.

Стили для тёмного режима (dark mode)

Тёмный режим — это функциональный запрос, который нужно создать для поддержки стилей. Здесь не будет примера, а только рекомендации. Достаточно выбрать цвет фона и цвет шрифта и не писать все новые стили с нуля.

Следует наследовать цвет текста и фон (или сделать его прозрачным) и выбрать цвет рамки, который по-прежнему соответствует требованиям контрастности. Стили состояния при фокусировке тоже нуждаются в достаточном контрасте. Метка для состояния при ошибке зависит от фонового градиента к белому, поэтому нужно будет полностью переопределить стили ошибок, в том числе для RTL. Отключенные (disabled) поля также потребуют некоторой работы, так как явно заданы цвета границ и текста.

Заключение

Пример стилизованного select в разных состояниях с сохранением WCAG-доступности.

See this code Select Menus on x.xhtml.ru.

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

Похожие публикации, посвященные стилизации HTML-элемента select: Select Like It’s 2019 и Custom Select Styles with Pure CSS немного отличаются подходами, но заслуживают не меньшего внимания. Может быть эти варианты даже лучше соответствуют вашим целям и требованиям.

Under-Engineered Select Menus.

6 ответов

Измените выбор> на ul> li list, и вы можете стилизовать его самостоятельно, используя Cross Browser

Michal Kucaj
25 март 2015, в 14:44

Поделиться

Поскольку эти элементы <option><select>) отображаются браузером как выпадающий список, к сожалению, вы не можете их стилизовать, потому что их стиль контролируется только самим браузером.

Marco Bonelli
25 март 2015, в 14:29

Поделиться

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

option{
     padding:10px 0;
   }

JSFIDDLE DEMO

Также вы можете использовать <optgroup> element чтобы он запускался в Chrome.

РЕДАКТИРОВАТЬ:-

Просто видел, что он не является надежным и не может быть идеально рассмотрен для кросс-браузерных решений.

MDN говорит:

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

Альтернатива, кроме Javascript:

Если возможно, используйте Dropstrap Dropdown.

Rahul Tripathi
25 март 2015, в 14:23

Поделиться

Вы можете использовать ul как альтернативу стилю по своему усмотрению, проверьте этот ответ.

Вы можете сделать только варианты bold или изменить font-size, но это не возможно изменить пространство option.

option{font-size:20px;font-weight:bold;}
<select>
    <option>Beijing</option>
    <option>ShangHai</option>
    <option>WuHan</option>
  </select>

Параметры отображаются операционной системой, а не HTML, поэтому стилизация ограничена.

Nima
25 март 2015, в 14:56

Поделиться

line-height может быть полезна -webkit-appearance: menulist-button который можно использовать, оба будут работать

Sagar Naliyapara
25 март 2015, в 14:15

Поделиться

Попробуйте это: измените высоту px на то, что вы хотите.

.a option { height: 50px; }

Sonam
25 март 2015, в 13:34

Поделиться

Ещё вопросы

  • 1Java и Hadoop: несовместимые типы с TextInputFormat
  • 1Утвердить регулярное выражение водительских прав Великобритании в JavaScript
  • 0ndnSIM: угонщик не работает и опустошает яму
  • 1Python Datareader не может извлечь данные о запасах из Morningstar
  • 0Opengl направление света
  • 0Как нарисовать таблицу как вертикальную, используя Jquery?
  • 1JavaScript: понимание замыканий и подъема
  • 1Удалить жесты из RatingBar
  • 0Возврат указателя портит объект (нарушение прав доступа)
  • 0Загрузка CSS в представлениях в codeigniter ошибка
  • 1Обмен сообщениями и электронной почтой в Android?
  • 0Как перебрать множество пар значений JSON-объект
  • 0curl_easy_perform возвращает -1, когда сервер недоступен
  • 1C # Пользовательский тип данных с «выбором»
  • 1Shell выбирает Python 2.7, а не 3.7
  • 0Чтение из сокета со смещением с флагом MSG_PEEK?
  • 1Как создать шифр подстановки ключевых слов
  • 0Проблема с компиляцией функции, которая возвращает строку &
  • 0PHP / MySQL n-ая строка с DATE_SUB и т. Д.
  • 0MFC ActiveX CShockwaveflash элемент. Как отключить контекстное меню?
  • 0Сравнение объектов jQuery
  • 0показ QMessageBox с QThread, когда графический интерфейс заморожен
  • 0Ошибка при подключении базы данных mysql
  • 0Ошибка оператора копирования
  • 1как получить файл в Java (сервлет / JSP)
  • 1Объединить два файла Config.yml в Java?
  • 1Ошибка Tensorflow 1.7.1 с питоном 3.5
  • 0MySQL Fetch Result Использование нескольких соединений в одном запросе?
  • 0Цепочка подзапросов SQL в большом запросе JOINS
  • 1можно добавить ChartRangeFilter в пузырьковую диаграмму?
  • 0PHP: ошибка сегментации: 11
  • 0Форматирование входных значений, но с трудностями при обновлении модели
  • 1Назначение символа Unicode размером 4 байта для символа
  • 0Получить данные с URL-адреса для размещения на сайте
  • 0Как распечатать сетку и текстовые поля в JavaScript
  • 0В одном запросе MySQL я могу вернуть массив строк из поля с массивом первичных ключей
  • 1Внешний вид и поведение Java-приложения выглядят по-разному в NetBeans и Eclipse.
  • 0PHP Hash raw_output формат
  • 1Android 1.6: onActivityResult не вызывается
  • 0Как увидеть строку запроса на моей веб-странице из отдельного файла php?
  • 1Используя аналитику Google, возможно ли создать пользовательское измерение с помощью API (программно)
  • 0отображение изображения и текста в одном и том же DIV через контент
  • 1Керас: как реализовать целевую репликацию для LSTM?
  • 1Как удалить предметы из комбинированного магазина
  • 0Получение неверного абсолютного значения в C ++ / C
  • 0Возврат пользователей с помощью PayPal Rest API
  • 0Как использовать диалог JQuery в качестве диалога подтверждения в ASP.NET?
  • 0Попытка сделать ресурсы темы Tumblr прозрачными
  • 0Mysql Несколько пользователей, использующих diff diff SQL_CALC_FOUND_ROWS, ведут к общему количеству строк diff diff
  • 0MySQL REGEXP обнаружение границы слова с немецкими умлаутами при использовании BINARY Operator

Стилизация select на CSS

Для верстальщика обязательным порядком необходимо уметь стилизовать разные элементы формы. Согласитесь, что вряд ли дизайнер оставит форму, как в браузере, никак не приукрасив.

HTML разметка для select

Тег select поместим внутри тега div с классом select. Создадим две опции, между которыми и должен происходить выбор.


<div class="select">
    <select>
        <option value="Лимон">Лимон</option>
        <option value="Банан">Банан</option>
        <option value="Яблоко">Яблоко</option>
    </select>
</div>

Вот так select выглядит в браузере Chrome, без стилизации. Однако, с помощью CSS стилей, мы слегка его приукрасим: увеличим размер поля, отступы, цвет и стиль рамки, шрифт.

Стилизация select на CSS.

CSS для select

Зададим блоку select позицию relative, делаем мы это для позиционирования кастомной стрелочки, относительно этого блока.


.select {
    position: relative;
}

Стилизуем тег select. С помощью свойства appearance, убираем стандартные стрелочки у элементов формы. Затем добавляем для него вендорные префиксы для браузеров Chrome и Safari нужен –webkit, а для Firefox -moz.


.select select {
    display: block;
    width: 100%; /* от ширины блока div */
    padding: .75rem 2.5rem .75rem 1rem;/* отступы от текста до рамки */
    background: none; /* убираем фон */
    border: 1px solid #ccc; /* рамка */
    border-radius: 3px;/* скругление полей формы */
    -webkit-appearance: none;/* Chrome */
    -moz-appearance: none;/* Firefox */
    appearance: none;/* убираем дефолнтные стрелочки */
    font-family: inherit;/* наследует от родителя */
    font-size: 1rem;
    color: #444;
}

Воссоздадим убранную стрелочку при помощи псевдоэлемента after, применив разные свойства border. При клике внутри поля, показывается выпадающий список, за исключением при клике по самой стрелочке. Свойство pointer-events: none; отменяет стандартное поведение при клике по элементам, прописав которое, теперь при клике по стрелочке, так же появится, выпадающий список.


.select:after {
    content: "";
    display: block;
    border-style: solid;
    border-width: 6px 5px 0 5px;
    border-color: #000 transparent transparent transparent;
    pointer-events: none;
    position: absolute;
    top: 50%;
    right: 1rem;
    z-index: 1;
    margin-top: -3px;
}

Как вставить дизайнерскую стрелочку?

Ниже, я приведу два варианта, как вставить уникальную стрелочку, при верстке макета, если её нарисовал дизайнер.
Вместо стрелочки на CSS, можно добавить стрелочку в виде картинки в пустые кавычки content.


.select:after {
    content: " url(...) ";
}

или вставить картинку в виде фона без повтора.


.select select {
    background: url(...) no-repeat;
}

Демонстрация примера

Стилизация select option

Как вы уже заметили, что тег option, остался не стилизованным. Почему его не нужно стилизовать? Дело в том, что браузеры мобильных устройств, по разному отображают опции выбора и совсем не так, как на десктопных. Поэтому пользователи мобильных телефонов, так и так увидели бы выпадающий список без стилизации.

Заключение

Однако лучшим решением на 2019 год – это конвертировать иконку в SVG формат и вставить фоном. Такой вариант, гарантирует качественное изображение на любых разрешениях и разных масштабах.

В видеокурсе «Вёрстка сайта с нуля 2.0», я показываю на живом примере, как верстать сайт по макету.

  • Создано 22.05.2019 10:15:50


  • Михаил Русаков

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Как изменить размер messagebox
  • Как изменить размер listbox
  • Как изменить размер label visual studio
  • Как изменить размер label html
  • Как изменить размер label css

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии