CSS :has() Interactive Guide

/css-has-guide

  • CSS :has() Interactive Guide
    https://ishadeed.com/article/css-has-guide

    On peut faire des trucs sympas avec :has(), exemples :

    With CSS :has(), we can replicate the logical operators like ”&&” and ”||“

    /* OR */
    .shelf:has(.bookPurple, .bookYellow) {
     outline: dashed 2px deeppink;
    }

    /* AND */
    .shelf:has(.bookPurple):has(.bookYellow) {
     outline: dashed 2px deeppink;
    }

    In this example, I want to show an additional visual clue if the page has an alert.

    .main:has(.alert) .header {
     box-shadow:
       inset 0 2px 0 0 red,
       0 3px 10px 0 rgba(#000, 0.1);
     background-color: #fff4f4;
    }

    Et plein d’autres trucs comme “Quantity queries with CSS :has” , “We can select an element if it’s followed by another.”, “For example, if the user selects “other”, we want to show input to let them fill in more info.” qui pourrait être utile à saisies de #SPIP et son afficher_si, etc.

    • Alors j’aime beucoup :has. Mais j’y vais tout de même mollo : on se retrouve rapidement avec des CSS avec une structure imbitable. Surtout si en plus on utilise des CSS imbriqués (puisque la logique du :has contredit la stricte lecture descendante des CSS imbriqués).

    • Pour l’aspect rapidement illisible, ça vient aussi du fait qu’on utilise :has pour faire des choses qu’on ne peut pas faire autrement. Et par exemple sur un truc que je fais en ce moment, je me retrouve à faire des choses comme ceci :

      #timeline:not(:has(li:nth-child(6))) li:nth-child(1)::before { … }

      Si c’était pour un site Web, dont on sait qu’il faudra le maintenir et le faire évoluer, je pense que j’éviterais. Et même dans ce cas, sur l’ensemble de ce développement, je n’ai que deux utilisations un peu lourdingues de :has, j’essaie de rester plus simple.