HTML/CSS Parent-child не получает полную ширину

Я все еще новичок в макете HTML/ CSS, но я пытаюсь установить ширину синей навигационной панели, чтобы покрыть всю мою область контейнера / родителя. Как вы видите, у меня есть и право 100px? пробел.. я хочу покрыть это со мной панель навигации. Можете ли вы проверить код и помочь мне написать его правильно? кажется относительное положение не будет работать. спасибо Смотрите картинку ниже

body, html
{
 margin: 0;
 padding: 0;
}
*
{
 box-sizing: content-box;
 padding: 0;
 margin: 0;
  color:#FFF;
}

.content
{
 width: 80%;
 background-color: red;
 height: 400px;
 text-align: center;
 margin: 0 auto; 
}
nav
{
 font-size: 0;
 
}

nav .menu li

{
 list-style-type: none;
 display: inline-block;
 
}

nav .menu li a

{
 text-decoration: none;
 font-size: 20px;
 background-color: blue;
 padding: 20px;
    display: table-cell;
    width: 250px;
    height: 25px;
   
  

}

nav .menu li a:hover
{
 background-color: yellow;
}
<!DOCTYPE html>
<html lang="en">
<html>
<head>
 <meta charset="UTF-8">
 <title>Website</title>
 <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<div class="content">
 <nav>
  <ul class="menu">
   <li><a href="#">Home</a></li>
   <li><a href="#">Home</a></li>
   <li><a href="#">Home</a></li>
   <li><a href="#">Home</a></li>
   <li><a href="#">Home</a></li>
  </ul>
 </nav>
</div>

</body>
</html>

2 ответа

В качестве альтернативного метода вы можете рассмотреть CSS Flexbox.
Вот удобное руководство.

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

Ниже я повернул ваш <ul> элемент в гибкий контейнер коробки, так что все дочерние элементы вместе заполняют горизонтальное пространство. Я позволил пунктам меню переноситься на несколько строк при необходимости. Я также установил ваш <a> элементы, которые будут display:block так что каждый заполняет ширину своего родителя <li>,

.content {
  width: 80%;
  height: 400px;
  background-color: red;
  margin: 0 auto;
}

.menu {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
}

.menu li {
  flex-grow: 1;
}

.menu li a {
  display: block;
  font-size: 20px;
  background-color: blue;
  padding: 20px;
  height: 25px;
  color: white;
  text-decoration: none;
  text-align: center;
}

.menu li a:hover {
  background-color: yellow;
  color: black;
}
<div class="content">
  <nav>
    <ul class="menu">
      <li><a href="#">Home</a></li>
      <li><a href="#">Home</a></li>
      <li><a href="#">Home</a></li>
      <li><a href="#">Home</a></li>
      <li><a href="#">Home</a></li>
    </ul>
  </nav>
</div>

Обратите внимание на совместимость браузера с Flexbox.


Вы также можете использовать display:table-cell метод, который вы начали применять. Точно так же ключ устанавливает <a> элементы к display:block поэтому их фоны покрывают ширину их родителей.

.content {
  width: 80%;
  background-color: red;
  height: 400px;
  text-align: center;
  margin: 0 auto;
}

.menu {
  display: table;
  list-style: none;
  margin: 0;
  padding: 0;
  width: 100%;
}
.menu li {
  display: table-cell;
}

.menu li a {
  display: block;
  text-decoration: none;
  font-size: 20px;
  padding: 20px;
  height: 25px;
  background-color: blue;
  color: white;
}
.menu li a:hover {
  background-color: yellow;
  color: black;
}
<div class="content">
  <nav>
    <ul class="menu">
      <li><a href="#">Home</a></li>
      <li><a href="#">Home</a></li>
      <li><a href="#">Home</a></li>
      <li><a href="#">Home</a></li>
      <li><a href="#">Home</a></li>
    </ul>
  </nav>
</div>


Но самое простое решение может быть перенести синий цвет фона с вашего <a> элементы к <ul> или же <nav> элемент:

.content {
  width: 80%;
  background-color: red;
  height: 400px;
  margin: 0 auto;
}

.menu {
  list-style: none;
  margin: 0;
  padding: 0;
  background-color: blue;
  font-size: 0;
  text-align: center;
}

.menu li {
  display: inline-block;
}

nav .menu li a {
  display: block;
  text-decoration: none;
  font-size: 20px;
  padding: 20px;
  height: 25px;
  color: white;
}

nav .menu li a:hover {
  background-color: yellow;
  color: black;
}
<div class="content">
  <nav>
    <ul class="menu">
      <li><a href="#">Home</a></li>
      <li><a href="#">Home</a></li>
      <li><a href="#">Home</a></li>
      <li><a href="#">Home</a></li>
      <li><a href="#">Home</a></li>
    </ul>
  </nav>
</div>

Я исправил ваш код, теперь навигация должна охватывать всю ширину. Добро пожаловать в стек переполнения!

https://jsfiddle.net/ofbnaks7/1/

я добавил position: relative; width: 100%; гарантируя, что каждый элемент списка охватывает ширину списка, его родителя. Далее, поскольку у вас есть якоря внутри элементов списка, я установил display: block; width: 100%; чтобы убедиться, что они отображаются в правильном месте и заполнить ширину своего родителя. Также я добавил box-sizing: border-box; к якорям. Поскольку у вас есть отступы на якорях, это означает, что заполнение будет "внутри" шириной 100%, а не снаружи, если это имеет смысл.

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