Trennen Sie :focus-within nicht durch Kommas, wenn Sie tiefen Browser-Support benötigen

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Ich mag :focus-within wirklich. Es ist ein super nützlicher Selektor, der es Ihnen ermöglicht, im Wesentlichen ein Elternelement auszuwählen, wenn eines seiner Kinder fokussiert ist.

Nehmen wir an, Sie möchten zusätzliche Inhalte anzeigen, wenn ein <div> mit der Maus überfahren wird...

div:hover .extra-stuff {
  /* reveal it */
}

Das ist nicht besonders tastaturfreundlich. Aber wenn etwas in .extra-stuff sowieso tabulatorfähig ist (was bedeutet, dass es fokussiert werden kann), dann könnten Sie es so schreiben, um es etwas zugänglicher zu machen

div:hover .extra-stuff,
div:focus-within .extra-stuff {
  /* reveal it */
}

Das ist schön, aber es verursacht ein kniffliges Problem.

Browser ignorieren ganze Selektoren, wenn sie keinen Teil davon verstehen. Wenn Sie also mit einem Browser zu tun haben, der :focus-within nicht unterstützt, würde er das obige CSS-Beispiel ignorieren, was bedeutet, dass Sie *auch* den :hover-Status verloren haben.

Stattdessen

div:hover .extra-stuff {
  /* reveal it */
}
div:focus-within .extra-stuff {
  /* reveal it */
}

Das ist sicherer. Aber es ist repetitiv. Wenn Sie einen Präprozessor wie Sass haben...

@mixin reveal {
  .extra-stuff {
     transform: translateY(0);
  }
}
div:hover {
  @include reveal;
}
div:focus-within {
  @include reveal;
}

Siehe den Pen
Mixin für :focus-within ohne Kommas
von Chris Coyier (@chriscoyier)
auf CodePen.

Ich würde sagen, das ist ein ziemlich guter Anwendungsfall für native CSS-Mixins.