Как уменьшить окно элемента `select`?

128
31 декабря 2020, 12:00

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

ужё 5 часа ищу из инет, но никак не мог найти ответ.

тут скрин: Как уменьшить появляющий окно элемента select?

А вообще есть другие варианты вместа элемента select?

Answer 1

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

JsFiddle

(function(){ 
  let hint   = document.getElementById('FullHint'); 
  let select = document.getElementsByClassName('select'); 
  let modal  = document.getElementsByClassName('modal-options'); 
  for( let i = 0; i < select.length; i++){ 
    /* Специально заранее добавляется value всем селектам, чтобы выбранный можно было 
    достать через select[].value, как в случае с обычными опциями*/ 
    select[i].value = ""; 
    select[i].addEventListener('click', function(){ 
      /* При клике на селект - вылетает большое окно выбора 
      и скрывается всплывающая подсказка, если она была*/ 
      modal[i].style.display = 'block'; 
      hint.classList.remove('show'); 
    }); 
    /* Кусок для всплывающего текста-подсказки, если выбран слишком длинный текст*/ 
    select[i].addEventListener('mouseenter', function(){ 
      if( this.value.length > 10 ){ 
        hint.innerText = this.value; 
        hint.classList.add('show');         
      } 
    }); 
    select[i].addEventListener('mousemove', function(e){ 
      hint.style.top = (e.pageY + 25) + 'px'; 
      hint.style.left = (e.pageX + 25) + 'px'; 
    }); 
    select[i].addEventListener('mouseleave', function(){ 
      hint.classList.remove('show'); 
    }); 
    /* конец куска подсказок */ 
     
    /* При клике на список опций (или вне списка) - окно закрывается */ 
    modal[i].addEventListener('click', function(){ 
      this.style.display = 'none'; 
    }); 
     
    /* Достаем все опции внутри текущего окна */ 
    let option = modal[i].getElementsByClassName('option'); 
    for(let u = 0; u < option.length; u++){ 
      option[u].addEventListener('click', function(){ 
        /* При клике на очередную - меняем value и innerText селекта */ 
        let text = this.innerText; 
        select[i].value = text; 
        if( text.length > 10 ){ 
          text = text.slice(0,8) + '...'; 
        } 
        select[i].innerText = text; 
      }); 
    } 
  } 
})();
* {margin: 0;} 
.select { 
  display: inline-block; 
  width: 100px; max-width: 100px; 
  border: 1px solid #9c009c; 
  overflow: hidden; 
  padding: 2px 4px; 
  box-sizing: border-box; 
  margin: 5px; 
  cursor: pointer; 
} 
.select:hover {background-color: #b2307c; color: white;} 
.select:before {content: '▼'; font-size: 12px;} 
 
.modal-options { 
  position: fixed; display: none; 
  z-index: 2147483647; /* Максимально возможный z-index; */ 
  width: 100vw; height: 100vh; 
  top: 0; 
  background-color: rgba(200,0,0,0.2); 
} 
.options { 
  width: 80%; max-width: 1200px; height: 90vh; 
  margin: 5vh auto; 
  background-color: #ffd2ff; 
  border: 1px solid #9c007c; 
  overflow: auto; 
} 
.option { 
  border-bottom: 1px solid #9c007c; 
  padding: 2px; cursor: pointer; 
} 
.option:hover {background-color: #ffeeee;} 
 
#FullHint { 
  display: none; 
  max-width: 1200px; background-color: white;  
  border: 2px solid #ec306c; 
  padding: 2px 4px; 
} 
#FullHint.show { 
  display: inline-block; 
  position: absolute; 
  margin-right: 30px; 
}
<div id="FullHint"></div><!-- Добавлен для всплывающей подсказки при наведении --> 
 
<div class="select">select...</div> 
<div class="modal-options"> 
  <div class="options"> 
    <div class="option"> 
      Писец какой длинный тект, просто нереально длинный, очень-очень длинный текст 
    </div> 
    <div class="option">Другой текст</div> 
    <div class="option">бубу</div> 
    <div class="option">куку</div> 
  </div> 
</div> 
 
<div class="select">select...</div> 
<div class="modal-options"> 
  <div class="options"> 
    <div class="option"> 
      Писец какой длинный тект, просто нереально длинный, очень-очень длинный текст 
    </div> 
    <div class="option">Другой текст</div> 
    <div class="option">бубу</div> 
    <div class="option">куку</div> 
  </div> 
</div>

P.s. не разобрался, как центрировать блок сверху и снизу... если у него абсолютная позиция. top: 0; bottom 0; растягивают его на всю страницу, если не задан height. А он не может быть задан, т.к. контент разный.

Answer 2

Как вариант, можете использовать этот плагин http://gregfranko.com/jquery.selectBoxIt.js/ Он достаточно прост в использовании и позволяет неплохо кастомизировать селекты.

Answer 3

Количество показываемых строк может задать атрибутом size="количество строк", а ширину окна можно стилизовать с помощью css и задать открытому окну максимальную ширину. А на счет других вариантов... Вы можете сделать select кнопкой или ссылкой, ппри нажатии на которую будет открываться импровизированный список по центру экрана с выбранными вариантами, если вариантов будет очень много, то будет ползунок справа , а высота будет неизменной, это если в крации:)

Тут, конечно в дело вступает или jquery или js

Answer 4

родителю задаёшь position:relative; display: flex; align-items: center;

READ ALSO
Активность пользователя JS, JQuery

Активность пользователя JS, JQuery

Возможно ли на JS определить активность пользователя?

128
parcel html настройка проекта

parcel html настройка проекта

Коллеги такой вопросИспользую сборщик parcel

107
Проблемы с декларации переменных

Проблемы с декларации переменных

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

130
Рекурсивный проход по элементам XML

Рекурсивный проход по элементам XML

Я выбрал tinyxml2 для парсинга XML файлов, хочу узнать как рекурсивно обойти элементы XML

86