:has() – studia przypadków

Swetha Gopalakrishnan
Swetha Gopalakrishnan
Saurabh Rajpal
Saurabh Rajpal

CSS często nie ma możliwości bezpośredniego wyboru elementu nadrzędnego na podstawie jego dzieci. Deweloperzy od wielu lat prosili o to. Selektor :has(), który jest obecnie obsługiwany przez wszystkie popularne przeglądarki, rozwiązuje ten problem. Przed :has(), często tworzy się łańcuchy długich selektorów lub dodaje klasy do hakowania stylizacji. Teraz możesz określić styl na podstawie relacji elementu z jego elementami podrzędnymi. Więcej informacji o selektorze :has() w Objęte CSS w 2023 r. oraz 5 fragmentów kodu CSS, które powinien znać każdy programista frontendu.

Chociaż ten selektor wydaje się mały, może zapewnić wiele zastosowań. W tym artykule omawiamy wybrane przypadki użycia dla firm e-commerce, które wykorzystują Selektor :has().

:has() jest częścią nowego modelu bazowego, który jest obecnie dostępny.

Obsługa przeglądarek

  • Chrome: 105.
  • Edge: 105.
  • Firefox: 121.
  • Safari: 15.4

Źródło

Obejrzyj całą serię, do której należy ten artykuł, z którego dowiesz się, jak firmy e-commerce ulepszyły swoje witryny za pomocą nowych funkcji CSS i UI.

Policybazaar

Dzięki selektorowi :has() udało nam się wyeliminować weryfikację opartą na języku JavaScript użytkownika i zastąpić ją skutecznym rozwiązaniem CSS z praktycznym doświadczeniem.Aman Soni, kierownik ds. technicznych, Policybazaar

Zespół ds. inwestycji firmy Policybazaar sprytnie zastosował selektor :has(), aby czytelny wskaźnik dla użytkowników, którzy porównują abonamenty. Następujący obraz pokazuje 2 typy abonamentów w interfejsie porównania (żółty i niebieski). Każdy abonament można porównywać tylko z jego własnym typem. Za pomocą funkcji :has(), gdy użytkownik wybierze jedną z opcji typ abonamentu, którego nie można wybrać.

Implementowanie elementu :has() w celu określenia stylu elementu nadrzędnego i jego elementów podrzędnych w celu utworzenia dzięki funkcji wyboru treści powiązanych z kategorią.

Kod

:has() umożliwia dostęp do elementów nadrzędnych i ich elementów podrzędnych. ten kod sprawdza, czy kontener nadrzędny ma ustawioną klasę .disabled-group. Jeśli tak, karta będzie wyszarzona, a przycisk „Dodaj” jest zablokowany od w reakcji na kliknięcia przez ustawienie opcji pointer-events na none.

.plan-group-container:has(.disabled-group) {
  opacity: 0.5;
  filter: grayscale(100%);
}

.plan-group-container:has(.disabled-section) .button {
  pointer-events: none;
  border-color: #B5B5B5;
  color: var(--text-primary-38-color);
  background: var(--input-border-color);
}

Zespół Health Policybazaar wdrożył wdrożenie w nieco innym przypadku. Mają wbudowany quiz dla użytkownika, :has(), aby sprawdzić stan pola wyboru pytania i dowiedzieć się, czy zostało ono odpowiedział(a). Jeśli tak, zostanie zastosowana animacja w celu przejścia do następnego pytania.

health.policybazaar.com/
.

Kod

W przykładowym porównaniu abonamentów użyto typu :has() do sprawdzenia obecności zajęcia. Możesz też sprawdzić stan elementu wejściowego, np. pola wyboru, za pomocą polecenia :has(input:checked) Na obrazku przedstawiającym quiz każde pytanie w fioletowy baner to pole wyboru. Policybazaar sprawdza, czy pytanie zostało odpowiedział za pomocą funkcji :has(input:checked), a jeśli tak, uruchom animację przy użyciu funkcji animation: quesSlideOut 0.3s 0.3s linear forwards, aby przejść do następnego elementu pytanie. Więcej informacji na ten temat znajdziesz w kodzie poniżej.

.segment_banner__wrap__questions {
 position: relative;
 animation: quesSlideIn 0.3s linear forwards;
}

.segment_banner__wrap__questions:has(input:checked) {
 animation: quesSlideOut 0.3s 0.3s linear forwards;
}


@keyframes quesSlideIn {
 from {
   transform: translateX(50px);
   opacity: 0;
 }
 to {
   transform: translateX(0px);
   opacity: 1;
 }
}

@keyframes quesSlideOut {
 from {
   transform: translateX(0px);
   opacity: 1;
 }
 to {
   transform: translateX(-50px);
   opacity: 0;
 }
}

Tokopedia

Tokopedia użyła atrybutu :has() do utworzenia obrazu nad powierzchnią, jeśli miniatura produktu zawiera film. Jeśli miniatura produktu zawiera klasę .playIcon, plik CSS nakładka została dodana. W tym przypadku selektor :has() jest używany razem z funkcją & zagnieżdżania selektora w nadrzędnej klasie .thumbnailWrapper, która ma zastosowanie do wszystkich miniatur. Dzięki temu kod CSS jest bardziej modułowy i bardziej czytelny.

Zrzut ekranu strony Tokopedia przed i po użyciu selektora „zawiera”.
Przed i po użyciu :has().

Kod

W poniższym kodzie użyto funkcji Selektory i kombinatory arkusza CSS (& i >) i zagnieżdżenie z ustawieniem :has(), aby określić styl miniatury. Nieobsługujące przeglądarek, jako kreacji zastępczej używana jest zwykła reguła dodatkowych klas CSS. Reguła @supports selector(:has(*)) służy też do sprawdzania obsługi przeglądarek. Dlatego ogólny interfejs jest taki sam we wszystkich wersjach przeglądarek.

export const thumbnailWrapper = css`
  padding: 0;
  margin-right: 7px;
  border: none;
  outline: none;
  background: transparent;

  > div {
    width: 64px;
    height: 64px;
    overflow: hidden;
    cursor: pointer;
    border-color: ;
    position: relative;
    border: 2px solid ${NN0};
    border-radius: 8px;
    transition: border-color 0.25s;

    &.active {
      border-color: ${GN500};
    }

    @supports selector(:has(*)) {
      &:has(.playIcon) {
        &::after {
          content: '';
          display: block;
          background: rgba(0, 0, 0, 0.2);
          position: absolute;
          top: 0;
          left: 0;
          right: 0;
          bottom: 0;
        }
      }
    }

    & > .playIcon {
      position: absolute;
      top: 25%;
      left: 25%;
      width: 50%;
      height: 50%;
      text-align: center;
      z-index: 1;
    }
  }
`;

Co warto wziąć pod uwagę podczas korzystania z :has()

Aby utworzyć bardziej złożony warunek, połącz pole :has() z innymi selektorami. Sprawdź znajdziesz kilka przykładów w has() w selektorze rodziny.

Zasoby:

Przeczytaj inne artykuły z tej serii o tym, jak e-commerce firm, które skorzystały z nowych funkcji CSS i UI, takich jak przewijanie animacje, przejścia widoków, okienka wyskakujące i zapytania dotyczące kontenerów.