3 votes

Positionner les pseudo-éléments dans la grille CSS

J'essaie de positionner des pseudo-éléments, comme cela devrait être possible selon les spécifications, sur une grille. Cela fonctionne très bien pour ma mise en page extérieure, que j'ai définie sur la balise <body> mais cela ne fonctionne pas pour le <header> qui est elle-même une grille.

Comment puis-je positionner l'en-tête nav:after dans la colonne de droite de la grille ? Pourquoi cela ne fonctionne-t-il pas dans mon exemple ?

J'apprécie toute aide ! Voici le code :

body {
  display: grid;
  grid-template-columns: 1fr 800px 1fr;
}
header {
  grid-column: 1 / 4;
  grid-row: 1;

  display: grid;
  grid-template-columns: 1fr 800px 1fr;
}

/* Works great */
header:before {
  content: 'Left';
  grid-column: 1 / 2;
}

/* Doesn't work, treated as a child element */
header nav:after {
  content: 'Right';
  grid-column: 3 / 4;
}
header nav {
  grid-column: 2 / 3;
}

<body>
  <header>
    <nav>
    <ul>
      <li><a href='#'>Link</a></li>
      <li><a href='#'>Link</a></li>
      <li><a href='#'>Link</a></li>
    </ul>
    </nav>
  </header>
</body>    

Merci !

2voto

kukkuz Points 24428

nav:after est un élément enfant de nav . Alors faites votre nav une grille aussi - elle ne l'est pas pour le moment.

Ou vous pouvez utiliser header:after au lieu de nav:after - voir la démo ci-dessous :

body {
  display: grid;
  grid-template-columns: 1fr 800px 1fr;
}

header {
  grid-column: 1 / 4;
  grid-row: 1;
  display: grid;
  grid-template-columns: 1fr 800px 1fr;
}

/* Works great */

header:before {
  content: 'Left';
  grid-column: 1 / 2;
}

/* CHANGED THIS*/

header:after {
  content: 'Right';
  grid-column: 3 / 4;
}

header nav {
  grid-column: 2 / 3;
}

<header>
  <nav>
    <ul>
      <li><a href='#'>Link</a></li>
      <li><a href='#'>Link</a></li>
      <li><a href='#'>Link</a></li>
    </ul>
  </nav>
</header>

0voto

Michael_B Points 15556

Les pseudo-éléments dans un conteneur de grille sont considérés comme des enfants du conteneur. Références :

Par conséquent, à moins qu'un pseudo-élément ne soit positionné de manière absolue, il s'agit d'un élément de la grille. Référence :

Voici une démonstration basée sur votre code :

body {
  display: grid;
  grid-template-columns: 1fr 300px 1fr;
  text-align: center;
  border: 1px solid black;
}

body::before {
  content: "pseudo - \a left sibling \a of header";
  white-space: pre;
  grid-column: 1 / 2;
  background-color: salmon;
}

body::after {
  content: "pseudo - \a right sibling \a of header";
  white-space: pre;
  grid-column: 3 / 4;
  background-color: lightgreen;
}

header {
  grid-column: 2 / 3;
  background-color: yellow;
  padding: 5px;
  display: grid;
  grid-template-columns: 1fr 100px 1fr;
  grid-gap: 5px;
}

header nav {
  grid-column: 2 / 3;
  border: 1px dashed red;
}

header::before {
  content: "pseudo - \a left sibling \a of nav";
  white-space: pre;
  grid-column: 1 / 2;
  border: 1px dashed red;
}

header::after {
  content: "pseudo - \a right sibling \a of nav";
  white-space: pre;
  grid-column: 3 / 4;
  border: 1px dashed red;
}

<body>
  <header>
    <nav>
      <ul>
        <li><a href='#'>Link</a></li>
        <li><a href='#'>Link</a></li>
        <li><a href='#'>Link</a></li>
      </ul>
    </nav>
  </header>
</body>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X