Вёрстка адаптивного навигационного меню | Все о создании сайтов
Меню навигации всегда были довольно простыми в создании. Сверстайте неупорядоченный список, установите float:left
и готово. С адаптивным дизайном, который сейчас очень популярен, вы столкнётесь с некоторыми новыми трудностями.
Сейчас мы с нуля сверстаем простое, но эффектное адаптивное навигационное меню, которое вы сможете легко модифицировать и многократно использовать в своих проектах.
Что мы создаём
Если вы такой человек, которому сначала нужно увидеть результат, вот демо нашего будущего проекта. Обязательно измените размер окна своего браузера, чтобы увидеть адаптивные концепции в действии.
HTML
Давайте отбросим лишние рассуждения и сразу перейдём к делу. Вы ведь хотите добраться до интересного материала?
В первую очередь нам необходимо определиться с некоторой разметкой. Т.к. мы делаем меню навигации, это идеальный случай, чтобы использовать HTML5 элемент nav
.
<nav> </nav> |
Хотите верьте, хотите нет, но этот маленький кусочек кода доставил много хлопот, когда дело дошло до проверки. По непонятным причинам, стили просто не давали никакого эффекта в IE6-8! Наконец, через десять минут бесполезных попыток, нас осенило, что, были использованы элементы HTML5, которые, конечно же, не поддерживаются IE версии ниже 9.
К счастью, решение довольно просто, нужно только подключить известную библиотеку html5shiv (код нужно поместить в раздел
<!—[if lt IE 9]> <script src=»//html5shiv.googlecode.com/svn/trunk/html5.js»></script> <![endif]—> |
Добавляем список
Теперь, когда мы определились с контейнером, пришло время добавить UL с восемью ссылками. В этой статье важно количество элементов, так что убедитесь, что используете именно восемь ссылок, если не уверены, что сможете самостоятельно справиться с некоторыми проблемами.
1 2 3 5 6 7 8 9 10 11 12 |
<nav> <ul> <li><a href=»#»>PixelsDaily</a></li> <li><a href=»#»>About</a></li> <li><a href=»#»>Clients</a></li> <li><a href=»#»>Work</a></li> <li><a href=»#»>Podcast</a></li> <li><a href=»#»>Downloads</a></li> <li><a href=»#»>Blog</a></li> <li><a href=»#»>Contact</a></li> </ul> |
Добавляем дополнительные теги
Чтобы сделать меню немного интереснее и информативнее, давайте добавим ещё одну строку текста под заголовком каждого элемента. Есть множество способов это сделать, и вы вполне можете пойти своим путем. Но мы добавили тег br
и использовали элемент small
для второй строки. Т.к. второй элемент действительно будет маленьким, у нас получится прекрасная семантическая разметка без лишних div
’ов, ID
или классов.
1 2 3 4 5 6 8 9 10 11 12 |
<nav> <ul> <li><a href=»#»>PixelsDaily<br /> <small>Go Home</small></a></li> <li><a href=»#»>About<br /> <small>Meet Us</small></a></li> <li><a href=»#»>Clients<br /> <small>Meet Our Friends</small></a></li> <li><a href=»#»>Work<br /> <small>See Our Work</small></a></li> <li><a href=»#»>Podcast<br /> <small>Hear Us</small></a></li> <li><a href=»#»>Downloads<br /> <small>Steal Our Stuff</small></a></li> <li><a href=»#»>Blog<br /> <small>Read About Us</small></a></li> <li><a href=»#»>Contact<br /> <small>Email Us</small></a></li> </ul> </nav> |
Результаты
После этого у нас должен быть простой, нестилизованный список ссылок. Заметьте, что без каких-либо усилий, наши теги small уже работают и уменьшают размер соответствующих строк.
Начальные стили
Начнём писать CSS. В первую очередь вспомним про старый добрый универсальный селектор и, воспользовавшись советом Пола Ириша (Paul Irish), применим box-sizing: border-box
ко всем элементам. Это поможет нам легко устанавливать размер наших элементов в процентах, даже при том, что будем использовать
1 2 3 4 5 6 7 8 |
* { padding: 0; margin: 0;
-webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } |
Стили контейнера
Прежде чем мы перейдём к стилям отдельных элементов списка, применим некоторые базовые стили для родительских элементов. Во-первых, для элемента nav
установим ширину на 90% от ширины body
. Это растянет меню на достаточно большое пространство, но всё же оставит небольшой отступ вокруг него. Убедитесь, что центрировали его на странице с помощью
.
Также включите необходимые стили для неупорядоченного списка, чтобы сбросить список и избавиться от маркеров.
1 2 3 4 5 6 7 8 9 |
nav { width: 90%; margin: 50px auto; }
nav ul { list-style: none; overflow: hidden; } |
Стили меню
Теперь, когда родительские элементы работают правильно, самое время поработать с элементами меню, к которым мы можем обратиться через элемент
вместе с тегами ссылок и элементов списка.
Здесь достаточно большой отрывок кода, но не пугайтесь, мы всё постепенно объясним.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
nav li a { background: #444; border-right: 1px solid #fff; color: #fff; display: block; float: left; font: 400 13px/1. padding: 10px; text-align: center; text-decoration: none; text-transform: uppercase; width: 12.5%; }
/*SMALL*/ nav small { color: #aaa; font: 100 11px/1 Helvetica, Verdana, Arial, sans-serif; text-transform: none;
} |
Здесь свойства предоставлены в алфавитном порядке, для более простого поиска, но если честно это не лучший способ. Лучше группировать стили по функциям, так они имеют немного больше смысла. Если мы упорядочим свои стили таким образом, их будет легче рассматривать.
2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
nav li a { display: block; float: left; width: 12.5%; padding: 10px;
background: #444; border-right: 1px solid #fff;
color: #fff; font: 400 13px/1. 4 ‘Cutive’, Helvetica, Verdana, Arial, sans-serif; text-align: center; text-decoration: none; text-transform: uppercase; } |
Сначала идёт часть кода, определяющая форму и разметку каждого элемента списка. Мы изменили ссылки на элементы уровня блока, поставили
, определили ширину и добавили небольшой padding
. Так мы получаем хороший большой прямоугольник для каждой ссылки в меню. Почему 12.5% для ширины? Потому что у нас восемь пунктов меню, а 100% / 8 даёт нам 12.5% ширины на каждый элемент.
Затем следует часть кода, отвечающая за визуальные стили блоков, которые мы создали. Мы даём им цвет фона и границу справа толщиной 1px.
Наконец, мы завершаем стили свойствами, отвечающими за текст меню. Здесь всё довольно просто, шрифт мы использовали “Cutive”, его вы можете найти здесь.
Для стилей small, мы изменили цвет, удалили
и установили шрифт на Helvetica.
Результаты
Эти стили имеют достаточно большое значение. Теперь меню выглядит намного лучше. Пользовательский шрифт работает, ссылки расположены в одной строке, небольшой текст отображается отлично; всё очень красиво.
Стили при наведении
Когда пользователь проводит курсор мыши над элементом списка, мы изменим его цвет на чёрный. Чтобы это смотрелось ещё лучше, добавим плавный полусекундный переход.
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 |
nav li a { background: #444; border-right: 1px solid #fff; color: #fff; display: block; float: left; font: 400 13px/1.4 ‘Cutive’, Helvetica, Verdana, Arial, sans-serif; padding: 10px; text-align: center; text-decoration: none; text-transform: uppercase; width: 12. 5%;
/*ПЕРЕХОДЫ*/ -webkit-transition: background 0.5s ease; -moz-transition: background 0.5s ease; -o-transition: background 0.5s ease; -ms-transition: background 0.5s ease; transition: background 0.5s ease; }
/*HOVER*/ nav li a:hover { background: #222; } |
Границы
Сейчас вы не можете это видеть, поскольку у нас белый фон, но на самом деле у нас есть проблема с границами (border). Мы использовали границы, чтобы разделить соседние элементы, поэтому у последнего элемента имеется ненужная нам граница. Чтобы это исправить, мы можем использовать псевдо-элемент last:child
.
nav li:last-child a { border: none; } |
Ниже мы применили временный цвет фона, только для того, чтобы вы смогли увидеть различия в меню до и после.
Адаптивность
Этот проект послужит отличным примером отличия адаптивного дизайна от резинового. Сейчас наше меню резиновое (оно использует ширину, указанную в процентах), но не адаптивное. Мы можем ясно это увидеть, когда попытаемся сильно уменьшить размер окна браузера:
Как видно, всё работает ужасно! Давайте попробуем использовать несколько media queries, чтобы посмотреть, сможем ли мы устранить эту проблему. Лучший способ узнать, где нам нужны media queries — просто открыть проект и посмотреть, где разметка ломается, а затем исправить это.
1220px
Первая проблема в нашем проекте возникает примерно при ширине 1200 пикселей. Здесь длинные строки текста начинают обрезаться и перестают быть полностью читабельными.
Чтобы это исправить, нам только нужно подогнать размер шрифта. Мы указали область непосредственно перед возникновением проблемы (1220px) и установили шрифт на 10px.
1 2 3 4 5 6 7 8 9 10 11 |
/* MEDIA QUERIES*/ @media only screen and (max-width : 1220px), only screen and (max-device-width : 1220px){ nav li a { font: 400 10px/1.4 ‘Cutive’, Helvetica, Verdana, Arial, sans-serif; }
nav small { font: 100 10px/1 Helvetica, Verdana, Arial, sans-serif; } } |
С этой правкой, проблема больше не возникает. Как только мы уменьшаем размер окна, меню реагирует и уменьшает размер шрифта.
930px
Снова уменьшаем размер окна и находим, что разметка ломается при отметке 900px. Здесь у нас проблема с переполнением:
Мы не будем делать шрифт всё меньше и меньше до тех пор, пока вы не перестанете его видеть, вместо этого мы полностью переупорядочим меню, разбив его на две строки. Теперь каждая ссылка будет большой и красивой.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@media only screen and (max-width : 930px), only screen and (max-device-width : 930px){ nav li a { width: 25%; border-bottom: 1px solid #fff; font: 400 11px/1.4 ‘Cutive’, Helvetica, Verdana, Arial, sans-serif; }
nav li:last-child a, nav li:nth-child(4) a { border-right: none; }
nav li:nth-child(5) a, nav li:nth-child(6) a, nav li:nth-child(7) a, nav li:nth-child(8) a { border-bottom: none; } } |
Обратите внимание, что сейчас нам пришлось пересмотреть то, как работают наши границы. Теперь нам нужно, чтобы верхняя строка имела нижнюю границу, но не нужно, чтобы эта граница была у нижней строки. Опять же, с селекторами псевдо-классов это довольно просто.
580px и 320px
Формат из двух строк работает хорошо до тех пор, пока мы не пересекаем черту в 600px, после чего теряются все разрывы. Разметка полностью разваливается.
Чтобы решить эту проблему, мы завершаем наши media queries форматом меню из двух колонок и четырёх строк. Эту разметку мы используем при ширине ниже 580px и уменьшаем размер шрифта на отметке 320px.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
@media only screen and (max-width : 580px), only screen and (max-device-width : 580px){ nav li a { width: 50%; font: 400 12px/1.4 ‘Cutive’, Helvetica, Verdana, Arial, sans-serif; padding-top: 12px; padding-bottom: 12px; }
nav li:nth-child(even) a { border-right: none; }
nav li:nth-child(5) a, nav li:nth-child(6) a { border-bottom: 1px solid #fff; } }
@media only screen and (max-width : 320px), only screen and (max-device-width : 320px){ nav li a { font: 400 11px/1. 4 ‘Cutive’, Helvetica, Verdana, Arial, sans-serif; } } |
Сейчас наше меню хорошо выглядит даже при очень маленьком разрешении. Обратная сторона медали заключается в том, что оно отнимает достаточно много вертикального пространства, но вы можете сократить padding
, если это вас беспокоит.
Selectivizr
Внимательные читатели заметят, что мы подстроились под старые версии IE с помощью html5shiv, чтобы селекторы псевдо-классов работали в IE. Кроме того, вам следует загрузить и подключить Selectivizr, удивительную JavaScript утилиту, построенную специально для использования CSS3 селекторов в IE6-8.
Выводы
Адаптивный дизайн — это не прогулка по парку. Все это отнимает время, требует от вас определённых усилий и знаний “know how”, которые нужно уметь эффективно осуществлять. Нам нравится разбивать обучение на отдельные части, например, меню навигации в этой статье или одна из прошлых статей Создание адаптивной галереи миниатюр, так вы можете досконально изучить весь процесс верстки.
Теперь вы вполне сможете создать собственный проект с адаптивным меню без особых усилий. Можете оставить комментарий и показать, чего вы добились. С какими трудностями вы столкнулись во время работы?
D-Link DCS-7110
Камера
Основные характеристики
• Для ревизии Ax — 1/4” мегапиксельный CMOS-сенсор
• Для ревизии B1 — 1/2,7” двухмегапиксельный CMOS-сенсор
• Инфракрасная подсветка: дальность освещения до 15м
• Встроенный ИК-фильтр
• Электронный затвор
• Встроенный объектив с фиксированным фокусным расстоянием 4 мм, F1.5
• Углы обзора для ревизии Аx: 65,4° (по горизонтали), 49,9° (по вертикали)
• Углы обзора для ревизии B1: 77,4° (по горизонтали), 45,1° (по вертикали), 88° (по диагонали)
• SDRAM, 256 Мбайт
• Flash-память 128 Мбайт
Корпус камеры
• Всепогодный корпус (стандарт IP-66)
Функционал видео
• Настройка качества, размера и скорости передачи изображения
• Метки времени и вставка текста
• Три окна для настройки обнаружения движения
• Минимальное освещение для ревизии Ax:
— 0. 26 Lux (режим дневной съемки)
— 0 Lux (режим ночной съемки) с инфракрасной подсветкой
• Минимальное освещение для ревизии B1:
— 0.12 Lux (режим дневной съемки)
— 0 Lux (режим ночной съемки) с инфракрасной подсветкой
• 5 приватных масок
• Переворот и зеркальное отображение
• Настройка яркости, насыщенности, контраста
• Автоматический контроль усиления (AGC), Автоматический баланс белого (AWB), Автоматическая настройка экспозиции (AES)
Сжатие видео
• Сжатие видео в форматах H.264/MPEG4/MJPEG
• JPEG для стоп-кадров
• H.264/MPEG-4 мультикаст
Разрешение видео
• 1920×1080 при 15 кадрах в секунду (только для ревизии B1)
• 1280×800 при 30 кадрах в секунду
• 1280×720 при 30 кадрах в секунду
• 640×480 при 30 кадрах в секунду
• 320×240 при 30 кадрах в секунду
• 176×144 при 30 кадрах в секунду
Сеть
Сетевые протоколы
• IPv4
• IPv6
• TCP/IP
• UDP
• ICMP
• DHCP клиент
• NTP клинт (D-Link)
• DNS клиент
• DDNS клиент (D-Link)
• SMTP клиент
• FTP Client
• HTTP / HTTPS
• Samba Client
• PPPoE
• UPnP Port Forwarding
• RTP / RTSP/ RTCP
• IP fltering
• LLTD
• CoS/QoS
• SNMP
• IGMP
• 802. 1x
• ONVIF
Безопасность
• Защита учетной записи администратора и группы пользователей
• Аутентификация по паролю
• Аутентификация HTTP и RTSP
• HTTPS streaming
• Удаленное управление доступом
Системная интеграция
Системные требования
• Операционная система: Microsoft windows, 2000, XP, Vista, 7
• Браузер: Internet explorer 7 или выше (для полноценного функционирования)
Системные требования для D-ViewCam™
• Операционная система: Microsoft windows 7/ Vista / XP
• Браузер: Internet explorer 6 или выше
• Протокол TCP/IP
Управление событиями
• Обнаружение движения
• Уведомление о событии и загрузка снимков/видеоклипов через HTTP, SMPT или FTP
• Поддержка нескольких HTTP, SMPT и FTP-серверов
• Несколько уведомлений о событии
• Несколько способов создания резервных копий
Удаленное управление
• Настройка через Web-браузер
• Получение снимков/видео и сохранение на локальном жестком диске или NAS через Web-браузер
Функции ПО наблюдения
• Управление/контроль: до 32 камер
• Просмотр изображений с 32 камер на одном экране
• Поддержка всех функций управления через Web-интерфейс
• Опции записи изображения по срабатывания датчика, вручную или по расписанию
Внешние интерфейсы устройства
• 10/100BASE-TX Fast Ethernet с поддержкой PoE (802. 3af)
• Один D/I-интерфейс и один D/O –интерфейс для внешнего датчика и сигнализации
• Интерфейс RS-485 для внешнего устройства наклона/поворота (только в ревизии Ax)
css — IE 6 и IE 7 Z-Index Проблема
Большинство ответов здесь неверны; некоторые работают, но не по той причине, которую они заявляют. Вот некоторые пояснения.
Вот как должен работать z-index согласно спецификации:
- вы можете присвоить
значение z-index
любому элементу; если нет, по умолчанию используетсяauto
- позиционированных элементов (то есть элементы с атрибутом
position
, отличным от статического по умолчанию) с
z-index
отличается отauto
создание нового контекста стека . Контексты наложения — это «единицы» перекрытия; один контекст наложения либо полностью выше другого (то есть каждый элемент первого выше любого элемента второго), либо полностью ниже его. - внутри одного и того же контекста стека сравнивается уровень стека элементов. Элементы с явным значением z-index имеют это значение как уровень стека, другие элементы наследуют от своих родителей. Элемент с более высоким уровнем стека отображается сверху. Когда два элемента имеют один и тот же уровень стека, обычно тот, который находится позже в дереве DOM, рисуется сверху. (Более сложные правила применяются, если они имеют разные
позиция
атрибут.)
Другими словами, когда два элемента имеют z-index
, чтобы решить, какой из них будет отображаться сверху, вам нужно проверить, есть ли у них какие-либо позиционированные родители, которые также имеют z-index
. Если это не так или родители общие, побеждает тот, у кого выше z-индекс. Если это так, вам нужно сравнить родителей, а z-индекс
детей не имеет значения.
Таким образом, z-index
определяет, как размещается элемент по сравнению с другими дочерними элементами его «родителя стекирования» (ближайший предок с 9000 z-индекс
набор и позиция
из относительный
, абсолютный
или фиксированный
), но это не имеет значения при сравнении с другими элементами; это z-индекс
родителя стека (или, возможно, z-индекс
родителя стека, и так далее), который считается. В типичном документе, где вы используете z-index
только для нескольких элементов, таких как выпадающие меню и всплывающие окна, ни один из которых не содержит другого, родитель стека всех элементов, которые имеют z-index
— это весь документ, и обычно вы можете думать о z-index
как о глобальном упорядочении на уровне документа.
Фундаментальное отличие от IE6/7 заключается в том, что позиционированные элементы начинают новые контексты стека, независимо от того, установлен ли у них z-index
или нет. Поскольку элементы, которым вы инстинктивно присвоили бы значений z-index
, обычно абсолютно позиционированы и имеют относительно позиционированного родителя или близкого предка, это будет означать, что ваши z-index
-ed Элементы вообще не будут сравниваться, вместо этого будут сравниваться их позиционированные предки — и, поскольку у них не установлен z-index, порядок документов будет преобладать.
В качестве обходного пути вам нужно выяснить, какие предки на самом деле сравниваются, и присвоить им некоторый z-индекс, чтобы восстановить желаемый порядок (который обычно будет обратным порядком документов). Обычно это делается с помощью javascript — для выпадающего меню вы можете просмотреть контейнеры меню или элементы родительского меню и назначить им z-index
из 1000, 999, 998 и так далее. Другой метод: когда всплывающее или выпадающее меню становится видимым, найдите всех его относительно позиционированных предков и дайте им класс поверх
, который имеет очень высокий z-индекс; когда он снова станет невидимым, удалите классы.
javascript — из Internet Explorer 6 в Google Chrome
Вопрос задан
Изменено 7 лет, 3 месяца назад
Просмотрено 128 раз
Новое! Сохраняйте вопросы или ответы и организуйте свой любимый контент.
Узнать больше.
Я работаю над старым веб-приложением (первоначально разработанным для Internet Explorer 6, теперь обновленным для Internet Explorer 8), и мне нужно обеспечить совместимость с Mozilla Firefox и Google Chrome. Мне удалось это сделать для Mozilla Firefox, но в Google Chrome это сложнее, меню не отображается, и я вообще не знаю, почему. У меня такой код (вот он для главного меню и еще есть что-то подобное для подменю, которые разворачиваются при наведении курсора на пункты меню):
если((document.all)||(window.sidebar)){ вар клик=""; вар; если(это[i].url!=""){ ; клик="";} A+=""+this[i].txt+"";} если(документ.слои){ var txt=это[i].txt; если(это[i].url!=""){ txt=""+txt+"";} A+="";} X+=это[i].larg+1;} "+txt+"
После многих исследований в Интернете я так и не понял, что такое document.layers, document.all, window.sidebar, window.getElementById и document.getElementById, что именно они возвращают и в чем разница между window.