Подтвердить что ты не робот

CSS Flexbox: Как вы выставляете дочерние элементы контейнера flexbox в противоположные крайние края главной оси?

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

Я хотел бы, чтобы логотип был как можно дальше в контейнере гибких дисков, а остальные элементы навигации должны быть как можно более правыми. Этого можно легко достичь, плавая элементами слева и справа, но это не то, что я хотел бы сделать. Так что...

Как вы выровняете дочерние элементы контейнера flexbox с противоположными дальними краями основной оси?

Для дочерних элементов flexbox существует свойство, которое позволяет сделать это на поперечной оси align-self, но, похоже, на главной оси этого не происходит.

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

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

HTML

<ul>
  <!-- Should be as far left as possible -->
  <li id="main">Some Logo <span>Some tag line.</span></li>

  <!-- Should be as far right as possible -->
  <li>Home</li>
  <li>Products</li>
  <li>Price Sheet</li>
  <li>Capabilities</li>
  <li>Contact</li>
</ul>

CSS

ul {
  width:           100%; 
  display:         flex;
  flex-flow:       row nowrap;
  justify-content: flex-end;
  align-items:     center;

  padding:    0;
  margin:     0;

  list-style: none;
}

li {
  margin:     0 8px;
  padding:    8px;

  font-size:   1rem;
  text-align:  center;
  font-weight: bold;

  color:       white;
  background:  green;
  border:     solid 4px #333;
}

#main { font-size: 2rem; }
#main span { font-size: 1rem; }
4b9b3361

Ответ 1

Из вашего вопроса:

Я не знаю, как сделать элемент интерполяции занимать все оставшееся пространство, независимо от ширины окна просмотра.

Это именно то, для чего было разработано flex-grow правило CSS. Если только один дочерний элемент имеет атрибут flex-grow, тогда он займет все оставшееся место в контейнере flex. Единственная разметка, которая вам понадобится в этом случае, следующая:

HTML:

<li id="spacer"></li>

CSS

#spacer {
    visibility: hidden;
    flex-grow: 1;    
}

Полная демо-версия:

ul {
  width:           100%; 
  display:         flex;
  flex-flow:       row nowrap;
  justify-content: flex-end;
  align-items:     center;

  padding:    0;
  margin:     0;

  list-style: none;
}

li {
  margin:     0 8px;
  padding:    8px;

  font-size:   1rem;
  text-align:  center;
  font-weight: bold;

  color:       white;
  background:  green;
  border:     solid 4px #333;
}

#main { font-size: 2rem; }
#main span { font-size: 1rem; }

#spacer {
    visibility: hidden;
    flex-grow: 1;    
}
<ul>
  <!-- Should be as far left as possible -->
  <li id="main">Some Logo <span>Some tag line.</span></li>

  <!-- Spacer element -->
  <li id="spacer"></li>
    
  <!-- Should be as far right as possible -->
  <li>Home</li>
  <li>Products</li>
  <li>Price Sheet</li>
  <li>Capabilities</li>
  <li>Contact</li>
</ul>

Ответ 2

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

Установив для этого элемента правила flex-grow значение 1 и text-align - left, он останется с левой стороны, увеличиваясь в размере, следя за тем, чтобы все остальные элементы оставались с правой стороны. Поскольку логотип может иметь большее значение высоты, чем все другие элементы, имеет смысл изменить правило align-items на baseline, убедившись, что все элементы выровнены по горизонтали.

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

html {
    box-sizing: border-box;
}

*, *:before, *:after {
    box-sizing: border-box;
}

body {
    margin: 0;
}

ul {
    width:           100%; 
    display:         flex;
    flex-flow:       column nowrap;
    justify-content: center;
    align-items:     stretch;

    padding:         0;
    margin:          0;

    list-style:      none;
}

li {
    margin:     0;
    padding:    8px;

    font-size:   1rem;
    text-align:  center;
    font-weight: bold;

    color:       white;
    background:  green;
    border:     solid 4px #333;

}

li:first-child {
    font-family: sans;
    font-size: 2em;
    text-align: center;
}

li:first-child span {
    font-size: initial;
}

@media (min-width: 34em) {
    ul {
        flex-flow: row wrap;
        justify-content: space-between;
        align-items:     flex-start;
    }

    li {
        flex: 1;
    }

    #main {
        flex: 0 0 100vw;
    }
}

@media (min-width: 48em) {
    ul {
        justify-content: flex-end;
        align-items:     baseline;
    }

    li {
        flex: none;
    }

    #main {
        flex: 1 0 auto;
        text-align: left;
    }
}
<ul>
  <!-- Should be as far left as possible -->
  <li id="main">Some Logo <span>Some tag line.</span></li>
  <!-- Should be as far right as possible -->
  <li>Home</li>
  <li>Products</li>
  <li>Price Sheet</li>
  <li>Capabilities</li>
  <li>Contact</li>
</ul>

Ответ 3

По существу вам нужен контейнер row с двумя дочерними столбцами

  • контейнер - гибкий div
  • Столбец - это гибкий div с логотипом
  • столбец два является гибкой ul с flexed li

И 'justify-content: space-between' для перемещения столбцов в дальние края

Проверьте мой фрагмент (полная страница)!

.container,
.menu {
  display: flex;
}
.container {
  justify-content: space-between;
  width: 100%;
}
.menu {
  padding: 0;
  margin: 0;
  list-style: none;
}
li,
.logo {
  margin: 0 8px;
  padding: 8px;
  font-size: 1rem;
  text-align: center;
  font-weight: bold;
  color: white;
  background: green;
  border: solid 4px #333;
}
#main {
  font-size: 2rem;
}
#main span {
  font-size: 1rem;
}
<div class="container">
  <div id="main" class="logo">Some Logo <span>Some tag line.</span>
  </div>
  <ul class="menu">
    <li>Home</li>
    <li>Products</li>
    <li>Price Sheet</li>
    <li>Capabilities</li>
    <li>Contact</li>
  </ul>
</div>

Ответ 4

Одна возможность - установить правый край для первого элемента

ul {
  width:           100%; 
  display:         flex;
  flex-flow:       row nowrap;
  justify-content: flex-end;
  align-items:     center;

  padding:    0;
  margin:     0;

  list-style: none;
}

li {
  margin:     0 8px;
  padding:    8px;

  font-size:   1rem;
  text-align:  center;
  font-weight: bold;

  color:       white;
  background:  green;
  border:     solid 4px #333;
}

#main { 
  font-size: 2rem; 
  margin-right: auto;  /* create a right margin as needed */
}  
#main span { font-size: 1rem; }

#spacer {
    visibility: hidden;
    flex-grow: 1;    
}
<ul>
  <!-- Should be as far left as possible -->
  <li id="main">Some Logo <span>Some tag line.</span></li>
  <!-- Should be as far right as possible -->
  <li>Home</li>
  <li>Products</li>
  <li>Price Sheet</li>
  <li>Capabilities</li>
  <li>Contact</li>
</ul>

Ответ 5

JSfiddle Demo

  • Оберните ul поверх остальных элементов списка и используйте вложенный контейнер flex. Это означает, что flexbox действует на два элемента.
  • Используйте justify-content: space-between для основного родителя flexbox для равномерного размещения двух элементов.

.parent-menu {
  width: 100%;
  display: flex;
  flex-flow: row nowrap;
  justify-content: space-between;
  /* Modify */
  align-items: center;
  padding: 0;
  margin: 0;
  list-style: none;
}
li {
  margin: 0 8px;
  padding: 8px;
  font-size: 1rem;
  text-align: center;
  font-weight: bold;
  color: white;
  background: green;
  border: solid 4px #333;
}
#main {
  font-size: 2rem;
}
#main span {
  font-size: 1rem;
}
.right-menu {
  display: flex;
  /* Add */
}
<ul class="parent-menu">
  <!-- Should be as far left as possible -->
  <li id="main">Some Logo <span>Some tag line.</span>
  </li>
  <ul class="right-menu">
    <!-- Should be as far right as possible -->
    <li>Home</li>
    <li>Products</li>
    <li>Price Sheet</li>
    <li>Capabilities</li>
    <li>Contact</li>
  </ul>
</ul>