Выпадающий список на css: Как создать выпадающее меню

Дебаунсинг выпадающего списка (меню сайта) средствами одного CSS / Habr

Предыстория

Около пяти-шести лет назад я переделывал меню на рабочем сайте (не называю). Меняли меню каталога со старомодного разворачивающегося на (сейчас относительно) современное выпадающее. Меню делали горизонтальное, выпадающее вправо.

Коллега обратил мое внимание на проблему «цепляния за соседние пункты» при передвижении курсора мыши к выпавшим подпунктам меню. Он предложил решить ее так, как это было тогда сделано на сайте Амазона, и скинул мне местную статью Загадка выпадающего списка «Амазона» (где и постановка задачи и описание решения и ссылки на).

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

Я долго ждал, когда увижу, что кто-то сделал что-то подобное (и мне не придется писать на Хабр), но пока не дождался. Возможно плохо смотрел.

Проблема

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

На картинке, думаю, понятно изображено. Двигать нужно по синим стрелкам. Кратчайшее движение по красной стрелке приведет к перескоку на пункты 4 и 3. Кто хочет проверить: ссылка на jsfiddle.

Мое решение

Живой пример возможно многим пояснит лучше дальнейших слов.

Мое решение: при зависании мыши над корневым пунктом меню закрываем соседние пункты прозрачным дочерним элементом (dom-елементом) этого пункта, таким образом, чтобы на соседних элементах событие hover уже не происходило.

В примере для наглядности этот вспомогательный элемент div. unhover сделал полупрозрачным красным. В продакте, конечно, ставим ему в стиле background: transparent.

А чтобы другой корневой пункт все-таки можно было выбрать, прячем этот вспомогательный div, если курсор передвинут непосредственно на него или на выпавший блок. Но делаем это с анимацией свойства width этого вспомогательного элемента.

В общем при движении курсора к подпунктам (зеленая стрелка) эта «шторка» div.unhover плавно но быстро сворачивается ему вслед. Скорость анимации нужно подбирать по ширине меню и скорости движения мыши среднестатистического посетителя.

Чтобы не происходило осцилляций вспомогательного блока, названия корневых пунктов обернуты в span‘ы, которые при наведении получают больший z-index, чем их сестринский div.unhover.

Заключение

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

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

Тег | htmlbook.ru

Internet ExplorerChromeOperaSafariFirefoxAndroidiOS
3.0+1.0+4.0+1.0+1.0+1.0+1.0+

Спецификация

HTML:3.24.015.0XHTML:1.01.1

Описание

Тег <select> позволяет создать элемент интерфейса в виде раскрывающегося списка, а также список с одним или множественным выбором, как показано далее. Конечный вид зависит от использования атрибута size тега <select>, который устанавливает высоту списка. Ширина списка определяется самым широким текстом, указанным в теге <option>, а также может изменяться с помощью стилей. Каждый пункт создается с помощью тега <option>, который должен быть вложен в контейнер <select>. Если планируется отправлять данные списка на сервер, то требуется поместить элемент <select> внутрь формы. Это также необходимо, когда к данным списка идет обращение через скрипты.

ЧебурашкаКрокодил ГенаШапоклякКрыса Лариса
Выберите герояЧебурашкаКрокодил ГенаШапоклякКрыса Лариса
Список множественного выбораРаскрывающийся список

Синтаксис

<select>
  <option>Пункт 1</option>
  <option>Пункт 2</option>
</select>

Атрибуты

accesskey
Позволяет перейти к списку с помощью некоторого сочетания клавиш.
autofocus
Устанавливает, что список получает фокус после загрузки страницы.
disabled
Блокирует доступ и изменение элемента.
form
Связывает список с формой.
multiple
Позволяет одновременно выбирать сразу несколько элементов списка.
name
Имя элемента для отправки на сервер или обращения через скрипты.
required
Список обязателен для выбора перед отправкой формы.
size
Количество отображаемых строк списка.
tabindex
Определяет последовательность перехода между элементами при нажатии на клавишу Tab

Также для этого тега доступны универсальные атрибуты и события.

Закрывающий тег

Обязателен.

Пример

HTML5IECrOpSaFx

<!DOCTYPE HTML>
<html>
 <head>
  <meta charset="utf-8">
  <title>Тег SELECT</title>
 </head>
 <body>  
 
  <form action="select1.php" method="post">
   <p><select size="3" multiple name="hero[]">
    <option disabled>Выберите героя</option>
    <option value="Чебурашка">Чебурашка</option>
    <option selected value="Крокодил Гена">Крокодил Гена</option>
    <option value="Шапокляк">Шапокляк</option>
    <option value="Крыса Лариса">Крыса Лариса</option>
   </select></p>
   <p><input type="submit" value="Отправить"></p>
  </form>
 </body>
</html>

Строчные элементыФормы

  • Поле со списком

Как настроить выпадающий список с помощью CSS

Знакомо ли вам чувство, которое вы испытываете, когда тратите несколько часов на то, чтобы все выглядело идеально, только для того, чтобы быть побежденным браузером! Позволь мне объяснить. Итак, мой день начался с тестирования страницы, которую я создавал для веб-сайта клиента. И что это, когда я заметил проблему. В то время как это конкретное *раздражение* осталось бы незамеченным неопытным глазом, мои очки дизайнера пользовательского интерфейса сразу же заметили это.

Проблема заключалась в том, что в разных браузерах поле выбора отображалось по-разному. Я знаю, что это не недавняя проблема. Дело в том, что каждый браузер отображает поле по-своему. Firefox — худший (в данном случае)… худший! И эта непоследовательность была темным пятном на моем творчестве.

Итак, прервём драму 😀 . Следующее, что я сделал, очевидно, попытался решить эту проблему. Погуглив об этом. Я не был готов так легко победить. Некоторые форумы предлагали мне использовать свойства -moz-appearance или -webkit-appearance , но я не смог найти действительно работающее решение.

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

Если не можешь изменить… Спрячь!

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

1. Поместите раскрывающийся список в контейнер
Для начала нам нужна определенная область для поля выбора. Эта область должна быть отмечена контейнером div, а поле выбора размещено внутри другого div.

 <дел>
    <дел>
       <выбрать имя="search_categories">
          
          
          
          
        

Внешний контейнер div отмечает область, в которой раскрывающийся список появится в браузере. Внутренний div содержит раскрывающийся список. Прежде чем продолжить, добавим базовый CSS:

 .search_categories{
  размер шрифта: 13px;
  отступ: 10px 8px 10px 14px;
  фон: #fff;
  граница: 1px сплошная #ccc;
  радиус границы: 6px;
  положение: родственник;
}
 

Итак, вот что у нас будет:

2. Увеличение ширины раскрывающегося списка
Далее следует увеличить ширину раскрывающегося списка, чтобы часть списка фактически вне содержащего внешнего div. И это делается с помощью CSS, конечно. И пока мы это делаем, давайте также стилизуем раскрывающийся список. И у вас есть полная свобода стилизовать его так, как вам нужно.

 .search_categories .select{
  ширина: 120%;
}
.search_categories .выбрать выбрать{
  фон: прозрачный;
  высота строки: 1;
  граница: 0;
  заполнение: 0;
  радиус границы: 0;
  ширина: 120%;
  положение: родственник;
  z-индекс: 10;
  размер шрифта: 1em;
} 

Вот что у нас получится:

3. Скрыть кнопку раскрывающегося списка
Последний шаг — уменьшить ширину списка, просто спрятав его с помощью CSS. Ты знаешь, что тебе здесь делать! Просто добавьте переполнение: скрыто в класс search_categories .

4. Улучшить внешний вид
О да! Я почти забыл. Таким образом, поле может не отображаться в виде списка для пользователей из-за скрытой кнопки раскрывающегося списка. Таким образом, чтобы сделать поле интуитивно понятным раскрывающимся списком, последний шаг — немного изменить класс select и добавить фоновое изображение стрелки.

 .search_categories .select{
  ширина: 120%;
  background:url('arrow.png') без повтора;
  фоновое положение: 80% центр;
} 

Готово!

Все CSS в одном месте…

Чтобы помочь вам, вот все CSS, которые я использовал, в одном месте!

 .search_categories{
  размер шрифта: 13px;
  отступ: 10px 8px 10px 14px;
  фон: #fff;
  граница: 1px сплошная #ccc;
  радиус границы: 6px;
  переполнение: скрыто;
  положение: родственник;
}
. search_categories .select{
  ширина: 120%;
  background:url('arrow.png') без повтора;
  фоновое положение: 80% центр;
}
.search_categories .выбрать выбрать{
  фон: прозрачный;
  высота строки: 1;
  граница: 0;
  заполнение: 0;
  радиус границы: 0;
  ширина: 120%;
  положение: родственник;
  z-индекс: 10;
  размер шрифта: 1em;
}
 

Как UX-разработчик, я хочу, чтобы все было идеально, даже если это потребует добавления дополнительного CSS. И хотя проблема не нарушала никакой функциональности, ее было важно исправить, чтобы улучшить взаимодействие с пользователем. Итак, хотя мой день начался плохо… он закончился хорошо, потому что я решил проблему 🙂 …. Итак, если вы ищете что-то похожее, попробуйте это и дайте мне знать, помогло ли вам это. Ваше здоровье!

  • Советы и рекомендации по WordPress
  • С тегами: CSS, раскрывающийся список

Поделиться:

  • Aruna V

Обратите внимание, что некоторые ссылки в этом блоге могут быть партнерскими ссылками. Это означает, что если вы продолжите покупать продукт, используя такую ​​ссылку, мы получим небольшую комиссию (без каких-либо дополнительных затрат для вас). Это помогает нам поддерживать блог и создавать бесплатный контент. Мы рекомендуем только те продукты, с которыми работаем или любим. Спасибо за Вашу поддержку!

Выпадающие списки CSS | HTML Dog

Нередкий вариант навигации — это раскрывающееся меню , в котором списки вспомогательной навигации появляются только при наведении курсора на ссылку.

HTML Dog имеет долгую историю с раскрывающимися списками — мы выделили популярный метод Suckerfish Dropdowns еще в 2003 году. Однако с тех пор стандарты и браузеры прошли долгий путь, и теперь мы можем безопасно использовать гораздо более простую технику, используя CSS без необходимости для любого JavaScript.

Многоуровневые выпадающие списки.

Прежде чем начать, подумайте, не будет ли разумнее всего применить раскрывающиеся списки к вашему сайту. Хотя скрытие основной части навигации может сделать дизайн более чистым, это добавляет пользователю дополнительный уровень сложности при переходе к этим скрытым ссылкам. Это не будет существенной проблемой для большинства, но будет для тех, кто не использует или не может использовать указывающее устройство, такое как мышь. Это может быть случай для людей с двигательными или зрительными нарушениями или для тех, кто использует мобильные устройства с сенсорным экраном. Вы должны, по крайней мере, подумать о том, как предоставить этим пользователям возможность навигации (см. пункты об использовании ссылок позже). Если вы решили использовать раскрывающиеся списки, давайте двигаться вперед и применять их наилучшим образом…

Новый раздел примеров! Посмотрите весь этот код в действии и поэкспериментируйте с ним.

HTML: красивые вложенные списки

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

<ул>
    
  • Птицы <ул>
  • Ратиты
  • Птица
  • Неоавес
  • Млекопитающие <ул>
  • Монотремы
  • Сумчатые
  • Плацентарные
  • Итак, у нас есть «Птицы» и «Млекопитающие» в качестве предметов верхнего уровня, а «Крысы», «Однопроходные» и так далее в качестве предметов второго уровня, подкатегории.

    Использовать ссылки. Всегда используйте ссылки. Если вас больше всего интересуют подкатегории (например, «Крысоловы» и «Однопроходные»), подумайте, по крайней мере, о том, чтобы основные элементы (например, «Птицы» и «Млекопитающие») ссылались на страницу со стандартной навигацией. на страницы подкатегорий. Основная причина этого — доступность — как уже отмечалось, посетители вашей страницы не всегда будут использовать указывающее устройство (которое, конечно, требуется для наведения и открытия подменю).

    CSS: самое необходимое

    Чтобы настроить все это визуально, давайте обнулим отступы по умолчанию (и поля для старых браузеров) списков:

    ул {
        заполнение: 0;
        маржа: 0;
    }
     

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

    .
    ли {
        дисплей: встроенный;
        положение: родственник;
    }
     

    Теперь займемся списками внутри списка. Мы хотим расположить их абсолютно, размещая их поверх всего, и мы хотим их скрыть:

    уль уль {
        положение: абсолютное;
        дисплей: нет;
    }
     

    Для поддержки старых браузеров вы также можете явно расположить подсписки, добавив к этому слева: 0 и сверху: 100% .

    Наконец, чтобы показать эти подсписки при наведении курсора на основной элемент списка:

    ли: наведите ул {
        дисплей: блок;
    }
     

    Первый сопровождающий пример показывает это в действии вместе с поясняющими встроенными комментариями (см. исходный код).

    Многоуровневые раскрывающиеся списки

    Размещение более одного уровня раскрывающегося меню потребует большего вложения списка:

  • Млекопитающие <ул>
  • Монотремы <ул>
  • Ехидны
  • Утконос
  • Сумчатые <ул>
  • Опоссумы
  • Нумбаты и т. д.
  • Бандикуты и т. д.
  • Кенгуру, коалы, вомбаты и т. д.
  • плацентарные <ул>
  • Приматы, копытные и т. д.
  • Муравьеды, ленивцы и т. д.
  • Слоны и т. д.
  • Теперь, чтобы обрабатывать эти новые под-подсписки немного по-другому, мы хотим, чтобы они отображались сбоку от своих элементов родительского списка, а не под ними:

    ул уль уль {
        слева: 100%;
        сверху: 0;
    }
     

    Нужна небольшая поправка. В его нынешнем виде будут показаны все списка потомков элемента списка, на который наведен курсор. Таким образом, при наведении курсора на «Млекопитающие» в этом примере будут показаны не только «Однопроходные», «Сумчатые» и «Плацентарные», но и все виды сумчатых — «Оппоссумы» и так далее. Нам нужен только первый потомок — детей (не внуков) — показать. Поэтому мы изменяем li:hover ul , вставляя дочерний селектор :

    .
    li: наведите курсор > ул {
        дисплей: блок;
    }
     

    Другие базовые изменения, которые вы, возможно, захотите внести, включают плавающие элементы списка вместо использования display: inline .

    Оставить комментарий

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *