Создаем стильные выпадающие списки. Выбор из выпадающего списка в HTML Выпадающий список при наведения css
Сегодня хочу представить небольшой «рецепт» создания списка на CSS. Никакого JQuery, никакого CSS3 — только старый, добрый, кроссбраузерный CSS. Пример достаточно простой, поэтому опытным товарищам, возможно, будет неинтересно. Будем реализовывать выпадающий список с социальными кнопками.
Итак, не будем долго рассуждать, перейдем сразу к делу
HTML
Поделись записью
- Google Plus
- ВКонтакте
- RSS
Я сознательно опускаю общие моменты, вроде подключения стилей, чтобы код не разрастался. Внизу страницы я дам ссылку на исходники — там все есть.
Что у нас в HTML — обычный список и необычный заголовок. Его необычность в том, что сделан он гиперссылкой, которая позволяет отследить событие :hover
, то есть наведение. Выпадающий список будет работать при наведении курсора на заголовок.
CSS
Для начала рассмотрим базовые стили выпадающего списка. Я старался комментировать каждую строку кода, чтобы было понятнее:
/*Сбросим отступы*/ .droplink ul,.droplink h3,.droplink h3 a{ padding:0;margin:0 } /*Базовая обертка*/ .droplink { width:200px; position:absolute; margin:10px 0 0 25px } /*Стиль блока при наведении*/ .droplink:hover{ height:auto; background-color:#3E403D; border:solid 1px #3A3C39 } /*Заголовок в обычном состоянии*/ .droplink h3 a{ text-align:center; width:100%; display:block; padding:12px 0px; color:#999; text-decoration:none } .droplink h3 a img{border:none} /*Стиль для заголовка при наведении*/ .droplink:hover h3 a { color:#FFF; font-weight:bold; position:absolute }
Тут ничего особенного, указали размеры и стиль блока, стиль заголовка и для обеих элементов — их стили при наведении курсора. Идем дальше:
/*Скрываем список без наведения*/ .droplink ul{ list-style:none; display:none } /*Отображаем список при наведении*/ .droplink:hover ul{ display:block; margin-top:40px } .droplink li{display:block}
Этот код уже поинтереснее и показывает, как ведет себя выпадающий список при наведении курсора. В обычном состоянии стоит display:none, то есть он не отображается. При наведении — показываем его блоком. Вот и весь секрет. Теперь немного оформим элементы списка и вставим иконки:
/*Стиль элемента списка*/ .droplink li a{ padding:5px 12px 4px 34px; margin:1px; background-color:#484A47; display:block; color:#FFF; text-decoration:none; font-size:12px; background-repeat:no-repeat; background-position: 10px 3px } /*Стиль элемента при наведении*/ .droplink li a:hover{ background-color:#999 } /*Иконки*/ .facebook a {background-image:url("icons/facebook.png")} .twitter a {background-image:url("icons/twitter.png")} .vk a {background-image:url("icons/vk.png")} .rss a {background-image:url("icons/rss.png")} .gplus a {background-image:url("icons/gplus.png")}
Вот, собственно, и все. Выпадающий список готов и смотрится достаточно симпатично. Можно оформить элементы на свое усмотрение, добавить закругленных углов и прочих «примочек».
Если необходимо, чтобы список «перекрывал» текст под ним при наведении — смотрите в сторону z-index .
Если что-то непонятно или не получается — спрашивайте в комментариях или воспользуйтесь кнопкой «Отправить сообщение», она там —>
Горизонтальное выпадающее меню используется для упорядочения структуры навигации по сайту. Оптимальное количество уровней вложения — один-два. Чем меньше уровней вложений, тем легче посетителю сайта найти нужную информацию. Как создать обычное горизонтальное меню, подробно изложено в .
Как сделать горизонтальное выпадающее меню
1. HTML-разметка и базовые стили для выпадающего меню с одним уровнем вложения
HTML-разметка горизонтального выпадающего меню отличается от обычного меню тем, что к нужному элементу списка
- или <оl> .
- В примерах кода пропущены префиксы браузеров для CSS-свойств, но вы, конечно, можете найти их в исходных файлах.
- Лично я использую бокс-модель, где = + + . Чтобы её активировать, необходим следующий фрагмент кода:
- > I"m hidden!>
- > Me too!>
- > So do I.>
- Во-первых, мы делаем выпадающий список видимым, изменив его прозрачность до 1.
- Далее, мы меняем направление и цвет маленькой стрелки.
- Затем мы изменим фон позади стрелки с помощью градиента.
- > type ="checkbox" id ="el-1" name ="el-1" value ="donut" > > >
- > type ="checkbox" id ="el-2" name ="el-2" value ="neighbour" > > >
- > type ="checkbox" id ="el-3" name ="el-3" value ="T-rex" > > >
- > href ="#" > class ="icon-user" > > Профиль> >
- > href ="#" > class ="icon-cog" > > Настройки> >
- > href ="#" > class ="icon-remove" > > Выйти> >
- Selected - предназначен для выделения пункта списка. Пользователь сможет выделять более одного пункта, если задан атрибут multiple (см. выше).
- Value - значение. Этот атрибут обязателен. Веб-сервер должен понимать, какие именно пункты списка выбрал пользователь.
- Label. С помощью этого атрибута можно сокращать слишком длинные элементы списков. Например, на экран будет выводиться «Милан», вместо указанного в теге option «Милан - административный центр Ломбардии. Северная Италия». Этот атрибут также используется для группировки пунктов в списке.
Для позиционирования вложенного меню относительно основного меню объявляются следующие стили:
— для элемента списка, в который вложен выпадающий список: li {position: relative;} ;
— для выпадающего меню ul {position: absolute;} , а также значения left и top .
Для наглядности и удобства форматирования добавим основному меню класс topmenu , выпадающему — submenu .
Скрыть выпадающее меню можно несколькими способами:
1) display: none;
2) visibility: hidden;
3) opacity: 0;
4) transform: scaleY(0);
5) с помощью библиотеки jQuery.
Способ 1. {display: none;}
Выпадающее меню скрывается с помощью.submenu {display: none;} , при наведении показывается с помощью.topmenu li:hover .submenu {display: block;} .
Способ 2. {visibility: hidden;}
Меню скрывается с помощью.submenu {visibility: hidden;} , показывается — .topmenu li:hover .submenu {visibility: visible;} .
Способ 3. {opacity: 0;}
Меню скрывается с помощью.submenu {opacity: 0;} , показывается — .topmenu li:hover .submenu {opacity: 1;} . Чтобы меню не появлялось при наведении на область, где оно расположено, добавляем visibility: hidden; , а при наведении меняем на visibility: visible; .
Способ 4. {transform: scaleY(0);}
Меню скрывается с помощью.submenu {transform: scaleY(0);} , показывается — .topmenu li:hover .submenu {transform: scaleY(1);} . Поскольку трансформация элемента по умолчанию происходит из центра, нужно добавить для.submenu {transform-origin: 0 0;} , т.е. из верхнего левого угла.
Способ 5. С помощью jQuery
$(".five li ul").hide(); // скрываем выпадающее меню $(".five li:has(".submenu")").hover(function(){ $(".five li ul").stop().fadeToggle(300);} /* отбираем элемент списка, который содержит элемент с классом.submenu и добавляем ему функцию при наведении, которая показывает и скрывает выпадающее меню */);2. 3D выпадающее меню
Интересные эффекты можно создавать с помощью CSS3-трансформаций, например, заставить меню появляться из глубины экрана.
* { box-sizing: border-box; } body { margin: 0; background: radial-gradient(#BFD6E2 1px, rgba(255,255,255,0) 2px); background-size: 10px 10px; } nav ul { list-style: none; margin: 0; padding: 0; } nav a { display: block; text-decoration: none; outline: none; transition: .4s ease-in-out; } .topmenu { backface-visibility: hidden; background: rgba(255,255,255,.8); } .topmenu > li { display: inline-block; position: relative; } .topmenu > li > a { font-family: "Exo 2", sans-serif; height: 70px; line-height: 70px; padding: 0 30px; font-weight: bold; color: #003559; text-transform: uppercase; } .down:after { content: "\f107"; margin-left: 8px; font-family: FontAwesome; } .topmenu li a:hover { color: #E6855F; } .submenu { background: white; border: 2px solid #003559; position: absolute; left: 0; visibility: hidden; opacity: 0; z-index: 5; width: 150px; transform: perspective(600px) rotateX(-90deg); transform-origin: 0% 0%; transition: .6s ease-in-out; } .topmenu > li:hover .submenu{ visibility: visible; opacity: 1; transform: perspective(600px) rotateX(0deg); } .submenu li a { color: #7f7f7f; font-size: 13px; line-height: 36px; padding: 0 25px; font-family: "Kurale", serif; }
3. Разворачивающееся выпадающее меню с логотипом
В этом примере в верхнем разделе страницы расположены логотип и навигация по сайту. В качестве логотипа может быть картинка или текст. Выпадающее меню постепенно разворачивается из-под элемента верхнего списка с помощью функции CSS3-трансформации.
4. Увеличивающееся выпадающее меню
Ещё один пример для выпадающего меню. Эффект увеличения при появлении меню реализуется за счет уменьшения первоначального размера.submenu {transform: scale(.8);} , при наведении размер увеличивается до.topmenu > li:hover .submenu {transform: scale(1);} .
* { box-sizing: border-box; } body { margin: 0; background: url(https://html5book.ru/wp-content/uploads/2015/10/background54.png) } nav { background: white; } nav ul { list-style: none; margin: 0; padding: 0; } nav a { text-decoration: none; outline: none; display: block; transition: .4s ease-in-out; } .topmenu { text-align: center; padding: 10px 0; } .topmenu > li { display: inline-block; position: relative; } .topmenu > li:after { content: ""; position: absolute; right: 0; width: 1px; height: 12px; background: #d2d2d2; top: 16px; box-shadow: 4px -2px 0 #d2d2d2; transform: rotate(30deg); } .topmenu > li:last-child:after { background: none; box-shadow: none; } .topmenu > li > a { padding: 12px 26px; color: #767676; text-transform: uppercase; font-weight: bold; letter-spacing: 1px; font-family: "Exo 2", sans-serif; } .topmenu li a:hover { color: #c0a97a; } .submenu { position: absolute; left: 50%; top: 100%; width: 210px; margin-left: -105px; background: #fafafa; border: 1px solid #ededed; z-index: 5; visibility: hidden; opacity: 0; transform: scale(.8); transition: .4s ease-in-out; } .submenu li a { padding: 10px 0; margin: 0 10px; border-bottom: 1px solid #efefef; font-size: 12px; color: #484848; font-family: "Kurale", serif; } .topmenu > li:hover .submenu { visibility: visible; opacity: 1; transform: scale(1); }
5. Подъезжающее выпадающее меню
Горизонтальное меню с мини-анимацией: при наведении на ссылки верхнего меню появляется маленький кружок, который также сопровождает появление выпадающего меню.
@import url("https://fonts.googleapis.com/css?.jpg); background-position: center center; background-repeat: no-repeat; background-size: cover; height: 100vh; position: relative; } body:before { content: ""; position: absolute; left: 0; bottom: 0; height: 100%; width: 100%; background: linear-gradient(45deg, rgba(0,0,0,0), rgba(255,255,255,.8)); } nav { text-align: center; padding: 40px 0 0; } nav ul { list-style: none; margin: 0; padding: 0; } nav a { text-decoration: none; display: block; color: #222; } .topmenu > li { display: inline-block; position: relative; } .topmenu > li > a { position: relative; padding: 10px 15px; font-family: "Kaushan Script", cursive; font-size: 1.5em; line-height: 1; letter-spacing: 3px; } .topmenu > li > a:before { content: ""; position: absolute; z-index: 5; left: 50%; top: 100%; width: 10px; height: 10px; background: white; border-radius: 50%; transform: translate(-50%, 20px); opacity: 0; transition: .3s; } .topmenu li:hover a:before { transform: translate(-50%, 0); opacity: 1; } .submenu { position: absolute; z-index: 4; left: 50%; top: 100%; width: 150px; padding: 15px 0 15px; margin-top: 5px; background: white; border-radius: 5px; box-shadow: 0 0 30px rgba(0,0,0,.2); box-sizing: border-box; visibility: hidden; opacity: 0; transform: translate(-50%, 20px); transition: .3s; } .topmenu > li:hover .submenu { visibility: visible; opacity: 1; transform: translate(-50%, 0); } .submenu a { font-family: "Libre Baskerville", serif; font-size: 11px; letter-spacing: 1px; padding: 5px 10px; transition: .3s linear; } .submenu a:hover {background: #e8e8e8;}
В этой статье мы покажем, как создавать красивые выпадающие списки без использования изображений, только при помощи CSS. Также мы добавим немного кода jQuery, чтобы заставить их работать.
Обратите внимание на некоторые вещи, прежде чем мы начнем:
*,
*
:after
,
*
:before
{
box-sizing:
border-box;
}
Итак, с чего же мы начнем.
Первый вопрос: что нам нужно для создания выпадающего меню? В общем, мы будем использовать блок DIV с вложенным тегом span и неупорядоченный список для выпадающего меню:
> I"m kinda the label!>
>
JavaScript
Нам нужнен небольшой JavaScript, чтобы наш выпадающий список работал как нужно. Этот фрагмент JS мы будем использовать для всех примеров:
//...
Obj.dd
.on
("click"
,
function
(event)
{
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. Мы используем ссылки-якоря, потому что мне кажется так будет семантически правильно, но вы можете также использовать другой тег.
>CSS
Давайте теперь перейдем к CSS. Начнем с обертки (враппера):
Wrapper-dropdown
{
/* размер и положение */
position
:
relative
;
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 & 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%
)
;
}
Три вещи, которые необходимо отметить:
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
=
{
var
obj =
this
;
$(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-разметка
>Теги используются для отображения маленьких иконок из 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 & position */
position
:
absolute
;
top
:
100%
;
left
:
-5px
;
right
:
0px
;
/* Styles */
background
:
white
;
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-разметка
>Кода не намного больше, чем раньше. Перейдем к 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 & 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-разметка
class
="dropdown"
>
>
Здесь нибудет ни ссылок, ни значков. Для каждого элемента, у нас есть две тега: чекбокс с лейблом.
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 & 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-разметка
class
="dropdown"
>
>
CSS
.wrapper-dropdown-5
{
/* Size & 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 & 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;. Ну и так далее.
Заключение.
Я надеюсь, что эта статья помогла вам понять, как создавать пользовательские раскрывающиеся меню. Как вы можете видеть, это довольно просто.
Демонстрация
Если у Вас возникли вопросы, то для скорейшего получения ответа рекомендуем воспользоваться нашим форумом
Простейший выпадающий список в HTML легко создать, используя тег select. Это тег-контейнер, в него вкладываются теги option - именно они задают элементы списка.
Есть несколько вариантов списков, которые можно сделать с помощью тега select: раскрывающийся список (варианты выпадают после клика на основном поле или наведения на него курсора) и список множественного выбора - в нем пользователь может выбрать несколько пунктов. Первые более распространены, они являются значимым элементом навигации современных сайтов. Выпадающий список множественного выбора можно применить, например, в каталогах, где нужно выбрать несколько характеристик товара.
Изменять внешний вид и свойства списков можно с помощью универсальных и специальных атрибутов.
Атрибуты тега select
1. Multiple - задает множественный выбор.
2. Size - задает количество видимых строк в списке, то есть высоту. И тут все зависит от того, присутствует атрибут multiple или нет. Если да, и вы не указываете size, то при наличии multiple пользователь увидит все возможные варианты выбора, если же multiple отсутствует, то показана будет всего одна строчка, а остальные посетитель сможет прочитать, когда нажмет на значок лифта с правой стороны. Если же высота size задана и она меньше количества вариантов, то справа появится полоса прокрутки.
3. Name - имя. Выпадающий список может обойтись и без него, но оно может быть необходимым для взаимодействия с программой-обработчиком на сервере. Как правило, имя все-таки указывают.
Тег select не имеет обязательных атрибутов в отличие от тега option.
Атрибуты вложенного тега option
Что касается ширины списка, то она устанавливается по умолчанию по длине самого широкого текста в списке. Разумеется, ширину можно менять при помощи стилей HTML.
Выпадающий список другими способами
Его можно сделать при помощи CSS, например, список будет появляться при наведении курсора на элемент страницы. Отличные возможности для создания списков предоставляет JavaScript , работу которого упрощает библиотека Jquery. Выпадающий список, подключенный с помощью этой библиотеки, может быть очень сложным, например, каскадным. То есть при выборе элемента в одном списке появляется следующий список, например, существует пункт меню «Женская одежда» (при наведении выпадают затем при выборе одного из видов, например, «Верхняя одежда», выпадает список с элементами: куртки, парки, пальто, полупальто, шубы и т. п.
Мы поверхностно перечислили основные способы, при помощи которых можно создать выпадающий список. Разумеется, есть масса нюансов в и в JavaScript, которые позволяют менять функциональность и внешний вид списков.
Часто новички сталкиваются с проблемой оформления выпадающего списка. Так как с оригинальным select особенного ничего не сделаешь. Тогда на помощь приходит jQuery , и тогда можно сделать чуть ли не что угодно.
А что если я скажу, что можно и стандартный HTML выпадающий список не плохо оформить на чистом CSS ?
Выпадающий список на HTML
Цвет фона и текста можно менять, причем делается это очень просто.
В span мы добавили 2 класса, один основной, на который ляжут все основные стили “custom-dropdown “, а второй big, который будет определять размер выпадающего списка . Мы можем заранее подготивить скажем 3 размера, big, medium, small , задать в стилях font-size . И в дальнейшем не заморачиваться. Это можно и пропустить, все зависит от вашего дизайна на сайте.
Body { background: #2a2a2b; color: #fff; text-align: center; font-family: Arial, Helvetica; } .big { font-size: 1.2em; } /* Custom dropdown */ .custom-dropdown { position: relative; display: inline-block; vertical-align: middle; margin: 10px; /* demo only */ } .custom-dropdown select { cursor:pointer; background-color: #2980b9; color: #fff; font-size: inherit; padding: .5em; padding-right: 2.5em; border: 0; margin: 0; border-radius: 3px; text-indent: 0.01px; text-overflow: ""; -webkit-appearance: button; /* hide default arrow in chrome OSX */ } .custom-dropdown::before, .custom-dropdown::after { content: ""; position: absolute; pointer-events: none; } .custom-dropdown::after { /* Custom dropdown arrow */ content: "\25BC"; height: 1em; font-size: .625em; line-height: 1; right: 1.2em; top: 50%; margin-top: -.5em; } .custom-dropdown::before { /* Custom dropdown arrow cover */ width: 2em; right: 0; top: 0; bottom: 0; border-radius: 0 3px 3px 0; } .custom-dropdown select { color: rgba(0,0,0,.3); } .custom-dropdown select::after { color: rgba(0,0,0,.1); } .custom-dropdown::before { background-color: rgba(0,0,0,.15); } .custom-dropdown::after { color: rgba(0,0,0,.4); }
Если вы не хотите заморачиваться и изучать стили, а просто добавить себе на сайт и поменять цвет под дизайн вашего сайта. То вам всего лишь в стиле “.custom-dropdown select ” нужно поменять значения background-color и color