Как сделать выпадающее меню в WordPress

100-3733746

От автора: меню навигации сейчас в центре внимания. От обычных меню для мобильных устройств до мегаменю для магазинов и — есть отличный выбор способа представления меню навигации на своем сайте WordPress.

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

1-7228953

Что вы будете создавать

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

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

Что вам понадобится

Чтобы следовать этому руководству, вам понадобятся:

установленный для разработки WordPress

тема, которую вы кодируете самостоятельно, или дочерняя тема стороннего проекта, если вы хотите изменить меню

редактор кода

Функционал встроенного меню WordPress

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

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

В своей проекте откройте файл header.php. Вы должны найти эту строку:

PHP wp_nav_menu( array( ‘container_class’ => ‘main-nav’, ‘theme_location’ => ‘primary’ ) );

1 wp_nav_menu( array( ‘container_class’ => ‘main-nav’, ‘theme_location’ => ‘primary’ ) );

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

wp_nav_menu() это функция, которая выбирает меню навигации и выводит его.

Затем параметры упаковываются в массив.

container_class — это класс CSS, который будет передан контейнеру, в который заключено меню. В данном случае это main-nav. Это то, на что мы будем нацелены с помощью нашего CSS позже.

theme_location => primary сообщает WordPress, что это основная навигация. Если я создам меню на панели администратора и установлю флажок «Основное», то это меню будет использоваться для этого места в коде.

Прекратите использование иконочных шрифтов

Иногда вам может потребоваться добавить меню навигации в другом месте вашего проекта, например, в нижний колонтитул, и в этом случае вы не хотите использовать theme_location => primary. Вы можете использовать это только для одного меню. Но вы можете захотеть использовать дополнительные параметры, которые можете найти на странице справочника WordPress wp_nav_menu().

Вот флажок для основного меню в разделе «Меню» панели администрирования:

2-5605928

Прежде чем мы сможем добавить CSS для создания выпадающего меню, полезно ознакомиться с кодом, который WordPress генерирует для меню. Вот типичное меню для малого бизнеса, отображаемое в разделе «Меню» панели администрирования:

3-2949218

Теперь вот вывод HTML для этого меню:

  • Home
  • About Me
  • Services
    • Preparing for interviews / individuals
    • Preparing for interviews / groups
    • Conducting interviews
  • My Book
  • Clients
  • Interview Tips
  • Areas covered
  • Contact & Links
123456789101112131415161718     

            

  • Home
  •         

  • About Me
  •         

  • Services            
                      

    • Preparing for interviews / individuals
    •                 

    • Preparing for interviews / groups
    •                 

    • Conducting interviews
    •             

            

  •         

  • My Book
  •         

  • Clients
  •         

  • Interview Tips
  •         

  • Areas covered
  •         

  • Contact & Links
  •     

Если вы изучите этот код, вы увидите, что он состоит из:

Div с классом main-nav, определенным в функции wp_nav_menu().

Внутри — идентификатор ul menu-navbar и класс menu. Это значения по умолчанию, определенные WordPress.

Внутри него несколько элементов li , каждый с классом menu-item menu-item-type-post_type, плюс другие классы, специфичные для типа сообщения, к которому ведет пункт меню, и состояния этого пункта меню в то время. У каждого из них также есть уникальный идентификатор, номер которого соответствует идентификатору сообщения пункта меню навигации в базе данных.

Внутри одного из элементов li находится другой ul со своими собственными li элементами внутри — пункты меню второго уровня. Это то, что мы хотим раскрыть, когда пользователь наводит курсор на пункт меню верхнего уровня.

Кодирование CSS для создания выпадающего меню

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

Когда страница открыта, пункты меню второго уровня скрыты.

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

Использование Gutenberg улучшает показатели Gore Web Vitals сайта

Скрытие элементов второго уровня по умолчанию

В таблице стилей вашего проекта начните с скрытия элементов второго уровня по умолчанию. Добавь это:

CSS main-nav ul ul { display: none;

}

123 main-nav ul ul {    display: none;}

Это скроет элемент ul внутри другого элемента ul внутри элемента main-nav. Однако он не скроет элемент верхнего уровня ul, так как требует, чтобы один ul был вложен в другой ul внутри меню.

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

Отображение элементов второго уровня при наведении курсора

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

CSS .main-nav ul li:hover > ul { display: block;

}

123 .main-nav ul li:hover > ul {    display: block;}

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

Добавление стиля макета списку второго уровня

Откройте свою таблицу стилей и найдите в ней строку с display: none. Отредактируйте этот блок, чтобы добавить стиль разметки:

CSS .main-nav ul ul { display: none; position: absolute; top: 3em; left: 0; z-index: 99999; width: 180px; background: #fff; box-shadow: 0px 3px 3px rgba(0,0,0,0.2);

}

12345678910 .main-nav ul ul {    display: none;    position: absolute;    top: 3em;    left: 0;    z-index: 99999;    width: 180px;    background: #fff;    box-shadow: 0px 3px 3px rgba(0,0,0,0.2);}

Вам также необходимо указать относительное позиционирование элемента списка верхнего уровня:

CSS .main-nav li { position: relative;

}

123 .main-nav li {    position: relative;}

Давайте посмотрим, что делает этот код:

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

top: 3em позиционирует верх списка относительно верха элемента, внутри которого он находится, а именно элемента списка верхнего уровня. Это 3em значение отражает высоту панели навигации верхнего уровня. Отредактируйте свой, если у вашей навигации верхнего уровня другая высота.

left: 0 размещает список слева относительно элемента над ним.

z-index: 99999 определяет, где находится элемент в трехмерной модели страницы. Высокое значение 99999 гарантирует, что он будет отображаться поверх всего остального.

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

Теперь давайте посмотрим, что мы видим, когда наводим курсор на элемент верхнего уровня:

4-1302858

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

Сделайте ваше выпадающее меню более удобным для мобильных устройств

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

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

Руководство для новичков по Headless CMS и Jamstack

Добавление значка меню в баннер

Сначала добавьте значок, который нужно будет нажимать, чтобы получить доступ к меню на маленьком экране. Добавьте это в файл header.php в то место, где вы хотите разместить значок меню:

1

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

Теперь вам нужно добавить CSS в таблицу стилей. Сначала скройте значок на больших экранах:

CSS .toggle-nav { display: none !important;

}

123 .toggle-nav {    display: none !important;}

Теперь внутри медиа-запроса добавьте CSS для меню:

CSS @media screen and ( max-width: 550px) { a.toggle-nav { float: right; margin: 0 0 0.5em 0.5em; display: inline-block !important; color: #fff; transition: color linear 0.15s;

}

a.toggle-nav:hover, a.toggle-nav:active { text-decoration: none; color: #fff;

}