Flex box отображается как столбец, когда он должен быть строкой

Я собираю то, что должно быть простой панелью навигации и стилем с помощью flex box. По какой-то причине вместо отображения в виде строки (по горизонтали) он отображается в виде столбца (по вертикали).

Я могу сделать ссылки горизонтальными, используя float:left, но тогда они не растягиваются равномерно, чтобы заполнить панель навигации.

Насколько я понимаю, flex-grow:1каждый элемент должен занимать одинаковое количество места. Но этого не происходит.


Есть четыре объявления, которые не работают должным образом:

flex-directionСсылки на панели навигации расположены в столбце, а не в строке.

paddingХотя отступ панели навигации установлен на ноль, он по-прежнему имеет отступы.

text-alignТекст внутри каждого <li> не центрируется по горизонтали

flex-growСсылки расположены неравномерно


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

Вот упрощенный фрагмент:

<!doctype html>
<html lang = "en">

<head>
<meta charset = "utf-8">
<title>Curse of the Nav Bar</title>
<style>
nav {
	display: flex;
	flex-direction: row; /* not working */
	background-color: #d2d6d6;
	padding: 0; /* not working */
}
nav a {
	display: flex;
	text-decoration: none;
	list-style: none;
	border: 2px solid #727171;
	color: #727171;
	background-color: #c4c4c4;
	padding: 4px;
	margin: 2px;
	text-align: center; /* not working */
	flex-grow: 1; /* not working */
}
nav a:hover,
nav a:active {
	background-color: #aaa;
}
</style>
</head>

<body>
<nav>
	<ul>
		<a href = "#"><li>Once</li></a>
		<a href = "#"><li>Upon</li></a>
		<a href = "#"><li>A Time</li></a>
		<a href = "#"><li>There</li></a>
		<a href = "#"><li>Was</li></a>
		<a href = "#"><li>A Problematic</li></a>
		<a href = "#"><li>Nav Bar</li></a>
	</ul>
</nav>
</body>
</html>

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

Улучшение производительности загрузки с помощью 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 страниц, которые помогут...
2
0
274
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы также можете попробовать указать display: flex для nav ul.

nav ul {
    display: flex;
}

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

  1. используйте flex на ul, а не nav (вы должны установить flex на обертку DOM ваших элементов, которые вы хотите, чтобы они были flex)
  2. Думаю лучше использовать ul и сразу li не a(ul li a)

ul {
  display: flex;
  flex-direction: row;
  background-color: #d2d6d6;
  padding: 0;
}

nav li {
  display: flex;
  text-decoration: none;
  list-style: none;
  border: 2px solid #727171;
  color: #727171;
  background-color: #c4c4c4;
  padding: 4px;
  margin: 2px;
  text-align: center;
  flex-grow: 1;
}

nav a:hover,
nav a:active {
  background-color: #aaa;
}
<nav>
  <ul>
    <li>
      <a href = "#">Once</a>
    </li>
           <li>
      <a href = "#">Once</a>
    </li>
    <li>
      <a href = "#">Once</a>
    </li>
    <li>
      <a href = "#">Once</a>
    </li>
    <li>
      <a href = "#">Once</a>
    </li>
  </ul>
</nav>

скажите мне для получения дополнительной помощи

לבני מלכה 29.05.2019 07:11
Ответ принят как подходящий

В вашем коде есть небольшая ошибка, вот исправленная, Вы отдали все свойства нави, а вам нужно присвоить их UL,

  1. Нет необходимости задавать flex-direction: row, так как это свойство по умолчанию.
  2. Прокладка теперь тоже работает, пожалуйста, проверьте.

nav ul {
	display: flex;
        text-decoration: none;
	flex-direction: row; /* not working */
	background-color: #d2d6d6;
	padding: 0; /* not working */
}
nav li {
	display: flex;
	text-decoration: none;
	list-style: none;
	border: 2px solid #727171;
	color: #727171;
	background-color: #c4c4c4;
	padding: 4px;
	margin: 2px;
	justify-content: center;
	flex-grow: 1;
}
nav a:hover,
nav a:active {
	background-color: #aaa;
}
<nav>
	<ul>
		<li><a href = "#">Once</a></li>
		<li><a href = "#">Upon</a></li>
		<li><a href = "#">A Time</a></li>
		<li><a href = "#">There</a></li>
		<li><a href = "#">Was</a></li>
		<li><a href = "#">A Problematic</a></li>
		<li><a href = "#">Nav Bar</a></li>
	</ul>
</nav>

и еще одна вещь: Ли должен быть прямым потомком UL, а не якорем.

Atul Rajput 29.05.2019 07:16

Спасибо. Это был наиболее четко объясненный ответ, который помог мне понять источник основной проблемы. Вы также решили проблемы с заполнением и центрированием текста, поэтому я принимаю ваш ответ как лучший. (Благодарность всем, кто предоставил ответы!)

Mentalist 29.05.2019 07:26

Я отредактировал фрагмент так, чтобы стиль hover и text-decoration:none теперь также правильно нацеливались.

Mentalist 29.05.2019 07:52

(Для всех, кому интересно, это редактирование в настоящее время ожидает проверки. Удалим этот комментарий, как только он будет проверен и станет видимым для всех.)

Mentalist 29.05.2019 07:57

Кое-что, что я должен был найти (и я опубликую здесь, если другие сочтут это полезным), — это то, как сделать элементы <li> кликабельными, поскольку обертывание их внутри <a> приводит к разрыву макета. Просто добавьте событие onclick. stackoverflow.com/a/16582588/2454914 Это в сочетании со стилем hover на <li> (не <a>) и добавлением cursor:pointer к <li> заставляет его вести себя так, как если бы он был якорем.

Mentalist 29.05.2019 09:21

В nav a {...} заменить display: flex; из display: inline-flex;

Вот эффект:

<!doctype html>
<html lang = "en">

<head>
<meta charset = "utf-8">
<title>Curse of the Nav Bar</title>
<style>
nav {
	display: flex;
	flex-direction: row; /* not working */
	background-color: #d2d6d6;
	padding: 0; /* not working */
}
nav a {
	display: inline-flex;
	text-decoration: none;
	list-style: none;
	border: 2px solid #727171;
	color: #727171;
	background-color: #c4c4c4;
	padding: 4px;
	margin: 2px;
	text-align: center; /* not working */
	flex-grow: 1; /* not working */
}
nav a:hover,
nav a:active {
	background-color: #aaa;
}
</style>
</head>

<body>
<nav>
	<ul>
		<a href = "#"><li>Once</li></a>
		<a href = "#"><li>Upon</li></a>
		<a href = "#"><li>A Time</li></a>
		<a href = "#"><li>There</li></a>
		<a href = "#"><li>Was</li></a>
		<a href = "#"><li>A Problematic</li></a>
		<a href = "#"><li>Nav Bar</li></a>
	</ul>
</nav>
</body>
</html>

Вы берете простое изменение

nav {
   display: flex;
   flex-direction: row; /* not working */
   background-color: #d2d6d6;
   padding: 0; /* not working */
}

К

nav ul {
   display: flex;
   flex-direction: row; /* not working */
   background-color: #d2d6d6;
   padding: 0; /* not working */
}

<!doctype html>
<html lang = "en">

<head>
<meta charset = "utf-8">
<title>Curse of the Nav Bar</title>
<style>
nav ul {
	display: flex;
	flex-direction: row; /* not working */
	background-color: #d2d6d6;
	padding: 0; /* not working */
}
nav a {
	display: flex;
	text-decoration: none;
	list-style: none;
	border: 2px solid #727171;
	color: #727171;
	background-color: #c4c4c4;
	padding: 4px;
	margin: 2px;
	text-align: center; /* not working */
	flex-grow: 1; /* not working */
}
nav a:hover,
nav a:active {
	background-color: #aaa;
}
</style>
</head>

<body>
<nav>
	<ul>
		<a href = "#"><li>Once</li></a>
		<a href = "#"><li>Upon</li></a>
		<a href = "#"><li>A Time</li></a>
		<a href = "#"><li>There</li></a>
		<a href = "#"><li>Was</li></a>
		<a href = "#"><li>A Problematic</li></a>
		<a href = "#"><li>Nav Bar</li></a>
	</ul>
</nav>
</body>
</html>

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