Товаров: 0 (0р.)

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

Содержание

грамотная навигация сайта с помощью стилей

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

CSS становится все более мощным, и с помощью таких функций, как CSS-сетка и пользовательские свойства (также называемые переменные CSS), мы можем реализовать многие действительно креативные решения. Некоторые из этих решений имеют своей целью не только сделать Интернет красивее, но и сделать его более доступным, и улучшить опыт создания доступных стилей. Я определенно придерживаюсь этой точки зрения!

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

Поиск в Google по запросу «выпадающее меню» предоставляет много примеров

Практический курс по верстке адаптивного сайта с нуля!

Изучите курс и узнайте, как верстать современные сайты на HTML5 и CSS3

Узнать подробнее

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

<nav role=»navigation»> <ul> <li><a href=»#»>One</a></li> <li><a href=»#»>Two</a></li> <li><a href=»#»>Three</a></li> </ul> </nav>

<nav role=»navigation»>

  <ul>

    <li><a href=»#»>One</a></li>

    <li><a href=»#»>Two</a></li>

    <li><a href=»#»>Three</a></li>

  </ul>

</nav>

Теперь, предположим, мы хотим создать выпадающее подменю во втором элементе навигации. Мы можем сделать то же самое и включить список ссылок в этом элементе списка:

<nav role=»navigation»> <ul> <li><a href=»#»>One</a></li> <li><a href=»#»>Two</a> <ul> <li><a href=»#»>Sub-1</a></li> <li><a href=»#»>Sub-2</a></li> <li><a href=»#»>Sub-3</a></li> </ul> </li> <li><a href=»#»>Three</a></li> </ul> </nav>

<nav role=»navigation»>

  <ul>

    <li><a href=»#»>One</a></li>

    <li><a href=»#»>Two</a>

      <ul>

        <li><a href=»#»>Sub-1</a></li>

        <li><a href=»#»>Sub-2</a></li>

        <li><a href=»#»>Sub-3</a></li>

      </ul>

    </li>

    <li><a href=»#»>Three</a></li>

  </ul>

</nav>

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

li { display: block; transition-duration: 0.5s; } li:hover { cursor: pointer; } ul li ul { visibility: hidden; opacity: 0; position: absolute; transition: all 0.5s ease; margin-top: 1rem; left: 0; display: none; } ul li:hover > ul, ul li ul:hover { visibility: visible; opacity: 1; display: block; } ul li ul li { clear: both; width: 100%; }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

li {

display: block;

transition-duration: 0.5s;

}

 

li:hover {

  cursor: pointer;

}

 

ul li ul {

  visibility: hidden;

  opacity: 0;

  position: absolute;

  transition: all 0.5s ease;

  margin-top: 1rem;

  left: 0;

  display: none;

}

 

ul li:hover > ul,

ul li ul:hover {

  visibility: visible;

  opacity: 1;

  display: block;

}

 

ul li ul li {

  clear: both;

  width: 100%;

}

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

Проблема

Все уже начинает выглядеть так, как нам нужно, но на данный момент мы еще далеки от завершения. Доступность в Интернете — это основная часть развития вашего продукта, и как раз сейчас вам предоставляется прекрасная возможность обеспечить ее. Добавление role=»navigation» — это хорошее начало, но для того, чтобы панель навигации была доступной, нужно обеспечить возможность перемещать по ней (и выделять фокусом соответствующий элемент), а также чтобы экранный диктор точно считывал вслух то, что сейчас выделено фокусом.

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

Теперь важно отметить, что теоретически вы выделили фокусом элемент подменю, и программа чтения с экрана сможет проанализировать это, считав Sub-One, но пользователи клавиатуры не смогут определить, что сейчас происходит.

Причина заключается в том, что, хотя мы настраиваем состояние наведения указателя для родительского элемента, когда мы переходим от родительского элемента к одному из элементов списка внутри него, мы теряем этот стиль. Это логично с точки зрения CSS, но это не то, что нам нужно.

К счастью, у нас есть новый псевдо-класс CSS, который даст нам именно то, что нам нужно в этом случае, и он называется :focus-within.

Решение: «:focus-inside»

Псевдо-селектор :focus-within является частью CSS Selectors Level 4 Spec и указывает браузеру применить стиль к родительскому объекту, когда какой-либо из его дочерних элементов выделен фокусом. В нашем случае это означает, что мы можем перейти к Sub-One и применить стиль :focus-within, а также стиль :hover для родительского элемента и увидеть, где именно находится выпадающий список навигации. В нашем случае это будет ul li:focus-within > ul:

ul li:hover > ul, ul li:focus-within > ul, ul li ul:hover { visibility: visible; opacity: 1; display: block; }

ul li:hover > ul,

ul li:focus-within > ul,

ul li ul:hover {

  visibility: visible;

  opacity: 1;

  display: block;

}

Замечательно! Это работает!

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

Практический курс по верстке адаптивного сайта с нуля!

Изучите курс и узнайте, как верстать современные сайты на HTML5 и CSS3

Узнать подробнее

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

a:hover, a:focus { … }

a:hover,

a:focus {

  …

}

Но в данном случае, поскольку мы применяем стили hover на основе родительского li, мы можем снова использовать :focus-within, чтобы получить тот же вид, что и при переходе с помощью табуляцию. Это связано с тем, что мы не можем выделить фокусом li (если не добавим tabindex=«0»). Мы фактически выделяем фокусом ссылку (а) внутри него. :focus-within позволяет нам применять стили к родительскому li, когда фокусом выделена ссылка (довольно круто!):

li:hover, li:focus-within { … }

li:hover,

li:focus-within {

  …

}

На данный момент, поскольку мы применяем стиль фокуса, мы можем сделать то, что обычно не рекомендуется (удалите стиль фокуса — этот синий контур). Мы можем сделать это:

li:focus-within a { outline: none; }

li:focus-within a {

  outline: none;

}

Вышеприведенный код указывает, что когда мы выделяем фокусом элемент внутри списка через ссылку (a), к элементу ссылки (a) не применяется контур. Это довольно безопасно, потому что мы задаем стили исключительно для состояния наведения курсора, и в браузерах, которые не поддерживают :focus-within, ссылка по-прежнему будет выделена контуром. Теперь наше меню выглядит так:

Окончательное меню со стилями для состояний :focus-within, :hover и удаленным контуром при выделении фокусом

Что насчет ARIA?

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

<nav role=»navigation»> <ul> <li><a href=»#»>One</a></li> <li><a href=»#» aria-haspopup=»true»>Two</a> <ul aria-label=»submenu»> <li><a href=»#»>Sub-1</a></li> <li><a href=»#»>Sub-2</a></li> <li><a href=»#»>Sub-3</a></li> </ul> </li> <li><a href=»#»>Three</a></li> </ul> </nav>

<nav role=»navigation»>

  <ul>

    <li><a href=»#»>One</a></li>

    <li><a href=»#» aria-haspopup=»true»>Two</a>

      <ul aria-label=»submenu»>

        <li><a href=»#»>Sub-1</a></li>

        <li><a href=»#»>Sub-2</a></li>

        <li><a href=»#»>Sub-3</a></li>

      </ul>

    </li>

    <li><a href=»#»>Three</a></li>

  </ul>

</nav>

Вы добавляете aria-haspopup=»true» к родительскому выпадающему меню, чтобы указать альтернативное состояние, включая aria-label=»submenu» для самого выпадающего меню (в нашем случае наш список с class=»dropdown»).

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

Поддержка браузерами

Говоря о возможных сложностях, давайте рассмотрим поддержку браузерами. Хотя :focus-within довольно неплохо поддерживается браузерами, стоит отметить, что Internet Explorer и Edge не поддерживают его, поэтому ваши пользователи на данных платформах не смогут увидеть меню.

Данные поддержки браузерами взяты с Caniuse, где вы можете найти более подробную информацию. Число указывает, что браузер поддерживает эту функцию с этой версии.

Окончательным решением здесь будет использование как разметки ARIA, так и CSS :focus-within.

Автор: Una Kravets

Источник: //css-tricks.com/

Редакция: Команда webformyself.

Практический курс по верстке адаптивного сайта с нуля!

Изучите курс и узнайте, как верстать современные сайты на HTML5 и CSS3

Узнать подробнее

PSD to HTML

Практика верстки сайта на CSS Grid с нуля

Смотреть

Как стилизовать Ul Li с CSS, чтобы он выглядел как выпадающий список «form»?



У меня есть Ul Li с некоторыми ссылками , они отображаются как меню. Я хочу установить список «dropdown», но как классические селекторы «form»… -не выпадающее меню, которое отображается при наведении курсора, а кликабельное меню.

<ul>
<li>Option 1 </li>
<li>Option 2 </li>
</ul>

Какой CSS сделает его похожим на «выпадающий список форм»?

Я прикрепляю изображение, чтобы было понятно, что мне нужно:

JP

html css drop-down-menu
Поделиться Источник dmtnexer     04 февраля 2014 в 13:42

3 ответа


  • Как стилизовать фон маркированных точек в <ul> ?

    У меня есть такой список: <ul> <li class=list-item> <span>Label</span> <div class=multi-line-content> multi-<br /> line<br /> content </div> </li> <li class=list-item> <span>Label</span> <div class=multi-line-content>…

  • HTML UL CSS пограничный стиль

    У меня есть небольшой вопрос относительно html-списков и CSS. Я хочу иметь список (whit sublist), который выглядит следующим образом (просмотр результата, копируя код в http://htmledit.squarefree.com/ ): <style type=text/css> ul { border: 0px solid #90bade; } li { list-style-type:none;…



1

Предполагая, что по какой-то причине вы хотите сохранить его в виде списка. Вам понадобится больше, чем CSS.

Шаг 1 — В HTML поместите список внутри a, а также добавьте некоторые HTML в стиль в качестве поля выбора. например

<div>
  <div></div>
  <a href="#">v</a>
  <ul>
    <li>Option 1 </li>
    <li>Option 2 </li>
  </ul>
</div>

Шаг 2 — Добавьте CSS, чтобы сделать это так, как вы хотите. В основном вы захотите расположить список под полем, а затем display:none.

.dropdown-emulator{
  position:relative;
}

.dropdown-emulator ul{
  position:absolute;
  top:25px;
  left:0;
}

Шаг 3 — Создайте некоторый JavaScript, чтобы захватить событие onclick кнопки выбора, чтобы список появился.

Очень простой рабочий пример см. Здесь http://jsfiddle.net/q5SEF/3/

Поделиться AndrewPolland     04 февраля 2014 в 15:19



0

Я думаю, для этого вы, вероятно, захотите использовать поле, используя теги?

http://www.w3schools.com/tags/tag_select.asp

Альтернативно.

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

Поделиться askrich     04 февраля 2014 в 13:46



0

Я считаю, что вы ищете выпадающий список. Вместо списка элементов используйте тег select.

<select>
  <option value="Milk">Fresh Milk</option>
  <option value="Cheese">Old Cheese</option>
  <option value="Bread">Hot Bread</option>
</select>

Поделиться Brian H     04 февраля 2014 в 13:46


Похожие вопросы:


Как отключить выпадающий список с CSS, чтобы он выглядел серым?

У меня есть приложение ASP.NET с выпадающим списком. Как отключить выпадающий список с CSS, чтобы он выглядел серым? Возможно ли это сделать только с CSS ?


Как я могу стилизовать ul li в css?

Возможный Дубликат : Я хочу показать элементы списка в виде 2 или более столбцов (динамическое выравнивание ) Извините за мой английский! У меня проблема с уль ли: мой HTML: <ul>…


Как мне стилизовать выпадающий список <select> только с CSS?

Существует ли CSS-единственный способ стилизовать выпадающий список <select> ? Мне нужно стилизовать форму <select> как можно больше по-человечески, без каких-либо JavaScript. Какие…


Как стилизовать фон маркированных точек в <ul> ?

У меня есть такой список: <ul> <li class=list-item> <span>Label</span> <div class=multi-line-content> multi-<br /> line<br /> content </div>…


HTML UL CSS пограничный стиль

У меня есть небольшой вопрос относительно html-списков и CSS. Я хочу иметь список (whit sublist), который выглядит следующим образом (просмотр результата, копируя код в…


Как стилизовать выпадающий список UL/LI

У меня есть неупорядоченный список,который я пытаюсь настроить во время выполнения, вызываемый стилем DropKick CSS. Вот изображение того, что я вижу: Я попытался стилизовать его так, что ничего не…


CSS: 3-столбчатая компоновка <ul> с парными <li>-элементами

Ищу способ стилизовать список, чтобы он выглядел как сетка. <div class=name> <ul> <li>1</li> <li>Text</li> <li>2</li> <li>Text</li>…


Как стилизовать список так, чтобы он выглядел как выпадающий список (с полосой прокрутки)

кто-нибудь может мне помочь с CSS. У меня есть список, и я хочу, чтобы список выглядел как выпадающий список, который имеет белый фон,имеет полосу прокрутки и т. д. Вот мой код HTML <script>…


Сделать выпадающий список из элементов li

Я пытаюсь сделать выпадающее меню из трех элементов li . Активный элемент li получает класс current_lang , и он должен работать как родитель, который можно щелкнуть, чтобы открыть выпадающий список….


Как стилизовать два разных тега <ul> в HTML и CSS?

У меня есть тег ‘ul’, который уже стилизует что-то другое. Мне нужно создать еще один тег ‘ul’, чтобы стилизовать что-то еще на моей странице HTML. Это первый стиль ul : ul { list-style: none;…

Создаем стильные выпадающие списки

В этой статье мы покажем, как создавать красивые выпадающие списки без использования изображений, только при помощи CSS. Также мы добавим немного кода jQuery, чтобы заставить их работать.

Обратите внимание на некоторые вещи, прежде чем мы начнем:

  • В примерах кода пропущены префиксы браузеров для CSS-свойств, но вы, конечно, можете найти их в исходных файлах.
  • Лично я использую бокс-модель, где [width] = [element-width] + [padding] + [borders]. Чтобы её активировать, необходим следующий фрагмент кода:

*,
*:after,
*:before {
    box-sizing: border-box;
}

Итак, с чего же мы начнем.

Первый вопрос: что нам нужно для создания выпадающего меню? В общем, мы будем использовать блок DIV с вложенным тегом span и неупорядоченный список для выпадающего меню:

<div>
    <span>I’m kinda the label!</span>
    <ul>
        <li>I’m hidden!</li>
        <li>Me too!</li>
        <li>So do I.</li>
    </ul>
</div>

JavaScript

Нам нужнен небольшой JavaScript, чтобы наш выпадающий список работал как нужно. Этот фрагмент JS мы будем использовать для всех примеров:

//…
 
obj.dd.on(‘click’, function(event){
    $(this).toggleClass(‘active’);
    return false;
});
 
//…
 
$(function() {
 
    var dd = new DropDown( $(‘#dd’) );
 
    $(document).click(function() {
        // all dropdowns
        $(‘.wrapper-dropdown-1’).removeClass(‘active’);
    });
 
});

Так что же это скрипт делает? Во-первых, он переключает класс .active, когда вы кликаете на враппер. Это означает, что если враппер не имеет класс .active, то он добавляется, а если этот класс уже присвоен, то он удаляется.

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

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

Пример 1

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

HTML-разметка

Нам нужно несколько вещей: обертка (div с id#dd), (скрытый) раскрывающийся список и «лейбл», который будет обернут тегом span. Мы используем ссылки-якоря, потому что мне кажется так будет семантически правильно, но вы можете также использовать другой тег.

<div tabindex=»1″>
    <span>Пол</span>
    <ul>
        <li><a href=»#»>Мужской</a></li>
        <li><a href=»#»>Женский</a></li>
    </ul>
</div>

CSS

Давайте теперь перейдем к CSS. Начнем с обертки (враппера):

.wrapper-dropdown {
    /* размер и положение */
    position: relative; /* Enable absolute positioning for children and pseudo elements */
    width: 200px;
    padding: 10px;
    margin: 0 auto;
 
    /* цвет и фон */
    background: #9bc7de;
    color: #fff;
    outline: none;
    cursor: pointer;
 
    /* шрифт */
    font-weight: bold;
}

Итак, мы сделали несколько вещей. Сначала мы установили ширину списка и некоторые отступы. Далее, мы задали ему цвет и фон. И, наконец, мы установили параметры для шрифта.

Давайте закончим с «лейблом», добавив небольшую стрелку справа при помощи псевдо-элемента.

.wrapper-dropdown:after {
    content: «»;
    width: 0;
    height: 0;
    position: absolute;
    right: 16px;
    top: 50%;
    margin-top: -6px;
    border-width: 6px 0 6px 6px;
    border-style: solid;
    border-color: transparent #fff;  
}

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

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

.wrapper-dropdown-1 .dropdown {
    /* Size &amp; position */
    position: absolute;
    top: 100%;
    left: 0; /* Size */
    right: 0; /* Size */
 
    /* Styles */
    background: #fff;
    font-weight: normal; /* Overwrites previous font-weight: bold; */
 
    /* Hiding */
    opacity: 0;
    pointer-events: none;
}

Мы зададим раскрывающемуся списку абсолютное позиционирование и разместим его позади кнопки (top: 100%;). Зададим ему такую же ширину, как для кнопки. И, наконец, скроем его, уменьшив его прозрачность до 0.

Теперь зададим стили для элементов списка:

.wrapper-dropdown-1 .dropdown li a {
    display: block;
    text-decoration: none;
    color: #9e9e9e;
    padding: 10px 20px;
}
 
/* Hover state */
.wrapper-dropdown-1 .dropdown li:hover a {
    background: #f3f8f8;
}

С помощью JavaScript мы будем переключать класс .active, когда мы нажимаем на кнопку, на основе этого класса мы можем изменить наш CSS для отображения раскрывающегося списка.

/* Active state */
.wrapper-dropdown-1.active .dropdown {
    opacity: 1;
    pointer-events: auto;
}
 
.wrapper-dropdown-1.active:after {
    border-color: #9bc7de transparent;
    border-width: 6px 6px 0 6px ;
    margin-top: -3px;
}
 
.wrapper-dropdown-1.active {
  background: #9bc7de;
  background: linear-gradient(to right, #9bc7de 0%, #9bc7de 78%, #ffffff 78%, #ffffff 100%);
}

Три вещи, которые необходимо отметить:

  1. Во-первых, мы делаем выпадающий список видимым, изменив его прозрачность до 1. 
  2. Далее, мы меняем направление и цвет маленькой стрелки.
  3. Затем мы изменим фон позади стрелки с помощью градиента.

JavaScript

Последнее, но не менее важное, мы также должны добавить еще один фрагмент JavaScript, чтобы кнопка отображала выбранное значение.

function DropDown(el) {
    this.dd = el;
    this.placeholder = this.dd.children(‘span’);
    this.opts = this.dd.find(‘ul.dropdown > li’);
    this.val = »;
    this.index = -1;
    this.initEvents();
}
DropDown.prototype = {
    initEvents : function() {
        var obj = this;
 
        obj.dd.on(‘click’, function(event){
            $(this).toggleClass(‘active’);
            return false;
        });
 
        obj.opts.on(‘click’,function(){
            var opt = $(this);
            obj.val = opt.text();
            obj.index = opt.index();
            obj.placeholder.text(‘Gender: ‘ + obj.val);
        });
    },
    getValue : function() {
        return this.val;
    },
    getIndex : function() {
        return this.index;
    }
}

Очень простой код: при нажатии на элемент мы получаем его значение и отображаем его в теге span.

Пример 2

Во втором примере мы создадим красивое меню для регистрации в различных социальных сетях.

HTML-разметка

<div>Регистрация
    <ul>
        <li><a href=»#»><i></i>Twitter</a></li>
        <li><a href=»#»><i></i>Github</a></li>
        <li><a href=»#»><i></i>Facebook</a></li>
    </ul>
</div>

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

CSS

Давайте начнем с обертки. В значительной степени она такая же, как и обертка в предыдущем примере. Обратите внимание на левую границу в 5px.

.wrapper-dropdown-2 {
    /* Size and position */
    position: relative; /* Enable absolute positioning for children and pseudo elements */
    width: 200px;
    margin: 0 auto;
    padding: 10px 15px;
 
    /* Styles */
    background: #fff;
    border-left: 5px solid grey;
    cursor: pointer;
    outline: none;
}

Теперь маленькая стрелка. Точно такая же, как раньше:

.wrapper-dropdown-2:after {
    content: «»;
    width: 0;
    height: 0;
    position: absolute;
    right: 16px;
    top: 50%;
    margin-top: -3px;
    border-width: 6px 6px 0 6px;
    border-style: solid;
    border-color: grey transparent;
}

А это раскрывающийся список. Опять же, в значительной степени такой же, как и в предыдущем примере:

.wrapper-dropdown-2 .dropdown {
  /* Size &amp; position */
    position: absolute;
    top: 100%;
    left: -5px;
    right: 0px;
 
    /* Styles */
    background: white;
    transition: all 0.3s ease-out;
    list-style: none;
 
    /* Hiding */
    opacity: 0;
    pointer-events: none;
}

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

Некоторые стили для ссылок и иконок:

.wrapper-dropdown-2 .dropdown li a {
    display: block;
    text-decoration: none;
    color: #333;
    border-left: 5px solid;
    padding: 10px;
    transition: all 0.3s ease-out;
}
 
.wrapper-dropdown-2 .dropdown li:nth-child(1) a {
    border-left-color: #00ACED;
}
 
.wrapper-dropdown-2 .dropdown li:nth-child(2) a {
    border-left-color: #4183C4;
}
 
.wrapper-dropdown-2 .dropdown li:nth-child(3) a {
    border-left-color: #3B5998;
}
 
.wrapper-dropdown-2 .dropdown li i {
    margin-right: 5px;
    color: inherit;
    vertical-align: middle;
}
 
/* Hover state */
 
.wrapper-dropdown-2 .dropdown li:hover a {
    color: grey;
}

И теперь, займемся стилями списка в раскрытом состоянии. Изменим направление стрелки, а раскрывающийся список станет видимым.

.wrapper-dropdown-2.active:after {
    border-width: 0 6px 6px 6px;
}
 
.wrapper-dropdown-2.active .dropdown {
    opacity: 1;
    pointer-events: auto;
}

JavaScript

function DropDown(el) {
    this.dd = el;
    this.initEvents();
}
DropDown.prototype = {
    initEvents : function() {
        var obj = this;
 
        obj.dd.on(‘click’, function(event){
            $(this).toggleClass(‘active’);
            event.stopPropagation();
        });
    }
}

Пример 3

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

HTML-разметка

<div tabindex=»1″>
    <span>Транспорт</span>
    <ul>
        <li><a href=»#»><i></i>Почта</a></li>
        <li><a href=»#»><i></i>UPS доставка</a></li>
        <li><a href=»#»><i></i>Частный самолет</a></li>
    </ul>
</div>

Кода не намного больше, чем раньше. Перейдем к CSS!

CSS

.wrapper-dropdown-3 {
    /* Size and position */
    position: relative;
    width: 200px;
    margin: 0 auto;
    padding: 10px;
 
    /* Styles */
    background: #fff;
    border-radius: 7px;
    border: 1px solid rgba(0,0,0,0.15);
    box-shadow: 0 1px 1px rgba(50,50,50,0.1);
    cursor: pointer;
    outline: none;
 
    /* Font settings */
    font-weight: bold;
    color: #8AA8BD;
}

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

.wrapper-dropdown-3:after {
    content: «»;
    width: 0;
    height: 0;
    position: absolute;
    right: 15px;
    top: 50%;
    margin-top: -3px;
    border-width: 6px 6px 0 6px;
    border-style: solid;
    border-color: #8aa8bd transparent;
}

Тут все также, как и раньше, так что не будем описывать код подробно.

.wrapper-dropdown-3 .dropdown {
  /* Size &amp; position */
    position: absolute;
    top: 140%;
    left: 0;
    right: 0;
 
    /* Styles */
    background: white;
    border-radius: inherit;
    border: 1px solid rgba(0,0,0,0.17);
    box-shadow: 0 0 5px rgba(0,0,0,0.1);
    font-weight: normal;
    transition: all 0.5s ease-in;
    list-style: none;
 
    /* Hiding */
    opacity: 0;
    pointer-events: none;
}
 
.wrapper-dropdown-3 .dropdown li a {
    display: block;
    padding: 10px;
    text-decoration: none;
    color: #8aa8bd;
    border-bottom: 1px solid #e6e8ea;
    box-shadow: inset 0 1px 0 rgba(255,255,255,1);
    transition: all 0.3s ease-out;
}
 
.wrapper-dropdown-3 .dropdown li i {
    float: right;
    color: inherit;
}
 
.wrapper-dropdown-3 .dropdown li:first-of-type a {
    border-radius: 7px 7px 0 0;
}
 
.wrapper-dropdown-3 .dropdown li:last-of-type a {
    border-radius: 0 0 7px 7px;
    border: none;
}
 
/* Hover state */
 
.wrapper-dropdown-3 .dropdown li:hover a {
    background: #f3f8f8;
}

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

.wrapper-dropdown-3 .dropdown:after {
    content: «»;
    width: 0;
    height: 0;
    position: absolute;
    bottom: 100%;
    right: 15px;
    border-width: 0 6px 6px 6px;
    border-style: solid;
    border-color: #fff transparent;  
}
 
.wrapper-dropdown-3 .dropdown:before {
    content: «»;
    width: 0;
    height: 0;
    position: absolute;
    bottom: 100%;
    right: 13px;
    border-width: 0 8px 8px 8px;
    border-style: solid;
    border-color: rgba(0,0,0,0.1) transparent;  
}

Мы использовали два псевдо-элемента для этой стрелки, так как мы хотим создать границу вокруг неё.

Теперь стили для раскрытого состояния. Все одно и то же. Тем не менее, обратите внимание, что мы установили переход к .dropdown немного дольше, чем обычно (0,5 вместо 0,3 с). Таким образом, открытие меню будет очень гладким.

.wrapper-dropdown-3.active .dropdown {
    opacity: 1;
    pointer-events: auto;
}

JavaScript

Чтобы закончить этот демо-пример, мы должны добавить немного JavaScript, чтобы заменить значение выбранной кнопки по умолчанию. Мы видели, как это делается в первом примере, но, поскольку мы не оставляем слово «Транспорт» здесь, то JS немного отличается.

function DropDown(el) {
    this.dd = el;
    this.placeholder = this.dd.children(‘span’);
    this.opts = this.dd.find(‘ul.dropdown > li’);
    this.val = »;
    this.index = -1;
    this.initEvents();
}
DropDown.prototype = {
    initEvents : function() {
        var obj = this;
 
        obj.dd.on(‘click’, function(event){
            $(this).toggleClass(‘active’);
            return false;
        });
 
        obj.opts.on(‘click’,function(){
            var opt = $(this);
            obj.val = opt.text();
            obj.index = opt.index();
            obj.placeholder.text(obj.val);
        });
    },
    getValue : function() {
        return this.val;
    },
    getIndex : function() {
        return this.index;
    }
}

Пример 4

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

HTML-разметка

<div>Сделать
    <ul>
        <li><input type=»checkbox» name=»el-1″ value=»donut»><label for=»el-1″>Съесть пирожок</label></li>
        <li><input type=»checkbox» name=»el-2″ value=»neighbour»><label for=»el-2″>Следить за соседями</label></li>
        <li><input type=»checkbox» name=»el-3″ value=»T-rex»><label for=»el-3″>Покормить кота</label></li>
    </ul>
</div>

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

CSS

.wrapper-dropdown-4 {
    /* Size and position */
    position: relative;
    width: 270px;
    margin: 0 auto;
    padding: 10px 10px 10px 30px;
 
    /* Styles */
    background: #fff;
    border: 1px solid silver;
    cursor: pointer;
    outline: none;
}

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

.wrapper-dropdown-4:after {
    content: «»;
    width: 0;
    height: 0;
    position: absolute;
    right: 10px;
    top: 50%;
    margin-top: -3px;
    border-width: 6px 6px 0 6px;
    border-style: solid;
    border-color: #ffaa9f transparent;
}

Стили для выпадающего списка такие же, как и в предыдущих примерах:

.wrapper-dropdown-4 .dropdown {
    /* Size &amp; position */
    position: absolute;
    top: 100%;
    margin-top: 1px; /* border of wrapper */
    left: -1px;
    right: -1px;
 
    /* Styles */
    background: white;
    border: 1px solid silver;
    border-top: none;
    list-style: none;
    transition: all 0.3s ease-out;
   
    /* Hiding */
    opacity: 0;
    pointer-events: none;
}

Мы должны установить margin-top равный 1px, потому что мы должны немного сдвинуть его вниз из-за границы обертки.

.wrapper-dropdown-4 .dropdown li {
    position: relative; /* Enable absolute positioning for checkboxes */
}
 
.wrapper-dropdown-4 .dropdown li label {
    display: block;
    padding: 10px 10px 10px 30px; /* Same padding as the button */
    border-bottom: 1px dotted #1ccfcf;
    transition: all 0.3s ease-out;
}
 
.wrapper-dropdown-4 .dropdown li:last-of-type label {
    border: none;
}
 
.wrapper-dropdown-4 .dropdown li input /* Checkboxes */ {
    position: absolute;
    display: block;
    right: 10px;
    top: 50%;
    margin-top: -8px;
}
 
/* Hover state */
 
.wrapper-dropdown-4 .dropdown li:hover label {
    background: #f0f0f0;
}
 
/* Checked state */
 
.wrapper-dropdown-4 .dropdown li input:checked ~ label {
    color: grey;
    text-decoration: line-through;
}

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

Когда флажок установлен, текст становится серым и перечеркнутым. Просто, но эффективно.

У нас есть еще две тонкие красные линии слева в нашей маленькой записной книжке. Есть два способа сделать это: один с псевдо-элементами и один с градиентами. Давайте посмотрим на оба варианта.

/* красные линии с псевдо-элементами */
.wrapper-dropdown-4 .dropdown:before,
.wrapper-dropdown-4:before {
    content: «»;
    width: 4px;
    height: 100%;
    position: absolute;
    top: 0;
    left: 15px;
    border: 1px solid #ffaa9f;
    border-top: none;
    border-bottom: none;
    z-index: 2;
}
 
/* Или: */
/* красные линии при помощи градиента */
 
.wrapper-dropdown-4 .dropdown,
.wrapper-dropdown-4 {
  background: linear-gradient(left, white 5%, #ffaa9f 5%, #ffaa9f 5.3%, white 5.3%, white 6.5%, #ffaa9f 6.5%, #ffaa9f 6.8%, white 6.8%);
}
 
.wrapper-dropdown-4 .dropdown li:hover label {
  background: linear-gradient(left, #f0F0F0 5%, #ffaa9f 5%, #ffaa9f 5.3%, #f0F0F0 5.3%, #f0F0F0 6.5%, #ffaa9f 6.5%, #ffaa9f 6.8%, #f0F0F0 6.8%);
}

Так какой из этих способов лучше? Вероятно, первый, потому что, если вы хотите изменить эффект при наведении на элементы списка, вы должны изменить градиент, что довольно непросто. Кроме того, псевдо-элементы лучше поддерживаются браузерами (начиная с IE8), в отличии от градиентов (не поддерживаются до IE10).

Теперь стили для раскрытого состояния. Ничего нового здесь нет.

/* Active state */
 
.wrapper-dropdown-4.active:after {
    border-width: 0 6px 6px 6px;
}
 
.wrapper-dropdown-4.active .dropdown {
    opacity: 1;
    pointer-events: auto;
}

JavaScript

function DropDown(el) {
    this.dd = el;
    this.opts = this.dd.find(‘ul.dropdown > li’);
    this.val = [];
    this.index = [];
    this.initEvents();
}
DropDown.prototype = {
    initEvents : function() {
        var obj = this;
 
        obj.dd.on(‘click’, function(event){
            $(this).toggleClass(‘active’);
            event.stopPropagation();
        });
 
        obj.opts.children(‘label’).on(‘click’,function(event){
            var opt = $(this).parent(),
                chbox = opt.children(‘input’),
                val = chbox.val(),
                idx = opt.index();
 
            ($.inArray(val, obj.val) !== -1) ? obj.val.splice( $.inArray(val, obj.val), 1 ) : obj.val.push( val );
            ($.inArray(idx, obj.index) !== -1) ? obj.index.splice( $.inArray(idx, obj.index), 1 ) : obj.index.push( idx );
        });
    },
    getValue : function() {
        return this.val;
    },
    getIndex : function() {
        return this.index;
    }
}

Пример 5

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

HTML-разметка

<div tabindex=»1″>Иван Иванов
    <ul>
        <li><a href=»#»><i></i>Профиль</a></li>
        <li><a href=»#»><i></i>Настройки</a></li>
        <li><a href=»#»><i></i>Выйти</a></li>
    </ul>
</div>

CSS

.wrapper-dropdown-5 {
    /* Size &amp; position */
    position: relative;
    width: 200px;
    margin: 0 auto;
    padding: 12px 15px;
 
    /* Styles */
    background: #fff;
    border-radius: 5px;
    box-shadow: 0 1px 0 rgba(0,0,0,0.2);
    cursor: pointer;
    outline: none;
    transition: all 0.3s ease-out;
}
 
.wrapper-dropdown-5:after { /* Little arrow */
    content: «»;
    width: 0;
    height: 0;
    position: absolute;
    top: 50%;
    right: 15px;
    margin-top: -3px;
    border-width: 6px 6px 0 6px;
    border-style: solid;
    border-color: #4cbeff transparent;
}

Это основные стили. Теперь перейдем к раскрывающемуся списку, который немного отличается от обычного.

.wrapper-dropdown-5 .dropdown {
    /* Size &amp; position */
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
 
    /* Styles */
    background: #fff;
    border-radius: 0 0 5px 5px;
    border: 1px solid rgba(0,0,0,0.2);
    border-top: none;
    border-bottom: none;
    list-style: none;
    transition: all 0.3s ease-out;
 
    /* Hiding */
    max-height: 0;
    overflow: hidden;
}

На этот раз мы не изменяли непрозрачность до 0, чтобы скрыть меню. Мы установили max-height равную 0 и overflow: hidden. Почему установили max-height, а не height? Потому что мы не знаем точную высоту раскрытого списка.

Простые стили для элементов списка.

.wrapper-dropdown-5 .dropdown li {
    padding: 0 10px ;
}
 
.wrapper-dropdown-5 .dropdown li a {
    display: block;
    text-decoration: none;
    color: #333;
    padding: 10px 0;
    transition: all 0.3s ease-out;
    border-bottom: 1px solid #e6e8ea;
}
 
.wrapper-dropdown-5 .dropdown li:last-of-type a {
    border: none;
}
 
.wrapper-dropdown-5 .dropdown li i {
    margin-right: 5px;
    color: inherit;
    vertical-align: middle;
}
 
/* Hover state */
 
.wrapper-dropdown-5 .dropdown li:hover a {
    color: #57a9d9;
}

А теперь, в активном состоянии:

/* Active state */
 
.wrapper-dropdown-5.active {
    border-radius: 5px 5px 0 0;
    background: #4cbeff;
    box-shadow: none;
    border-bottom: none;
    color: white;
}
 
.wrapper-dropdown-5.active:after {
    border-color: #82d1ff transparent;
}
 
.wrapper-dropdown-5.active .dropdown {
    border-bottom: 1px solid rgba(0,0,0,0.2);
    max-height: 400px;
}

Когда выпадающий список открыт, мы меняем нижние углы кнопки, ее цвет, направление стрелки и цвет стрелки и удаляем её тень и границы.
И, чтобы показать меню, мы устанавливаем max-height выпадающего списка равную 400 пикселей. Мы могли бы установить её равную 500px или 1000px, это не имеет значения.

JavaScript

function DropDown(el) {
    this.dd = el;
    this.initEvents();
}
DropDown.prototype = {
    initEvents : function() {
        var obj = this;
 
        obj.dd.on(‘click’, function(event){
            $(this).toggleClass(‘active’);
            event.stopPropagation();
        });
    }
}

Обратная совместимость

Итак, теперь у нас есть 5 раскрывающихся списков, которые замечательно работают, но как насчет старых браузеров?
Эти браузеры не понимают, например, свойство opacity.

В этом нам поможет библиотека Modernizr. Грубо говоря, для тех, кто не знает, Modernizr это библиотека JavaScript, которая обнаруживает поддерживаемые HTML5 и CSS3 свойства в браузер пользователя.

Благодаря этому, мы можем «указать» браузеру, если вы не поддерживаете *это* свойство, то делайте следующее. Ниже приведен пример того, как мы можем управлять стилями для браузеров, которые не поддерживают определенные свойства CSS:

/* Нет поддержки CSS3 */
 
.no-opacity       .wrapper-dropdown-1 .dropdown,
.no-pointerevents .wrapper-dropdown-1 .dropdown {
    display: none;
    opacity: 1; /* If opacity support but no pointer-events support */
    pointer-events: auto; /* If pointer-events support but no pointer-events support */
}
 
.no-opacity       .wrapper-dropdown-1.active .dropdown,
.no-pointerevents .wrapper-dropdown-1.active .dropdown {
    display: block;
}

Если браузер не поддерживает opacity или pointer-events, то используется свойство display: block;. Ну и так далее.

Заключение.

Я надеюсь, что эта статья помогла вам понять, как создавать пользовательские раскрывающиеся меню. Как вы можете видеть, это довольно просто.

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

Скачать исходные файлы

Перевод статьи с tympanus.net/codrops


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

CSS: Выпадающее меню с задержкой

Обычное выпадающие css-меню сделанное с помощью переключения display:none;/display:block; повешенного на hover обладает двумя раздражающими недостатками:

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

Пример такого меню:

<ul>
    <li>
        <a href="#">item</a>
        <ul>
            <li>subitem 1</li>
            <li>subitem 2</li>
        </ul>
   </li>
</ul>

<style>
.menu {
    margin: 0;
    padding: 0;
    list-style: none;
}
.menu .menu-item {
    float: left;
    margin: 0 1px 0 0;
    padding: 0;
    background: #E1E1E1;
}
.menu .menu-item a {
    display: block;
    padding: 5px 10px;
}
.menu .submenu {
    display: none; /* По умолчанию скрываем подменю */
    position: absolute;
    margin: 0;
    padding: 0;
    list-style: none;
    background: #E1E1E1;
}
.menu .menu-item:hover .submenu {
    display: block; /* Показываем подменю при ховере */
}
.menu .submenu-item {
    margin: 0;
    padding: 5px 10px;
}
</style>

Демо

Чтобы создать небольшую задержку перед показом и скрытием подменю раньше приходилось использовать javascript, но теперь наткнулся на css вариант.

Весь фокус в свойстве transition, а точнее его подсвойстве transition-delay, которое позволяет добавить задержку перед показом анимации:

.menu .submenu {
    opacity: 0; /* По умолчанию скрываем подменю */
    visibility: hidden;
    transition-property: opacity, visibility; /* Важно чтобы transition применялось к обоим свойствам */
    transition-duration: 0.2s; /* Добавляем анимацию 0.3 сек. */
    transition-delay: 0.15s; /* Добавляем задержку в 0.15 сек. */
}
.menu .menu-item:hover .submenu {
    opacity: 1; /* Показываем подменю при ховере */
    visibility: visible;
}

Демо

Поскольку анимацию нельзя вешать на display, то для скрытия подменю приходится использовать связку opacity:0; visibility:hidden;.

Выпадающий список — Руководство заказчика. Справка

Тип поля: select — выпадающий список.

да

нет

Атрибут для поля выходных данных. Содержит имя поля выходных данных.

да

нет

Название выпадающего списка в интерфейсе.

нет

нет

Ширина поля. Указывается в следующих единицах:

  • Пиксели. Например: width="100px".

  • Доля от размера родительского элемента. Например: width="100%".

Можно также задать ширину формулой. Например: width="calc(100%-30px)".

нет

зависит от длины подписи

Расположение всплывающих подсказок (отображаются, если ответ не прошел валидацию). Расположение указывается относительно поля ввода.

Допустимые значения:

  • Над полем ввода: "top-left" (слева), "top-center" (посередине), "top-right" (справа).

  • Под полем ввода: "bottom-left" (слева), "bottom-center" (посередине), "bottom-right" (справа).

  • Слева от поля ввода: "left-top" (сверху), "left-center" (посередине), "left-bottom" (внизу).

  • Справа от поля ввода: "right-top" (сверху), "right-center" (посередине), "right-bottom" (внизу).

  • Не показывать сообщение ("false").

нет

Размер поля.

Допустимые значения: "S", "M", "L".

нет

CSS-класс для поля. Например: class="annotation".

нет

".field" ".field_type_select"

Возможность редактирования:

  • disabled=true — поле закрыто для редактирования.

  • disabled=false — поле открыто для редактирования.

нет

Направление, в котором раскрывается список:

  • mode="dropdown" — вниз.

  • mode="dropup" — вверх.

нет

Текст, который записывается в файл с выходными данными при выборе данного элемента.

нет

нет

Название элемента списка.

нет

нет

Элемент списка, который выбран по умолчанию:

  • selected=true — сделать элемент списка выбранным по умолчанию.

  • selected=false — оставить элемент списка невыбранным по умолчанию.

нет

Выпадающее меню на HTML и CSS

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

  1. Вертикальное выпадающее меню
  2. Горизонтальное выпадающее меню с одним уровнем вложенности
  3. Горизонтальное меню с несколькими уровнями вложенности

Сначала сделаем HTML разметку для меню. Принято делать меню списком. Это не стандарт просто так сложилось.

<ul>
  <li><a href="#">пункт 1</a>
    <ul>
      <li><a href="#">пункт 1.1</a></li>
      <li><a href="#">пункт 1.2</a></li>
    </ul>
  </li>
  <li><a href="#">пункт 2</a>
    <ul>
      <li><a href="#">пункт 2.1 многа букаф</a></li>
      <li><a href="#">пункт 2.2</a>
        <ul>
          <li><a href="#">пункт 2.2.1</a></li>
          <li><a href="#">пункт 2.2.2</a></li>
        </ul>
      </li>
    </ul>
  </li>
  <li><a href="#">пункт 3</a></li>
  <li><a href="#">пункт 4</a></li>
  <li><a href="#">пункт 5</a></li>
</ul>

HTML файл мы больше трогать не будем. Все дальнейшие изменения производятся только за счёт CSS. Первое что нам нужно сделать — скрыть вложенные пункты.

ul.nav li ul {display: none;}

Ещё нужно убрать маркеры но это дело вкуса.

ul.nav li {list-style: none;}

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

ul.nav li:hover > ul {display: block;} 

В этой строчке заключается вся магия нашего выпадающего меню, поэтому разберём её подробнее. Благодаря псевдоклассу :hover, при наведении курсора на пункт меню, он же элемент списка li, для первого вложенного списка ul значение display станет block. Так открывается первый уровень вложенности. Если на этом уровне есть пункты содержащие подпункты, то при наведении на них также откроется только один вложенный уровень.

С основной механикой разобрались. Осталось переопределить место где будут появляться вложенные пункты. Для этого воспользуемся свойством position: absolute. При таком позиционировании отсчёт координат ведётся от края окна браузера если только для родительского элемента не задано свойство position с значением fixed, relative или absolute. В этом случае отсчёт ведётся от края родительского элемента.

Используя свойство position мы переместим вложенные пункты в право на расстояние равное ширине меню. В рассматриваемом способе есть одно ограничение. При позиционировании нам придётся жёстко задать ширину. С другой стороны вертикальное меню размещается в сайдбаре ширина которого заранее определена, поэтому привязка к ширине не должна вызвать проблем.

/* Вертикальное выпадающее меню*/
body{
  background: #DCDCDC;
}
/*блок меню*/
ul{
  margin: 0;
  padding: 0;
}
ul.nav li {
  background: #B3B3FF;
  border: 1px solid #FFFFFF;
  list-style: none;
  width: 150px;         /*ширина блока меню*/
}
ul.nav li a {
  text-decoration: none;
  display: block;
  padding: 5px 5px 5px 15px;
}
ul.nav li ul {
  display: none;	/*скрываем вложенные пункты*/
}

/*Выпадающее меню*/

ul.nav li:hover {
  /* позиционирование вложенных элементов
   * будет расчитыватьться относительно
   * родительского элемента
   */
  position: relative;
  background: yellow;
}
ul.nav li:hover > ul {
  display: block;
}
ul.nav li:hover ul{
  position: absolute;
  top: 0;       /*Задаём координаты для вложенных пунктов*/
  left: 150px; /*меню раскрывается вправо*/
}

Вот что должно получиться в результате. демка

Для горизонтального меню мы будем так же применять позиционирование но есть несколько нюансов. Что бы сделать меню горизонтальным используем свойство float. Меню будет раскрываться вниз значит при позиционировании нужно учитывать высоту. Для начала сделаем меню с одним уровнем вложенности. Вложенное меню также будет горизонтальным. Для этого вложенное меню позиционируем относительно списка а не родительского пункта и задаём для него ширину.

/*Горизонтальное выпадающее меню с одним уровнем вложенности*/

body{
  background: #DCDCDC;
}

/* Блок меню*/

ul{
  margin: 0;
  padding: 0;
}
ul.nav li {
  background: #B3B3FF;
  border-right: 1px solid #FFFFFF;
  float: left; /*делаем меню горизонтальным*/
  height: 30px;
  list-style: none;
}
ul.nav li a {
  text-decoration: none;
  display: block;
  padding: 5px 5px 5px 15px;
}
ul.nav li ul {
  display: none;	/*скрываем вложенные пункты*/
}
ul.nav li:hover {
  background: yellow;
}
/*Выпадающее меню*/
ul.nav {
  position: relative;
  background: #B3B3FF;
  height: 30px;
  width: 600px;
}
ul.nav li:hover > ul {
  background: #D0E0FF;
  border-top: 1px solid white;
  display: block;
  width: 600px;
  position: absolute;
  top: 30px;
  left: 0;
}

Вот что получиться в итоге демка.

Созданное в предыдущем пункте меню также может быть многоуровневым но выглядит оно при этом не очень. На мой взгляд многоуровневое меню должно открываться следующим образом — первый уровень вниз остальные вправо. Здесь, в отличии от предыдущего горизонтального меню, вложенные пункты позиционируем относительно родительского пункта и задаём для них ширину. Ширина нам нужна для второго и последующих уровней вложенности. В этом меню мы возьмём понемногу от предыдущих и немного добавим нового.

/*Горизонтальное выпадающее меню a*/

body{
  background: #DCDCDC;
}

/* Блок меню*/
ul{
  margin: 0;
  padding: 0;
}
ul.nav li {
  background: #B3B3FF;
  border-right: 1px solid #FFFFFF;
  float: left; /*делаем меню горизонтальным*/
  height: 30px;
  list-style: none;
}
ul.nav li a {
  text-decoration: none;
  display: block;
  padding: 5px 5px 5px 15px;
}
ul.nav li ul {
  display: none;	/*скрываем вложенные пункты*/
}
ul.nav { /*задаём высоту и ширину меню*/
  background: #B3B3FF;
  height: 30px;
  width: 600px;
}

/*Выпадающее меню*/

ul.nav li:hover {
  background: yellow;
  position: relative;
}
ul.nav li:hover > ul {
  border-top: 1px solid white;
  display: block;
  position: absolute;
  top: 30px; /*первый уровень меню раскрывается вниз*/
  left: 0;
}
/*Второй и последующие уровни вложенности*/
ul.nav li ul li{
  border-bottom: 1px solid white;
  height: auto;
  width: 150px;
}
ul.nav li:hover ul li ul{
  position: absolute;
  top: 0;
  left: 150px; /*второй и последующие уровни расскрываются вправо*/
}

Вот так будет выглядеть наше многоуровневое меню демка.

Красивое оформление выпадающего списка на CSS3 и jQuery

@font-face {

    font-family: ‘icomoon’;

    src:url(‘../fonts/icomoon/icomoon.eot?-rdnm34’);

    src:url(‘../fonts/icomoon/icomoon.eot?#iefix-rdnm34′) format(’embedded-opentype’),

        url(‘../fonts/icomoon/icomoon.woff?-rdnm34’) format(‘woff’),

        url(‘../fonts/icomoon/icomoon.ttf?-rdnm34’) format(‘truetype’),

        url(‘../fonts/icomoon/icomoon.svg?-rdnm34#icomoon’) format(‘svg’);

    font-weight: normal;

    font-style: normal;

}

 

div.cs-skin-border {

    background: transparent;

    font-size: 2em;

    font-weight: 700;

    max-width: 600px;

}

 

@media screen and (max-width: 30em) {

    .cs-skin-border { font-size: 1em; }

}

 

.cs-skin-border > span {

    border: 5px solid #000;

    border-color: inherit;

    transition: background 0.2s, border-color 0.2s;

}

 

.cs-skin-border > span::after,

.cs-skin-border .cs-selected span::after {

    font-family: ‘icomoon’;

    content: ‘\e000’;

}

 

.cs-skin-border ul span::after {

    content: »;

    opacity: 0;

}

 

.cs-skin-border .cs-selected span::after {

    content: ‘\e00e’;

    color: #ddd9c9;

    font-size: 1.5em;

    opacity: 1;

    transition: opacity 0.2s;

}

 

.cs-skin-border.cs-active > span {

    background: #fff;

    border-color: #fff;

    color: #2980b9;

}

 

.cs-skin-border .cs-options {

    color: #2980b9;

    font-size: 0.75em;

    opacity: 0;

    transition: opacity 0.2s, visibility 0s 0.2s;

}

 

.cs-skin-border.cs-active .cs-options {

    opacity: 1;

    transition: opacity 0.2s;

}

 

.cs-skin-border ul span {

    padding: 1em 2em;

    backface-visibility: hidden;

}

 

.cs-skin-border .cs-options li span:hover,

.cs-skin-border li.cs-focus span {

    background: #f5f3ec;

}

HTML-тег выбора


Пример

Создайте раскрывающийся список с четырьмя вариантами:

Выбери машину:

<выбрать name = "cars">




Попробуй сам »

Дополнительные примеры «Попробуйте сами» ниже.


Определение и использование

Элемент чаще всего используется в форме для сбора пользовательского ввода.

Атрибут name необходим для ссылки данные формы после отправки формы (если вы опустите name , данные из раскрывающегося списка отправляться не будут).

Атрибут id необходим для связи раскрывающийся список с меткой.

Теги


Атрибуты событий

Тег с тегами:


Попробуй сам »

Связанные страницы

Ссылка на HTML DOM: выберите объект

Учебное пособие по CSS: стилизация форм


Настройки CSS по умолчанию

Нет.



Выпадающие списки начальной загрузки


Базовое раскрывающееся меню

Выпадающее меню — это переключаемое меню, которое позволяет пользователю выбрать одно значение. из предопределенного списка:

Пример




Попробуй сам »

Объяснение примера

Модель .dropdown class указывает раскрывающееся меню.

Чтобы открыть раскрывающееся меню, используйте кнопку или ссылку с классом .dropdown-toggle и то data-toggle = "dropdown" атрибут .

Класс .caret создает значок стрелки курсора (), который указывает, что кнопка представляет собой раскрывающийся список.

Добавьте класс .dropdown-menu к элементу

    , чтобы создать раскрывающееся меню.


    Выпадающий разделитель

    Модель .divider класс используется для разделения ссылок внутри выпадающего меню тонкой горизонтальной рамкой:



    Раскрывающийся заголовок

    Класс .dropdown-header используется для добавления заголовков в раскрывающееся меню:


    Отключить и активировать элементы

    Выделите конкретный элемент раскрывающегося списка с помощью класса .active (добавляет синий цвет фона).

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

    Пример

  • CSS

  • HTML
  • Попробуй сам »

    Раскрывающееся положение

    Чтобы выровнять раскрывающийся список по правому краю, добавьте .dropdown-menu-right класс к элементу с. dropdown-menu:

    Выпадение

    Если вы хотите, чтобы раскрывающееся меню расширялось вверх, а не вниз, измените элемент

    с до "dropup" :


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

    Чтобы облегчить доступ для людей, использующих программы чтения с экрана, вы должны включить следующие атрибуты role и aria- * при создании раскрывающегося меню:

    Пример




    Попробуй сам »

    Полный справочник раскрывающегося списка начальной загрузки

    Для получения полной информации обо всех раскрывающихся опциях, методах и событиях перейдите на наш Справочник по раскрывающемуся списку Bootstrap JS.



    Раскрывающиеся списки CSS | HTML Собака

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

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

    Рекламируйте здесь! На давнем, начитанном и уважаемом ресурсе веб-разработки.

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

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

     
    
      

    Итак, у нас есть «Птицы» и «Млекопитающие» как предметы верхнего уровня, а «Ratites», «Monotremes» и так далее как предметы второго уровня, подкатегории.

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

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

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

     
    ul {
        отступ: 0;
        маржа: 0;
    }
      

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

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

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

     
    ul ul {
        позиция: абсолютная;
        дисплей: нет;
    }
      

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

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

     
    li: hover ul {
        дисплей: блок;
    }
      

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

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

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

     
    
  • Млекопитающие
  • Теперь, чтобы немного по-другому относиться к этим новым подподспискам, мы хотим, чтобы они отображались сбоку от элементов родительского списка, а не под ними:

     
    ul ul ul {
        осталось: 100%;
        верх: 0;
    }
      

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

     
    li: hover> ul {
        дисплей: блок;
    }
      

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

    Довольно красиво

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

    Как создать раскрывающееся меню с помощью CSS

    В этом руководстве вы узнаете, как создать раскрывающееся меню с помощью CSS.

    1. Начните со следующего HTML-документа, содержащего неупорядоченный список:
       
      
      
      
      
       Раскрывающееся меню навигации 
      
      
      <основной>
      <заголовок>
       

      Горизонтальная навигация с раскрывающимся меню

Без CSS он будет выглядеть следующим образом:
  • Создайте файл для внешней таблицы стилей и создайте ссылку на него из HTML, используя следующий тег:
     
    
     
  • Внутри таблицы стилей используйте следующий CSS для создания базового горизонтального меню:
     
    ol, ul {
    стиль списка: нет;
    }
    #главное меню {
    маржа: 10 пикселей;
    ширина: 900 пикселей;
    семейство шрифтов: без засечек;
    }
    #mainMenu li {
    дисплей: блок;
    ширина: 120 пикселей;
    плыть налево;
    маржа слева: 2px;
    граница: 1px solid # 000;
    }
    
    #mainMenu a {
    дисплей: блок;
    отступ: 3 пикселя;
    текстовое оформление: нет;
    цвет фона: #fff;
    цвет: # 009;
    }
    
    #mainMenu a: hover {
    цвет фона: # 009;
    цвет: #fff;
    }
      
  • Откройте HTML-страницу в браузере.Этот код отображает следующее:
  • В HTML добавьте вложенный список под элементом списка «О программе».
     
    
    
      
  • В CSS установите относительное положение элементов главного меню.Нам нужно будет позиционирование подменю с использованием абсолютного позиционирования, но с абсолютным позиционированием элементы располагаются в пределах их ближайшего нестатически позиционированного, содержащего элемент. Итак, чтобы подготовиться к этому, мы сначала сделаем основные элементы списка относительно позиционируется:
     
    #mainMenu li {
     позиция: относительная; 
    дисплей: блок;
    ширина: 120 пикселей;
    плыть налево;
    маржа слева: 2px;
    граница: 1px solid # 000;
    }
      
  • Абсолютное позиционирование подменю. Подменю содержатся в элементах ul внутри li элементов.Следующее правило использует абсолютное позиционирование для позиционирования их сразу под этими элементами li:
    #mainMenu li ul {
    позиция: абсолютная;
    маржа: 0px;
    отступ: 0 пикселей;
    слева: -3px;
    верх: 22px;
    }
     
  • Скрыть подменю. Добавить дисплей: нет; к правилу выше, чтобы скрыть подменю.
    #mainMenu li ul {
     дисплей: нет; 
    позиция: абсолютная;
    маржа: 0px;
    отступ: 0 пикселей;
    слева: -3px;
    верх: 22px;
    }
     
  • Стиль опций подменю.Два правила ниже добавляют границы вокруг подменю. параметры. Мы отключаем верхнюю границу для всех, кроме первого варианта, который мы определяем с псевдоклассом: first-child, чтобы мы не получали двойную толщину граница, полученная из верхней и нижней границ смежных параметров.
     
    #mainMenu li ul {
    позиция: абсолютная;
    маржа: 0px;
    отступ: 0 пикселей;
    слева: -3px;
    верх: 22px;
    дисплей: нет;
    }
    #mainMenu li ul li {
    ширина: 150 пикселей;
    размер шрифта: меньше;
    граница-верх: нет;
    }
    #mainMenu li ul li: first-child {
    border-top: 1px solid # 000;
    }
      
  • Отображать подменю, когда пользователь наводит курсор на основную опцию.Современный браузеры позволяют использовать псевдокласс: hover почти для всех элементов, включая список пунктов. В приведенном ниже коде для свойства отображения подменю устанавливается значение блокировать, когда пользователь наводит курсор на родительский элемент списка:
    #mainMenu li: hover ul {
    дисплей: блок;
    }
     
  • Готовый CSS должен выглядеть следующим образом:
     
    #главное меню {
    маржа: 10 пикселей;
    ширина: 900 пикселей;
    семейство шрифтов: без засечек;
    }
    #mainMenu li {
    положение: относительное; отображение: блок;
    ширина: 120 пикселей;
    плыть налево;
    маржа слева: 2px;
    граница: 1px solid # 000;
    }
    #mainMenu a {
    дисплей: блок;
    отступ: 3 пикселя;
    текстовое оформление: нет;
    цвет фона: #fff;
    цвет: # 009;
    }
    #mainMenu a: hover {
    цвет фона: # 009;
    цвет: #fff;
    }
    #mainMenu li ul {
    позиция: абсолютная;
    маржа: 0px;
    отступ: 0 пикселей;
    слева: -3px;
    верх: 22px;
    дисплей: нет;
    }
    #mainMenu li ul li {
    ширина: 150 пикселей;
    размер шрифта: меньше;
    граница-верх: нет;
    }
    #mainMenu li ul li: first-child {
    border-top: 1px solid # 000;
    }
    #mainMenu li: hover ul {
    дисплей: блок;
    }
     
  • Откройте HTML-страницу в браузере.Этот код отображает следующее:
  • Bulma: Бесплатная современная CSS-структура с открытым исходным кодом на основе Flexbox

    Выпадающий список — это контейнер для кнопки раскрывающегося списка и раскрывающегося меню.

    • раскрывающийся список основной контейнер
      • dropdown-trigger контейнер для кнопки
      • выпадающее меню переключаемое меню, скрыто по умолчанию
        • dropdown-content выпадающий список box , с белым фоном и тенью
          • dropdown-item каждый single item dropdown, который может быть a или div
          • выпадающий разделитель горизонтальная линия для разделения выпадающих элементов

    HTML

        

    Выпадающее содержимое #

    В то время как раскрывающийся список может использоваться как якорная ссылка , вы также можете использовать

    и вставлять почти любой тип содержимого .

    HTML

        

    Hoverable или Toggable #

    Выпадающий компонент имеет 2 дополнительных модификатора

    • is-hoverable : раскрывающийся список будет отображаться, когда наведен на , выпадающий триггер
    • активен : в раскрывающемся списке постоянно отображается

    Хотя реализация CSS : hover работает отлично, класс is-active доступен для пользователей, которые хотят управлять отображением раскрывающегося списка с помощью JavaScript .

    HTML

        

    HTML

      

    В раскрывающееся меню можно вставить любой тип содержания .

    Выровнен по правому краю #

    Вы можете добавить модификатор is-right , чтобы выпадающий список был выровнен по правому краю.

    HTML

      

    Раскрывающийся список по умолчанию выровнен по левому краю .

    HTML

      

    Добавьте модификатор is-right для раскрывающегося с выравниванием по правому краю .

    Dropup #

    Вы можете добавить модификатор is-up , чтобы раскрывающееся меню отображалось над кнопкой раскрывающегося списка.

    HTML

      

    Вы можете добавить модификатор is-up , чтобы раскрывающееся меню отображалось над кнопкой раскрывающегося списка.

    Переменные #

    Имя

    Тип

    Ценить

    Расчетное значение

    Вычисляемый тип

      $ dropdown-content-background-color  

    переменная

    цвет

      $ dropdown-content-padding-bottom  

    размер

      $ dropdown-content-padding-top  

    размер

    переменная

      0 0.5em 1em -0.125em rgba ($ scheme-invert, 0,1), 0 0px 0 1px rgba ($ scheme-invert, 0,02)  

    тень

      $ dropdown-item-hover-color  

    переменная

    цвет

      $ dropdown-item-hover-background-color  

    переменная

    цвет

      $ dropdown-item-active-color  

    переменная

    цвет

      $ dropdown-item-active-background-color  

    переменная

    цвет

      $ dropdown-divider-background-color  

    переменная

    цвет

    Pure Dropdown CSS Navigation Bar From Scratch

    Выпадающие меню неизбежны, когда дело доходит до разработки интерфейса.В какой-то момент вы столкнетесь с ними.

    Хотя большинство фреймворков CSS делают это автоматически, иногда вам просто нужно сделать это самостоятельно.

    Но вот вопрос - как?

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

    Вот краткое руководство о том, как все это работает и почему работает, с примерами кода.

    Или, если вы сразу после последнего рецепта кода, вы можете просто прокрутить вниз и взять его там.

    Но прежде, чем мы начнем, нам нужно прежде всего определиться с несколькими концепциями.

    Относительное и абсолютное позиционирование в CSS - одна из тех надоедливых концепций, с которыми часто сталкиваются новые интерфейсные разработчики.

    Мы все знаем, что он может перемещать вещи, но как это работает?

    Начнем с родственника и следующего кода:

      

    Здесь текст

    Здесь снова немного текста

    Когда он отображается, граничная область каждого тега выглядит примерно так:

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

    простираются до края вашего браузера.

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

    Допустим, мы хотим применить относительно к нашим тегам p и переместить его вправо и вниз. Мы бы написали что-то вроде этого:

      p {position: relative; слева: 50 пикселей; верх: 50 пикселей; }  

    Это приведет к следующему результату:

    Блоки p перемещаются соответственно (50 пикселей слева и 50 пикселей сверху).Относительность его исходной точки зависит от экрана.

    Следует отметить, что когда вы используете , относительный , он не перемещает ваши элементы из естественного потока блоков. Это означает, что если у вас есть контейнер div вокруг тегов p и применить к нему относительный , это не приведет к сворачиванию div .

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

    Например, ваш HTML-код выглядит примерно так:

      

    Здесь немного текста

    Здесь снова текст

    А ваш CSS выглядит примерно так:

      div {
    положение: относительное; слева: 50 пикселей; верх: 50 пикселей;
       }  

    Ваш визуальный результат будет примерно таким:

    Итак, где же здесь абсолютное позиционирование?

    Абсолютное позиционирование наиболее эффективно, когда оно используется в дочернем элементе.Если вы используете его для родительского элемента, его координаты привязаны к вашему окну.

    Например, представьте, что у вас есть следующий HTML-код:

      

    Здесь немного текста

    Здесь немного текста

    Здесь снова текст

    Здесь немного текста

    Вот как поток будет выглядеть при нормальных обстоятельствах:

    Если вы применили position: absolute к вашему div , а затем переместили его, исходный координаты не будут основываться на угловой точке вашего текущего положения.Скорее, они будут основаны на верхнем левом углу вашего окна.

    В дополнение к этому, весь блок div будет перемещен из вашего естественного потока блоков. Он будет располагаться поверх всего остального, как если бы он существовал на собственном уровне. Ширина также уменьшается до ширины самого большого элемента внутри (который также схлопнулся).

    В итоге он выглядит так:

    Предположим, вы начали перемещать его, а ваш код CSS выглядит примерно так:

      div {
    позиция: абсолютная; верх: 0; слева: 10 пикселей;
    }  

    Вместо размещения div на основе его текущей позиции, начальные координаты будут начинаться в верхнем левом углу и идти оттуда.

    В итоге это выглядит примерно так:

    Как работает комбинация позиционирования относительного и абсолютного в CSS?

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

    Когда нет контейнера, окно эквивалентно родительскому контейнеру.

    Предположим, у вас есть комбинация CSS, которая выглядит примерно так:

      div {position: relative;}
    div p {позиция: абсолютная; верх: 50 пикселей; }  

    У вас получится что-то вроде этого:

    Исходный контейнер div остается на месте, в то время как теги p накладываются друг на друга, потому что они были перемещены из обычного потока в свой собственный. плоскости, и размещаются с левым верхним углом div в качестве начальной точки.

    Высота div также уменьшается.Почему?

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

    Итак, это одна из концепций для понимания того, как работают раскрывающиеся меню на чистом CSS. Перейдем к следующему.

    Каждый элемент HTML имеет отображаемое значение по умолчанию, и это значение часто составляет , блок .

    По умолчанию имеется несколько встроенных элементов . Вот краткий список того, что есть по умолчанию.

    блочный элемент по умолчанию

      <адрес> <статья>