CSS выровнять подменю по родительскому элементу

У меня есть следующий фрагмент HTML для строки меню:

#menubar {
  display: block;
  background: #FFFFFF;
}

#menubar ul li a.menubutton {
  display: none;
  /* dont show burger symbol (mobile menu symbol) */
}

#menubar ul {
  display: block;
  width: 2em;
  /* restrict burger symbol */
  padding: 0.9em;
}

#menubar ul li {
  display: inline;
}

#menubar ul li ul li {
  display: none;
}


/*Header*/

header {
  display: block;
  background: #2F2C2C;
  text-align: center;
}


/* Navigation */

nav {
  display: block;
  height: 2.5em;
  background: #FFFFFF;
  text-align: center;
}

nav ul {
  display: block;
}

nav ul li {
  display: inline;
  margin: 0em 0.188em 0em 0.188em;
}

nav ul li a {
  color: #454040;
  font-size: 1.125em;
  line-height: 2.5em;
  padding: 0.563em 0.938em 0.375em 0.983em;
  transition: background 0.2s;
  /* nice transition effect */
  -webkit-transition: background 0.2s;
}

nav ul li a:hover {
  background: #DBD9D8;
  border-bottom: 0.188em solid #FF0000;
}

nav ul li a.active {
  border-bottom: 0.188em solid #E7590B;
}

nav ul li ul {
  display: none;
}

nav ul li:hover ul.submenu {
  text-align: center;
  position: fixed;
  display: block;
  margin-left: 40%;
}

nav ul li ul li:hover {
  background: #DBD9D8;
  border-bottom: 0.188em solid #FF0000;
}
<nav class = "nav">
  <ul>
    <li><a href = "./index.html" class = "active">Start</a></li>
    <li><a href = "./meetings.html">Termine</a></li>
    <li><a href = "./organisation.html">Organisation</a>
      <ul class = "submenu">
        <li><a href = "./organisation/page1.html">Page1</a></li>
        <li><a href = "./organisation/page2.html">Page2</a></li>
        <li><a href = "./organisation/page3.html">Page3</a></li>
      </ul>
    </li>
    <li><a href = "./about.html">About</a>
      <ul class = "submenu">
        <li><a href = "./about/page1.html">Page1</a></li>
        <li><a href = "./about/page2.html">Page2</a></li>
        <li><a href = "./about/page3.html">Page3</a></li>
      </ul>
    </li>
    <li><a href = "./contact.html">Contact</a></li>
  </ul>
</nav>

ul #submenu отображаются при наведении курсора.

Мне удалось центрировать подменю со всей страницей, используя left: 40% в правиле nav ul li:hover ul.submenu. Однако я хочу расположить подменю по центру их родительских компонентов, поэтому, например, если взять организацию, я бы хотел, чтобы подменю страницы 2 было сосредоточено с полем родительской организации и примерно так же.

Как я могу добиться центрирования относительно родительского компонента?

Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
0
148
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Добавьте position: relative в пункты меню, в которых есть подменю (то есть в селектор nav ul li), и измените position: fixed на position: absolute для подменю, то есть в селектор nav ul li:hover ul.submenu.

Это делает положение подменю «относительным» к их родительскому элементу (элемент главного меню), поэтому вам следует соответствующим образом настроить параметры left и top в правиле CSS подменю.

#menubar {
  display: block;
  background: #FFFFFF;
}

#menubar ul li a.menubutton {
  display: none;
  /* dont show burger symbol (mobile menu symbol) */
}

#menubar ul {
  display: block;
  width: 2em;
  /* restrict burger symbol */
  padding: 0.9em;
}

#menubar ul li {
  display: inline;
}

#menubar ul li ul li {
  display: none;
}


/*Header*/

header {
  display: block;
  background: #2F2C2C;
  text-align: center;
}


/* Navigation */

nav {
  display: block;
  height: 2.5em;
  background: #FFFFFF;
  text-align: center;
}

nav ul {
  display: block;
}

nav ul li {
  display: inline;
  margin: 0em 0.188em 0em 0.188em;
  position: relative;
}

nav ul li a {
  color: #454040;
  font-size: 1.125em;
  line-height: 2.5em;
  padding: 0.563em 0.938em 0.375em 0.983em;
  transition: background 0.2s;
  /* nice transition effect */
  -webkit-transition: background 0.2s;
}

nav ul li a:hover {
  background: #DBD9D8;
  border-bottom: 0.188em solid #FF0000;
}

nav ul li a.active {
  border-bottom: 0.188em solid #E7590B;
}

nav ul li ul {
  display: none;
}

nav ul li:hover ul.submenu {
  text-align: center;
  position: absolute;
  display: block;
  left: -50%;
}

nav ul li ul li:hover {
  background: #DBD9D8;
  border-bottom: 0.188em solid #FF0000;
}
<nav class = "nav">
  <ul>
    <li><a href = "./index.html" class = "active">Start</a></li>
    <li><a href = "./meetings.html">Termine</a></li>
    <li><a href = "./organisation.html">Organisation</a>
      <ul class = "submenu">
        <li><a href = "./organisation/page1.html">Page1</a></li>
        <li><a href = "./organisation/page2.html">Page2</a></li>
        <li><a href = "./organisation/page3.html">Page3</a></li>
      </ul>
    </li>
    <li><a href = "./about.html">About</a>
      <ul class = "submenu">
        <li><a href = "./about/page1.html">Page1</a></li>
        <li><a href = "./about/page2.html">Page2</a></li>
        <li><a href = "./about/page3.html">Page3</a></li>
      </ul>
    </li>
    <li><a href = "./contact.html">Contact</a></li>
  </ul>
</nav>

Спасибо за этот комментарий, но кажется, что левое правило подменю не работает, оно прилипает либо к левому, либо к правому краю сайта. если я удалю левое правило, оно снова будет центрировано по всему сайту: /

ItFreak 08.08.2018 14:18

звучит так, будто вы что-то забыли ... Существенными являются position: relative для элементов главного меню li и position: absolute для их дочерних элементов ul. И не забудьте стереть position: fixed, который у вас был раньше. (Вы можете видеть, что это работает в моем фрагменте, который является лишь небольшой модификацией вашего предыдущего кода)

Johannes 08.08.2018 14:24

нет, просто скопировал вашу часть в мою и все такое же поведение, и я почти уверен, что нет другого правила, мешающего

ItFreak 08.08.2018 14:28

Ну, если вы просто скопировано это, вы не стирали / не меняли position: fixed, о котором я упоминал

Johannes 08.08.2018 14:30

только что проверил и искал исправленное в css, единственное исправление - в моем сеансе нижнего колонтитула

ItFreak 08.08.2018 14:31

вы удалили margin-left, который у вас был раньше?

Johannes 08.08.2018 14:51

Мне очень жаль, у меня были старые правила в css для содержимого индекса (idk, почему ...). можно ли выровнять подменю слева направо?

ItFreak 08.08.2018 15:07

теоретически да, если вы добавите display: inline-block к этим элементам li. Но вам также придется добавить ширину исправлено к абсолютно позиционированным подменю ul, что не будет одинаковым для всех подменю и, следовательно, не будет работать должным образом.

Johannes 08.08.2018 15:57

так что нет возможности создать прочную рабочую встроенную версию, центрированную по родительскому компоненту?

ItFreak 08.08.2018 16:10

вам нужно будет определить фиксированную ширину отдельно для каждого подменю ul, чтобы все его элементы li поместились в него - тогда вы можете расположить этот блок по своему усмотрению

Johannes 08.08.2018 16:11

это звучит не очень хорошо. есть ли возможность (с вашим решением) получить подменю над содержанием сайта?

ItFreak 08.08.2018 16:13

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

.child-class{
  width:max-content;
  margin:0px auto;
}

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

Я рекомендую этот метод, а не относительное положение, потому что что действительно удобно в использовании этого метода, так это то, что он будет выравнивать ваш контент по центру равномерно, даже если разные теги li имеют разную ширину. Что удобно для мобильной оптимизации. :)

Другие вопросы по теме