ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
SafariとWebKitの最新情報
SafariとWebKitの最新機能をはじめ、Webサイトを向上させ、強化する方法をご覧ください。HTML、CSSの向上、Webインスペクタツール、Web APIなどの最新情報を紹介します。
リソース
- Learn more about bug reporting
- MDN Web Docs - Web Extensions API
- Safari Release Notes
- Safari Technology Preview
- WebKit Open Source Project
関連ビデオ
WWDC23
WWDC22
-
ダウンロード
♪メロウな ヒップホップ音楽♪ ♪ こんにちは Safariチームの ソフトウェアエンジニアの Kendall Bagleyです 前回のWWDCから 1年が経ちました 今日は 今年のWWDCでの 新機能と この1年を通して 見てきたことの両面から SafariとWebKitの素晴らしい 機能と強化について お話しします 今年はとても 忙しい年でした! 昨年の秋以来 Safariの各リリースは Webデベロッパの みなさんが求める 新しい機能を 提供してきました 今年提供された 新しい機能拡張は みなさんから寄せられた 最大のフィードバックへの 対応が目的です :has() Pseudo Classによる 親セクレタや 新しいFlexbox Inspector コンテナクエリの追加です 私たちはWeb用の最高の ソフトウェアを作りながら みなさんの仕事を より良く 簡単にしたいと 願っています ここにあるのは 今日紹介する 新コンテンツの一例です この動画では カバーしきれません この1年でリリースした 7つのSafariでは 162の新しいWeb プラットフォーム機能と 改良が施されています Webサイトや Web Appを作るため 多数の新ツールを 提供してきました macOSでは SafariとWebKitの 最新かつ最高のツールを 試すだけでなく 次に何を出すべきかを 教えてくれる Safari Technology Previewが いち早く新機能を試す 最適な方法です ご覧の通り 新機能が目白押しなので これから紹介する内容を すべて見ていきましょう 今日お話しするのは HTMLの新機能 コード構築に 役立つ CSSの強化 新しいWebインスペクタツール 幅広い新しいWeb API 優れたJavaScriptと WebAssemblyの優れた機能 セキュリティやプライバシー の向上についてです 早速 HTMLの新機能を 私と同僚が使うために 作成している Webページを通して 見てみましょう 私は 自分の衣服を より持続可能なものに するために 古着や洋服を 再利用するのが とても好きです 私がデザインしたサイトには 「Request Item」ボタンが あり 気に入った洋服が 見つかったら フォームを表示できます そのフォームを ページ全体の上に オーバーレイ表示 させたいのです 新しいdialog要素は オーバレイを安定して 作成する簡単な方法と リクエストフォームに使える アクセス可能な方法を 提供します また CSSの新しい backdrop擬似要素により モーダルのバックグラウンドにある 背景の スタイル設定が 可能になりました アイテムを要求して ダイアログを表示しましょう この影とアニメーションを 見てください 素晴らしい出来栄えです サイト上でアイテムが リクエストされたら 投稿者がリクエストを 受け付けられるように する必要があります ページ下部には 受信した すべてのリクエストが めくれるカルーセルが あります しかし 最前面にない 項目のボタンや テキストフィールドを クリックやキーボードで 誤って 操作されるのは困ります inert属性で解決できます inert属性を JavaScriptと同時に 適用することで 現在選択されている スライド以外にある 要素のインタラクションを 無効にして スライドを切り替えています また inertを使用すると 補助技術のための インタラクションが 無効になり スクリーンリーダーが それらを読めなくなるので インタラクションを意図する 要素について 明確なガイダンスが 与えられます 最後に HTMLには画像の 遅延読み込みがあります 私のサイトでは ヘッダーにすぐに 読み込む必要がある アイコンがありますが 最初の読み込みで 画面外に出る画像は 遅延読み込みを利用して ユーザーが スクロールしたときのみ 画像を読み込み ページの高速化と 応答性の向上を図っています このサイトを とても気に入っていますし 補助技術を 使う人にとっても 素晴らしいものになります HTMLの機能だけでなく 今年は CSSについても 注目すべき点が たくさんあります CSSでは より強力な アーキテクチャにより CSSの再利用を 容易にすることに 重点を置いています 新しいWeb技術に対する 要望のトップが コンテナクエリです そして このコンテナクエリの Safari 16でのリリースを 発表できることに わくわくしています サイズクエリと コンテナクエリ ユニットの両方が 使えるようになります ここでは洋服交換の Webサイトの レイアウトを変えて 実験しています 服を紹介するカードを 再利用可能な要素にして その要素を ページレイアウトの 何カ所かに 落とし込んでいます このサイドバーでは 利用できるスペースが 狭いので コンポーネント内の すべてのコンテンツを 縦に重ねたいのです メイングリッドの アイテムでは 最初の1つを ヒーロー画像として 特集し 水平方向の 空きスペースを ワイドレイアウトで より意味のある方法で コンテンツを 配置したいのです メインコンテンツ エリアの残りの項目は 小さなカラムに 分割します 水平方向に中程度の スペースがあるときに 有効な別のレイアウトを 作成しました メディアクエリではなく コンテナクエリで レイアウト変更を 処理することで このコンポーネントの レイアウトコードを 一度書けば サイト上の どの場所や どのサイズのコンテナも そのコンポーネントが 使用でき 常に正しい レイアウトを適用します コンテナにどの要素を使い インラインサイズのみ 対策するか インラインサイズと ブロックサイズの 両方を同時に対策するかは container-typeプロパティで 指定しました コンテナには container-nameプロパティで 任意に名前が付けられるので HTMLの構成に 柔軟性が生まれます @containerルールで コンテナのサイズに基づき 条件付きでスタイルを 適用しています 幅が250ピクセル以上の コンテナに 衣類カード コンポーネントがある場合 グリッドが2列になるよう 変更されます CSSアーキテクチャの次は カスケードレイヤーです CSSカスケードへの 強力な変更です CSSの誕生以来 カスケードは さまざまなレイヤーで 構成されてきました しかし 各レイヤー内の セレクタに どんな特異性があっても あなたが Web開発者として 書くオーサースタイルが 常にUAスタイルに勝ります インラインスタイルは 常にオーサースタイルより 強力で 他の階層も同様です カスケードレイヤーは これと同じコンセプトで 各レイヤーの内部で 独自に特異性を計算する 独自のレイヤーの 作成が可能です 使用されるセレクタの 特異性がどうであれ あるレイヤー全体が 別のレイヤー全体に勝ります どのレイヤーが他のレイヤーに 対して 力を持つかは CSSでレイヤーを定義する 順番で決まります カスケードレイヤーは 大規模なプロジェクトで CSSを設計し そのコードを長期間 維持する際に 便利なツールになります デザインシステムの オーバーライドからの 分離や プロジェクトの カスタムスタイルに使う フレームワークの分離に 使用するでしょう すべてあなた次第です! CSSアーキテクチャのための 新機能には 念願の親セレクタとして 機能する 擬似クラス :has()や 他にも多くの機能が 追加されました CSSの他のセレクタと 組み合わせると きょうだいや属性 フォームフィールドの 状態などを検索できます 実にパワフルです 誰かがメッセージの 「Urgent?」に チェックを入れたときに メッセージボックス 全体を ハイライト表示 するようにしたいとします ここで:has疑似クラスを使い フォーム要素に チェックボックスタイプの 入力があり チェック時はこのCSSを 適用するよう指示できます しかも JavaScriptは 使う必要がありません has() カスケードレイヤー コンテナクエリなど CSSアーキテクチャの 扱いに関する改善により Web開発者としての あなたの仕事がより 良いものになることを 願っています 楽しみなCSSの追加機能は これだけではありません 既存のビューポート ユニットに似ており スクロールによって サイズ変化するような デバイスで便利に使える ツールを求めてきましたね そこで 新しいビューポート ユニットを用意しました ビューポートの 最小のときの高さが 知りたいときは svhを使います ビューポートの 最大の高さを 知りたいときは lvhを使用します Sはスモール Lは ラージと覚えてください ビューポートの現在の 高さに一致するよう 常に変化する数値には dvhを使用します 高さだけではありません さらにビューポート ユニットを用意しました 幅の単位は よく使用する高さの単位と 合わせて 完成度を高められます ブロックとインラインがあり どちらも テキストの流れ方が異なる 複数の言語向けに 書く場合に便利です minとmaxも 忘れてはいません しかし 反応するだけでなく ページ上に 動きを作り出したい場合は どうでしょう? これまでアニメーションは 開始 終了 継続時間を 指定してオブジェクトを動かす 宣言的なものでした しかし ページ上の 要素を アニメーション化する際に カーブしたパスに沿わせたり オフセットで移動させたり するのは大変でした ここで ヘッダーを クリックすると シークレット アニメーションが 表示されるようにしたいです 新しいoffset-pathを使えば オブジェクトを アニメーションさせたい パスを定義できます offset-pathでパスを設定し offset-distanceで キーフレームエフェクトを 使います animationプロパティで キーフレーム効果を 適用すれば アニメーションの制御を すべてCSSで行えます 従来はブラウザエンジンに 定義された Web上の要素も より自由に ページをコントロール できるようにしたく スクロールの挙動は その最初の一例です Webの開始以来 Webページの別の場所に 移動するリンクを クリックすると 視覚的に ジャンプしたように 表示されます これには ユーザーも 戸惑うことがあります CSSのscroll-behavior プロパティでは この動作をするかどうか 指定できます デフォルトのauto設定では ジャンプ表示になります scroll-behaviorに smoothを指定すると ページの次の場所まで スムーズに スクロールするよう ブラウザに要求できます JavaScriptのメソッドの window.scroll() scrollTo() scrollBy()を 使っても可能です ユーザーのことを一番 よく知るのはあなたたので ブラウザエンジンの デフォルト以外の 独自のWebページ体験を 定義できるようにすべきです そこには :focus-visibleや accent-colorの使用も 含まれます フォーカスインジケータに 特定のスタイルを適用して 全体のデザインに 調和させたいと 思ったことがあれば フォーカスセレクターの ことはご存知でしょう しかし 実行するとブラウザベースの ヒューリスティックが 失われる アクセシビリティ 上の落とし穴があります また 私のサイトでは ビルトインのフォームカラーでなく カスタムカラーを 使いたいのです フォーカスのハイライトと チェックボックスに ヘッダーのティールカラーを 使ってみましょう focus-visible疑似クラスを 使うと フォーカスインジケータを 自由にスタイルでき そのインジケータを ブラウザにネイティブ表示 される場合にのみ 表示させることもできます フォームのカスタマイズを さらに進めるため accent-colorで フォームコントロールの UIの異なる部分の色を 変更できます チェックボックスだけでなく ラジオボタンなどにも 適用できます また CSSについても WebKitの接頭辞を どんどん置き換えています 以前は 実験的な機能を 試す方法でしたが 現在は 標準的に定義された プロパティに移行することで CSSが 書きやすく 相互運用性の 高いものになりました Web標準に対応するものに 移行しても WebKitの接頭辞を持つ 既存のCSSは 引き続き動作します Backface-visibility print-color-adjust text-align: match-parentは 接頭辞付きが 対応するものと 全く同じです maskと text-combine-uprightは 標準に合うように 更新されました nonprefixed appearance プロパティも 新しいauto値のサポートを 追加しましたが 標準仕様になったため Safari 16では caretやlistitemなど WebKit特有の値を 削除しています タイポグラフィの 追加についても 注目する点が多数あります カラーフォントの中の カラーパレットを 簡単に選択できる font-paletteプロパティを 追加しました ロゴの候補で試したら とてもクールだと思います 内蔵のダークパレットや ライトパレットで 見え方を試したり カラーオーバーライドで カスタマイズして 黄色で明るくする こともできます また タイポグラフィでは text-decoration-skip-inkの 追加により 下線や上線が 文字と交差するときの 動作を制御できます さらにicユニットが 日中韓の文字を ブロック方向に 正確に並ぶようにしました 中国語 日本語 韓国語などでの きれいなタイポグラフィ グリッドの作成に便利です CSSの素晴らしい機能の まとめとして サブグリッドについて お話しします 長年 Webでのレイアウトは とても大変でした CSS Gridは画期的ですが グリッドコンテナの直接の 子要素にしか影響しません CSS Gridを使ってこれらの カードをレイアウトし メディアクエリなしで 列の追加や削除を行い ビューポートの 幅に合わせて 自動的にレイアウトを 調整します しかし 各カードのコンテンツの サイズがバラバラで 見出しが長かったり 写真の縦横比が 異なったりして 見づらくなっています リクエストボタンや メッセージボックスは 横一列に並べたいですし 1枚のカードのタイトルが 長いと 他のカードの レイアウトに影響するので 全部同じ間隔になるように したいのです サブグリッドで 実現します 各記事に グリッドを置いて "grid-template-rows: subgrid "と書いて すべて親グリッドに 結びつけました Webインスペクタの Grid Inspectorで 必要なグリッドを すべてオンにすると 各カードのコンテンツが 完璧に整列します Webインスペクタで 多くの CSS作業が楽になります Webインスペクタに 素晴らしい機能を 追加したので ぜひお試しください まず レイアウトは 何が起こっているのかが わかると書きやすく Webインスペクタの 重要性がわかります さらに 新しい Flexbox Inspectorで 要素間の間隔を 視覚化できます 私のWebサイトでは ヘッダーへの これらのアイコンの 追加に苦労しました 必要なのは 要素の検査と Layoutタブへの 移動です 今はグリッドに 関心がないので そのセクションを閉じて 新しい Flexbox Inspectorに 移動します ワンクリックですべての ビューをオンにしつつ スムーズな動作が 得られます すべてのビューを オンにすると ハッシュマークや コンテナボックスでの 要素の配置の様子や 空いたスペースの ビューの 占め方がわかります 今度はアライメントが 正しいかどうか 新しいアライメント エディターで確認します スタイルタブを開くと align-itemsの横に 新しいボタンがあります オプションを切り替えて ヘッダーに 最適なものが 見つけられます justify-contentでも 同様です ひとつひとつ 見ていきながら ちょうどよいものを 選びます 黄色のアイコンが 小さすぎるので 赤のアイコンと 同じ大きさにします 名前に"medium"と 入っている 変数を使ったはずですが フルネームが 思い出せません 黄色いアイコンの一つを インスペクタで調べて 高さを編集すると サイズ変更が試せます また 新しいCSS ファジーオート コンプリートのおかげで 名前の最後であっても ”medium”と入力すると 目的の変数が ポップアップで表示されます 黄色いアイコンは もう 小さすぎることはありません アイコンの変数が 検査対象の要素で 使われていない場合は 新しいCSSツールで 隠されます 必要なときにボタンで 表示できるので ご安心ください 今年のWebインスペクタで 最も喜ばしいのは Safari Webインスペクタの 開発者用ツール拡張の サポートを発表することです お気に入りの開発者用ツール 拡張機能のクリエイターは 他のブラウザで 使用中のものと 同じ基本APIで それらを Safariに移植できます Webインスペクタの 拡張機能の作り方や 新しいAPIの探索 自分で使用開始する ためのセットアップに 興味がある方は 「SafariWebInspector Extensionsの作成」を ご覧ください ここまで フロントエンド技術の 新情報を たくさん紹介してきました 次は Web APIの新情報に 移りましょう Webプッシュのサポートを 発表できて嬉しいです macOS VenturaのSafari 16で 利用可能になる予定です 来年にはiOSとiPadOSに 搭載する予定です Webプッシュは Webサイトや Web Appから ユーザーに 遠隔で通知が送れます 完全に相互運用可能な 標準に基づいた実装です すでに Webプッシュを実装済みで 他のブラウザで 動作している場合は 変更無しで Safariで そのまま動作するはずです Apple Developer アカウントも不要です 詳細はWWDC22の 「Safari用の Webプッシュについて」を ご覧ください Webプッシュに 興味のある方は 新しいWeb Appの マニフェストの 改善にも 関心があることでしょう Web Appをホーム画面に 保存する際に使用する アイコンをマニフェスト ファイルに定義できるようになりました マニフェスト内のアイコンを 優先するには HTMLヘッドに apple-touch-iconが 定義されていないことを 確認します iOSとiPadOSには あるアイコンを配信し 他のモバイル プラットフォームには別の アイコンを配信したい場合も そのHTMLヘッドの apple-touch-iconで Apple用 アイコンを定義します どこにもアイコンを 宣言しない場合は サイトをホーム画面に 保存すると サイトのスクリーンショット を表示します さらに ユーザーが 共有メニューから 「ホーム画面に追加」を 選択するのを待たずに マニフェストファイルを 読み込むようになりました そのマニフェストファイルを 使うことで 全サイトで Webページの特性を定義し メタタグを使用する 必要性がさらに減ったのです APIに引き続き 同じオリジンで 複数の ブラウジングコンテキストで Webページの利用を 改善するために工夫しました ブロードキャスト チャネルは 異なる ブラウジングコンテキスト 間で 通知が送信できます 例えば 洋服交換のサイトの 利用中に 同時に 2つのウインドウで 開いているとします それから あるウインドウの 服を選択します その場合 メッセージを投稿して 利用できない状態を ほかのタブや ウインドウに同期することが可能です バックグラウンドで タブを更新するのでなく サイト用に保存した ファイルを 更新しているかも しれないので File System Access APIを 追加しました このAPIは今年 複数のリリースで 段階的に更新されました まず originをベースにした プライベートストレージの origin private file systemがあります これにより 私の洋服交換サイトでは apple.comのような 他のサイトが そのファイルを読むことは できません そこで FileSystemFile Handleの getFile() メソッドで サイトのルート ディレクトリから取得した 既存のファイルを読み込む APIを追加しました ここでは作成したばかりの ドラフトファイルを 使っています 今年追加された APIの中で 最も色彩豊かなものを ご紹介します Display P3色空間は RGBにはない色を 表現することができます カラーピッカーの例を ご紹介します 白の四角い線の左側は RGBに存在する色です 右側には P3にしかない 色が並んでいます 2016年には 動画と写真の P3対応を行いました 昨年は CSS Color Level 4で 定義した 新しいカラー シンタックスを実装した 最初のブラウザエンジンと なりました 今年は canvas要素内の コンテンツの P3カラーに対応しました よって 90年代のデバイスを ベースにした色を 使う必要はなく 今日の素晴らしいデバイスの 色彩能力が フル活用できます 新しいWeb API には さらに注目する点があります シャドウ領域 Webロック ResizeObserver APIの ResizeObserverSize インターフェースへの 更新サポートなど 要素のボックスサイズ プロパティに対する 変更の監視に役立ちます 新しいAPIの追加や 新機能を含めて 試したいことが たくさんありますね 実は まだまだ お話しすることがあります 次は JavaScriptと WebAssemblyの 新機能をご紹介します Webサイトでワーカーを 使っていて そのインスタンスをタブや ウインドウで共有する場合 新しい共有ワーカー インターフェースが役立ち メモリ使用量を 削減できるでしょう バックグラウンドで 発生させたいタスクごとに 新しいワーカーを生成する 代わりに 同じオリジンの ブラウジングコンテキストは 1つのワーカーだけ使います 各スクリプトは同じ 方法で 共有ワーカーを 作成し 同じポートを使って メッセージの受信と 投稿ができます 共有ワーカーは 異なるスクリプトから 送信されたメッセージを 受信して 応答ができます これで サーバーへの 負担が軽減するとともに ユーザーにとって 高速で 応答性の高い Webページを実現します アレイ機能も 一通りご紹介します 配列の末尾から検索する 場合 reverse()を使った 配列の変更が必要 でしたが findLast()と findLastIndex() メソッドを使えば 「shoestring」を含む 最後の項目の アイテムとインデックス が検索できます また 新しい at()メソッドにより 配列の末尾からの検索が 容易になりました 中括弧の使用は インデックスが正の値の 場合に有効ですが at()を使えば 負の値のインデックスを 作成できるため コードがより簡潔で 読みやすくなります これだけ 配列の新機能があっても 私たちがお届けする 国際化の新機能の 数の多さには敵いません WebKitはこの1年間 Intlの実装に 定期的なアップデートを 加え続けてきました NumberFormatの新メソッドが 異なる番号体系を サポートし LocaleとDisplayNamesの 更新により カレンダーが Intl Enumeration APIにより 通貨が追加されています 今年は 国際的な実装が多く 世界中のユーザーに 対応するための試行錯誤に 事欠かないでしょう また C Objective C Swiftなど さまざまな コーディング言語で書かれた 既存のコードを Webで利用する場合 WebAssemblyを使えば 書き直さずに実行できます また 今年の改良で アドレス可能なメモリが 4GBに拡張され 新しいゼロコスト例外処理に ともなうパフォーマンスの 向上により WebAssemblyを 使用するWeb Appは より強力になります 概して JavaScriptと WebAssemblyを試すのに わくわくする材料は 間違いなく揃っています WebAssemblyに関しては セキュリティと プライバシーの強化もあり 私たちが開発する Webの ユーザーを守るだけでなく 開発者にも 新しい可能性を もたらすでしょう 新しいCross Origin Opener Policyと Cross Origin Embedder Policyの HTTPレスポンスヘッダーを 使うと プロセスの分離が選択でき サイトが 独自の専用のwebContent プロセスで実行されます 多くのAppにとって WebAssemblyのスレッド機能を 使って 複数のスレッドで 並行して動作できた方がよく 新しいヘッダーで それを安全に実行できます 2つ目のセキュリティ強化は コンテンツセキュリティ ポリシーレベル3への対応で HTTPヘッダにも対応します CSPは 読み込みコンテンツの セキュリティ管理を強化し クロスサイト スクリプティングや その他の脆弱性のリスクを 軽減します レベル3のアップデートで 最も素晴らしいのは 新しいストリクト ダイナミックソース表現です strict-dynamicの設計者は ノンスで特定のスクリプトを 許可して すでに 信頼されているスクリプトが ロードするスクリプトに その信頼を拡張できることに 気づきました 明示的な 許可リストは不要です ヘッダーがシンプルに なりますね 元の長いドメインのリストだと 多くを許可してしまう 可能性がありますね セキュリティと プライバシーに関する機能は これで終わりです 今日取り上げる話題も 以上ですが さらに 探索してみてくださいね 例えば メディア関連の アップデートである getUserDisplay() APIによる 特定のSafariウインドウの キャプチャやWebRTC Perfect Negotiation In-band chapter tracks requestVideoFrame Callback()などを行いました また マニフェスト バージョン3のサポートと ともに Webを拡張する 多くの追加機能や 新しいWeb拡張機能のAPIも 多数あります 今日取り上げた機能を さらに掘り下げ 過去1年間に SafariとWebKitで開発された 162のすべての機能と 改善点を調べるには Safari Technology Preview をダウンロードして 今後の動向を把握し リリースノート ブログ記事 Webインスペクタの 広範なドキュメントを含む webkit.orgの すべての コンテンツをチェックして Web技術を探求してください また バグレポートを提出して 意見や要望を 聞かせてください WebKitのバグを HTML CSS JavaScript DOM API または Webインスペクタに関して 発見したら WebKitの バグ追跡システム bugs.webkit.orgで フィードバックをください Safariのインターフェースに 関する意見やバグは Appleの フィードバックアシスタント にご報告ください 来年リリース予定の SafariとSafari Technology Previewでは あなたのような 開発者の 仕事をより良くする 素晴らしい機能を 提供できるのが楽しみです 本日は ありがとうございました WWDCで最高の時間を お過ごしください それではまた! ♪
-
-
2:59 - Dialog element
<!-- <dialog> element --> <dialog method="dialog"> <form id="dialogForm"> <label for="givenName">Given name:</label> <input class="focus" type="text" name="givenName"> <label for="familyName">Family name:</label> <input class="focus" type="text" name="familyName"> <label> <input type="checkbox"> Can trade in person </label> <button>Send</button> </form> </dialog>
-
3:09 - Backdrop pseudo-class
/* ::backdrop pseudo-element */ dialog::backdrop { background: linear-gradient(rgba(233, 182, 76, 0.7), rgba(103, 12, 0, 0.6)); animation: fade-in 0.5s; } @keyframes fade-in { from { opacity: 0; } to { opacity: 1; } }
-
3:53 - inert attribute
// inert attribute function switchToIndex(index) { this.items.forEach(item => item.inert = true); this.items[index].inert = false; this.currentIndex = index; }
-
4:22 - Lazy image loading
<img src="images/shirt.jpg" loading="lazy" alt="a brown polo shirt" width="500" height="600">
-
6:46 - Container Queries
/* Container queries */ .container { container-type: inline-size; container-name: clothing-card; } .content { display: grid; grid-template-rows: 1fr; gap: 1rem; } @container clothing-card (width > 250px) { .content { grid-template-columns: 1fr 1fr; } /* additional layout code */ }
-
8:05 - Cascade layers
/* Author Styles - Layer A */ @layer utilities { div { background-color: red; } } /* Author Styles - Layer B */ @layer customizations { div { background-color: teal; } } /* Author Styles - Layer C */ @layer userDefaults { div { background-color: yellow; } }
-
8:54 - :has() pseudo-class
<!-- :has() pseudo-class --> <style> form:has(input[type="checkbox"]:checked) { background: #ff927a; } </style> <form class="message"> <textarea rows="5" cols="60" name="text" placeholder="Enter text"></textarea> <div class="checkbox"> <input type="checkbox" value="urgent"> <label>Urgent?</label> </div> <button>Send Message</button> </form>
-
11:08 - Offset Path
/* offset-path */ :is(.blue, .teal, .yellow, .red) { offset-path: circle(9vw at 5vw 50%); } @keyframes move { 100% { offset-distance: 100%; } } /* Animation */ .clothing-header.clicked :is(.blue, .teal, .red, .yellow) { animation: move 1100ms ease-in-out; }
-
11:43 - scroll-behavior: auto
html { scroll-behavior: auto; }
-
12:09 - scroll-behavior: smooth
html { scroll-behavior: smooth; }
-
13:10 - :focus-visible & accent-color
/* :focus-visible & accent-color */ :focus-visible { outline: 4px solid var(--green); box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.3); } :root { accent-color: var(--green); }
-
14:50 - Font palette dark mode & light mode
/* Dark mode */ font-palette: dark; /* Light mode */ font-palette: light;
-
15:01 - Font palette custom colors
/* Dark mode */ font-palette: dark; /* Light mode */ font-palette: light; /* Custom colors */ @font-palette-values --MyPalette { override-colors: 1 yellow; } #logo { font-palette: --MyPalette; }
-
15:55 - CSS Grid
/* Grid to layout cards */ main { display: grid; grid-template-columns: repeat(auto-fit, minmax(225px, 1fr)); gap: 1rem; } /* Grid to layout each card’s content */ article { display: grid; grid-row: span 5; }
-
16:35 - Adding sub grid
/* Grid to layout cards */ main { display: grid; grid-template-columns: repeat(auto-fit, minmax(225px, 1fr)); gap: 1rem; } /* Grid to layout each card’s content */ article { display: grid; grid-row: span 5; /* Adding subgrid, tying them together */ grid-template-rows: subgrid; }
-
21:15 - Web App Manifest file icons
// Manifest file "icons": [ { "src": "orange-icon.png", "sizes": "120x120", "type": "image/png" } ]
-
21:29 - apple-touch-icon
<!-- HTML head --> <link rel="apple-touch-icon" href="blue-icon.png" />
-
22:36 - Broadcast Channel
// State change broadcastChannel.postMessage("Item is unavailable");
-
23:14 - Origin private file system
// Accessing the origin private file system const root = await navigator.storage.getDirectory(); // Create a file named Draft.txt under root directory const draftHandle = await root.getFileHandle("Draft.txt", { "create": true }); // Access and read an existing file const existingHandle = await root.getFileHandle("Draft.txt"); const existingFile = await existingHandle.getFile();
-
25:32 - Shared Worker
// Create Shared Worker let worker = new SharedWorker("SharedWorker.js"); // Listen for messages from Shared Worker worker.port.addEventListener("message", function(event) { console.log("Message received from worker: " + event); }); // Send messages to Shared Worker worker.port.postMessage("Send message to worker");
-
25:56 - findLast() and findLastIndex()
const list = ["shirt","pants","shoes","hat","shoestring","dress"]; const hasShoeString = (string) => string.includes("shoe"); console.log(list.findLast(hasAppString)); // shoestring console.log(list.findLastIndex(hasAppString)); // 4
-
26:17 - at()
const list = ["shirt","pants","shoes","hat","shoestring","dress"]; // Instead of this: console.log(list[list.length - 2]); // It's as easy as: console.log(list.at(-2));
-
29:12 - strict-dynamic source expression
// strict-dynamic source expression // Without strict-dynamic Content-Security-Policy: script-src desired-script.com dependent-script-1.com dependent-script-2.com dependent-script-3.com; default-src "self"; // With strict-dynamic Content-Security-Policy: default-src "self"; script-src "nonce-desired" "strict-dynamic";
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。