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

Создаем горизонтальное выпадающее меню на CSS – Zencoder

В предыдущей статье “Создаем вертикальное меню на CSS” был освещен вопрос построения вертикального меню с подменю.

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

1
display
со значениями
1
none
и
1
block
.

При построении горизонтального меню нужно быть внимательным с принципом специфичности CSS, то есть — с вложенностью и каскадностью правил. Хорошим подспорьем в этом вопросе является SASS (SCSS), благодаря которому исключаются ошибки при соблюдении каскадности и наследовании свойств.

Код, написанный на SASS (SCSS) короче и логически читается проще, чем CSS. Поэтому, рекомендую изучить этот вопрос в статьях “SASS (SCSS) в картинках — Часть 1”, “SASS (SCSS) в картинках — Часть 2”.

Мы же приступим к созданию горизонтального меню с подменю “на коленках”. Почему говорю так? Дело в том, что существует масса готовых примеров и кода, а также генераторов различных меню. Но они неинтересны — нам нужно разобраться в принципе построения и возможности самому написать такую навигацию. Как обычно, начинаем с каркаса меню, выполненного на HTML:

<ul>
  <li>
    <a href="#">Link_1</a>
      <ul>
      <li>
        <a href="#">Link_1-1</a>
      </li>
      <li>
        <a href="#">Link_1-2</a>
      </li>
      <li>
        <a href="#">Link_1-3</a>
      </li>
      <li>
        <a href="#">Link_1-4</a>
      </li>
    </ul>
  </li>
  <li>
    <a href="#">Link_2</a>
  </li>
  <li>
    <a href="#">Link_3</a>
      <ul>
      <li>
        <a href="#">Link_3-1</a>
      </li>
      <li>
        <a href="#">Link_3-2</a>
      </li>
      <li>
        <a href="#">Link_3-3</a>
      </li>
    </ul>
  </li>
  <li>
    <a href="#">Link_4</a>
  </li>
  <li>
    <a href="#">Link_5</a>
      <ul>
      <li>
        <a href="#">Link_5-1</a>
      </li>
      <li>
        <a href="#">Link_5-2</a>
      </li>
      <li>
        <a href="#">Link_5-3</a>
      </li>
      <li>
        <a href="#">Link_5-4</a>
      </li>
      <li>
        <a href="#">Link_5-5</a>
      </li>
    </ul>
  </li>
</ul>

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

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

1
arrow
, но о нем мы поговорим позже.

Приступим к оформлению нашего меню с помощью CSS. Сразу оговорюсь, что примеры кода, представленного здесь, написаны на SASS (SCSS). Начнем с того, что расположим навигацию горизонтально:

.hormenu{
  margin: 50px 0 0 50px;
  overflow: hidden;
  li{
    float: left;
    margin-left: 1px;
    &:first-child{
      margin-left: 0;
    }

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

1
float: left
. Предотвращаем схлопывание (
1
collapse
) блока-родителя , прописав для него
1
overflow: hidden
.

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

1
margin
в 1px. И для аккуратности уберем левый
1
margin
у первого элемента .

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

1
text-align
для выравнивания по горизонтали. Цвет фона и цвет текста — как обычно.

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

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

При скрытии же подменю пункты основного меню будут “сжиматься”, уменьшая ширину до своей собственной. Вот для этой цели и применяется явное задание ширины элемента :

a{
  display: block;
  line-height: 25px;
  height: 25px;
  width: 130px;
  text-align: center;
  background-color: #ccc;
  color: #ccc - #555;
  position: relative;
}

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

1
float
и левый
1
margin
, чтобы они не наследовали эти свойства.
Убираем плавание, чтобы элементы расположились вертикально, а левый
1
margin
— убрать “лесенку”:

li{
  float: none;
  margin: 0 0 1px 0;

Стилизуем ссылки пунктов подменю. Делаем фоновую заливку чуть светлее, чтобы отличалась от основного меню, а текст — чуть темнее по той же причине. Ну и анимация пунктов при наведении курсора мыши:

a{
  background-color: #ccc + #111;
  color: #ccc - #333;
  &:hover{
    background-color: #ccc + #222;
  }
}

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

1
dislay: none
:

.sub-hormenu{
  display: none;

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

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

&:hover .sub-hormenu{
  display: block;
}

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

1
:after
.

Как раз здесь нам и понадобиться относительное позиционирование для ссылок, о котором говорилось ранее. Создание стрелки “поручим” отдельному классу

1
arrow
, который будем “вешать” только на нужные нам ссылки:

. arrow:after{
  content: '';
  position: absolute;
  top: 50%;
  left: 80%;
  width: 0;
  height: 0;
  border-top: 4px solid #ccc - 666;
  border-left: 4px solid transparent;
  border-right: 4px solid transparent;
  margin-top: -2px;
}

Вот, в принципе, и все. Основная задача выполнена и горизонтальное меню с выпадающим подменю у нас работает. Конечно, можно озадачиться целью “окрасить” активный пункт основного меню в тот же цвет, что и у подменю. Но эта проблема не входит в рассмотрение поставленной нами задачи. Ниже представлен полный код правил CSS (SCSS) для нашего меню:

@import "compass/reset";
 a{
   text-decoration: none;
 }
 .arrow:after{
   content: '';
   position: absolute;
   top: 50%;
   left: 80%;
   width: 0;
   height: 0;
   border-top: 4px solid #ccc - 666;
   border-left: 4px solid transparent;
   border-right: 4px solid transparent;
   margin-top: -2px;
 }
 .hormenu{
   margin: 50px 0 0 50px;
   overflow: hidden;
   li{
     float: left;
     margin-left: 1px;
     &:first-child{
       margin-left: 0;
     }
     &:hover .
sub-hormenu{ display: block; } .sub-hormenu{ display: none; li{ float: none; margin: 0 0 1px 0; a{ background-color: #ccc + #111; color: #ccc - #333; &:hover{ background-color: #ccc + #222; } &:after{ content: none; } } } } a{ display: block; line-height: 25px; height: 25px; width: 130px; text-align: center; background-color: #ccc; color: #ccc - #555; position: relative; } } }

… и то, как оно выглядит:

На этом все.


cssdropdown menu

Cоздание выпадающего меню на HTML и CSS просто

Автор статьи: admin

Метки: CSS / HTML / Как сделать

В этой статье мы разберём, как происходит создание выпадающего меню на HTML, CSS и JavaScript.

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

Создание горизонтального выпадающего меню:

Сперва на HTML и CSS сделаем выпадающее меню которое будет проявляться при наведении мышки, вот его HTML.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<header>

    <nav>

        <ul>

            <li><a href=»#»>Главная</a></li>

            <li>Галерея

                <ul>

                    <li><a href=»#»>Машины</a></li>

                    <li><a href=»#»>Горы</a></li>

                    <li><a href=»#»>Компьютеры</a></li>

                </ul>

            </li>

            <li>О себе

                <ul>

                    <li><a href=»#»>Имя</a></li>

                    <li><a href=»#»>Аватарка</a></li>

                </ul>

            </li>

        </ul>

    </nav>

</header>

Тут всё как в обычном меню, если вы читали статью про то как сделать меню навигации, единственное что отмечу, это то, что обязательно меню должно находится в теги <nav>, для лучшей индексации.

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

html, body {

margin: 0;

padding: 0;

}

 

nav > ul {

display: flex;

margin: 0;

width: 100%;

background-color: green;

}

 

nav > ul > li {

margin-right: 20px;

}

 

li {

color: white;

list-style: none;

font-size: 20px;

}

 

li a {

color: white;

text-decoration: none;

}

 

li > ul{

display: none;

position: absolute;

background-color: tomato;

padding: 0;

}

 

li:hover > ul{

display: block;

}

В самом начале, мы убираем отступы со всего документа, чтобы, меню было чётко прибито ко краям страницы.

Дальше настраиваем внешний вид, делаем FlexBox и задаём отступы, самое главное, что нужно сделать, это тегам <ul>, которые находятся внутри тега <li>, сделать позиционирование absolute и добавить ему свойство display: none, что бы блок не показывался на экране.

Последнее важное изменение, это при наведении мышкой на <li>, внутри которого есть <ul>, он появлялся, вот что получилось.

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

Примечание:

Тут покажу только те селекторы, которые изменим, а не весь CSS, так как, там добавилось не много.


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

nav > ul {

display: flex;

margin: 0;

width: 100%;

height: 25px;

background-color: green;

}

 

li > ul{

position: absolute;

top: 40px;

visibility: hidden;

opacity: 0;

background-color: tomato;

padding: 0;

transition: 400ms;

}

 

li:hover > ul{

visibility: visible;

top: 25px;

opacity: 1;

}

В первом селекторе мы добавляем высоту, чтобы было проще менять позицию, во втором, добавляем позицию top равного 45 пикселем, также устанавливаем свойство visibility: hidden, которое отвечает за скрытие элемента, и opacity: 0, для прозрачности, значение ноль, означает что элемент полностью прозрачен.

В последнем селекторе который мы изменяем, который ещё отвечает за наведение мышки, убираем display и добавляем visibility: visible, для показа элемента, top равный 25 пикселям и opacity: 1, для полной не прозрачности.

Также появилось свойство transition, для плавных переходов, мы задаём ему время перехода 400 миллисекунды.

Вывод:

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

Подписываетесь на соц-сети:

Оценка:

Количество оценивших: 1
Средняя оценка: 5,00

Загрузка…

Поделится:

Пока кнопок поделиться нет

Также рекомендую:

Горизонтальное CSS-меню с выпадающими списками

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

  • Пункт 1
  • Пункт 2
    • Пункт 2.1
    • Пункт 2.2
  • Пункт 3
    • Пункт 3.1
    • Пункт 3.2
    • Пункт 3.3
  • Пункт 4
    • Пункт 4.1
    • Пункт 4.2
    • Пункт 4.3

Я собираюсь сделать это в два этапа:

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

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

  

Ничего особенного. Теперь давайте посмотрим на css:

 ul#horiznav{
маржа: 0;
padding:0;/*установите оба значения на ноль, чтобы устранить несоответствия браузера*/
list-style-type:none;/*избавьтесь от маркеров*/
height:32px/*просто чтобы избежать возможных проблем с плавающей запятой*/
}

#горизонт ли{
float:left;/* перемещаем элемент li так, чтобы меню располагалось горизонтально. ..*/
ширина: 150 пикселей/*... и установите ширину*/
}

#горизнав ли а{
display:block;/*сделать ссылку блочным элементом...*/
width:150px;/*...с фиксированной шириной...*/
line-height:30px;/*...и установите высоту строки, чтобы центрировать текст по вертикали*/
text-align:center;/*центрировать текст по горизонтали...*/
color:white;/*...раскрасить в белый цвет...*/
text-decoration:none;/*...и удалить подчеркивание по умолчанию*/
цвет фона:#EA9531;/*сделайте ссылку оранжевым фоном...*/
border:1px сплошной белый/*...и белая рамка...*/
}

#horiznav li a:hover{
color:#333333/*изменить цвет текста на :hover*/
}
 

См. комментарии в css для объяснения. Главное, что делает меню горизонтальным, — это плавающий элемент

  • . Этот код дает нам это:

    • Пункт 1
    • Пункт 2
    • Пункт 3
    • Пункт 4

    Добавление раскрывающегося списка

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

  • Элемент 4 <ул>
  • Элемент 4.1
  • Элемент 4.2
  • Элемент 4.3
  • Хорошо, теперь CSS. Нам нужно сделать несколько дополнений — отмечены красным:

    ul#horiznav, #horiznav ul{/*также удалите маркеры из раскрывающегося списка ul*/
    маржа: 0;
    заполнение: 0;
    тип стиля списка: нет;
    высота: 32px
    }
    
    #горизонт ли{
    плыть налево;
    ширина: 152 пикселя;
    position:relative/*установить position:relative в качестве начальной точки для абсолютного позиционирования выпадающего списка*/
    }
    
    #горизнав ли а{
    дисплей:блок;
    ширина: 150 пикселей;
    высота строки: 30 пикселей;
    выравнивание текста: по центру;
    белый цвет;
    текстовое оформление: нет;
    цвет фона:#EA9531;
    граница: 1px сплошной белый
    }
    
    #horiznav li a:hover{
    цвет:#333333
    }
    
    #горизонт ли ул{
    display:none;/*скрыть раскрывающийся список*/
    position:absolute;/*абсолютное позиционирование. .*/
    left:0;/*...выравниваем левый край с левым краем родительского li...*/
    top:32px/*...и 32px вниз сверху - 30px высота + 2px для границы*/
    }
    
    #horiznav li: hover ul {
    display:block/*отображать ul при наведении курсора на родительский li*/
    }
    
    #horiznav li ul a{
    background-color:#FFB33B/*изменить цвет фона раскрывающегося списка*/
    } 

    См. пояснения в комментариях к коду. Удивительно малое количество css, на самом деле. Выпадающие списки обычно скрыты и появляются при наведении курсора на родительский элемент

  • . Итак, это дает нам (то же самое, что и вверху страницы):

    • Пункт 1
    • Пункт 2
      • Пункт 2.1
      • Пункт 2.2
    • Пункт 3
      • Пункт 3.1
      • Пункт 3.2
      • Пункт 3.3
    • Пункт 4
      • Пункт 4.1
      • Пункт 4.2
      • Пункт 4.3

    Вы увидите, что использование абсолютного позиционирования приводит к тому, что раскрывающийся список появляется поверх всего остального на странице — это то, что нам нужно. И это прекрасно работает практически во всех популярных сегодня браузерах. В частности, я тестировал в IE7, IE8, FF3, Chrome, Opera9, Opera 10, Safari4. Вы заметите, что чего-то не хватает. Никаких призов за угадывание браузера, вызывающего дополнительные трудности…

    Работа с раскрывающимся списком в IE6

    IE6 не поддерживает :hover, за исключением элементов. Таким образом, без дополнительного кода наш красивый выпадающий список вообще не будет работать в IE6. К счастью, есть решение под названием csshover, которое вы найдете здесь вместе с инструкциями по его использованию. Я лично считаю, что версия 2 этого программного обеспечения является наиболее надежной.

    Добавление анимации с помощью jQuery

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

    Горизонтальные выпадающие меню CSS — сброс CSS

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

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

      

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

     #navbar {
    положение: абсолютное;
    сверху: 0;
    справа: 0;
    маржа: 0;
    заполнение: 0;}
    #навбар ли {
    стиль списка: нет;
    плыть налево; } 

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

     #navbar li a {
    дисплей: блок;
    отступ: 3px 8px;
    преобразование текста: верхний регистр;
    текстовое оформление: нет;
    цвет: #999;
    вес шрифта: полужирный; }
    #navbar li a:hover {
    цвет: #000; } 

    Я добавил немного отступа к ссылке и использовал свойство text-transform, чтобы сделать все в верхнем регистре, как того требует макет. Таким образом, исходный XHTML может быть строчным или верблюжьим (первые буквы заглавными)… что будет немного легче читать в нестилизованном документе.

    Далее мы скрываем вложенные списки по умолчанию, а затем стилизуем их при наведении курсора на содержащий элемент списка:

     #navbar li ul {
    дисплей: нет; }
    #navbar li:hover ul, #navbar li.hover ul {
    положение: абсолютное;
    дисплей: встроенный;
    слева: 0;
    ширина: 100%;
    маржа: 0;
    заполнение: 0; } 

    Приведенный выше код — это часть, которая действительно заставляет большую часть этой магии работать, поэтому я объясню важные части более подробно. Во-первых, поскольку IE6 не поддерживает состояния наведения для чего-либо, кроме тегов привязки, мы пишем наши правила для учета состояния наведения и класса наведения. Этот класс применяется к элементам при наведении на них курсора с использованием оригинального кода JavaScript (который объясняется в этом предыдущем руководстве по выпадающему меню).

    Затем мы абсолютно позиционируем наши вложенные списки и используем свойство «left», чтобы переместить список в крайнее левое положение. Это не перемещает список в крайнюю левую часть экрана, а вместо этого перемещает крайнюю левую сторону его родительского позиционированного элемента , который в данном случае оказывается основным неупорядоченным списком, который мы расположили в самом начале. . Таким образом, этот трюк основан на том, что весь список каким-то образом позиционируется, даже если он просто относительно позиционирован и оставлен на месте.

    Правило display: inline немного сложнее. Настолько, что я даже не совсем понимаю, что он делает. Что я знаю , так это то, что без этого правила элементы списка в подменю просто не отображаются ни в одном из основных браузеров. Я думаю что это как-то связано с тем фактом, что содержащие элементы являются плавающими (к чему мы немного вернемся), но я не могу этого доказать. Если у кого-то есть лучшее представление о технической стороне, пожалуйста, дайте мне знать в комментариях.

    Наконец, правило ширины: 100% очень важно. Это предотвращает свертывание неупорядоченного списка до меньшего размера в некоторых браузерах. В частности, без указания этой ширины вложенный список иногда сжимается до размера «содержащего» его элемента списка (даже если он абсолютно позиционирован и, следовательно, технически больше не содержится). Обратите внимание, что старые версии Opera плохо справляются со 100%-ной шириной… если вы хотите, чтобы она работала в более старых версиях, вам нужно указать ширину в соответствии с определенным размером (например, в пикселях). Однако самая последняя версия Opera (9.27) справляется с этим нормально, и у меня сложилось впечатление, что пользователи Opera чаще обновляются, чем, скажем, пользователи IE.

    Наконец, мы просто перемещаем оставшиеся элементы (чтобы расположить их в красивом горизонтальном ряду) и окрашиваем их:

     #navbar li:hover li, #navbar li.hover li {
    плыть налево; }
    #navbar li:hover li a, #navbar li.hover li a {
    цвет: #000; }
    #navbar li li a:hover {
    цвет: #357; } 

    Вот и все! Вы можете увидеть рабочий пример здесь. Это было протестировано и отлично работает в IE 6+, Firefox 2, Safari (Mac и ПК) и Opera 9..27.

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

    Спасибо Андреа за вдохновение, надеюсь, полезный урок! И если у вас когда-нибудь возникнет вопрос, связанный с CSS, который, по вашему мнению, мог бы стать хорошей статьей здесь, не стесняйтесь, присылайте мне сообщение через мою контактную страницу или в Twitter.

  • Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *