Le chaos avec nth-child()

Accueil Tags Recherche

26 Novembre 2013

Le chaos avec nth-child()

Comment faire pour donner une petite touche de chaos dans vos design, sans toucher au JS ?

L’effet attendu

Une fois n’est pas coutume, je vais commencer par le résultat final, histoire que vous visualisiez ce que je voulais obtenir :

(Vous noterez l’utilisation de Random User Generator dont j’ai parlé dans un précédent billet)

La base avant tout

Je suis parti d’une structure très basique, me permettant d’afficher le nom d’une personne sous sa photo :

<ul class="pictures">
  <li>
    <img src="http://link.to/image.jpg" alt="first name">
    <p>first name</p>
  </li></ul>

J’ajoute un peu de CSS pour donner l’effet photo Polaroid :

ul.pictures {
  width: 500px;
  margin: 25px auto;
  padding: 0;
  list-style: none;
}
li {
  width: 100px; height: 130px;
  border: 5px solid white;
  text-align: center;
  background: white;
  border-radius: 2px;
  box-shadow: 0 0 1px #333;
  float: left;
}
p {
  font-family: 'Roboto';
  margin: 0;
  font-weight: 400;
  line-height: 30px;
  text-transform: capitalize;
}
img {
  width: 100px; height: 100px;
}

Polaroid style !

Voilà, nous sommes prêts à ajouter…

The chaos trick

L’astuce consiste à appliquer diverses rotations à des ensembles d’éléments différents, en utilisant nth-child(). J’applique une première rotation à tous les éléments :

li:nth-child(1n) {
  -webkit-transform: rotate(4deg);
          transform: rotate(4deg);
}

Notez que l’utilisation du préfixe -moz- tend à disparaître pour la propriété transform (elle n’est plus nécessaire depuis Firefox 16). De même, le li:nth-child(1n) {} est tout à fait inutile, un li {} suffisait amplement, mais je l’ai gardé pour l’exemple.

Une seule rotation

J’applique ensuite une rotation différente à 1 élément sur 2 :

li:nth-child(2n) {
  -webkit-transform: rotate(-6deg);
          transform: rotate(-6deg);
}

Cette seconde rotation va venir écraser l’ancienne (et non s’y combiner) :

Deux rotations

Bon, là on peut pas vraiment encore parlé de chaos. Mais si on prolonge le principe avec 3n, 5n et 7n ?

li:nth-child(1n) {
  -webkit-transform: rotate(4deg);
          transform: rotate(4deg);
}
li:nth-child(2n) {
  -webkit-transform: rotate(-6deg);
          transform: rotate(-6deg);
}
li:nth-child(3n) {
  -webkit-transform: rotate(2deg);
          transform: rotate(2deg);
}
li:nth-child(5n) {
  -webkit-transform: rotate(-4deg);
          transform: rotate(-4deg);
}
li:nth-child(7n) {
  -webkit-transform: rotate(10deg);
          transform: rotate(10deg);
}

Voyons ce qui va se passer, vous avez ci-dessus les éléments concernés par chacun des sélecteurs CSS que j’ai utilisé :

Les éléments affectés par les différents sélecteurs

Si on tiens compte de l’ordre dans lequel je les déclare, et du fait qu’une nouvelle rotation écrase l’ancienne, on se retrouve à la fin avec ceci :

Le sélecteur retenu pour chaque élément

Et là, ça send tout de suite moins le ménage de printemps ! Voici donc comment vous pouvez donner un semblant d’aléatoire et de chaos dans vos créations !

Liens

Démonstration Random User Generator, utilisé pour les portraits et les noms Can I Use ? transform Master of the :nth-child()