html — Как растянуть пункты меню по всей ширине родительского блока?

Вопрос задан

Изменён 2 года назад

Просмотрен 14k раз

Есть обычная навигация:

HTML:

<nav>
  <ul>
    <li><a href="">Продукция</a></li>
    <li><a href="">Сообщества</a></li>
    <li><a href="">Мероприятия и акции</a></li>
    <li><a href="">Поддержка</a></li>
  </ul>
</nav>

CSS:

nav {
  font-size: 0;
    line-height: 0;
    letter-spacing: -1px;
}
nav li {
  display: inline-block;
}
nav a {
    display: block;
  background: #000;
    padding: 0 10px;
    font-size: 17px;
    line-height: normal;
    letter-spacing: normal;
  color: #fff;
}
nav li:nth-child(2n) a {
  background: #666;
}

Как пункты меню растянуть по всей ширине блока nav, чтобы padding у всех ссылок был одинаковым (пустого пространства между ссылками быть не должно, это пространство распределяется на внутренние отступы ссылок)?

UPD:

Изображение того, как должно отображаться меню.

  • html
  • jquery
  • css

Поставить display: flex родителю, flex-basis: auto + flex-grow: 1 — потомкам.

body,
ul {
  margin: 0;
  padding: 0;
}

ul {
  display: flex;
}

ul li {
  list-style-type: none;
  flex-basis: auto;
  flex-grow: 1;
  background: #000;
  text-align: center;
}

ul li:nth-child(2n) {
  background: #ccc;
}

ul li a {
  padding: 20px 0;
  text-decoration: none;
  color: #ccc;
  display: block;
}

ul li:nth-child(2n) a {
  color: #000;
}
<nav>
  <ul>
    <li><a href="">Продукция</a></li>
    <li><a href="">Сообщества</a></li>
    <li><a href="">Мероприятия и акции</a></li>
    <li><a href="">Поддержка</a></li>
  </ul>
</nav>

Вариант на Flexbox

body,
ul {
  margin: 0;
  padding: 0;
}

ul,
ul li,
ul li a {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  width: 100%;
}

ul {
  text-align: center;
  -webkit-box-orient: horizontal;
  -webkit-box-direction: normal;
  -ms-flex-direction: row;
  flex-direction: row;
}

ul li a {
  min-height: 70px;
  text-decoration: none;
  color: #333;
  -webkit-box-align: center;
  -ms-flex-align: center;
  align-items: center;
  -webkit-box-pack: center;
  -ms-flex-pack: center;
  justify-content: center;
}

ul li a:hover {
  background: #eee;
}
<nav>
  <ul>
    <li><a href="">Продукция</a></li>
    <li><a href="">Сообщества</a></li>
    <li><a href="">Мероприятия и акции</a></li>
    <li><a href="">Поддержка</a></li>
  </ul>
</nav>

4

А этот вариант не проще?

ul 
 text-align: justify!important;
    text-align-last: justify;

1

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

html — Растянуть меню на всю ширину

Вот разметка:

. main_nav_wrapp {
  background-color: #004a9e;
}

.main_row {
  max-width: 1240px;
  margin: 0 auto;
}

.main_nav {
  display: flex;
  display: -webkit-flex;
  outline: 1px solid red;
}

.main_nav li {
  display: flex;
  display: -webkit-flex;
  flex-direction: column;
  -webkit-flex-direction: column;
  text-align: center;
}

.main_nav li a {
  display: block;
  flex: 1;
  -webkit-flex: 1;
  padding: 17px 38px;
  outline: 1px solid red;
}
<div>
  <div>
    <ul>
      <li><a href="#"><span>О компании</span></a></li>
      <li><a href="#"><span>Услуги</span></a></li>
      <li><a href="#"><span>Алгоритм работы</span></a></li>
      <li><a href="#"><span>Каталоги</span></a></li>
      <li><a href="#"><span>Полезная информация</span></a></li>
      <li><a href="#"><span>Медиа-центр</span></a></li>
      <li><a href="#"><span>Контакты</span></a></li>
    </ul>
  </div>
</div>

Получается вот так

На картинке видно что справа есть пустое место. Нужно чтобы все пункты меню растянулись по всей ширине меню так, чтобы между ними не было отступов. Как это сделать?

  • html
  • css
  • flexbox

2

Должного эффекта можно добиться с помощью свойства justify-content.

Для начала отмечу, что в данных стилях, которые ранее использовались для центрирования списка вкладок, надобности больше нет:

.main_row {
    max-width: 1240px;
    margin: 0 auto;
}

В принципе сам блок .main_row можно убрать, но тут уже на ваше усмотрение, может быть он вам нужен.

Теперь к сути. Я бы прибег к следующему варианту:

justify-content: stretch для родителя (ul) и flex-grow: 1 для потомков (li).

Ваш пример с соответствующими изменениями:

.main_nav_wrapp {
  background-color: #004a9e;
}

.main_row {
  /* это больше не нужно */
  /* max-width: 1240px; */
  /* margin: 0 auto; */
}

. main_nav {

  justify-content: stretch; // и раз

  display: flex;
  display: -webkit-flex;
  outline: 1px solid red;
}

.main_nav li {
  display: flex;
  display: -webkit-flex;
  flex-direction: column;
  -webkit-flex-direction: column;
  text-align: center;

  flex-grow: 1; // и двас

}

.main_nav li a {
  display: block;
  flex: 1;
  -webkit-flex: 1;
  padding: 17px 38px;
  outline: 1px solid red;
}
<div>
  <div>
    <ul>
      <li><a href="#"><span>О компании</span></a></li>
      <li><a href="#"><span>Услуги</span></a></li>
      <li><a href="#"><span>Алгоритм работы</span></a></li>
      <li><a href="#"><span>Каталоги</span></a></li>
      <li><a href="#"><span>Полезная информация</span></a></li>
      <li><a href="#"><span>Медиа-центр</span></a></li>
      <li><a href="#"><span>Контакты</span></a></li>
    </ul>
  </div>
</div>

flex-grow: 1 необходим для правильной работы stretch и является своего рода множителем определяющим насколько элемент больше своих соседей (попробуйте поставить flex-grow: 10 только первому li, посмотрите, что выйдет).

Также замечу, что отступ слева создаёт ul, у него по дефолту есть padding

UPD: Немного невнимательно прочитал, если вам нужно, чтобы элементы меню растянулись не по всей странице, а только внутри блока .main_row, тогда его стиль убирать не нужно

Подстройте этот пример под свои стили:

ul.full-width {
  width: 100%;
  /* Ширина основного блока меню */
  height: 50px;
  /* Высота основного блока меню */
  position: relative;
  display: table;
  margin: 0;
  padding: 0;
}

ul.full-width li {
  display: table-cell;
  position: relative;
}

ul.full-width li a {
  display: block;
  position: relative;
  width: 100%;
  height: 100%;
  text-align: center;
  background: #FFF;
  line-height: 50px;
  /* Приравниваем к высоте, чтобы выровнять текст по вертикали */
}

ul.full-width li ul {
  display: none;
  /* Скрываем выпадающее меню */
  position: absolute;
  width: 100%;
  margin: 0px;
  padding: 0px;
}

ul. full-width li ul li {
  display: block;
}

ul.full-width li:hover ul {
  display: block;
  /* Показываем выпадающее меню, где оно есть, при наведении */
}
<ul>
  <li>
    <a href="#">О компании</a>
    <li><a href="#">Услуги</a></li>
    <li><a href="#">Технологии</a></li>
    <li><a href="#">Проекты</a></li>
    <li><a href="#">Контакты</a></li>
</ul>

1

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

Панель навигации по центру во всю ширину

Как раз в то время, когда я разрабатывал код для суперпростой панели навигации, о которой я писал некоторое время назад, ко мне обратился друг с интересной проблемой. Ему нужна была горизонтальная панель навигации, подобная той, которую я создавал, со следующими изменениями:

  1. Фон панели навигации должен растягиваться на всю ширину экрана (не только ширину центральной области содержимого), а
  2. Сами элементы навигации должны по-прежнему располагаться по центру области содержимого.

На приведенном ниже эскизе показана основная концепция дизайна.

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

Этот учебник является результатом этой задачи.

HTML

Мне удалось сократить количество необходимых дополнительных разделов до одного. К сожалению, я не думаю, что это возможно сделать без хотя бы одного дополнительного блока div или без обращения к JavaScript вместо того, чтобы полностью полагаться на CSS.

 <дел>
<ул>
  • О нас
  • Наши продукты
  • Часто задаваемые вопросы
  • Контакты
  • Войти
  • Если вы знакомы с кодом суперпростой панели навигации, вы увидите, что он почти идентичен, за исключением того, что я заключил тег ul в div и переместил идентификатор «nav» в него. разд.

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

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

    CSS

    Опять же, все, что я здесь сделал, это взял предыдущий CSS панели навигации и немного изменил его. Результаты ниже:

     #nav {
    ширина: 100%;
    плыть налево;
    поле: 0 0 1em 0;
    заполнение: 0;
    цвет фона: #f2f2f2;
    нижняя граница: 1px сплошная #ccc; }
    #нав ул {
    стиль списка: нет;
    ширина: 800 пикселей;
    поле: 0 авто;
    заполнение: 0; }
    #нав ли {
    плыть налево; }
    #нав ли {
    дисплей: блок;
    отступ: 8px 15px;
    текстовое оформление: нет;
    вес шрифта: полужирный;
    цвет: #069;
    граница справа: 1px сплошная #ccc; }
    #nav li:first-child a {
    граница слева: 1px сплошная #ccc; }
    #nav li a:hover {
    цвет: #c00;
    цвет фона: #fff; } 

    Наш блок #nav растягивается на 100% окна браузера и перемещается влево. Правило «плавающее: левое» может показаться немного странным, потому что мы не хотим, чтобы что-либо оборачивало нашу панель навигации.

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

    Почему это важно? Это то, что позволяет нам установить цвет фона и рамку для нашего элемента #nav, чтобы он по-прежнему отображался. Если бы #nav не был плавающим, он бы рухнул до нулевой высоты, сделав наш фон и границу невидимыми!

    Затем мы задали «#nav ul» фиксированную ширину и использовали трюк с автоматическим отступом, чтобы центрировать его. Ширина здесь имеет решающее значение: вы хотите, чтобы она была такой же ширины, как и центрированная область содержимого. В данном примере это 800 пикселей.

    Здесь я использую один псевдокласс для получения интересного эффекта. Псевдокласс «:first-child» применяется к любому элементу, который является первым дочерним элементом своего родителя. В нашем случае это правило находит первую «ли» в нашем родительском «ул». Затем мы применяем границу к левой стороне тега привязки внутри. Без него у нашего первого элемента не было бы границы слева, как у других. Хотя технически мы могли бы сделать это с классом или идентификатором для первого элемента, я думаю, что это решение немного более элегантно.

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

    Вы можете увидеть этот код в действии здесь. Надеюсь, другие найдут это решение таким же полезным, как и мой друг!

    Нужна полноразмерная горизонтальная панель навигации — HTML и CSS — Форумы SitePoint

    makamo661

    1

    У меня есть следующий код для создания горизонтальной панели навигации, однако она не заполняет всю ширину браузера, как мне хотелось бы. Что не так с моим кодом? Теги привязки отсутствуют, потому что html создается динамически с помощью javascript и имеет событие щелчка для перехода к разделам. Это для задания, так что это должно быть сделано таким образом.

     <заголовок>
        <навигация>
    
          
          <ул>
    
        
      
     
    #navbar__list {
    тип стиля списка: нет;
    цвет: #FFF;
    поле: 0 авто 0 авто;
    заполнение: 0;
    положение: фиксированное;
    сверху: 0;
    ширина: 100%;
    минимальная ширина: 100%;
    переполнение: авто;
    }
    #navbar__list ли {
    курсор: указатель;
    цвет фона: #dddddd;
    цвет: #000;
    отступ: 8px;
    дисплей:блок;
    ширина: 31%;
    плыть налево;
    граница: 1px сплошная #000;
    выравнивание текста: по центру;
    }
     

    2 лайка

    23 февраля 2021 г. , 15:40

    2

    Попробуйте изменить min-width: на 50% или оставить 100% и сделать width: 50%

    2 лайков

    Гэндальф

    3

    ладанс37:

    сделать ширина: 50%

    Как и заставят его занимать всю ширину?

    3 лайков

    ladans37

    4

    @Gandalf, тогда оставьте min-width: to 100%

    1 Нравится

    Гэндальф

    5

    @makamo661 вы указали, что элемент списка должен быть 31%. Это не полная ширина.

    Редактировать: вы указали ширину 100% в списке панели навигации, поэтому нет смысла добавлять и основную ширину.

    3 лайков

    23 февраля 2021 г., 16:00

    6

    @Гэндальф Я тоже это вижу. Так что это может быть его проблема.

    1 Нравится

    John_Betong

    7

    макамо661:

     дисплей:блок;
    ширина: 31%;
    плыть налево;
     

    У меня возникло бы искушение временно забыть о вставке JavaScript и жестко запрограммировать пару элементов

  • . Как только он сделает то, что вы хотите, удалите жестко закодированные элементы и добавьте JavaScript.

    Также попробуйте

     display: inline-block;
    цвет фона: Аква;
    ширина: 31%;
    /* плыть налево: */
     

    3 лайка

    Erik_J

    8

    макамо661:

    Это для задания, так что это должно быть сделано именно так.

    Код, который вы разместили, является заданием?

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

    4 лайков

    SamA74

    9

    макамо661:

    поплавок:левый;

    Использование плавающих элементов — довольно «старый» способ позиционирования пунктов меню. Это потребует от вас их размера пропорционально общей ширине.
    Было бы проще использовать что-то вроде display table или flex, так как они могут распределять пространство равномерно для каждого элемента или делить доступное пространство пропорционально размеру каждого элемента, не прибегая к самостоятельной работе.

    4 лайка

    makamo661

    10

    Я изменил ширину элементов списка с 31% до 32%, и теперь это полная ширина.

    4 лайка

    PaulOB

    11

    Возможно, у вас есть 3 предмета, которые вы хотите сделать равными на 100%?

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

    Если вы действительно хотите, чтобы три пункта меню в сумме составляли точно 100%, тогда ваш метод немного выдуманный. 3 х 32% не равно 100%.

    33,3333% x 3 ближе, но тогда вам нужно будет использовать модель рамки для учета отступов и границ.

    Как уже говорили выше, это не совсем то, как это делается в наши дни.

    Вы должны использовать flexbox вместо float, так как он будет делать то, что вы хотите, более надежно. Предполагая, что я понял требования

    5 лайков

    makamo661

    12

    Да, у меня есть 3 вкладки, которые я хочу сделать на всю ширину. Я не знаю, что такое модель бордюрной коробки. Я попробовал размер коробки: border-box; но это не изменило дизайн. Как мне реализовать flex box?

    2 лайка

    24 февраля 2021 г., 14:36

    13

    Это может помочь вам понять, как работают гибкие блоки

    CSS-Tricks — 8 апреля 13

    Полное руководство по Flexbox | CSS-трюки

    Наше подробное руководство по макету CSS flexbox. Это полное руководство объясняет все о flexbox, уделяя особое внимание всевозможным свойствам родительского элемента (flex-контейнера) и дочерних элементов (flex-элементов). Это также…

    Я часто хожу на этот сайт, а также на w3schools

    А вот и кое-что по бордюру модели коробки

    https://css-tricks. com/box-sizing/ . Надеюсь это поможет.

    1 Нравится

    ПолОБ

    14

    макамо661:

    Как реализовать flex box?

    Вот так:

    33% не обязательно должны быть такими точными, если они составляют менее трети пробела. Flex автоматически заполнит любые пробелы. Это может быть flex:1 0 0% и все равно выглядеть почти так же, если только у вас нет пунктов меню с большим количеством текста, и тогда они будут шире и т. д. Однако они всегда будут соответствовать.

    1 Нравится

    makamo661

    15

    Спасибо, ladans37 и PaulOB и спасибо всем остальным, кого я не назвал.

  • Автор записи

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

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