Інтернет Windows Android

Плавно відкривається меню за допомогою CSS. Вертикальне меню, що випадає на css: як його зробити

Від автора: всіх вітаю. Чомусь меню, що випадає у веб-майстрів асоціюється зі скриптами, але вже давно зробити таку навігацію можна абсолютно спокійно на чистому css. Причому таке меню буде нічим не гірше. Сьогодні я вам покажу, як створити в css меню, що випадає. Поділюся, так би мовити, рецептом.

План уроку і розмітка нашого меню

В общем-то, спочатку визначимося з тим, як будемо створювати саме меню. У html5 стандартним способом вважається створювати його в контейнері nav за допомогою маркованого списку. Давайте саме так і зробимо. Маркери ми пізніше приберемо за допомогою css, в меню вони нам зовсім не потрібні.

Власне, я відразу напишу в html розмітку з вкладеними списками. Тобто наші список буде дворівневим - в ньому будуть інші списки. А саме, на кожен пункт 1 список, який і буде формувати меню, що випадає.

Тут є важливий момент, Який полягає в тому, що вам, можливо, не потрібно кожен пункт робити випадає, а лише деякі. Без проблем, тоді в пунктах без випадання просто не створюємо вкладених списків.

Власне, ось вона, вся розмітка:

< nav id = "nav" >

< ul >

< li > < a href = "#" > Пункт 1< / a >

< ul class = "second" >

< li > < a href = "#" > підпункт< / a > < / li >

< li > < a href = "#" > підпункт< / a > < / li >

< li > < a href = "#" > підпункт< / a > < / li >

< / ul >

< / li >

< li > < a href = "#" > Пункт 2< / a >

< ul class = "second" >

< li > < a href = "#" > підпункт< / a > < / li >

< li > < a href = "#" > підпункт< / a > < / li >

< li > < a href = "#" > підпункт< / a > < / li >

< / ul >

< / li >

< li > < a href = "#" > Пункт3< / a >

< ul class = "second" >

< li > < a href = "#" > підпункт< / a > < / li >

< li > < a href = "#" > підпункт< / a > < / li >

< li > < a href = "#" > підпункт< / a > < / li >

< / ul >

< / li >

< li > < a href = "#" > Пункт4< / a >

< ul class = "second" >

< li > < a href = "#" > підпункт< / a > < / li >

< li > < a href = "#" > підпункт< / a > < / li >

< li > < a href = "#" > підпункт< / a > < / li >

< / ul >

< / li >

< / ul >

< / nav >

Я розумію, що вона величезна. У цьому-то і проблема вкладених списків, що потрібно писати багато коду. Але враховуйте той факт, що ми робимо 4 основні пункти і для кожного буде меню, що випадає.

Власне, я задав всієї навігації ідентифікатор nav, а всіх вкладених списками - стильовий клас second, щоб розуміти, що вони є вкладеними.

Відмінно, розмітка у нас готова, можна подивитися на результат:

Да уж, виглядає жахливо. Але зараз ми включимо в роботу css і вже через кілька хвилин наша навігація перетвориться. Давайте працювати.

Пишемо css-стилі

Перше, що я зроблю, це скину все відступи за замовчуванням для всіх елементів. Вони нам будуть тільки заважати, краще задамо потім відступи самі, де це знадобиться.

* (Margin: 0; padding: 0;)

margin: 0;

padding: 0;

#nav (height: 70px;) #nav ul (list-style: none;)

#nav (

height: 70px;

#nav ul (

list - style: none;

Тепер нам потрібно, власне, вирішити, яким буде наше меню. Горизонтальним або вертикальним? Я пропоную спочатку зробити горизонтальне і подивитися все на його прикладі. Для цього потрібно написати такі стилі:

#nav\u003e ul\u003e li (float: left; width: 180px; position: relative;)

#nav\u003e ul\u003e li (

float: left;

width: 180px;

position: relative;

Зауважте, що за допомогою знака\u003e ми звертаємося до пунктів списку, який безпосередньо вкладені в ul, а той безпосередньо вкладений в nav. Це дуже важливо, тому що дозволяє не застосувати стиль до пунктів вкладених списків. Справа в тому, що за моєю задумом в головному списку пункти будуть розташовуватися горизонтально, а у вкладених - вертикально.

Але ви, звичайно, можете робити по-іншому, в згоді зі своїм задумом. Ви можете зробити так, щоб всі пункти були в одну строчку.

У будь-якому випадку, вищенаведений код, я сподіваюся, ви розумієте. Він змушує пункти головного списку притискатися до лівого краю, так що всі вони встають в один рядок, хоча і є блоковими елементами. Також я задав їм явну ширину і відносне позиціонування.

Для чого позиціонування? Воно необхідне для того, щоб потім абсолютно позиціонувати вкладені списки. Якщо ви вивчали позиціонування в css, то напевно знаєте, що якщо задати блоку відносне позиціонування, то всі елементи в ньому можна буде позиціонувати абсолютно всередині саме цього блоку, а не всього вікна браузера.

Тим часом, ось що у нас вже вийшло:

З цього скриншоту ви можете вже уявити собі приблизний результат. Звичайно, нам ще належить красиво оформити пункти, щоб очі не благали про пощаду при перегляді навігації.

#nav li a (display: block; background: # 90DA93; border: 1px solid # 060A13; color: # 060A13; padding: 8px; text-align: center; text-decoration: none;) #nav li a: hover ( background: # 2F718E;)

#nav li a (

display: block;

background: # 90DA93;

border: 1px solid # 060A13;

color: # 060A13;

padding: 8px;

text - align: center;

text - decoration: none;

#nav li a: hover (

background: # 2F718E;

По-перше, самі посилання потрібно зробити блоковими. Це необхідно для того, щоб працювали внутрішні відступи і коректно застосовувалися всі властивості. Далі вказую кольору фону, тексту, параметри рамки, внутрішні відступи і вирівнювання тексту по центру. Нарешті, скасовую підкреслення посилань.

Всі ці параметри не обов'язково прописувати так, як це зробив я. Кольори ви можете вибрати довільно, рамку зробити іншу або взагалі не використовувати, відступи можна зменшувати або збільшувати.

Зауважте, що в даному випадку ми не використовували знак\u003e, тому зазначені правила застосуються до всіх посилань, в тому числі і тим, що знаходяться у вкладених пунктах. Отже, тепер маємо наступне:

Відмінно, але ж ви розумієте, що підпункти не повинні бути видно, вони повинні розкриватися при наведенні на потрібний пункт. Без цього наше меню схоже на таблицю. Що ж, саме час заховати вкладені пункти.

#nav li .second (display: none; position: absolute; top: 100%;)

#nav li .second (

display: none;

position: absolute;

top: 100%;

По-перше, приховуємо повністю вкладені списки. По-друге, задаємо їм абсолютне позиціонування і координату top: 100%. Це означає, що меню, що випадає буде відображатися чітко під основним пунктом, якому належить, чітко під 100% висоти цього пункту.

Тепер ми бачимо на веб-сторінці тільки основне меню, що нам і потрібно.

Реалізуємо випадання

Нам залишилося зробити найголовніше - реалізувати саме випадання. В цьому немає нічого складного, дивіться на цей код:

#nav li: hover .second (display: block;)

#nav li: hover .second (

display: block;

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

Є тільки одна незначна проблема - ширина вкладених пунктів не відповідає ширині основних. Але це дуже легко вирішується дописуванням відповідних стилів:

#nav li li (width: 180px;)

#nav li li (

width: 180px;

Все, проблема вирішена:

Все працює відмінно. При наведенні на основний пункт з'являється відповідне йому меню, що випадає. Якщо прибрати курсор в сторону - воно пропадає. Якщо перевести курсор на самі вкладені пункти, то можна буде по ним клікнути і перейти в потрібний розділ сайту. Таким чином, ми зробили з вами дуже просте і легке меню, що випадає абсолютно без скриптів.

Переробляємо меню в вертикальне

Ну добре, з горизонтальною навігацією ми з вами повністю розібралися, але ж крім неї на сайтах дуже часто зустрічається і вертикальна і вона теж може бути випадає. Насправді переробити меню з горизонтального на вертикальне дуже легко, нам доведеться змінити буквально пару рядків коду.

По-перше, вам потрібно буде прибрати float: left у головних пунктів списку. Саме це властивість сприяє тому, що наші пункти відображаються в один рядок, але навіщо нам це, якщо навігація повинна бути вертикальної?

Тепер залишається змінити правила для селектора #nav li .second, тобто для вкладених списків, а саме, їх потрібно трохи по-іншому позиціонувати. Ось так:

#nav li .second (display: none; position: absolute; left: 100%; top: 0;)

#nav li .second (

display: none;

position: absolute;

left: 100%;

top: 0;

Тобто необхідно прописати дві координати замість однієї. По-перше, у випадку з горизонтальною навігацією я говорив, що за задумом пункти вкладених меню повинні відображатися під основними пунктами. У випадку з вертикальним меню це не підходить - пункти повинні відображатися збоку.

Тому змінюємо top: 100% на left: 100%. Крім цього, координата top нам теж потрібна. Задаємо їй 0, щоб вкладене меню знаходилося на одному рівні з пунктом, яким відповідають.

Все, тепер все працює так, як треба. Можете протестувати. Як бачите, я не брехав, коли говорив, що доведеться переписати всього кілька рядків коду.

Горизонтальне меню з декількома рівнями

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

Михайло сб, 09/20/2014 - 12:28

Щось мій коментар ніхто не бачить - дублюю:

===========
Спасибі, але у мене (під Інт.Експл-8) меню не випадає. Тобто не працює рядок "ul. navli: hover ul (display: block;) "
Підкажіть, в чому справа?

Є пожеданія за викладом матеріалу:

Добре б в цьому рядку (ul.aaaaa li: hover ul (display: block;)) розтлумачити, яка її частина відповідає за "випадання меню", а яка - за переховування пунктів глибшого рівня вкладеності

Добре б в прикладах кожен рядок постачати коментарем, що вона робить.

Зокрема, неясно, навіщо потрібна рядок "

Перед цим рядком стоять 2 рядки, мабуть, що не стосуються справи (Додому
і Подивитися вертикальне меню). У людини, незнайомої з новим матеріалом (тобто, як раз для того, для якого ви писали), йде час на усвідомлення того, що ці рядки для меню, що випадає не потрібні. Або все-таки потрібні?

У хеддере в вашому прикладі є 3 рядки. З них тільки одна відноситься до теми (задає ім'я ЦСС-файлу), а 2 інші - ні. Це також ускладнює освоєння матеріалу. Тим більше, що на моєму комп'ютері такий хеддер взагалі призводить до некоректного відображення тексту, оскільки мені потрібно ставити не "utf-8", а "Windows -..."

У прикладі неясно, що слова "style.css", "block-menu" і "nav" - це не ключові слова, А назви, задающиеся користувачем. Я з'ясовував це експериментально

Коротше кажучи, хотілося б, щоб в прикладах було тільки те, що має відношення до справи, причому, щоб про неясні по контексту рядки було б написано, який саме "ставлення до справи" вони мають.

  • Увійдіть, щоб залишати коментарі

Oleg сб, 09/20/2014 - 23:50

Самий об'ємний коммент !!!
Коментарі проходять тільки після модерації тому ви і не побачили свій коммент відразу.
Постараюся відповісти на все. Почнемо з питань навіщо тут це. Таки да два посилання просочилися з робочого варіанту.
Щодо некоректно відображення тексту. Ви змогли прочитати і откоментіть цю сторінку при тому що кодування у неї така ж як і у приклад в пості.
Даний пост не призначений для абсолютних новачків і був написаний за бажанням передплатників. Якщо пояснювати абсолютно все те потрібно буде розповісти про класи і ідентифікатори, блоки, позиціонування, псевдоселектори, каскад та інше. Досить велика стаття вийти і що найголовніше нікому не потрібна.
ul.nav li: hover\u003e ul (display: block;) буде показувати раніше прихований пункт. Якщо розбирати по буквах то (тут паралельно дивимося на код) при наведенні на пункт меню (ul.nav li) спрацює: hover і перший вкладений список\u003e ul буде видно за рахунок того що значення display змінить значення з none на block.

Вітаю! Якщо ти верстальник, то рано чи пізно ти зіткнешся з тим, що захочеш якось пожвавити свої сторінки, зробити їх хоч трохи інтерактивними. Як не можна краще тут тебе зможуть виручити CSS анімації. Але потрібно знати, де і як їх застосовувати.

Сьогодні я розповім, як зробити меню, що випадає на чистомуCSS і як додати йому плавності з допомогою CSS анімації. Якщо ти не знаєш, то саме час ознайомитися з азами.

Верстаємо меню HTML + CSS

Для початку, щоб нам було з чим працювати, давайте зверстаємо просте однорівневе меню. Не будемо сильно заморочуватися з дизайном, для наочності вистачить і цього:

Що ми маємо? Самий звичайні ненумерований список з ідентифікатором «top_menu» і з посиланнями, обгорнутими в елементи цього самого списку. Все банально і просто. При наведенні пункти меню змінюють колір ... це все ви вже знаєте і розумієте, як це зробити (я сподіваюся).

Додаємо меню другого рівня

Щоб зробити багаторівневе меню, нам потрібно додати другий ненумерований список всередину першого. Думаю, це ви проходили десь на початкових уроках. А також те, що його вставити потрібно не просто всередині нашого списку, а саме всередині елемента списку, тобто тега « li», Відразу після закриває тега« a ».

Позиціонуємо вкладені списки абсолютно по відношенню до « li», В які вони вкладені. А все " li» верхнього рівня позиціонуємо щодо ( relative). Щоб меню, що випадає знаходилося ВІДРАЗУ ж після нашого меню верхнього рівня, йому (випадає - " inner_menu") Потрібно задати

Position: absolute; top: 100%;

Тобто відступ від верхньої межі батька дорівнюватиме висоті батька. Дуже логічно, по-моєму.

Крім позиціонування потрібно надати випадає меню стиль як у меню верхнього рівня. Яблучко від яблуньки, як то кажуть ...

Як бачите, наше меню, що випадає поки виглядає не випадає, а випав і висить. Але нічого, це ми скоро виправимо.

Як зробити меню, що випадає дійсно випадає

Немає нічого простіше! Щоб наш вкладений список зробити випадає меню, його потрібно просто приховати! А потім відкривати тільки тоді, коли курсор миші буде проноситься над пунктом меню верхнього рівня, який містить в собі меню, що випадає. Звучить, можливо, трохи складно, але насправді це вирішується буквально кількома рядками коду.

Випадає меню додаємо:

Display: none;

А щоб його відобразити, потрібно прописати:

#top_menu\u003e li: hover\u003e ul (display: block;)

Що нам говорить це ціле скопище селектор? Читаємо з кінця. Ми задаємо стилі (відмості) для списку другого рівня, який лежить всередині елемента списку першого рівня, але стилі ці спрацюють тільки в тому випадку, якщо ми наведемо мишкою (ховер) на елемент «li »в який вкладено наш список другого рівня.

Сподіваюся, я висловився зрозуміло. Якщо немає, спробуйте прочитати кілька разів. А ще краще просто розуміти це, дивлячись на код. Дивимося, що у нас вийшло:

Так, ми начебто домоглися того, чого хотіли - ми зробили меню, що випадає, справжнісіньке меню, що випадає, мати його! Але йому чогось не вистачає. А знаєте чого? Плавності! Адже все виглядає так, як ніби меню не випадає, а просто з'являється. Причому дуже різко, моментально навіть, я б сказав.

Ну що ж, давайте ще трохи поколдуем над ним.

Плавне меню, що випадає - це просто

Отже, давайте зробимо плавне меню, що випадає на чистому CSS. Навіщо це робити? Тому що люди люблять, коли все плавно і м'якенька ... і це виглядає красиво. Буде плюс до юзабіліті вашого сайту. Погнали!

Запам'ятайте, ви можете анімувати тільки точні математичні величини, наприклад 50px і 300px, 0 і 100%, 0,5 і 1,0 і так далі. У нашому випадку ми не зможемо анімувати два стану нашого меню, що випадає ( display: none; і display: block;).

Але ми можемо замінити їх на прозорість - opacity: 0 і opacity: 1. І поставити час протягом якого наше меню буде проявлятися з прозорого стану. Так, це дійсно спрацює, проте це не зовсім той ефект, який ви можливо очікували. Тому давайте зробимо трохи складніше. Але це того варте, повірте.

Щоб анімація вийшла більш плавною і передбачуваною, довелося поставити фіксовану висоту пунктам меню, що випадає, хоча можна було обійтися і без цього. Методів безліч, тільки вигадуй комбінації і вирішуй завдання.

Як видно з коду, ми анімували висоту елементів списку і їх прозорість. Цього виявилося достатньо для того, щоб зробити красиву плавну анімацію меню, що випадає.

Що нам знадобилося для анімації? Два стану пунктів нашого меню, а також властивість transition, яке проінтерполіровало ці стани, тобто заповнило все проміжні значення за відведений проміжок часу. От і все!

Ще простіше можна було б зробити із застосуванням jQuery, але ми ж обумовили спочатку, що будемо сьогодні працювати з чистим CSS. А ще гарніше можна було зробити, додавши до анімацій криві Безьє, однак ця тема трохи виходить за рамки сьогоднішньої. Але ми до неї обов'язково повернемося пізніше.

висновок:

Тепер ви можете похвалитися своїм друзям і близьким, що знаєте, як зробити меню, що випадає на чистому CSS. Це дійсно корисний навик, який вам ще не раз стане в нагоді. Ну, самі посудіть, чи багато ви бачили сайтів зі статичним меню? Ні, більшість сайтів мають саме меню, що випадає.

До речі це був мій перший урок по CSS. Опишіть, як вам? Зрозуміло все пояснив або потрібно ще докладніше розжовувати? І чи варто взагалі продовжувати писати статті на тему Лайфхак в CSS?

Дякую за увагу і до швидких зустрічей!

Ви дочитали до самого кінця?

Чи була ця стаття корисною?

Так / ні

Що саме вам не сподобалося? Стаття була неповною або неправдивої?
Напишіть в клмментаріях і ми обіцяємо виправитися!

Кожен, хто вирішив створити свій сайт, стикається з потребою створення симпатичного меню для свого сайту. У цій статті я розповім, як за допомогою звичайного HTML-коду і нескладних CSS-правил, можна створити чудовий випадаюче меню, Яке легко міняти і доповнювати. І для цього нам не знадобиться ніякої JavaScript-код!

Першим і найважливішим етапом, при створенні меню, що випадає, є створення його структури. Найкраще це робити, використовуючи ненумеровані списки. Давайте створимо ось таке просте меню:

Досить простий і не складний вийшов html-код. Виглядати цей список буде так.

На наступному етапі ми наведемо наше меню до більш красивому увазі. Це легко можна зробити завдяки використанню CSS.
Насамперед приберемо Меркера в ненумерований списку, відступи, а також задамо ширину нашого меню.

#nav ul (margin: 0px; padding: 0px; list-style: none; width: 200px;)

Тепер нам необхідно задати положення елементів списку. Так як наше меню буде вертикальне, це полегшує нашу роботу. Однак, нам необхідно задати значення для властивості "Position" , як "Relative" . Це необхідно для того, щоб відносно основного меню абсолютно позиціонувати підменю. Також поставимо нижнє підкреслення для пунктів меню.

#nav ul li (position: relative; border-bottom: 1px solid #ccc;)

Тепер необхідно підкоригувати наше підміню. Так як ми хочемо, щоб наше меню з'являлася праворуч від основного меню в той момент, коли над цим пунктом знаходиться курсор, то нам необхідно вкладеному списку, властивості "Position" задати значення "Absolute" . Також нам необхідно задати його положення. Це робиться в такий спосіб

#nav li ul (position: absolute; left: 200px; top: 0; display: none;)

використовуючи атрибути left і top ми задаємо абсолютне позиціонування нашого підміню щодо батьківського пункту меню. Також я присвоїв атрибуту "Display" значення "None" , Так як ми не хочемо бачити підменю при відкритті сторінки.

Отже, тепер наше меню виглядає так.

Тепер додамо вид нашими посиланнями. В першу чергу для того, щоб кожна посилання займала весь відведений для неї місце всередині містить її елемента списку, дамо атрибуту "Display" значення "Block" . Також приберемо нижнє підкреслення і задамо колір фону і колір тексту посилань.

#nav ul li a (display: block; text-decoration: none; color: # 777; background: #fff; padding: 5px;)

#nav li: hover ul (display: block;)

Ось тепер наше меню вже працює і виглядає так.

Залишилося додати йому більш привабливий вигляд.

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

#nav li: hover a (color: #FFFFFF; background: url (img / fone-tr.png);)

Тут я в якості фону використовую ось цю картинку, але Ви можете використовувати і заливку будь-яким іншим кольором (наприклад: background-color: # 0000ff; ).

#nav li: hover ul a: hover (background-color: #cccccc; background-image: none; color: #FFFFFF;)

Ну от і все! наше меню, що випадає на html і CSS готово. Можете подивитися, що у нас вийшло.

На цьому здавалося б можна було закінчити, але немає. На жаль ранні версії Internet Explorer розуміють псевдоклас : hover лише для тега - так що li: hover , На який у нас зав'язане поява підміню і зміна кольору фону, йому ні про що не говорить.

Для того щоб усунути цю проблему, додамо невеликий JavaScript-код:

А тепер зробимо так, щоб при наведенні на пункт підміню, він також змінював колір свого фону. Для цього використовуємо наступний код:

Це дозволяє "причепити" клас jshover до будь-якого елементу

  • , Над яким проходить курсор. Ця функція працює тільки в Internet Explorer - для інших браузерів вона просто не потрібна.

    Тепер, щоб меню запрацювало в IE, додамо до трьох уже існуючим правилам по додатковому селектору li.jshover:

    #nav li: hover ul, #nav li.jshover ul (

    }

    #nav li: hover a, #nav li.jshover a (

    }

    #nav li: hover ul a: hover, #nav li.jshover ul a: hover (

    }