Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Game Changer? :has() の到来 🛸

TK
January 13, 2023

Game Changer? :has() の到来 🛸

1/27日に行われた、WebフロントエンドなんでもLT 会 #7にて発表したスライド。:has() について。

https://ncdc-dev.connpass.com/event/265595/

TK

January 13, 2023
Tweet

More Decks by TK

Other Decks in Technology

Transcript

  1. CSSの指定は横方向、下方向へと進む /* special クラスをもっている <li> 要素へ焦点を当てる時 */ li.special { …

    } /* <article> 要素の内側にある <p> 要素の <span> 要素に焦点を当てるとき */ article p span { ... } /* <h1> 要素の直後に来る <ul> 要素の、そのまた直後に来る <p> 要素に焦点を当てるとき */ h1 + ul + p { ... } Before :has()
  2. https://codepen.io/web-dot-dev/pen/JjLJyWx <ul> <li class="card"> ... </li> <li class="card"> ... </li>

    <li class="card"> ... </li> <li class="card"> ... </li> <li class="card"> ... </li> </ul> /* バナーは Grid の横幅いっぱいの大きさ */ .card:has(.card__banner) { grid-row: 1; grid-column: 1 / -1; } /* 写真ありの時の Grid レイアウトの指定 */ .card:has(.card__media) { grid-template-columns: 1fr 1fr; grid-template-rows: repeat(3, auto); } .card__media { grid-column: 2; grid-row: 1 / -1; }
  3. https://codepen.io/web-dot-dev/pen/ZExyJKx <form action=""> <div class="form-group"> <label for="email" class="form-label"> <span class="sr-only">Email</span>

    </label> <div class="form-group__input"> <input required type="email" id="email" class="form-input" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$" title="Enter valid email address" placeholder="Enter valid email address"/> <div class="form-group__error">Enter a valid email address</div> </div> </div> </form> /* invalid なフォームのカラーを変える */ .form-group:has(:invalid) { --color: var(--invalid); } /* フォーカスが外れているかつ、プレースホールダーが表示さ れていない、エラーメッセージを表示する */ .form-group:has(:invalid:not(:focus):not(:placeholder-shown )) .form-group__error { display: block; }
  4. https://codepen.io/web-dot-dev/pen/abYwyWQ <main> <article> <h1>Some Awesome Article</h1> <p> ... </p> <figure>

    <img alt="" width="200" height="200" src="https://assets.codepen.io/605876/team-awesome.png" /> </figure> <p> ... </p> <figure> <img alt="" width="200" height="200" src="https://assets.codepen.io/605876/team-awesome.png" /> <figcaption>Shot of the CSS, UI, and DevTools Chrome Dev</figcaption> </figure> <p> ... </p> </article> </main> figure:not(:has(figcaption)) { float: left; margin: 2rem 2rem 2rem 0; }
  5. https://codepen.io/web-dot-dev/pen/YzaQxQK const NAV_CONTROL = document.querySelector('.nav-control') const CONTROL_NAV = () =>

    { NAV_CONTROL.setAttribute('aria-expanded', NAV_CONTROL.matches('[aria-expanded="false"]') ? true : false) NAV_CONTROL.setAttribute('aria-pressed', NAV_CONTROL.matches('[aria-expanded="false"]') ? true : false) } NAV_CONTROL.addEventListener('click', CONTROL_NAV) body { transform: translateX(calc(var(--open) * -200px)); } :root:has([aria-expanded="true"]) { --open: 1; }