CSS flexbox: différence entre align-items et align-content [dupliquer]

Cette question a déjà une réponse ici:

je trouve la différence entre align-items et align-content dans CSS flexbox propriétés extrêmement déroutantes. J'ai regardé les docs, et plusieurs exemples en ligne pendant des heures, mais ne peut toujours pas saisir pleinement il.

Pour être plus précis, align-items est totalement logique pour moi et il est complètement clair comment il se comporte. D'autre part, align-content n'est pas clair du tout. En particulier, Je ne comprends pas pourquoi nous devrions utiliser deux propriétés différentes selon que le contenu s'adapte tous dans une ligne ou plusieurs.

quelqu'un Peut-il aider à l'expliquer en termes simples?

Merci!

13
demandé sur Pensierinmusica 2015-07-06 18:48:49

2 réponses

Comme décrit dans 6. Flex Lines,

Flex éléments dans un flex conteneur sont disposés et alignés dans lignes flex, les conteneurs hypothétiques utilisés pour le regroupement et l'alignement par l'algorithme de mise en page. Un conteneur flexible peut être une seule ligne ou multi-ligne selon flex-wrap la propriété

Ensuite, vous pouvez définir différents alignements:

  • justify-content propriété s'applique à tous les conteneurs flex, et définit l'alignement de la flexion des éléments le long de l'axe principal de chaque ligne flex.

    An illustration of the five justify-content keywords and their effects on a flex container with three colored items.

  • align-items la propriété s'applique à tous les conteneurs flex, et définit l'alignement par défaut des éléments flex le long de l'axe transversal de chaque ligne flex. Le align-self s'applique à tous les éléments flex, permet d'annuler cet alignement par défaut pour les éléments flex individuels.

    An illustration of the five align-items keywords and their effects on a flex container with four colored items.

  • align-content la propriété ne s'applique qu'aux conteneurs flex multilignes, et elle aligne les lignes flex à l'intérieur du conteneur flex lorsqu'il y a plus d'espace dans l'axe transversal.

    An illustration of the align-content keywords and their effects on a multi-line flex container.

Ici vous avez un extrait de jouer:

var form = document.forms[0],
    flex = document.getElementById('flex');
form.addEventListener('change', function() {
  flex.style.flexDirection = form.elements.fd.value;
  flex.style.justifyContent = form.elements.jc.value;
  flex.style.alignItems = form.elements.ai.value;
  flex.style.alignContent = form.elements.ac.value;
});
ul {
  display: flex;
  flex-flow: row wrap;
  padding: 0;
  list-style: none;
}
li {
  padding: 0 15px;
}
label {
  display: block;
}
#flex {
  display: flex;
  flex-wrap: wrap;
  height: 240px;
  width: 240px;
  border: 1px solid #000;
  background: yellow;
}
#flex > div {
  min-width: 60px;
  min-height: 60px;
  border: 1px solid #000;
  background: blue;
  display: flex;
  justify-content: center;
  align-items: center;
  color: #fff;
}
#flex > .big {
  font-size: 1.5em;
  min-width: 70px;
  min-height: 70px;
}
<form>
  <ul>
    <li>flex-direction
      <label><input type="radio" name="fd" value="row" checked /> row</label>
      <label><input type="radio" name="fd" value="row-reverse" /> row-reverse</label>
      <label><input type="radio" name="fd" value="column" /> column</label>
      <label><input type="radio" name="fd" value="column-reverse" /> column-reverse</label>
    </li>
    <li>justify-content
      <label><input type="radio" name="jc" value="flex-start" checked /> flex-start</label>
      <label><input type="radio" name="jc" value="flex-end" /> flex-end</label>
      <label><input type="radio" name="jc" value="center" /> center</label>
      <label><input type="radio" name="jc" value="space-between" /> space-between</label>
      <label><input type="radio" name="jc" value="space-around" /> space-around</label>
    </li>
    <li>align-items
      <label><input type="radio" name="ai" value="flex-start" /> flex-start</label>
      <label><input type="radio" name="ai" value="flex-end" /> flex-end</label>
      <label><input type="radio" name="ai" value="center" /> center</label>
      <label><input type="radio" name="ai" value="baseline" /> baseline</label>
      <label><input type="radio" name="ai" value="stretch" checked /> stretch</label>
    </li>
    <li>align-content
      <label><input type="radio" name="ac" value="flex-start" /> flex-start</label>
      <label><input type="radio" name="ac" value="flex-end" /> flex-end</label>
      <label><input type="radio" name="ac" value="center" /> center</label>
      <label><input type="radio" name="ac" value="space-between" /> space-between</label>
      <label><input type="radio" name="ac" value="space-around" /> space-around</label>
      <label><input type="radio" name="ac" value="stretch" checked /> stretch</label>
    </li>
  </ul>
</form>
<div id="flex">
  <div>1</div>
  <div class="big">2</div>
  <div>3</div>
  <div>4</div>
  <div class="big">5</div>
  <div>6</div>
</div>
28
répondu Oriol 2015-12-19 06:53:14

vous devez d'Abord comprendre comment Flexible box travaux de structure. L'image ci-dessous est une partie de l' Triche

Structure Flexbox

Flexbox structure

Flexbox a été construit pour s'adapter à la fois en ligne et en colonne.

Main-axe:

lorsque flex-direction Est ligne: axe des abscisses comme sur un graphique, lorsque flex-direction est colonne: axe des ordonnées sur un graphique graphique

Croix-axe:

quand flex-direction est colonne: X-axis comme sur un graphe, quand flex-direction Est ligne: Y-axis sur un graphe

Justifier De Contenu

justifier de contenu est utilisé pour aligner les éléments le long de la main-axis.

.justify-content {
  display: flex;
  justify-content: center;
  flex-wrap: wrap;
  height: 500px;
  width: 500px;
  background: lightgray;
  padding: 5px;
}
.box {
  background: tomato;
  width: 100px;
  height: 100px;
  margin: 10px;
}
<div class="justify-content">
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
</div>

Align-contenu

align-contenu est utilisé pour aligner les éléments à l'intérieur de la flexbox sur le cross-axis. Notez qu'il s'applique à conteneurs multilignes

.align-content {
  display: flex;
  align-content: center;
  flex-wrap: wrap;
  height: 500px;
  width: 500px;
  background: lightgray;
  padding: 5px;
}
.box {
  background: tomato;
  width: 100px;
  height: 100px;
  margin: 10px;
}
<div class="align-content">
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
</div>

Alignez-les éléments

alignez-les éléments a la même fonctionnalité align-content mais la différence est qu'il fonctionne pour centrer chaque conteneur d'une seule ligne au lieu de centrer le conteneur entier. Vérifiez que dans le snippet, le conteneur entier est divisé en 250px de hauteur chacun et centré à l'intérieur, tandis que dans align-content il est centré à l'intérieur 500px hauteur de la ligne.

.align-content {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  height: 500px;
  width: 500px;
  background: lightgray;
  padding: 5px;
}
.box {
  background: tomato;
  width: 100px;
  height: 100px;
  margin: 10px;
}
<div class="align-content">
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
</div>
10
répondu Manoj Kumar 2015-11-10 17:23:27