Styler la liste d'articles

On a laissé la liste d'article bien balisée, mais sans styles. L'apparence par défaut de la balise <ul> ne se prête pas vraiment à ce qu'on cherche, voyons donc comment la transformer un peu.

Screenshot de la liste d'articles

Penser à l'espace, à nouveau

Lorsque l'arrière plan des objets d'une liste est transparent, il faut décider s'il faut utiliser margin ou padding pour les espacer. En effet, le manque de limites rend plus difficile de distinguer l'espace à l'intérieur de l'élément de celui à l'extérieur.

Une autre façon de regarder cet espace dedans ou dehors est de décider si l'espace est plutôt autour ou entre le contenu de chaque élément. margin s'occupe alors plutôt de l'espace entre, et padding si l'espace est autour. La présence de séparateurs, par exemple, donne une impression d'espace "autour du contenu". Ce n'est pas le seul critère. Moins visible, la zone où il est possible de cliquer/toucher pour intéragir avec l'élément peut aussi impliquer que l'espace soit "autour".

Vu les séparateurs entre chaque article, ça sera padding pour la list d'article. Parce que ce padding est lié au fait que les éléments font partie de la liste, je préfère attacher les styles au sélecteur post-list plutôt qu'à chaque élément. Cela en fera un point central pour controller tout ce qui touche à la liste (en complément de supprimer les styles par défaut de la balise <ul>).

.post-list {
  list-style-type: none;
  padding: 0;
}

.post-list > * {
  padding-top: 1rem;
  padding-bottom: 1rem;
}

Maintenant que les éléments sont correctements espacés, on peut ajouter les séparateurs.

Dessiner les séparateurs

Ce n'est pas une bordure complète qui sépare chaque articles, mais un ligne moins large. Impossible donc de juste utiliser border pour l'implémenter. Quelle que soit la solution, les styles se retrouveront encore liés au sélecteur .post-list, ces séparateurs étant là à cause de la liste. En utilisant le combinateur * + *, on les affichera entre chaque élément.

Comment les afficher, donc... Il y a (au moins) 3 options:

N'importe laquelle fera l'affaire pour la liste. En variant les gradients, il serait surement également possible de dessiner des tirets, mais laissons ça pour un autre article.

Plein d'espace pour les interactions

Avec sa taille généreuse, le titre donne déja une large zone pour activer les liens. On peut l'aggrandir encore un peu plus pour donner aux gens la totalité de l'élément à cliquer/toucher.

Malheureusement, entourer la balise <li> d'un lien n'est pas valide en HTML. Ça serait OK pour d'autres éléments comme une simple <div> ou un <article>. Il faudrait également faire attention au nom accessible donné à la balise <a>. Elle prendrait par défaut l'ensemble du contenu de la balise <li> (le titre suivi de la date). Ennuyeux à lire ou entendre pour les utilisateurs/trices de technologies d'assistance, essayons autre chose.

À la place, on peut rendre la zone interactive de la balise <a> aussi grande que la balise <li>. En effet, les pseudo-éléments ::before et ::after peuvent aussi recevoir les interactions et activeront le lien. En positioner un pour couvrir la balise <li> rendra toute sa surface cliquable.

Il y un prix à payer, les utilisateurs/trices ne pourront plus sélectionner le texte dans le <li>. Ça reste plus léger que d'introduire du JavaScript pour détecter les clicks (et devoir éviter de se déclencher quand les gens sélectionnent le texte en, et s'occuper correctement de Ctrl click,...).

Avoir une zone interactive plus grande, ce n'est pas la responsabilité de la liste, mais de chaque élément. Les styles vont donc être rattachés à .post-list-item:

.post-list-item {
  position: relative;  
  z-index: 0;
}

.post-list-item a::before {
  content: '';
  display: block;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 1;
}

Et voilà, la liste d'articles est maintenant présentable. Il ne reste donc plus que le flux RSS pour avoir un site prêt au lancement. Une autre liste d'articles, en quelques sorte, pour le prochain post, mais avec un balisage un peu différent.