В этой статье мы покажем, как создавать красивые выпадающие списки без использования изображений, только при помощи CSS. Также мы добавим немного кода jQuery, чтобы заставить их работать.
Обратите внимание на некоторые вещи, прежде чем мы начнем:
- В примерах кода пропущены префиксы браузеров для CSS-свойств, но вы, конечно, можете найти их в исходных файлах.
- Лично я использую бокс-модель, где = + + . Чтобы её активировать, необходим следующий фрагмент кода:
*,
*
: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%
)
;
}
Три вещи, которые необходимо отметить:
- Во-первых, мы делаем выпадающий список видимым, изменив его прозрачность до 1.
- Далее, мы меняем направление и цвет маленькой стрелки.
- Затем мы изменим фон позади стрелки с помощью градиента.
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 формы. Какой бы не был движок вашего сайта (cms), на нем обязательно будут в том или ином виде использоваться формы, созданные с помощью тегов Form и Input, а так же атрибутов и параметров Button, Checked, Value, Checkbox, Radio, Checkbox, Submit.
Ну, и еще можно добавить к этому элементы для создания выпадающих списков и текстовых полей — Select, Option, Textarea, Label, Fieldset, Legend.
Зачем нужны и как работают формы на современных сайтах
Та же строка поиска по сайту () создается с использованием этих тэгов, а поиск то на вашем проекте будет обязательно. Поэтому понимание того, как они устроены и работают, вам совсем не помешает для успешной работы над дизайном, да и при самостоятельной раскрутке и продвижении будет не лишним.
Так, с обоснованием необходимости изучения этих элементов, думаю, вопросов больше не должно возникнуть, поэтому самое время переходить непосредственно к изучению их возможных вариантов.
Да, хочу еще напомнить, что мы уже успели рассмотреть много материалов на тему языка гипертекстовой разметки, например, трех ) и .
По своей сути формы состоят из элементов, для создания которых внутри основного контейнера из тегов Form вставляют различные тэги — Checked, Value, Checkbox, Radio, Checkbox, Submit и др. Нам лишь нужно будет расположить ее код в любом удобном для этого месте шаблона сайта, указав с помощью тегов и их атрибутов, как она должна будет выглядеть.
Это может быть текстовое поле с кнопкой отправки введенного запроса, варианты выбора с радиокнопками (когда можно оставить нажатой только одну из предоставляемых кнопок), несколько текстовых полей с кнопкой для отправки () и многое другое.
Например, в случае «поиска», с помощью атрибута Value можно задать, что именно будет написано на кнопке расположенной рядом с полем для ввода запроса. Данные вводимые в формах должны быть в дальнейшем каким-то образом обработаны.
Например, в случае обратной связи пользователь, после того как заполнит поле со своим именем, введет свой E-mail и текст сообщения, а затем нажмет на кнопку отправки, будет вправе надеяться на отправку данных из формы на E-mail автора сайта. Но реализовать такое с помощью только одного языка гипертекстовой разметки (), к сожалению, не возможно.
Для этих целей потребуется специальная программа обработчик, которая после нажатия пользователем на кнопку отправки возьмет все данные из полей обратной связи и отправит их на E-mail владельцу ресурса. Какая именно программа будет это делать, вы должны указать сами с помощью атрибута Action.
Обычно программа обработки представляет из себя скрипт, написанный на языке PHP. Поэтому в атрибуте Action тэга Form вы должны будете прописать путь к файлу этого скрипта, лежащего на сервере вашего хостинга. Приведу в качестве примера подписку на RSS ленту моего блога посредством E-mail:
Немного непонятно, наверное, кажется по началу, но, думаю, что все прояснится по мере дальнейшего рассказа.
Теги Form и Input для создания кнопок, чекбоксов и радиокнопок
Любая форма должна быть заключена в открывающий и закрывающий тэги Form . Это своеобразный контейнер для их создания. У этого тега имеется ряд обязательных и необязательных атрибутов:
- Name – уникальное имя, которое нужно указывать, если в Html файле, где вы что-то делаете, будет использоваться несколько вебформ
- Action – обязательный атрибут указывающий путь к скрипту, которому будут переданы данные из нее для дальнейшей обработки
- Method – с помощью него вы можете изменить метод передачи данных из этой вебформы скрипту файла обработчика. Если вы его не укажете, то по умолчанию будет использоваться метод Get, который, собственно говоря, предназначен в основном для переменных и коротких сообщений, и к тому же открытым способом передавая данные через адресную строку браузера. Для передачи данных форм скрипту обработчика все же лучше использовать метод POST , предназначенный специально для передачи текстовых сообщений закрытым способом
Рассмотрим остальные тэги, позволяющие создавать разнообразные вебформы. Самый универсальный – это Input . Внутри него обязательно прописывают атрибут Type, который определяет, что именно будет из себя представлять HTML форма, созданная с помощью этого тэга.
C помощью Input и Type можно создавать следующие элементы:
- однострочные текстовые поля (Type="Text")
- поля для ввода пароля (Type="Password")
- чекбоксы (Type="Checkbox")
- радиокнопки (Type="Radio")
- скрытые поля (Type="Hidden")
- обычные кнопки (Type="Button")
- кнопки для отправки данных в обработчик (Type="Submit")
- кнопки для приведения вебформы к исходному состоянию (Type="Reset")
- поля для загрузки файлов на сервер (Type="File)
- кнопки с изображением (Type="Image")
Input не имеет закрывающего тега. Что именно будет представлять из себя вебформа, созданная с помощью него, целиком и полностью зависит от параметра указанного в атрибуте Type. Если Type не указан, то по умолчанию будет создано текстовое поле.
Примеры форм, созданных на Input с различными значениями для Type
Другие атрибуты тэга Input и примеры их использования
Рассмотрим, для чего нужны остальные атрибуты:
- Name – в случае, если данные должны быть отправлены в скрипт программы обработчика, то вы должны обязательно указать параметр для атрибута Name. Под этим именем данные, отправленные из формы, будут фигурировать в программе обработчика информации.
- Size — с помощью него задается размер поля создаваемой вебформы. Значение указывается в количестве символов, которое сможет поместиться в данном поле. Если Size не указан, то ширина будет принята по умолчанию равной 24 символам
- Maxlength — по умолчанию количество символов, которое можно будет ввести в Html форму, не ограничено, но с помощью Maxlength можно задать это ограничение. Больше символов, чем в нем будет указано, вам ввести в поле не удастся
- Value — с помощью него можно задать, что именно будет написано по умолчанию в поле или же на кнопке отправки данных
- Checked — это атрибут-флаг, который можно вставить в Input для радиокнопок (radio) или же для чекбоксов (checkbox). В этом случае данная радиокнопка или чекбокс будут активными при загрузке страницы с вебформой (в них уже будет стоять галочка)
Теперь давайте рассмотрим все примеры формы с Input . Внешний вид текстового поля похож на вид поля для ввода пароля, поэтому рассмотрим только вариант создания Text, например, для ввода адреса электронной почты:
Теперь давайте рассмотрим создание вебформы с радиокнопками (Radio):
Обратите внимание, что в этой форме два раза используется тег Input – по разу для создания каждой из двух радиокнопок. Причем, в каждом из них прописан атрибут Name с одинаковым значением (rezultat), а значение Value разное (YES и NO).
Это означает, что при ее обработке, в случае выбора любого из переключателей, будет отправлена переменная, название которой прописано в Name, но значение этой переменной будет зависеть от того, какой именно переключатель был выбран.
Рассмотрим пример создание вебформы с чекбоксами (Checkbox):
Чекбоксы отличаются от радиокнопок возможностью выбрать сразу несколько вариантов. Name служит для определения в файле обработчика, в каком именно чекбоксе проставлены флажки,а Value — задает то значение, которое будет отослано в обработчик (если Value задан не будет, то в обработчик будет отправлен текст, расположенный рядом с данным чекбоксом).
Select, Option, Textarea, Label, Fieldset, Legend — выпадающие списки, текстовые области и другие элементы вебформ
Для начала хочу немного напомнить, что такое, собственно, вебформы и для чего они нужны на страницах сайта. Они в первую очередь призваны в удобном для пользователя виде повторять имеющиеся в любой операционной системе элементы: кнопки, поля для ввода текста, выпадающие списки, флажки, переключатели и тому подобные вещи.
Все пользователи без каких-либо дополнительный объяснений понимают назначение этих элементов и если они видят кнопку Html формы, то понимают, что на нее нужно нажать.
Причем, все составляющие ее элементы (вроде Select, Option, Textarea, Label, Fieldset, Legend) представляют собой уже законченные заготовки (контейнеры), для вставки которых достаточно будет лишь использовать нужный тег с нужными атрибутами и параметрами.
Браузеры сами знают, как отображать тот или иной элемент вебформы. Правда, варианты отображения одного и того же ее элемента в разных браузерах могут немного отличаться друг от друга, но, как правило, не существенно.
Т.о. получается, что вебформы в Html являются попыткой перенести ключевые элементы, используемые в любой операционной системе , на страницы вебсайта. Но для чего они могут понадобиться на страницах сайта?
В принципе, для того же, для чего аналогичные элементы используются в операционных системах — передача данных от пользователя. В случае форм данные от пользователя передаются на сервер, где обрабатываются специальной программой (язык гипертекстовой разметки, к сожалению, не позволяет вести обработку данных).
Хотя, данные можно отправить не только на сервер, но и, например, по электронной почте на адрес, заданный в атрибуте Action тэга Form. При отправке из Html данных на E-mail у пользователя, заполняющего поля, после нажатия им на кнопку отправки данных, запустится почтовая программа используемая на его компьютере по умолчанию.
Открывающий тег Form в таком случае должен выглядеть примерно так:
Как вы можете убедиться, по тексту щелкать для активации этого элемента бесполезно — нужно щелкать именно по нему самому. Вот именно такое положение вещей и призван исправить тэг Label. Он позволить сделать текст рядом с элементом веб формы кликабельным, что несомненно улучшит юзабилити .
Но как связать элемент Html формы и текст? Для этого нужно дописать в атрибут ID с уникальным параметром, а текст нужно окружить открывающим и закрывающим тэгами Label. И это еще не все. В открывающем теге Label нужно прописать атрибут For, параметр которого должен быть точно таким же, как и у атрибута ID в Html теге элемента формы. Получается примерно так:
Как вы можете видеть, теперь, благодаря использованию Label, элементы вебформы можно активировать не только щелчком по нему самому, но и щелчком по тексту, расположенному рядом.
Fieldset и Legend — разбиваем форму на части
Вы, наверное, часто видели, что большие формы в Html бывают разбиты на группы (Fieldset), которые обведены в рамочку и у каждой такой группы имеется свой заголовок (Legend). Реализуется это с помощью всего двух тэгов: Fieldset и Legend. Они парные, т.е. у них должны быть в обязательном порядке открывающий и закрывающий.
Так вот, для создания группы из составных частей вам нужно заключить все эти части в открывающий и закрывающий тэги Fieldset. А для того, чтобы задать для данной группы заголовок (Legend), вам нужно сразу же после открывающего Fieldset прописать конструкцию из открывающего и закрывающего Legend, между которыми необходимо вставить текст заголовка группы.
Вот пример создания групп с помощью Fieldset и Legend:
Удачи вам! До скорых встреч на страницах блога сайт
Вам может быть интересно
Select, Option, Textarea, Label, Fieldset, Legend - теги Html формы выпадающих списков и текстового поля
Списки в Html коде - теги UL, OL, LI и DL
MailTo - что это и как в Html создать ссылку для отправки Емейла
Как задаются цвета в Html и CSS коде, подбор RGB оттенков в таблицах, выдаче Яндекса и других программах
Что такое язык гипертекстовой разметки Html и как посмотреть список всех тэгов в валидаторе W3C
Как вставить в HTML ссылку и картинку (фото) - теги IMG и A
Таблицы в Html - теги Table, Tr и Td, а так же Colspan, Cellpadding, Cellspacing и Rowspan для их создания
Теги Font (Face, Size и Color), Blockquote и Pre - устаревшее форматирование текста в чистом HTML (без использования CSS)
Как создать гиперссылку (А, Href, Target blank), как открывать ее в новом окне на сайте, а так же сделать картинку ссылкой в Html коде
Благодаря тегу
Какие есть атрибуты у тега select?
Тег
Второй атрибут required , с помощью его можно «сказать» браузеру, что список должен быть выбран перед отправкой формы, иначе браузер запретит отправлять форму, и выведет вам соответствующее сообщение. Вид этого сообщения зависит полностью от браузера и пользователь не может его изменять. Далее пример применения атрибута required:
Третий атрибут size , с помощью его можно указать количество отображаемых элементов списка. Атрибут size может содержать только целое число. Атрибут size трансформирует список, например, если он равен 1, то тег
За последние два года, разработка веб-приложений (сайтов) продвинулась далеко вперед и то, что мы использовали для создания сайта ранее — уже устарело или появились более свежие методы.
Ранее, чтобы создать выпадающий список в html (на англ. — dropdown
), мы просто использовали
Специально для этой статьи, я нашел 16 разных примеров, которые могут пригодиться во время разработки сайта. И так приступим.
1. Настраиваемый список
Html шаблон, который позволяет настроить собственные цвета на выпадающего списка.
2. Сделанный на CSS3/JavaScript
Написан на CSS3 и JavaScript. Обычный выпадающий список.
3. Стиль: станции метро
Прозрачный выпадающий список со стилистикой станций метро.
4. Dropy. Написанное на SCSS & jQuery
5. Для длинных выдающих списков
Отличное решение для длинных выпадающих меню.
Выпадающее меню, которое написано на чисто CSS без использования каких-либо скриптов.
Отлично подойдет для боковых меню на сайте, чтобы визуально показать категории на сайте.
8. Стильное меню настроек пользователя
9. CSS3 выпадающий список
Сделано в стиле UI, подойдет под UI стилистику сайта.
12. Выбор флага
Dropdown в стиле выбора страны.
13. Обычный HTML, CSS dropdown
Надеюсь вам понравилось моя подборка. Оставляйте комментарии, делитесь мнением и присылайте собственные работы!
Как сделать выпадающий список в html (подборка ТОП 16) от bologer
Выпадающий список в HTML можно сделать при помощи тега select . Помимо выпадающего (или "раскрывающегося") списка, тег select позволяет создавать элемент-список с множественным выбором. Синтаксис использования тега select HTML выглядит следующим образом:
Здесь с помощью тега option задаются элементы списка.
Результат применения:
Электроник Сыроежкин Чижиков Кукушкина
Атрибуты тега SELECT
Рассмотрим атрибуты тега select :
- name
- size - число отображаемых строк в списке (число);
- multiple - включает функцию множественного выбора элементов выпадающего списка;
- disabled - блокирует доступ к элементу;
- form - позволяет связать выпадающий список с формой (может понадобиться, если сам список находится вне формы, к которой должен быть привязан). В качестве аргумента передается id формы.
Пожалуй, это все основные атрибуты тега select , которые чаще всего используются. Посмотрим теперь, как сделать выпадающий список в HTML с использованием указанных атрибутов:
Атрибуты тега OPTION
Тег option , как уже отмечалось, позволяет определить дочерние элементы выпадающего списка select , который, в свою очередь, играет роль контейнера. Тег option имеет собственные атрибуты:
- disabled - устанавливает запрет на выбор данного элемента списка;
- label - позволяет установить метку для текущего элемента списка (вместо текста, указанного в теге, выводится значение метки, что позволяет выводить сокращенное значение); Внимание: атрибут не поддерживается в браузере Firefox
- selected - текущий пункт списка будет выбран по умолчанию;
- value - значение, которое будет передано на сервер;
Посмотрим на расширенный вариант использования тега option :
Выглядеть результат приведенного примера будет следующим образом:
Господин Электроник Сыроежкин Чижиков Кукушкина
В конструкторе сайтов "Нубекс" есть возможность создавать произвольные формы с помощью модуля конструктора форм. Работа выпадающих списков в "Нубекс" описана в статье: