<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://web.dev/</id>
  <title>Rachel Andrew on web.dev</title>
  <updated>2026-04-15T23:21:06Z</updated>
  <author>
    <name>Rachel Andrew</name>
  </author>
  <link href="https://web.dev/authors/rachelandrew/feed.xml" rel="self"/>
  <link href="https://web.dev/"/>
  <icon>https://web-dev.imgix.net/image/admin/dUAN2DEXHRT6G6iPrIby.jpg?auto=format</icon>
  <logo>https://web.dev/images/shared/rss-banner.png</logo>
  <subtitle>Technical writer at Google. Content lead for web.dev.</subtitle>
  
  
  <entry>
    <title>New to the web platform in September</title>
    <link href="https://web.dev/web-platform-09-2023/"/>
    <updated>2023-10-02T00:00:00Z</updated>
    <id>https://web.dev/web-platform-09-2023/</id>
    <content type="html" mode="escaped">&lt;h2 id=&quot;stable-browser-releases&quot;&gt;Stable browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-09-2023/#stable-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In September 2023 &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/118&quot; rel=&quot;noopener&quot;&gt;Firefox 118&lt;/a&gt;, &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-17-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 17&lt;/a&gt;, and &lt;a href=&quot;https://developer.chrome.com/blog/new-in-chrome-117/&quot; rel=&quot;noopener&quot;&gt;Chrome 117&lt;/a&gt; became stable. This post takes a look at what that means for the web platform.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-bad-bg color-state-bad-text&quot;&gt;&lt;p class=&quot;cluster color-state-bad-text&quot;&gt;&lt;span class=&quot;aside__icon box-block &quot;&gt;&lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;Error sign&quot;&gt;   &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 15v-2h2v2h-2zm0-10v6h2V7h-2z&quot;&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/span&gt;&lt;strong&gt;Caution&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot; flow&quot;&gt; We include browser compatibility data pulled from MDN in these posts which may not have been updated yet for very recent browser releases. The post will show the correct information as soon as it appears in the &lt;a href=&quot;https://github.com/mdn/browser-compat-data/releases&quot;&gt;browser-compat-data release&lt;/a&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;The &lt;code&gt;subgrid&lt;/code&gt; value for &lt;code&gt;grid-template-columns&lt;/code&gt; and &lt;code&gt;grid-template-rows&lt;/code&gt; is included in Chrome 117, making this longed for feature interoperable. You can learn more about subgrid in the article &lt;a href=&quot;https://web.dev/css-subgrid/&quot;&gt;CSS subgrid&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 114, Behind a flag&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;flag&quot; title=&quot;Behind a flag&quot; aria-label=&quot;Behind a flag&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Firefox 71, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
71
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 114, Behind a flag&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;flag&quot; title=&quot;Behind a flag&quot; aria-label=&quot;Behind a flag&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari 16, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
16
&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Grid_Layout/Subgrid#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Chrome also includes three new CSS features to easily add entry and exit animations, and smoothly animate to and from the top layer dismissible elements such as dialogs and popovers. You can learn about the &lt;code&gt;transition-behavior&lt;/code&gt; property, &lt;code&gt;@starting-style&lt;/code&gt; rule, and &lt;code&gt;overlay&lt;/code&gt; property in the article &lt;a href=&quot;https://developer.chrome.com/blog/entry-exit-animations/&quot; rel=&quot;noopener&quot;&gt;Four new CSS features for entry and exit animations&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Also in Chrome 117 is JavaScript array grouping with the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/groupBy&quot; rel=&quot;noopener&quot;&gt;Object.groupBy&lt;/a&gt; and &lt;a href=&quot;https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Map/groupBy&quot; rel=&quot;noopener&quot;&gt;Map.groupBy&lt;/a&gt; static methods.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Safari 17 includes the &lt;code&gt;popover&lt;/code&gt; attribute, to add support for the &lt;a href=&quot;https://developer.chrome.com/blog/introducing-popover-api/&quot; rel=&quot;noopener&quot;&gt;Popover API&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Safari 17 and Firefox 118 include the HTML &lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTML/Element/search&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;&amp;lt;search&amp;gt;&lt;/code&gt;&lt;/a&gt; element. This element represents the parts of the page or application that contain funtionality for search or filtering content.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/HTML/Element/search#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;There are lots of new CSS features included in Safari 17, including &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@counter-style&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;@counter-style&lt;/code&gt;&lt;/a&gt;. This rule lets you define counter styles that are outside the predefined list of style. This feature is now available in all three engines.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 91, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      91
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 33, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      33
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 91, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      91
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 17, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      17
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/@counter-style#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Firefox 118 includes several additional CSS math functions: &lt;code&gt;abs()&lt;/code&gt;, &lt;code&gt;sign()&lt;/code&gt;, &lt;code&gt;round()&lt;/code&gt;, &lt;code&gt;mod()&lt;/code&gt;, &lt;code&gt;rem()&lt;/code&gt;, &lt;code&gt;pow()&lt;/code&gt;, &lt;code&gt;sqrt()&lt;/code&gt;, &lt;code&gt;hypot()&lt;/code&gt;, &lt;code&gt;log()&lt;/code&gt;, and &lt;code&gt;exp()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Firefox 112, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
112
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari 15.4, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
15.4
&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/exp#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Safari 17 also includes support for HEIC/HEIF images, and JPEG XL.&lt;/p&gt;
&lt;h2 id=&quot;beta-browser-releases&quot;&gt;Beta browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-09-2023/#beta-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beta browser versions give you a preview of things that will be in the next stable version of the browser. It&#39;s a great time to test new features, or removals, that could impact your site before the world gets that release. New betas are &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/119&quot; rel=&quot;noopener&quot;&gt;Firefox 119&lt;/a&gt;, &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-17_1-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 17.1&lt;/a&gt;, and &lt;a href=&quot;https://developer.chrome.com/blog/chrome-118-beta/&quot; rel=&quot;noopener&quot;&gt;Chrome 118&lt;/a&gt;. These releases bring many great features to the platform. Check out the release notes for all of the details, here are just a few highlights.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;&amp;lt;search&amp;gt;&lt;/code&gt; element, shipping in Firefox and Safari this month is included in Chrome 118, meaning this feature is quickly landing across all three engines.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/groupBy&quot; rel=&quot;noopener&quot;&gt;Object.groupBy&lt;/a&gt; and &lt;a href=&quot;https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Map/groupBy&quot; rel=&quot;noopener&quot;&gt;Map.groupBy&lt;/a&gt; static methods are part of Firefox 119.&lt;/p&gt;
&lt;p&gt;Chrome 118 includes &lt;a href=&quot;https://drafts.csswg.org/css-cascade-6/#scoped-styles&quot; rel=&quot;noopener&quot;&gt;CSS scoped styles&lt;/a&gt; with the &lt;code&gt;@scope&lt;/code&gt; rule and new media features with &lt;code&gt;prefers-reduced-transparency&lt;/code&gt; and &lt;code&gt;scripting&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Safari 17.1 is currently a release that fixes a range of issues across the platform.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by &lt;a href=&quot;https://unsplash.com/@charlesdeluvio&quot; rel=&quot;noopener&quot;&gt;Charles Deluvio&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Submit your proposals for Interop 2024</title>
    <link href="https://web.dev/interop-2024-proposals/"/>
    <updated>2023-09-14T00:00:00Z</updated>
    <id>https://web.dev/interop-2024-proposals/</id>
    <content type="html" mode="escaped">&lt;p&gt;Over the past two years the Chrome team has successfully worked with our partners to improve the interoperability of the web. For &lt;a href=&quot;https://web.dev/interop-2022-wrapup/&quot;&gt;Interop 2022&lt;/a&gt; all major browser vendors and other stakeholders worked together to improve top browser compatibility issues identified by web developers. We repeated the process with &lt;a href=&quot;https://web.dev/interop-2023/&quot;&gt;Interop 2023&lt;/a&gt;, which still has a few months to run yet is already seeing a huge improvement in scores. For Interop 2023, we also requested public proposals for features to include, which led to many great suggestions representing the needs of the wider web ecosystem.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;The Scores for Interop overall: 62, Investigations: 0, and the scores per browser - 86 for Chrome and Edge, 74 for Firefox, 86 for Safari Technology Preview.&quot; decoding=&quot;async&quot; height=&quot;866&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;January 2023.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
  &lt;img alt=&quot;The scores for Interop overall: 81, Investigations 59, and per browser, 96 for Chrome Dev and Edge Dev, 88 for Firefox Nightly, and 92 for Safari Technology Preview.&quot; decoding=&quot;async&quot; height=&quot;808&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/25TJc2Fc8gJ4Qp9vQUNA.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/25TJc2Fc8gJ4Qp9vQUNA.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/25TJc2Fc8gJ4Qp9vQUNA.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/25TJc2Fc8gJ4Qp9vQUNA.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/25TJc2Fc8gJ4Qp9vQUNA.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/25TJc2Fc8gJ4Qp9vQUNA.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/25TJc2Fc8gJ4Qp9vQUNA.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/25TJc2Fc8gJ4Qp9vQUNA.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/25TJc2Fc8gJ4Qp9vQUNA.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/25TJc2Fc8gJ4Qp9vQUNA.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/25TJc2Fc8gJ4Qp9vQUNA.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/25TJc2Fc8gJ4Qp9vQUNA.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/25TJc2Fc8gJ4Qp9vQUNA.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/25TJc2Fc8gJ4Qp9vQUNA.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/25TJc2Fc8gJ4Qp9vQUNA.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/25TJc2Fc8gJ4Qp9vQUNA.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/25TJc2Fc8gJ4Qp9vQUNA.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/25TJc2Fc8gJ4Qp9vQUNA.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;September 2023.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;It&#39;s been a huge success, with many features reaching interoperability, and we&#39;re happy to announce that Interop 2024 is happening.&lt;/p&gt;
&lt;p&gt;The first step is to gather suggested features, once again including ideas from the wider community, so the Interop 2024 proposal process is now open for submissions. Suggestions can include features that behave differently across browsers, or features that are not yet implemented in all browsers. Keep in mind that proposals with high quality specifications and web platform tests are &lt;a href=&quot;https://github.com/web-platform-tests/interop/blob/main/README.md#requirements-for-focus-area-proposals&quot; rel=&quot;noopener&quot;&gt;more likely to be included&lt;/a&gt;, as this project is about reaching interoperability rather than specifying new features. The proposal submission process ends October 5, 2023.&lt;/p&gt;
&lt;p&gt;Once the proposal period ends, the collected submissions will be discussed by browser vendors and other partners to determine the final list. It&#39;s likely that there will be more proposals than can be achieved during 2024, so some high quality proposals may not be selected. We are looking forward to reviewing &lt;a href=&quot;https://github.com/orgs/web-platform-tests/projects/3&quot; rel=&quot;noopener&quot;&gt;all the submissions&lt;/a&gt;, and we&#39;ll post the final list here once Interop 2024 gets underway.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/web-platform-tests/interop/issues/new/choose&quot; rel=&quot;noopener&quot;&gt;Submit your proposals here&lt;/a&gt;.&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author><author>
      <name>Robert Nyman</name>
    </author><author>
      <name>Philip Jägenstedt</name>
    </author><author>
      <name>Nandu Nair</name>
    </author>
  </entry>
  
  <entry>
    <title>New to the web platform in August</title>
    <link href="https://web.dev/web-platform-08-2023/"/>
    <updated>2023-08-31T00:00:00Z</updated>
    <id>https://web.dev/web-platform-08-2023/</id>
    <content type="html" mode="escaped">&lt;h2 id=&quot;stable-browser-releases&quot;&gt;Stable browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-08-2023/#stable-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In August 2023 &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/116&quot; rel=&quot;noopener&quot;&gt;Firefox 116&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/117&quot; rel=&quot;noopener&quot;&gt;Firefox 117&lt;/a&gt;, &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_6-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 16.6&lt;/a&gt;, and &lt;a href=&quot;https://developer.chrome.com/blog/new-in-chrome-116/&quot; rel=&quot;noopener&quot;&gt;Chrome 116&lt;/a&gt; became stable. This post takes a look at what that means for the web platform.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-bad-bg color-state-bad-text&quot;&gt;&lt;p class=&quot;cluster color-state-bad-text&quot;&gt;&lt;span class=&quot;aside__icon box-block &quot;&gt;&lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;Error sign&quot;&gt;   &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 15v-2h2v2h-2zm0-10v6h2V7h-2z&quot;&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/span&gt;&lt;strong&gt;Caution&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot; flow&quot;&gt; We include browser compatibility data pulled from MDN in these posts which may not have been updated yet for very recent browser releases. The post will show the correct information as soon as it appears in the &lt;a href=&quot;https://github.com/mdn/browser-compat-data/releases&quot;&gt;browser-compat-data release&lt;/a&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;Firefox 116 supports the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/Audio_Output_Devices_API&quot; rel=&quot;noopener&quot;&gt;Audio Output Devices API&lt;/a&gt; on all platforms except for Android. This API allows web applications to redirect audio output to a permitted Bluetooth headset, speakerphone, or other device, instead of having to use the browser or underlying OS default.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Firefox preview, Preview&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;preview&quot; title=&quot;Preview&quot; aria-label=&quot;Preview&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/MediaDevices/selectAudioOutput#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Chrome 116 includes CSS Motion Path allowing any graphical object to be animated it along a path specified by the developer. This allows a number of powerful new transform possibilities, such as positioning using polar coordinates (with the &lt;code&gt;ray()&lt;/code&gt; function) rather than the standard rectangular coordinates used by the &lt;code&gt;translate()&lt;/code&gt; function, or animating an element along a defined path. This makes it easier to define complex and beautiful 2d spatial transitions. A path can be specified as &lt;code&gt;circle()&lt;/code&gt;, &lt;code&gt;ellipse()&lt;/code&gt;, &lt;code&gt;rect()&lt;/code&gt;, &lt;code&gt;inset()&lt;/code&gt;, &lt;code&gt;xywh()&lt;/code&gt;, &lt;code&gt;polygon()&lt;/code&gt;, &lt;code&gt;ray()&lt;/code&gt; and &lt;code&gt;url()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Also in Chrome 116 is the &lt;a href=&quot;https://developer.chrome.com/docs/web-platform/document-picture-in-picture/&quot; rel=&quot;noopener&quot;&gt;Document Picture-in-Picture API&lt;/a&gt;. This enables an always-on-top window that can be populated with arbitrary HTMLElements. This is an expansion upon the existing HTMLVideoElement API that only allows for an HTMLVideoElement to be put into a Picture-in-Picture (PiP) window.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Firefox 117 supports &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_nesting&quot; rel=&quot;noopener&quot;&gt;CSS Nesting&lt;/a&gt; and the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/Nesting_selector&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;&amp;amp;&lt;/code&gt; nesting selector&lt;/a&gt;. This enables the nesting of one style rule inside another. This makes CSS Nesting interoperable with a caveat, Safari and Chrome implemented an older version of the spec, which did not allow nesting of &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/Type_selectors&quot; rel=&quot;noopener&quot;&gt;type selectors&lt;/a&gt;. Firefox has implemented the new version of the spec which does not require the &lt;code&gt;&amp;amp;&lt;/code&gt; nesting selector. You can see examples of both versions in &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_nesting/Using_CSS_nesting&quot; rel=&quot;noopener&quot;&gt;Using CSS Nesting&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 112, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      112
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 112, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
112
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari 16.5, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
16.5
&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/Nesting_selectors#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id=&quot;beta-browser-releases&quot;&gt;Beta browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-08-2023/#beta-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beta browser versions give you a preview of things that will be in the next stable version of the browser. It&#39;s a great time to test new features, or removals, that could impact your site before the world gets that release. New betas are &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/118&quot; rel=&quot;noopener&quot;&gt;Firefox 118&lt;/a&gt; and &lt;a href=&quot;https://developer.chrome.com/blog/chrome-117-beta/&quot; rel=&quot;noopener&quot;&gt;Chrome 117&lt;/a&gt;. The &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-17-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 17&lt;/a&gt; beta is still ongoing. These releases bring many great features to the platform. Check out the release notes for all of the details, here are just a few highlights.&lt;/p&gt;
&lt;p&gt;There&#39;s not a lot of information available as yet for the next Firefox release. However, Chrome 117 promises some exciting features. For example, some new CSS features that &lt;a href=&quot;https://developer.chrome.com/blog/entry-exit-animations/&quot; rel=&quot;noopener&quot;&gt;enable entry and exit animations&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;subgrid&lt;/code&gt; value for &lt;code&gt;grid-template-columns&lt;/code&gt; and &lt;code&gt;grid-template-rows&lt;/code&gt; is included in Chrome 117, making this longed for feature interoperable.&lt;/p&gt;
&lt;p&gt;Also in Chrome 117 is JavaScript array grouping with the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/groupBy&quot; rel=&quot;noopener&quot;&gt;Object.groupBy&lt;/a&gt; and &lt;a href=&quot;https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Map/groupBy&quot; rel=&quot;noopener&quot;&gt;Map.groupBy&lt;/a&gt; static methods.&lt;/p&gt;
&lt;p&gt;Safari 17 beta includes the &lt;code&gt;popover&lt;/code&gt; attribute, to add support for the &lt;a href=&quot;https://developer.chrome.com/blog/introducing-popover-api/&quot; rel=&quot;noopener&quot;&gt;Popover API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by &lt;a href=&quot;https://unsplash.com/@courtneymcook&quot; rel=&quot;noopener&quot;&gt;Courtney Cook&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>New to the web platform in July</title>
    <link href="https://web.dev/web-platform-07-2023/"/>
    <updated>2023-07-31T00:00:00Z</updated>
    <id>https://web.dev/web-platform-07-2023/</id>
    <content type="html" mode="escaped">&lt;h2 id=&quot;stable-browser-releases&quot;&gt;Stable browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-07-2023/#stable-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In July 2023 &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/115&quot; rel=&quot;noopener&quot;&gt;Firefox 115&lt;/a&gt; and &lt;a href=&quot;https://developer.chrome.com/blog/new-in-chrome-115/&quot; rel=&quot;noopener&quot;&gt;Chrome 115&lt;/a&gt; became stable. This post takes a look at what that means for the web platform.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-bad-bg color-state-bad-text&quot;&gt;&lt;p class=&quot;cluster color-state-bad-text&quot;&gt;&lt;span class=&quot;aside__icon box-block &quot;&gt;&lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;Error sign&quot;&gt;   &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 15v-2h2v2h-2zm0-10v6h2V7h-2z&quot;&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/span&gt;&lt;strong&gt;Caution&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot; flow&quot;&gt; We include browser compatibility data pulled from MDN in these posts which may not have been updated yet for very recent browser releases. The post will show the correct information as soon as it appears in the &lt;a href=&quot;https://github.com/mdn/browser-compat-data/releases&quot;&gt;browser-compat-data release&lt;/a&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;h3 id=&quot;multiple-values-for-the-css-display-property&quot;&gt;Multiple values for the CSS &lt;code&gt;display&lt;/code&gt; property &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-07-2023/#multiple-values-for-the-css-display-property&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Chrome 115 includes multiple values for the CSS &lt;code&gt;display&lt;/code&gt; property. This means that &lt;code&gt;display: flex&lt;/code&gt; becomes &lt;code&gt;display: block flex&lt;/code&gt; and &lt;code&gt;display: block&lt;/code&gt; becomes &lt;code&gt;display: block flow&lt;/code&gt;. The single values are maintained as legacy keywords, these values are now available in the three major engines.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 115, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      115
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 70, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      70
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 115, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      115
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id=&quot;scroll-driven-animations&quot;&gt;Scroll-driven animations &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-07-2023/#scroll-driven-animations&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Also in Chrome 115 are the &lt;code&gt;ScrollTimeline&lt;/code&gt; and &lt;code&gt;ViewTimeline&lt;/code&gt; extensions to the Web Animations specification. These enable &lt;a href=&quot;https://developer.chrome.com/articles/scroll-driven-animations/&quot; rel=&quot;noopener&quot;&gt;scroll-driven animations&lt;/a&gt; via CSS and JavaScript.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 115, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      115
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 115, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
115
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/ScrollTimeline#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;privacy-sandbox-apis&quot;&gt;Privacy Sandbox APIs &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-07-2023/#privacy-sandbox-apis&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The Privacy Sandbox &lt;a href=&quot;https://developer.chrome.com/blog/privacy-sandbox-launch/&quot; rel=&quot;noopener&quot;&gt;relevance and measurement APIs&lt;/a&gt; shipped in Chrome 115. This includes the Topics, Protected Audience, Attribution Reporting, Private Aggregation, Shared Storage, and Fenced Frames APIs.&lt;/p&gt;
&lt;p&gt;To understand more about these APIs check out the &lt;a href=&quot;https://developer.chrome.com/blog/privacy-sandbox-demos/&quot; rel=&quot;noopener&quot;&gt;Privacy Sandbox demos&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;the-animation-composition-property&quot;&gt;The &lt;code&gt;animation-composition&lt;/code&gt; property &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-07-2023/#the-animation-composition-property&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Firefox 115 supports the CSS &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/animation-composition&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;animation-composition&lt;/code&gt;&lt;/a&gt; property. Making &lt;code&gt;animation-composition&lt;/code&gt; supported in all three major engines. Learn more in the article &lt;a href=&quot;https://developer.chrome.com/articles/css-animation-composition/&quot; rel=&quot;noopener&quot;&gt;Specify how multiple animation effects should composite with animation-composition&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 112, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      112
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 115, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      115
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 112, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      112
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/animation-composition#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;array-methods&quot;&gt;Array methods &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-07-2023/#array-methods&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Also reaching interoperability with Firefox 115 are a set of methods for &lt;code&gt;Array&lt;/code&gt; and &lt;code&gt;TypedArray&lt;/code&gt;.  &lt;code&gt;Array.toReversed()&lt;/code&gt;, &lt;code&gt;Array.toSorted()&lt;/code&gt;, &lt;code&gt;Array.toSpliced()&lt;/code&gt;, &lt;code&gt;Array.with()&lt;/code&gt;, &lt;code&gt;TypedArrays.toReversed()&lt;/code&gt;, &lt;code&gt;TypedArrays.toSorted()&lt;/code&gt;, and &lt;code&gt;TypedArrays.with()&lt;/code&gt; return a new array with elements that have been shallow copied.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 110, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      110
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 115, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      115
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 110, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      110
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/toReversed#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id=&quot;beta-browser-releases&quot;&gt;Beta browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-07-2023/#beta-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beta browser versions give you a preview of things that will be in the next stable version of the browser. It&#39;s a great time to test new features, or removals, that could impact your site before the world gets that release. New betas are &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/116&quot; rel=&quot;noopener&quot;&gt;Firefox 116&lt;/a&gt; and &lt;a href=&quot;https://developer.chrome.com/blog/chrome-116-beta/&quot; rel=&quot;noopener&quot;&gt;Chrome 116&lt;/a&gt;. The &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_6-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 17&lt;/a&gt;  and &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_6-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 16.6&lt;/a&gt; betas are still ongoing. These releases bring many great features to the platform. Check out the release notes for all of the details, here are just a few highlights.&lt;/p&gt;
&lt;p&gt;Firefox 116 supports the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/Audio_Output_Devices_API&quot; rel=&quot;noopener&quot;&gt;Audio Output Devices API&lt;/a&gt; on all platforms except for Android. This API allows web applications to redirect audio output to a permitted Bluetooth headset, speakerphone, or other device, instead of having to use the browser or underlying OS default.&lt;/p&gt;
&lt;p&gt;Chrome 116 includes CSS Motion Path allowing any graphical object to be animated it along a path specified by the developer. This allows a number of powerful new transform possibilities, such as positioning using polar coordinates (with the &lt;code&gt;ray()&lt;/code&gt; function) rather than the standard rectangular coordinates used by the &lt;code&gt;translate()&lt;/code&gt; function, or animating an element along a defined path. This makes it easier to define complex and beautiful 2d spatial transitions. A path can be specified as &lt;code&gt;circle()&lt;/code&gt;, &lt;code&gt;ellipse()&lt;/code&gt;, &lt;code&gt;rect()&lt;/code&gt;, &lt;code&gt;inset()&lt;/code&gt;, &lt;code&gt;xywh()&lt;/code&gt;, &lt;code&gt;polygon()&lt;/code&gt;, &lt;code&gt;ray()&lt;/code&gt; and &lt;code&gt;url()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Also in Chrome 116 is the &lt;a href=&quot;https://developer.chrome.com/docs/web-platform/document-picture-in-picture/&quot; rel=&quot;noopener&quot;&gt;Document Picture-in-Picture API&lt;/a&gt;. This enables an always-on-top window that can be populated with arbitrary HTMLElements. This is an expansion upon the existing HTMLVideoElement API that only allows for an HTMLVideoElement to be put into a Picture-in-Picture (PiP) window.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by &lt;a href=&quot;https://unsplash.com/@ninjason&quot; rel=&quot;noopener&quot;&gt;Jason Leung&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>New to the web platform in June</title>
    <link href="https://web.dev/web-platform-06-2023/"/>
    <updated>2023-06-30T00:00:00Z</updated>
    <id>https://web.dev/web-platform-06-2023/</id>
    <content type="html" mode="escaped">&lt;h2 id=&quot;stable-browser-releases&quot;&gt;Stable browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-06-2023/#stable-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In June 2023 &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/114&quot; rel=&quot;noopener&quot;&gt;Firefox 114&lt;/a&gt; became stable, so it&#39;s a single browser issue this month. Check out the beta browser releases section for details of several features that are about to become interoperable once those betas become stable.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-bad-bg color-state-bad-text&quot;&gt;&lt;p class=&quot;cluster color-state-bad-text&quot;&gt;&lt;span class=&quot;aside__icon box-block &quot;&gt;&lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;Error sign&quot;&gt;   &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 15v-2h2v2h-2zm0-10v6h2V7h-2z&quot;&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/span&gt;&lt;strong&gt;Caution&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot; flow&quot;&gt; We include browser compatibility data pulled from MDN in these posts which may not have been updated yet for very recent browser releases. The post will show the correct information as soon as it appears in the &lt;a href=&quot;https://github.com/mdn/browser-compat-data/releases&quot;&gt;browser-compat-data release&lt;/a&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;h3 id=&quot;webtransport-api&quot;&gt;WebTransport API &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-06-2023/#webtransport-api&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Firefox 114 includes the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/WebTransport_API&quot; rel=&quot;noopener&quot;&gt;WebTransport API&lt;/a&gt;, a modern update to WebSockets providing support for multiple streams, unidirectional streams, and out-of-order delivery.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 97, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      97
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 114, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      114
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 97, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      97
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/WebTransport#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;the-svg-crossorigin-attribute&quot;&gt;The SVG &lt;code&gt;crossorigin&lt;/code&gt; attribute &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-06-2023/#the-svg-crossorigin-attribute&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Firefox 114 also includes the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/SVG/Attribute/crossorigin&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;crossorigin&lt;/code&gt; attribute&lt;/a&gt;, on the &lt;code&gt;&amp;lt;image&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;feImage&amp;gt;&lt;/code&gt; elements in SVG, provides support for configuration of the Cross-Origin Resource Sharing (CORS) requests for the element&#39;s fetched data. This works in the same way as the HTML &lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTML/Attributes/crossorigin&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;crossorigin&lt;/code&gt;&lt;/a&gt; attribute.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Firefox 114, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
114
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/SVGImageElement/crossorigin#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id=&quot;beta-browser-releases&quot;&gt;Beta browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-06-2023/#beta-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beta browser versions give you a preview of things that will be in the next stable version of the browser. It&#39;s a great time to test new features, or removals, that could impact your site before the world gets that release. New betas are &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/115&quot; rel=&quot;noopener&quot;&gt;Firefox 115&lt;/a&gt;, and &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_6-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 17&lt;/a&gt; with &lt;a href=&quot;https://developer.chrome.com/blog/chrome-115-beta/&quot; rel=&quot;noopener&quot;&gt;Chrome 115&lt;/a&gt; and &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_6-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 16.6&lt;/a&gt; still ongoing. These releases bring many great features to the platform. Check out the release notes for all of the details, here are just a few highlights.&lt;/p&gt;
&lt;p&gt;Firefox 115 supports the CSS &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/animation-composition&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;animation-composition&lt;/code&gt;&lt;/a&gt; property. Once this version of Firefox becomes stable on July 4th, &lt;code&gt;animation-composition&lt;/code&gt; will be supported in all three major engines. Learn more in the article &lt;a href=&quot;https://developer.chrome.com/articles/css-animation-composition/&quot; rel=&quot;noopener&quot;&gt;Specify how multiple animation effects should composite with animation-composition&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Also reaching interoperability with Firefox 115 are a set of methods for &lt;code&gt;Array&lt;/code&gt; and &lt;code&gt;TypedArray&lt;/code&gt;.  &lt;code&gt;Array.toReversed()&lt;/code&gt;, &lt;code&gt;Array.toSorted()&lt;/code&gt;, &lt;code&gt;Array.toSpliced()&lt;/code&gt;, &lt;code&gt;Array.with()&lt;/code&gt;, &lt;code&gt;TypedArrays.toReversed()&lt;/code&gt;, &lt;code&gt;TypedArrays.toSorted()&lt;/code&gt;, and &lt;code&gt;TypedArrays.with()&lt;/code&gt; return a new array with elements that have been shallow copied.&lt;/p&gt;
&lt;p&gt;There is a whole stack of new features and fixes in the Safari 17 beta. Safari 17 adds &lt;a href=&quot;https://blog.tomayac.com/2023/06/07/web-apps-on-macos-sonoma-14-beta/&quot; rel=&quot;noopener&quot;&gt;Web Apps&lt;/a&gt; to macOS Sonoma. This means you can add a website to the Dock from the File menu or Share Sheet, and it will open in its own window.&lt;/p&gt;
&lt;p&gt;Safari 17 also brings some features to interoperable status—&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-size&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;contain-intrinsic-size&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@counter-style&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;@counter-style&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@font-face/size-adjust&quot; rel=&quot;noopener&quot;&gt;@font-face size-adjust&lt;/a&gt;, and the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@media/overflow-block&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;overflow-block&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@media/overflow-inline&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;overflow-inline&lt;/code&gt;&lt;/a&gt; media features will be available in all major engines when Safari 17 ships.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by &lt;a href=&quot;https://unsplash.com/@rodrigospabreu&quot; rel=&quot;noopener&quot;&gt;Rodrigo Abreu&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>New CSS color spaces and functions in all major engines</title>
    <link href="https://web.dev/color-spaces-and-functions/"/>
    <updated>2023-06-02T00:00:00Z</updated>
    <id>https://web.dev/color-spaces-and-functions/</id>
    <content type="html" mode="escaped">&lt;aside class=&quot;aside flow bg-state-good-bg color-state-good-text&quot;&gt;&lt;p class=&quot;cluster &quot;&gt;&lt;span class=&quot;aside__icon box-block &quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 128 128&quot; style=&quot;enable-background:new 0 0 128 128&quot; xml:space=&quot;preserve&quot;&gt;&lt;path d=&quot;M7.5 123.3c2.2 2.4 11.6-1.9 19-5.3C32 115.4 54 106.3 65 101.6c3-1.2 7.3-2.9 10.4-7 2.8-3.6 10-19-4.6-34.7-15-16-30.4-11.5-36.2-7.5A28.5 28.5 0 0 0 27.3 63c-5.2 11.6-12.7 32.9-15.7 41.3-2.3 6.1-6.4 16.5-4.1 19z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M18 86.8s.7 6.5 6.1 14.6c6.3 9.6 15 11.2 15 11.2l-5.8 2.4s-6.5-2-12.7-10.4c-3.8-5.3-5-11.6-5-11.6l2.3-6.2zm-5.6 15.4s1.5 5.6 4.7 9.7c3.8 5 8.6 6.5 8.6 6.5l-4.5 2s-3.3-.8-7-5.5c-2.9-3.5-3.7-7.6-3.7-7.6l1.9-5.1z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M10 116.4c-.2-.5-.2-1 0-1.4l25.4-53 4.2 16-26.8 38.7c-.7 1-2.3 1-2.8-.2z&quot; style=&quot;opacity:.44&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M41.6 83.2c12 14 25.5 12.2 30 8.6 4.5-3.5 8.1-15.6-3.7-29.3C55.3 48.2 41.3 52.2 38 55.3s-7.4 15.1 3.5 27.9z&quot; style=&quot;fill: var(--color-state-good-bg);&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M82.5 89c-4.3-3.7-6.6-3-9.7-1.8a26 26 0 0 1-18.9 0l2.6-6.2c5 1.7 8.7 1 12-1 4-2.4 9.6-5.6 18.3 1.6 3.6 3 7.3 5.1 10 4.2 2-.7 3-3.6 3.6-6l.2-1.3c.4-3.7 1.2-11.6 7.1-15.7 6.4-4.3 13-4.3 13-4.3l1.2 12c-3-.5-5.2.1-7 1-6.7 3.8-.8 18.2-11.3 23-10.1 4.8-18.4-3.3-21-5.6zM45.4 73.7l-4.3-3.9c8-8.9 5.8-15.4 4.3-20.2A26.4 26.4 0 0 1 44 38.8c-3-3.8-4.4-7.8-4.5-8-1.9-5.7-.5-11.2 2.8-16.4C48.7 4 60.5 4 60.5 4l4 10.5c-3-.1-12.8 0-15.8 4.8-3.8 6-1.3 9.6-1.2 10 .8-1 1.5-1.7 2.2-2.3 4.8-4.2 9-4.8 11.6-4.6a11 11 0 0 1 7.6 4.2c2 2.7 3 6.2 2.3 9.4a11 11 0 0 1-5.8 7.4 16 16 0 0 1-13 1.5v.3l.6 2c1.8 5.4 5 14.1-7.6 26.5zm7.4-37.5c.5.4 1.1.8 1.8 1 2 .8 4.4.6 7-.8 1.5-.9 1.7-1.7 1.7-2 .2-.9 0-2-.7-2.8a2.8 2.8 0 0 0-2-1.2c-1.6-.2-3.6.8-5.6 2.6-1 .9-1.7 2-2.3 3.2zm10 39.1-6.2-.1s3-16.7 12.5-19.5c1.8-.5 3.7-1 5.7-1.3l4-.8c.1-1.6-.5-3.6-1.3-5.9-.6-1.7-1.2-3.5-1.5-5.5-.6-3.9.4-7.3 3-9.6 3-2.9 7.9-3.8 13.4-2.5 3.2.7 5.5 2.2 7.6 3.6 2.9 2 4.6 3 8.2.5 4.3-2.9-1.4-14.3-4.4-21l11.3-4.6c1.5 3.3 8.8 20.3 4 30a11.5 11.5 0 0 1-8.1 6.2c-8 1.8-12.6-1.3-16-3.6-1.6-1-3-1.9-4.6-2.3-10.6-3 4.2 12.6-2.7 19.6-4.2 4.2-14.4 5.3-15 5.5-6.6 1.6-10 11.3-10 11.3z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M44 38.8c-.2 2.2-.3 3.5.3 6.4 2.7 2 8.7 2 8.7 2l-.6-2v-.3c-6.1-3-8.4-6.1-8.4-6.1zm-12.5 9.8-10.3-5 5.1-7.5 8.2 5.4zm-15.2-14A26 26 0 0 1 5 28.9l5.2-6c1.6 1.2 5 3.5 7.2 3.8l-1.1 7.9zM25.6 21.3 18 18.8a18 18 0 0 0 .7-8.3l7.9-1.3c.6 4 .3 8.2-1 12zM73 15.3l7.9-1.7L83 23.9l-7.8 1.7zM92.5 17.8 87 12c2.8-2.8 3.5-6.3 3.5-6.4L98.4 7c-.1.6-1.1 6.3-6 10.9zM95.5 48.6l7-2.2 2.3 7.7-7 2.1zM97.5 113l-7.9-1c.3-2.7-1.8-6.2-2.4-7l6.4-4.8c.5.6 4.7 6.4 4 12.8zM120.4 102.9c-3-.5-6-.6-9.1-.5l-.3-8c3.5-.2 7 0 10.6.6l-1.2 7.9zM109.6 113.9l5.6-5.7 7.8 7.6-5.6 5.7zM93.1 63.3 99 70l-6.6 5.8-5.8-6.6z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; &lt;/span&gt;&lt;strong&gt;Celebration&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot; flow&quot;&gt; This web feature is now available in all three major browser engines! &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;CSS now supports color spaces that allow us to access colors outside of the sRGB &lt;a href=&quot;https://developer.chrome.com/articles/high-definition-css-color-guide/#what-is-a-color-gamut&quot; rel=&quot;noopener&quot;&gt;gamut&lt;/a&gt;. This means that you can support HD (high definition) displays, using colors from HD gamuts. This support comes with new functions to make better use of color on the web.&lt;/p&gt;
&lt;h2 id=&quot;accessing-color-spaces-from-css&quot;&gt;Accessing color spaces from CSS &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/color-spaces-and-functions/#accessing-color-spaces-from-css&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We already have a number of functions that allow us to access colors within the sRGB gamut—&lt;code&gt;rgb()&lt;/code&gt;, &lt;code&gt;hsl()&lt;/code&gt;, and &lt;code&gt;hwb()&lt;/code&gt;. Now supported in browsers is the &lt;code&gt;color()&lt;/code&gt; function, a normalized way to access colors within any RGB color space. This includes sRGB, Display P3, and Rec2020. You can see some examples in the following CSS:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.valid-css-color-function-colors&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;--srgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;srgb 1 1 1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;--srgb-linear&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;srgb-linear 100% 100% 100% / 50%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;--display-p3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;display-p3 1 1 1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;--rec2020&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;rec2020 0 0 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;--a98-rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a98-rgb 1 1 1 / 25%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;--prophoto&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;prophoto-rgb 0% 0% 0%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;--xyz&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xyz 1 1 1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 111, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      111
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 113, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      113
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 111, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      111
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/color_value/color#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Also supported are several functions allowing access to color spaces other than sRGB using &lt;code&gt;lch()&lt;/code&gt;, &lt;code&gt;lab()&lt;/code&gt;, &lt;code&gt;oklch()&lt;/code&gt;, and &lt;code&gt;oklab()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 111, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      111
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 113, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      113
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 111, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      111
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/color_value/lch#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;You can learn about all of these different color spaces in the &lt;a href=&quot;https://developer.chrome.com/articles/high-definition-css-color-guide/&quot; rel=&quot;noopener&quot;&gt;High definition CSS color guide&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;the-color-mix-function&quot;&gt;The &lt;code&gt;color-mix()&lt;/code&gt; function &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/color-spaces-and-functions/#the-color-mix-function&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As well as these new color spaces, all engines now support the &lt;code&gt;color-mix()&lt;/code&gt; function. This function enables mixing of one color into another, in any of the color spaces. In the following CSS, 25% of blue is mixed into white, in the srgb color space.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.example&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;color-mix&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;in srgb&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; blue 25%&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; white&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 111, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      111
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 113, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      113
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 111, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      111
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16.2, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16.2
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/color_value/color-mix#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.chrome.com/blog/css-color-mix/&quot; rel=&quot;noopener&quot;&gt;Learn more about &lt;code&gt;color-mix()&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;These new functions and color spaces promise to bring vibrant HD color to the web. For inspiration, make a start by creating some beautiful gradients using the HD gradient generator at &lt;a href=&quot;https://gradient.style/&quot; rel=&quot;noopener&quot;&gt;gradient.style&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Hero image by &lt;a href=&quot;https://unsplash.com/fr/@yogidan2012&quot; rel=&quot;noopener&quot;&gt;Daniele Levis Pelusi&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>New to the web platform in May</title>
    <link href="https://web.dev/web-platform-05-2023/"/>
    <updated>2023-05-31T00:00:00Z</updated>
    <id>https://web.dev/web-platform-05-2023/</id>
    <content type="html" mode="escaped">&lt;h2 id=&quot;stable-browser-releases&quot;&gt;Stable browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-05-2023/#stable-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In May 2023, &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/113&quot; rel=&quot;noopener&quot;&gt;Firefox 113&lt;/a&gt;, &lt;a href=&quot;https://developer.chrome.com/blog/new-in-chrome-113/&quot; rel=&quot;noopener&quot;&gt;Chrome 113&lt;/a&gt;, &lt;a href=&quot;https://developer.chrome.com/blog/new-in-chrome-114/&quot; rel=&quot;noopener&quot;&gt;Chrome 114&lt;/a&gt;, and &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_5-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 16.5&lt;/a&gt; became stable. Let&#39;s take a look at what this means for the web platform.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-bad-bg color-state-bad-text&quot;&gt;&lt;p class=&quot;cluster color-state-bad-text&quot;&gt;&lt;span class=&quot;aside__icon box-block &quot;&gt;&lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;Error sign&quot;&gt;   &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 15v-2h2v2h-2zm0-10v6h2V7h-2z&quot;&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/span&gt;&lt;strong&gt;Caution&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot; flow&quot;&gt; We include browser compatibility data pulled from MDN in these posts which may not have been updated yet for very recent browser releases. The post will show the correct information as soon as it appears in the &lt;a href=&quot;https://github.com/mdn/browser-compat-data/releases&quot;&gt;browser-compat-data release&lt;/a&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;h3 id=&quot;webgpu&quot;&gt;WebGPU &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-05-2023/#webgpu&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Chrome 113 includes &lt;a href=&quot;https://developer.chrome.com/blog/webgpu-release/&quot; rel=&quot;noopener&quot;&gt;WebGPU&lt;/a&gt;, the successor to the WebGL and WebGL 2 graphics APIs for the web. It provides modern features such as GPU compute, lower overhead access to GPU hardware, the ability to render to multiple canvases from a single graphics device, and better, more predictable performance.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 113, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      113
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox preview, Preview&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;preview&quot; title=&quot;Preview&quot; aria-label=&quot;Preview&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 113, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
113
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/GPU#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;first-party-sets&quot;&gt;First-Party Sets &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-05-2023/#first-party-sets&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.chrome.com/docs/privacy-sandbox/first-party-sets/&quot; rel=&quot;noopener&quot;&gt;First-Party Sets (FPS)&lt;/a&gt; is part of the &lt;a href=&quot;https://privacysandbox.com/&quot; rel=&quot;noopener&quot;&gt;Privacy Sandbox&lt;/a&gt;. It is a way for organizations to declare relationships among sites, so that browsers can decide when to allow limited third-party cookie access for sites within a set. FPS began a staged rollout in Chrome 113.&lt;/p&gt;
&lt;h3 id=&quot;css-media-features-and-more&quot;&gt;CSS media features and more &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-05-2023/#css-media-features-and-more&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;For CSS, Chrome 113 includes the &lt;code&gt;overflow-inline&lt;/code&gt; and &lt;code&gt;overflow-block&lt;/code&gt; media features.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 113, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      113
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 66, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      66
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 113, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      113
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/@media/overflow-inline#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;And the &lt;code&gt;update&lt;/code&gt; media feature.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 113, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      113
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 102, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      102
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 113, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      113
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/@media/update-frequency#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Also included is the &lt;code&gt;linear()&lt;/code&gt; easing function, which you can learn more about in the article &lt;a href=&quot;https://developer.chrome.com/articles/css-linear-easing-function/&quot; rel=&quot;noopener&quot;&gt;Create complex animation curves in CSS with the &lt;code&gt;linear()&lt;/code&gt; easing function&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 113, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      113
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 112, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      112
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 113, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      113
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id=&quot;css-color-level-4-features&quot;&gt;CSS Color Level 4 features &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-05-2023/#css-color-level-4-features&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Firefox 113 includes the &lt;code&gt;color()&lt;/code&gt;, &lt;code&gt;lab()&lt;/code&gt;, &lt;code&gt;lch()&lt;/code&gt;, &lt;code&gt;oklab()&lt;/code&gt;, &lt;code&gt;oklch()&lt;/code&gt;, and &lt;code&gt;color-mix()&lt;/code&gt; functional notations, along with the forced-color-adjust property. This means that the new color spaces and functions are now supported across all three major engines. You can learn more about these color spaces and functions in the &lt;a href=&quot;https://web.dev/articles/high-definition-css-color-guide/&quot;&gt;High definition CSS color guide&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 111, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      111
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 113, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      113
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 111, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      111
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16.2, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16.2
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/color_value/color-mix#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;more-control-over-nth-child-selections&quot;&gt;More control over &lt;code&gt;:nth-child()&lt;/code&gt; selections &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-05-2023/#more-control-over-nth-child-selections&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Firefox 113 also adds the ability to pass a selector list into &lt;code&gt;:nth-child()&lt;/code&gt; and &lt;code&gt;nth-last-child()&lt;/code&gt;. Learn more about this, and see examples in the post &lt;a href=&quot;https://developer.chrome.com/articles/css-nth-child-of-s/&quot; rel=&quot;noopener&quot;&gt;More control over :nth-child() selections with the of S syntax&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 111, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      111
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 113, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      113
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 111, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      111
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 9, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      9
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id=&quot;compressions-streams-api&quot;&gt;Compressions Streams API &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-05-2023/#compressions-streams-api&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Now supported in all three major engines due to inclusion in Firefox 113, the Compressions Streams API enables the compression and decompression of streams. This means that JavaScript applications no longer need to bundle a compression library.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 80, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      80
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 113, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      113
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 80, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      80
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/CompressionStream#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;css-nesting&quot;&gt;CSS nesting &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-05-2023/#css-nesting&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Safari 16.5 mostly resolved issues, but also adds support for &lt;a href=&quot;https://developer.chrome.com/articles/css-nesting/&quot; rel=&quot;noopener&quot;&gt;CSS Nesting&lt;/a&gt;, with the new nesting selector &lt;code&gt;&amp;gt;&lt;/code&gt;, used to nest related style rules, in a way that will be familiar to developers who have used pre-processors:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.nesting&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hotpink&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;&gt; .is&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; rebeccapurple&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class=&quot;token selector&quot;&gt;&gt; .awesome&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; deeppink&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 112, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      112
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 112, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
112
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari 16.5, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
16.5
&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/Nesting_selectors#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;balancing-headlines-with-text-wrap-balance&quot;&gt;Balancing headlines with &lt;code&gt;text-wrap: balance&lt;/code&gt; &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-05-2023/#balancing-headlines-with-text-wrap-balance&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;From Chrome 114 you can use &lt;code&gt;text-wrap: balance&lt;/code&gt;. This allows you to balance headlines, avoiding the issue of having a single word on the final line, providing a more pleasing and readable result. You can find out more in &lt;a href=&quot;https://developer.chrome.com/blog/css-text-wrap-balance/&quot; rel=&quot;noopener&quot;&gt;CSS text-wrap: balance&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 114, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      114
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 114, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
114
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/text-wrap#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;chips-cookies-having-independent-partitioned-state&quot;&gt;CHIPS: Cookies Having Independent Partitioned State &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-05-2023/#chips-cookies-having-independent-partitioned-state&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;As part of the work to &lt;a href=&quot;https://developer.chrome.com/docs/privacy-sandbox/third-party-cookie-phase-out/&quot; rel=&quot;noopener&quot;&gt;phase out third-party cookies&lt;/a&gt;, &lt;a href=&quot;https://developer.chrome.com/docs/privacy-sandbox/chips/&quot; rel=&quot;noopener&quot;&gt;CHIPS&lt;/a&gt; enables opting-in to third-party cookies being partitioned by top-level site using the new cookie attribute &lt;code&gt;Partitioned&lt;/code&gt;. CHIPS is available in Chrome 114.&lt;/p&gt;
&lt;h3 id=&quot;the-popover-api&quot;&gt;The Popover API &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-05-2023/#the-popover-api&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Also in Chrome 114 is the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/Popover_API&quot; rel=&quot;noopener&quot;&gt;Popover API&lt;/a&gt; making it easier to build transient user interface (UI) elements that are displayed on top of all other web app UI.&lt;/p&gt;
&lt;p&gt;These include user-interactive elements like action menus, form element suggestions, content pickers, and teaching UI.&lt;/p&gt;
&lt;p&gt;The new popover attribute enables any element to be displayed in the &lt;a href=&quot;https://developer.chrome.com/blog/top-layer-devtools/&quot; rel=&quot;noopener&quot;&gt;top layer&lt;/a&gt; automatically. This means no more worrying about positioning, stacking elements, focus or keyboard interactions for the developer.&lt;/p&gt;
&lt;p&gt;Learn more in &lt;a href=&quot;https://developer.chrome.com/blog/introducing-popover-api/&quot; rel=&quot;noopener&quot;&gt;Introducing the popover API&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 114, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      114
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 114, Behind a flag&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;flag&quot; title=&quot;Behind a flag&quot; aria-label=&quot;Behind a flag&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 114, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
114
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari 17, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
17
&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/ToggleEvent#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id=&quot;beta-browser-releases&quot;&gt;Beta browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-05-2023/#beta-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beta browser versions give you a preview of things that will be in the next stable version of the browser. It&#39;s a great time to test new features, or removals, that could impact your site before the world gets that release. New betas are &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/114&quot; rel=&quot;noopener&quot;&gt;Firefox 114&lt;/a&gt;, &lt;a href=&quot;https://developer.chrome.com/blog/chrome-115-beta/&quot; rel=&quot;noopener&quot;&gt;Chrome 115&lt;/a&gt;, and &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_6-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 16.6&lt;/a&gt;. These releases bring many great features to the platform. Check out the release notes for all of the details, here are just a few highlights.&lt;/p&gt;
&lt;p&gt;Chrome 115 includes multiple values for the CSS &lt;code&gt;display&lt;/code&gt; property. This means that &lt;code&gt;display: flex&lt;/code&gt; becomes &lt;code&gt;display: block flex&lt;/code&gt; and &lt;code&gt;display: block&lt;/code&gt; becomes &lt;code&gt;display: block flow&lt;/code&gt;. The single values are maintained as legacy keywords, and once in Chrome Stable this makes the multiple values available accross all engines.&lt;/p&gt;
&lt;p&gt;Also in Chrome 115 are the &lt;code&gt;ScrollTimeline&lt;/code&gt; and &lt;code&gt;ViewTimeline&lt;/code&gt; extensions to the Web Animations specification. These enable &lt;a href=&quot;https://developer.chrome.com/articles/scroll-driven-animations/&quot; rel=&quot;noopener&quot;&gt;scroll-driven animations&lt;/a&gt; via CSS and JavaScript.&lt;/p&gt;
&lt;p&gt;Firefox 114 includes the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/WebTransport_API&quot; rel=&quot;noopener&quot;&gt;WebTransport API&lt;/a&gt;, a modern update to WebSockets providing support for multiple streams, unidirectional streams, and out-of-order delivery.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by &lt;a href=&quot;https://unsplash.com/@photozace&quot; rel=&quot;noopener&quot;&gt;Photoz ace&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Introducing Baseline</title>
    <link href="https://web.dev/introducing-baseline/"/>
    <updated>2023-05-10T00:00:00Z</updated>
    <id>https://web.dev/introducing-baseline/</id>
    <content type="html" mode="escaped">&lt;p&gt;Baseline helps you to see, at a glance, whether a feature or API is safe to use in your site or web applications. In this post, learn about the ideas that led to this concept, and how we hope it will help you.&lt;/p&gt;
&lt;div class=&quot;youtube&quot;&gt;  &lt;lite-youtube videoid=&quot;eZa3BgGaAeA&quot;&gt;  &lt;/lite-youtube&gt;&lt;/div&gt;
&lt;h2 id=&quot;keeping-up-with-changes-to-the-web-platform&quot;&gt;Keeping up with changes to the web platform &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/introducing-baseline/#keeping-up-with-changes-to-the-web-platform&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The web of today changes rapidly. Our browsers are &lt;em&gt;evergreen&lt;/em&gt;, with new features landing in stable browsers each month. This is exciting, however it also poses problems. How do web developers keep up with all of this change? How do you know when it&#39;s safe to use a feature? When is it the right time to start to learn, and to invest in new features?&lt;/p&gt;
&lt;p&gt;In the past, we often explained browser support to stakeholders by tying it to a certain browser release (for example, Internet Explorer 11) because the line in the sand a non-evergreen browser created was clear to everyone. Today, the landscape can often seem less clear, with so many features landing it&#39;s a lot of work to check support for everything we use.&lt;/p&gt;
&lt;p&gt;We know how much of a problem this is to developers, because you have consistently &lt;a href=&quot;https://web.dev/deep-dive-into-developer-pain-points/&quot;&gt;told us that it&#39;s a problem&lt;/a&gt;. Over two years ago we decided it was a problem we wanted to try to address.&lt;/p&gt;
&lt;h2 id=&quot;getting-our-own-house-in-order&quot;&gt;Getting our own house in order &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/introducing-baseline/#getting-our-own-house-in-order&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We recognized that we were adding to confusion about the status of features, mixing experimental things in with stable content on our sites. So, we&#39;ve improved the clarity of our own communication channels. We now use web.dev to publish content about the stable web, those things that we can now describe as part of Baseline, and those that are very close to that status. We also highlight the work of other browsers, as we all work together to improve the interoperability of the platform.&lt;/p&gt;
&lt;p&gt;On web.dev you&#39;ll find content such as the &lt;a href=&quot;https://web.dev/tags/newly-interoperable/&quot;&gt;newly interoperable&lt;/a&gt; series, celebrating features that are now supported in all three major engines. We also have our monthly series, covering &lt;a href=&quot;https://web.dev/tags/new-to-the-web/&quot;&gt;what&#39;s new to the web platform&lt;/a&gt; sharing the work of all browsers, and updates about Interop 2023. This site is also home to our best practices guidance in subjects such as performance, accessibility, and fundamental web development skills.&lt;/p&gt;
&lt;p&gt;On &lt;a href=&quot;https://developer.chrome.com/&quot; rel=&quot;noopener&quot;&gt;developer.chrome.com&lt;/a&gt; you can learn about the new things that Chrome is bringing to the web platform. Some of these things are experimental, or only in Chrome right now. Many of the things we post about on developer.chrome.com are coming to other browsers, and we hope to celebrate their interoperable moments very soon, but we want you to have clarity about their status and browser support.&lt;/p&gt;
&lt;p&gt;We have also been adding clear browser support information to everything that we publish, and when our team talks about features at conferences.&lt;/p&gt;
&lt;p&gt;Documentation is really important for adoption of new features, and this year we&#39;ve made sure that the new features we are landing in Chrome have documentation over on MDN. For example, take a look at the documentation for &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/View_Transitions_API&quot; rel=&quot;noopener&quot;&gt;View Transitions&lt;/a&gt; and &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/WebGPU_API&quot; rel=&quot;noopener&quot;&gt;WebGPU&lt;/a&gt;. We also help support &lt;a href=&quot;https://openwebdocs.org/&quot; rel=&quot;noopener&quot;&gt;Open Web Docs&lt;/a&gt; who contribute documentation for the entire web platform to MDN.&lt;/p&gt;
&lt;h2 id=&quot;working-with-others&quot;&gt;Working with others &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/introducing-baseline/#working-with-others&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Improving what we do was important, however to address the bigger issue we needed to work with others. We&#39;ve been successfully working with our partners at other browser vendors and related companies through &lt;a href=&quot;https://web.dev/interop-2022-wrapup/&quot;&gt;Interop 2022&lt;/a&gt; and &lt;a href=&quot;https://web.dev/interop-2023/&quot;&gt;2023&lt;/a&gt;. Forming the &lt;a href=&quot;https://www.w3.org/community/webdx/&quot; rel=&quot;noopener&quot;&gt;WebDX Community Group&lt;/a&gt; brought everyone together to think about this issue of clarity across the platform as a whole.&lt;/p&gt;
&lt;p&gt;The group is working together on a &lt;a href=&quot;https://github.com/web-platform-dx/feature-set&quot; rel=&quot;noopener&quot;&gt;feature set&lt;/a&gt;, a way to group web platform features to show their support status, and this feature-set is key to the concept of Baseline.&lt;/p&gt;
&lt;h2 id=&quot;creating-platform-wide-clarity-with-baseline&quot;&gt;Creating platform-wide clarity with Baseline &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/introducing-baseline/#creating-platform-wide-clarity-with-baseline&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://web.dev/baseline&quot;&gt;Baseline&lt;/a&gt; is the line in the sand that is hard to identify in a world of evergreen browsers. Everything that is fully supported in the most recent two versions of major browsers will be part of Baseline. Therefore if your library states that all features used are part of Baseline, developers know what you mean. When creating a proposal for a new application, you can explain to stakeholders that browser support will be tied to Baseline, thus creating clarity for everyone as to levels of support.&lt;/p&gt;
&lt;p&gt;From today you will start to see Baseline appearing on pages &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/grid&quot; rel=&quot;noopener&quot;&gt;on MDN&lt;/a&gt;, and on &lt;a href=&quot;https://web.dev/baseline-features/&quot;&gt;web.dev&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As Baseline will be a continuously moving line, with new features becoming part of that set each month, every year we will publish a cut of features that are part of Baseline at one moment in time. For extra clarity, you can tie support to Baseline 24, for example.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; We&#39;re also quite excited by the ability to compare year-on-year what Baseline looks like. What will have changed between Baseline 24 and Baseline 25? That will be interesting to see. &lt;/div&gt;&lt;/aside&gt;
&lt;h2 id=&quot;whats-next&quot;&gt;What&#39;s next? &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/introducing-baseline/#whats-next&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We&#39;ll be continuing the rollout of Baseline across web.dev. When reading an article or tutorial, you&#39;ll be able to see when the features described are part of Baseline. You won&#39;t get part of the way through something and realize it uses something that doesn&#39;t have good browser support.&lt;/p&gt;
&lt;p&gt;We&#39;ll be providing widgets that you can use on your own articles or libraries, indicating support for the Baseline feature set.&lt;/p&gt;
&lt;p&gt;We&#39;ll also be working to ensure that new features we are landing in Chrome become part of Baseline as quickly as possible. Watch out for future posts where we&#39;ll talk more about that work.&lt;/p&gt;
&lt;p&gt;And we&#39;ll be gathering feedback from developers to find out how this idea is working in practice, and what more you would like to see. Keep an eye on the &lt;a href=&quot;https://web.dev/baseline/&quot;&gt;Baseline page&lt;/a&gt;, or offer feedback right now via the &lt;a href=&quot;https://www.w3.org/community/webdx/&quot; rel=&quot;noopener&quot;&gt;WebDX Community Group&lt;/a&gt;.&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>New to the web platform in April</title>
    <link href="https://web.dev/web-platform-04-2023/"/>
    <updated>2023-04-28T00:00:00Z</updated>
    <id>https://web.dev/web-platform-04-2023/</id>
    <content type="html" mode="escaped">&lt;h2 id=&quot;stable-browser-releases&quot;&gt;Stable browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-04-2023/#stable-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In April 2023, &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/112&quot; rel=&quot;noopener&quot;&gt;Firefox 112&lt;/a&gt;, and &lt;a href=&quot;https://developer.chrome.com/blog/new-in-chrome-112/&quot; rel=&quot;noopener&quot;&gt;Chrome 112&lt;/a&gt; became stable. Let&#39;s take a look at what this means for the web platform.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-bad-bg color-state-bad-text&quot;&gt;&lt;p class=&quot;cluster color-state-bad-text&quot;&gt;&lt;span class=&quot;aside__icon box-block &quot;&gt;&lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;Error sign&quot;&gt;   &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 15v-2h2v2h-2zm0-10v6h2V7h-2z&quot;&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/span&gt;&lt;strong&gt;Caution&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot; flow&quot;&gt; We include browser compatibility data pulled from MDN in these posts which may not have updated for very recent browser releases. The post will show the correct information as soon as it appears in the &lt;a href=&quot;https://github.com/mdn/browser-compat-data/releases&quot;&gt;browser-compat-data release&lt;/a&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;h3 id=&quot;the-inert-attribute&quot;&gt;The &lt;code&gt;inert&lt;/code&gt; attribute &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-04-2023/#the-inert-attribute&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Firefox 112 includes the &lt;code&gt;inert&lt;/code&gt; global attribute. This attribute tells the browser to ignore the element, indicating content that should not be interactive. It:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prevents &lt;code&gt;click&lt;/code&gt; events being fired.&lt;/li&gt;
&lt;li&gt;Prevents the element from gaining focus.&lt;/li&gt;
&lt;li&gt;Excludes the element and its contents from the accessibility tree.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This attribute is now interoperable in all three engines.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 102, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      102
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 112, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      112
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 102, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      102
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15.5, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15.5
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/HTML/Global_attributes/inert#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;the-linear-easing-function&quot;&gt;The &lt;code&gt;linear()&lt;/code&gt; easing function &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-04-2023/#the-linear-easing-function&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;linear()&lt;/code&gt; easing function enables linear interpolation between a number of points. This enables more complex animations such as bounce and elastic effects. This function is in Firefox 112.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 113, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      113
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 112, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      112
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 113, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      113
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id=&quot;css-nesting&quot;&gt;CSS nesting &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-04-2023/#css-nesting&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Chrome 112 adds support for &lt;a href=&quot;https://developer.chrome.com/articles/css-nesting/&quot; rel=&quot;noopener&quot;&gt;CSS Nesting&lt;/a&gt;, a feature that is highly anticipated by many developers. This introduces a new nesting selector &lt;code&gt;&amp;gt;&lt;/code&gt;, used to nest related style rules, in a way that will be familiar to developers who have used pre-processors:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.nesting&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hotpink&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;&gt; .is&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; rebeccapurple&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class=&quot;token selector&quot;&gt;&gt; .awesome&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; deeppink&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 112, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      112
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 112, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
112
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari 16.5, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
16.5
&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/Nesting_selectors#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;css-animation-composition&quot;&gt;CSS &lt;code&gt;animation-composition&lt;/code&gt; &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-04-2023/#css-animation-composition&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Chrome 112 also includes support for &lt;code&gt;animation-composition&lt;/code&gt;. Learn how this property works in &lt;a href=&quot;https://developer.chrome.com/articles/css-animation-composition/&quot; rel=&quot;noopener&quot;&gt;Specify how multiple animation effects should composite with animation-composition&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 112, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      112
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 115, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      115
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 112, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      112
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/animation-composition#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;new-headless-mode&quot;&gt;New headless mode &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-04-2023/#new-headless-mode&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you use Chrome&#39;s Headless mode, for example with Puppeteer, then 112 brings an all new Headless mode. Learn about it in &lt;a href=&quot;https://developer.chrome.com/articles/new-headless/&quot; rel=&quot;noopener&quot;&gt;Chrome&#39;s Headless mode gets an upgrade&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;beta-browser-releases&quot;&gt;Beta browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-04-2023/#beta-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beta browser versions give you a preview of things that will be in the next stable version of the browser. It&#39;s a great time to test new features, or removals, that could impact your site before the world gets that release. New betas are &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/113&quot; rel=&quot;noopener&quot;&gt;Firefox 113&lt;/a&gt; and &lt;a href=&quot;https://developer.chrome.com/blog/chrome-113-beta/&quot; rel=&quot;noopener&quot;&gt;Chrome 113&lt;/a&gt;, with the &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_5-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 16.5&lt;/a&gt; beta still ongoing. These releases bring many great features to the platform. Check out the release notes for all of the details, here are just a few highlights.&lt;/p&gt;
&lt;p&gt;Firefox 113 includes the &lt;code&gt;color()&lt;/code&gt;, &lt;code&gt;lab()&lt;/code&gt;, &lt;code&gt;lch()&lt;/code&gt;, &lt;code&gt;oklab()&lt;/code&gt;, and &lt;code&gt;oklch()&lt;/code&gt; functions. Also included is the &lt;a href=&quot;https://developer.chrome.com/blog/css-color-mix/&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;color-mix()&lt;/code&gt;&lt;/a&gt; function from CSS Color 5, and the &lt;code&gt;forced-color-adjust&lt;/code&gt; property.&lt;/p&gt;
&lt;p&gt;Firefox also includes the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/:nth-child#the_of_selector_syntax&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;nth-child of &amp;lt;selector&amp;gt;&lt;/code&gt;&lt;/a&gt; syntax, giving finer control of which elements you want to select. Read more in &lt;a href=&quot;https://developer.chrome.com/articles/css-nth-child-of-s/&quot; rel=&quot;noopener&quot;&gt;More control over :nth-child() selections with the of S syntax&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For CSS, Chrome 113 includes the &lt;code&gt;overflow-inline&lt;/code&gt;, &lt;code&gt;overflow-block&lt;/code&gt;, and &lt;code&gt;update&lt;/code&gt; media features. Also included in the &lt;code&gt;linear()&lt;/code&gt; easing function, and the unprefixed &lt;code&gt;image-set()&lt;/code&gt; type.&lt;/p&gt;
&lt;p&gt;Chrome 113 also includes &lt;a href=&quot;https://developer.chrome.com/blog/webgpu-release/&quot; rel=&quot;noopener&quot;&gt;WebGPU&lt;/a&gt;, the successor to the WebGL and WebGL 2 graphics APIs for the Web. It provides modern features such as GPU compute, lower overhead access to GPU hardware, the ability to render to multiple canvases from a single graphics device, and better, more predictable performance.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by &lt;a href=&quot;https://unsplash.com/@moonflowerstudiocreativet&quot; rel=&quot;noopener&quot;&gt;Karen Ciocca&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>New to the web platform in March</title>
    <link href="https://web.dev/web-platform-03-2023/"/>
    <updated>2023-03-31T00:00:00Z</updated>
    <id>https://web.dev/web-platform-03-2023/</id>
    <content type="html" mode="escaped">&lt;h2 id=&quot;stable-browser-releases&quot;&gt;Stable browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-03-2023/#stable-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In March 2023, &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/111&quot; rel=&quot;noopener&quot;&gt;Firefox 111&lt;/a&gt;, &lt;a href=&quot;https://developer.chrome.com/blog/new-in-chrome-111/&quot; rel=&quot;noopener&quot;&gt;Chrome 111&lt;/a&gt;, and &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_4-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 16.4&lt;/a&gt; became stable. Let&#39;s take a look at what this means for the web platform.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-bad-bg color-state-bad-text&quot;&gt;&lt;p class=&quot;cluster color-state-bad-text&quot;&gt;&lt;span class=&quot;aside__icon box-block &quot;&gt;&lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;Error sign&quot;&gt;   &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 15v-2h2v2h-2zm0-10v6h2V7h-2z&quot;&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/span&gt;&lt;strong&gt;Caution&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot; flow&quot;&gt; We include browser compatibility data pulled from MDN in these posts which may not have updated for very recent browser releases. The post will show the correct information as soon as it appears in the &lt;a href=&quot;https://github.com/mdn/browser-compat-data/releases&quot;&gt;browser-compat-data release&lt;/a&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;h3 id=&quot;global-html-attributes&quot;&gt;Global HTML attributes &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-03-2023/#global-html-attributes&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Firefox 111 adds support for a couple of useful &lt;a href=&quot;https://web.dev/learn/html/attributes/#global-attributes&quot;&gt;global HTML attributes&lt;/a&gt;. The &lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTML/Global_attributes/autocapitalize&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;autocapitalize&lt;/code&gt;&lt;/a&gt; attribute controls whether text may be automatically capitalized when the user is typing on a virtual keyboard.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 43, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      43
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 111, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      111
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 79, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      79
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/HTML/Global_attributes/autocapitalize#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTML/Global_attributes/translate&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;translate&lt;/code&gt;&lt;/a&gt; attribute indicates whether an element should be translated when a page is localized.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 19, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      19
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 111, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      111
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 79, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      79
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 6, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      6
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/HTML/Global_attributes/translate#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;origin-private-file-system-opfs&quot;&gt;Origin Private File System (OPFS) &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-03-2023/#origin-private-file-system-opfs&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Firefox adds support for the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/File_System_Access_API#origin_private_file_system&quot; rel=&quot;noopener&quot;&gt;Origin Private File System (OPFS)&lt;/a&gt; when using the File System Access API. &lt;a href=&quot;https://developer.chrome.com/articles/origin-private-file-system/&quot; rel=&quot;noopener&quot;&gt;Learn more about the OPFS&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;the-view-transitions-api&quot;&gt;The View Transitions API &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-03-2023/#the-view-transitions-api&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Chrome 111 adds the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/View_Transitions_API&quot; rel=&quot;noopener&quot;&gt;View Transitions API&lt;/a&gt;, making the creation of polished transitions in Single-Page Apps (SPAs) simpler by snapshotting views and allowing the DOM to change without any overlap between states.&lt;/p&gt;
&lt;p&gt;Find out more in the launch post &lt;a href=&quot;https://developer.chrome.com/blog/spa-view-transitions-land/&quot; rel=&quot;noopener&quot;&gt;SPA view transitions land in Chrome 111&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 111, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      111
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 111, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
111
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/ViewTransition#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;new-css-color-spaces-and-functions&quot;&gt;New CSS color spaces and functions &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-03-2023/#new-css-color-spaces-and-functions&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Also included in Chrome 111 are a whole new set of ways to use color on the web. Chrome now supports color spaces that access colors outside of the RGB gamut, along with the &lt;code&gt;color()&lt;/code&gt; and &lt;code&gt;color-mix()&lt;/code&gt; functions. Learn more in our &lt;a href=&quot;https://developer.chrome.com/articles/high-definition-css-color-guide/&quot; rel=&quot;noopener&quot;&gt;High definition CSS color guide&lt;/a&gt; and &lt;a href=&quot;https://developer.chrome.com/blog/css-color-mix/&quot; rel=&quot;noopener&quot;&gt;blog post on &lt;code&gt;color-mix()&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 111, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      111
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 113, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      113
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 111, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      111
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16.2, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16.2
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/color_value/color-mix#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;The Chrome release also includes &lt;a href=&quot;https://developer.chrome.com/blog/new-in-devtools-111/#color&quot; rel=&quot;noopener&quot;&gt;new DevTools&lt;/a&gt; to help you work with this new color functionality.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; You can also test the new color functions &lt;code&gt;color()&lt;/code&gt;, &lt;code&gt;lab()&lt;/code&gt;, &lt;code&gt;lch()&lt;/code&gt;, &lt;code&gt;oklab()&lt;/code&gt;, and &lt;code&gt;oklch()&lt;/code&gt; in Firefox 111, currently behind a preference &lt;code&gt;layout.css.more_color_4.enabled&lt;/code&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;h3 id=&quot;more-control-over-nth-child-selections&quot;&gt;More control over &lt;code&gt;:nth-child()&lt;/code&gt; selections &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-03-2023/#more-control-over-nth-child-selections&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Chrome 111 adds the ability to pass a selector list into &lt;code&gt;:nth-child()&lt;/code&gt; and &lt;code&gt;nth-last-child()&lt;/code&gt;. Learn more about this, and see examples in the post &lt;a href=&quot;https://developer.chrome.com/articles/css-nth-child-of-s/&quot; rel=&quot;noopener&quot;&gt;More control over :nth-child() selections with the of S syntax&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 111, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      111
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 113, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      113
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 111, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      111
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 9, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      9
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id=&quot;support-for-previous-and-next-slide-in-the-media-session-api&quot;&gt;Support for previous and next slide in the Media Session API &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-03-2023/#support-for-previous-and-next-slide-in-the-media-session-api&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Finally in this list of Chrome 111 additions are the &lt;a href=&quot;https://web.dev/media-session/#presenting-slides-actions&quot;&gt;Presenting slides actions&lt;/a&gt; for the media session API—&lt;code&gt;&amp;quot;previousslide&amp;quot;&lt;/code&gt; and &lt;code&gt;&amp;quot;nextslide&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 111, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      111
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 111, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
111
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id=&quot;pseudo-class-support-in-safari&quot;&gt;Pseudo-class support in Safari &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-03-2023/#pseudo-class-support-in-safari&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Safari 16.4 is an amazing release for the web platform. This article won&#39;t cover all of the additions, so check out the full list of features in the &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_4-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 16.4 release notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There&#39;s a bunch of additional CSS pseudo-classes with support in this release: &lt;code&gt;:user-invalid&lt;/code&gt;, &lt;code&gt;:user-valid&lt;/code&gt;, &lt;code&gt;:dir()&lt;/code&gt;, &lt;code&gt;:modal&lt;/code&gt;, and &lt;code&gt;:fullscreen&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;new-range-syntax-for-media-queries&quot;&gt;New range syntax for media queries &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-03-2023/#new-range-syntax-for-media-queries&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This Safari release makes the far more elegant and useful range syntax for media queries interoperable across all three engines. See examples of this syntax in &lt;a href=&quot;https://developer.chrome.com/blog/media-query-range-syntax/&quot; rel=&quot;noopener&quot;&gt;this post&lt;/a&gt;, published when the syntax shipped in Chrome.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 104, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      104
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 102, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      102
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 104, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      104
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/Media_Queries/Using_media_queries#syntax_improvements_in_level_4#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;css-properties-and-values&quot;&gt;CSS Properties and Values &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-03-2023/#css-properties-and-values&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Safari 16.4 adds support for &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@property&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;@property&lt;/code&gt;&lt;/a&gt;, enabling CSS custom property registration directly in a stylesheet. Learn more about this in &lt;a href=&quot;https://web.dev/at-property/&quot;&gt;@property: giving superpowers to CSS variables&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 85, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      85
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 85, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
85
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari 16.4, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
16.4
&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/@property#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;css-api-support&quot;&gt;CSS API support &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-03-2023/#css-api-support&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The great additions for CSS keep coming, with support for the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/CSS_Typed_OM_API&quot; rel=&quot;noopener&quot;&gt;CSS Typed OM&lt;/a&gt;. This API exposes CSS values as typed JavaScript objects rather than strings. It makes working with CSS from JavaScript easier, and is more performant than existing methods.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 66, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      66
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 79, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
79
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari 16.4, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
16.4
&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/CSSStyleValue#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;There is also support for constructable stylesheets with &lt;code&gt;CSSStyleSheet()&lt;/code&gt;. This enables the sharing of stylesheets between a document and its shadow DOM subtrees. With this version of Safari, constructable stylesheets are now supported in all three engines.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 73, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      73
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 101, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      101
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 79, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      79
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/CSSStyleSheet/CSSStyleSheet#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;web-push-and-the-badging-api&quot;&gt;Web Push and the Badging API &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-03-2023/#web-push-and-the-badging-api&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Safari now suports Web Push, along with the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/Badging_API&quot; rel=&quot;noopener&quot;&gt;Badging API&lt;/a&gt;, which is great news for app developers. In particular, this version means that &lt;a href=&quot;https://web.dev/push-notifications-in-all-modern-browsers/&quot;&gt;push notifications are supported&lt;/a&gt; in all major engines.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 42, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      42
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 44, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      44
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 17, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      17
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/PushEvent/PushEvent#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;import-maps&quot;&gt;Import maps &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-03-2023/#import-maps&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Another addition that brings a feature to interoperable status is the addition of JavaScript &lt;a href=&quot;https://web.dev/import-maps-in-all-modern-browsers/&quot;&gt;Import maps&lt;/a&gt;, making importing ES modules much easier.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 89, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      89
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 108, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      108
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 89, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      89
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id=&quot;beta-browser-releases&quot;&gt;Beta browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-03-2023/#beta-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beta browser versions give you a preview of things that will be in the next stable version of the browser. It&#39;s a great time to test new features, or removals, that could impact your site before the world gets that release. New betas are &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/112&quot; rel=&quot;noopener&quot;&gt;Firefox 112&lt;/a&gt;, &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_5-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 16.5&lt;/a&gt;, and &lt;a href=&quot;https://developer.chrome.com/blog/chrome-112-beta/&quot; rel=&quot;noopener&quot;&gt;Chrome 112&lt;/a&gt;. These releases bring many great features to the platform. Check out the release notes for all of the details, here are just a few highlights.&lt;/p&gt;
&lt;p&gt;Firefox 112 adds support for the &lt;code&gt;inert&lt;/code&gt; attribute, which will make this useful attribute available across all engines. You can learn more about inert in &lt;a href=&quot;https://developer.chrome.com/articles/inert/&quot; rel=&quot;noopener&quot;&gt;Introducing inert&lt;/a&gt;. Firefox will also enable support for the &lt;code&gt;linear()&lt;/code&gt; easing function.&lt;/p&gt;
&lt;p&gt;Chrome 112 and Safari 16.5 both add support for &lt;a href=&quot;https://developer.chrome.com/articles/css-nesting/&quot; rel=&quot;noopener&quot;&gt;CSS Nesting&lt;/a&gt;, a feature that is highly anticipated by many developers.&lt;/p&gt;
&lt;p&gt;Chrome 112 also includes support for &lt;code&gt;animation-composition&lt;/code&gt;. Learn how this property works in &lt;a href=&quot;https://developer.chrome.com/articles/css-animation-composition/&quot; rel=&quot;noopener&quot;&gt;Specify how multiple animation effects should composite with animation-composition&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you use Chrome&#39;s Headless mode, for example with Puppeteer, then 112 brings an all new Headless mode. Learn about it in &lt;a href=&quot;https://developer.chrome.com/articles/new-headless/&quot; rel=&quot;noopener&quot;&gt;Chrome&#39;s Headless mode gets an upgrade&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by &lt;a href=&quot;https://unsplash.com/@taliscope?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot; rel=&quot;noopener&quot;&gt;Tali Khrab&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>New to the web platform in February</title>
    <link href="https://web.dev/web-platform-02-2023/"/>
    <updated>2023-02-28T00:00:00Z</updated>
    <id>https://web.dev/web-platform-02-2023/</id>
    <content type="html" mode="escaped">&lt;h2 id=&quot;stable-browser-releases&quot;&gt;Stable browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-02-2023/#stable-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In February 2023, &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/110&quot; rel=&quot;noopener&quot;&gt;Firefox 110&lt;/a&gt; and &lt;a href=&quot;https://developer.chrome.com/blog/new-in-chrome-110/&quot; rel=&quot;noopener&quot;&gt;Chrome 110&lt;/a&gt; became stable. Let&#39;s take a look at what this means for the web platform.&lt;/p&gt;
&lt;h3 id=&quot;container-queries-in-all-three-engines&quot;&gt;Container queries in all three engines &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-02-2023/#container-queries-in-all-three-engines&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Firefox 110 included support for &lt;a href=&quot;https://web.dev/cq-stable/&quot;&gt;size container queries&lt;/a&gt;, making this key feature available in all three engines.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 105, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      105
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 110, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      110
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 105, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      105
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/@container#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;css-initial-letters&quot;&gt;CSS initial letters &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-02-2023/#css-initial-letters&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Chrome 110 adds support for the CSS &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/initial-letter&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;initial-letter&lt;/code&gt;&lt;/a&gt; property. This property sets the number of lines an initial letter should sink into the following lines of text. Learn more in the post &lt;a href=&quot;https://developer.chrome.com/blog/control-your-drop-caps-with-css-initial-letter/&quot; rel=&quot;noopener&quot;&gt;Control your drop caps with CSS initial-letter&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 110, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      110
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 110, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
110
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari 9, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
9
&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/initial-letter#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;readablestream-async-iteration&quot;&gt;ReadableStream async iteration &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-02-2023/#readablestream-async-iteration&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Firefox added support for the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/ReadableStream#async_iteration&quot; rel=&quot;noopener&quot;&gt;async interable protocol in &lt;code&gt;ReadableStream&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id=&quot;audiocontextsetsinkid&quot;&gt;AudioContext.setSinkId() &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-02-2023/#audiocontextsetsinkid&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In Chrome &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/AudioContext/setSinkId&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;AudioContext.setSinkId&lt;/code&gt;&lt;/a&gt; sets the ID of the audio device to use for output. This allows the &lt;code&gt;AudioContext&lt;/code&gt; to route audio to a connected output device of the user&#39;s choosing.&lt;/p&gt;
&lt;p&gt;Learn more about this feature in the post &lt;a href=&quot;https://developer.chrome.com/blog/audiocontext-setsinkid/&quot; rel=&quot;noopener&quot;&gt;Change the destination output device in Web Audio&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 110, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      110
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 110, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
110
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/AudioContext/setSinkId#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;iframe-credentialless&quot;&gt;IFrame credentialless &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-02-2023/#iframe-credentialless&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Also in Chrome, &lt;a href=&quot;https://developer.mozilla.org/docs/Web/Security/IFrame_credentialless&quot; rel=&quot;noopener&quot;&gt;IFrame credentialless&lt;/a&gt; gives developers a way to load documents in third party iframes using new and ephemeral contexts. Iframe credentialless are a generalization of COEP credentialless to support third-party iframes that may not deploy COEP. This removes the constraint that third-party iframes must support COEP in order to be embedded in a COEP page and will unblock developers looking to adopt cross-origin-isolation.&lt;/p&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developer.chrome.com/blog/iframe-credentialless/&quot; rel=&quot;noopener&quot;&gt;iframe credentialless&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 110, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      110
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 110, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
110
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id=&quot;early-stable&quot;&gt;Early stable &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-02-2023/#early-stable&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Chrome 110 also marked a change in the Chrome release schedule. The &lt;em&gt;early stable&lt;/em&gt; release will roll out a week earlier than the general release, to a small percentage of users. You can learn more about this change in the article &lt;a href=&quot;https://developer.chrome.com/blog/early-stable/&quot; rel=&quot;noopener&quot;&gt;change in release schedule from Chrome 110&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;beta-browser-releases&quot;&gt;Beta browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-02-2023/#beta-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beta browser versions give you a preview of things that will be in the next stable version of the browser. It&#39;s a great time to test new features, or removals, that could impact your site before the world gets that release. New betas are &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/111&quot; rel=&quot;noopener&quot;&gt;Firefox 111&lt;/a&gt;, &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_4-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 16.4&lt;/a&gt;, and &lt;a href=&quot;https://developer.chrome.com/blog/chrome-111-beta/&quot; rel=&quot;noopener&quot;&gt;Chrome 111&lt;/a&gt;. These releases bring many great features to the platform. Check out the release notes for all of the details, here are just a few highlights.&lt;/p&gt;
&lt;p&gt;Firefox adds support for the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/File_System_Access_API#origin_private_file_system&quot; rel=&quot;noopener&quot;&gt;Origin Private File System (OPFS)&lt;/a&gt; when using the File System Access API.&lt;/p&gt;
&lt;p&gt;Chrome includes all features described in CSS Color Level 4. This includes four device-independent color types (lab, Oklab, lch and Oklch), the &lt;code&gt;color()&lt;/code&gt; function, and user-defined color spaces for gradients and animations. Also included is the &lt;a href=&quot;https://developer.chrome.com/blog/css-color-mix/&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;color-mix()&lt;/code&gt;&lt;/a&gt; function from CSS Color 5.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href=&quot;https://developer.chrome.com/articles/high-definition-css-color-guide/&quot; rel=&quot;noopener&quot;&gt;High definition CSS color guide&lt;/a&gt; to learn about these new color types and spaces.&lt;/p&gt;
&lt;p&gt;Chrome also includes the View Transitions API, that enables polished transitions in Single-Page Applications (SPAs). Find out more in the documentation for &lt;a href=&quot;https://developer.chrome.com/docs/web-platform/view-transitions/&quot; rel=&quot;noopener&quot;&gt;View Transitions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Also in Chrome 111 is the &lt;a href=&quot;https://developer.chrome.com/articles/declarative-shadow-dom/&quot; rel=&quot;noopener&quot;&gt;declarative shadow DOM&lt;/a&gt;, a new way to implement and use shadow DOM directly in HTML.&lt;/p&gt;
&lt;p&gt;Safari 16.4 promises to be a huge release for the platform. For CSS the release includes support for the &lt;a href=&quot;https://developer.mozilla.org/docs/web/css/:user-invalid&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;:user-invalid&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://developer.mozilla.org/docs/web/css/:user-valid&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;:user-valid&lt;/code&gt;&lt;/a&gt; pseudo-classes, the &lt;a href=&quot;https://developer.mozilla.org/docs/web/css/margin-trim&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;margin-trim&lt;/code&gt;&lt;/a&gt; property, the &lt;a href=&quot;https://developer.chrome.com/blog/media-query-range-syntax/&quot; rel=&quot;noopener&quot;&gt;range syntax for media queries&lt;/a&gt;, and support for the CSS Properties and Values API and &lt;a href=&quot;https://developer.mozilla.org/docs/web/css/@property&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;@property&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Safari also includes support for Web Push, and the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/Badging_API&quot; rel=&quot;noopener&quot;&gt;Badging API&lt;/a&gt;, along with a number of other Web APIs. It&#39;s a really exciting release that will see a number of features &lt;a href=&quot;https://web.dev/tags/newly-interoperable/&quot;&gt;reach interoperability&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by &lt;a href=&quot;https://unsplash.com/fr/@ro_ka?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot; rel=&quot;noopener&quot;&gt;Robert Katzki&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Introducing Learn Privacy</title>
    <link href="https://web.dev/introducing-learn-privacy/"/>
    <updated>2023-02-22T00:00:00Z</updated>
    <id>https://web.dev/introducing-learn-privacy/</id>
    <content type="html" mode="escaped">&lt;p&gt;Today we are excited to announce the latest in our series of courses on web.dev. &lt;a href=&quot;https://web.dev/learn/privacy/&quot;&gt;Learn Privacy&lt;/a&gt; is a brand new course written by &lt;a href=&quot;https://twitter.com/sil&quot; rel=&quot;noopener&quot;&gt;Stuart Langridge&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When you acquire a new user, you are granted their trust. It&#39;s your organization&#39;s responsibility to honor this trust by keeping
user data private. And, as a developer, you have a key role to play. This course will help you to understand the ways in which you can help to protect the privacy of your users, with code snippets, best practices, and questions to ask yourself and your team on your privacy journey.&lt;/p&gt;
&lt;p&gt;Learn Privacy joins our existing courses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/css/&quot;&gt;Learn CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/html/&quot;&gt;Learn HTML&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/accessibility&quot;&gt;Learn Accessibility&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/images/&quot;&gt;Learn Images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/design/&quot;&gt;Learn Responsive Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/forms/&quot;&gt;Learn Forms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/pwa/&quot;&gt;Learn PWA&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Watch this space for more opportunities to learn key web development skills, coming up very soon!&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>All of Learn HTML! is available</title>
    <link href="https://web.dev/learn-html-available/"/>
    <updated>2023-02-21T00:00:00Z</updated>
    <id>https://web.dev/learn-html-available/</id>
    <content type="html" mode="escaped">&lt;p&gt;All modules in the &lt;a href=&quot;https://web.dev/learn/html/&quot;&gt;Learn HTML&lt;/a&gt; course are now
available. This course was written by &lt;a href=&quot;https://front-end.social/@estelle&quot; rel=&quot;noopener&quot;&gt;Estelle Weyl&lt;/a&gt; and takes you through an in-depth journey to really understand HTML.&lt;/p&gt;
&lt;p&gt;You can read them in whatever order you&#39;d like. The final modules, launched today, are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/html/forms/&quot;&gt;Forms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/html/images/&quot;&gt;Images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/html/audio-video/&quot;&gt;Audio and video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/html/template/&quot;&gt;Template, slot, and shadow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/html/apis/&quot;&gt;HTML APIs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/html/focus/&quot;&gt;Focus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/html/inline-text/&quot;&gt;Other inline text elements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/html/details/&quot;&gt;Details and summary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/html/dialog/&quot;&gt;Dialog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&#39;ve been writing HTML for a very long time, and I learned things while editing this course. There really is a lot more to HTML than you might think, and it&#39;s definitely worth revisiting some of the things you think you already know. Take a look, and don&#39;t forget to check out some of the &lt;a href=&quot;https://web.dev/learn/&quot;&gt;other courses in our growing collection&lt;/a&gt;.&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Last baseline alignment</title>
    <link href="https://web.dev/last-baseline/"/>
    <updated>2023-02-20T00:00:00Z</updated>
    <id>https://web.dev/last-baseline/</id>
    <content type="html" mode="escaped">&lt;aside class=&quot;aside flow bg-state-good-bg color-state-good-text&quot;&gt;&lt;p class=&quot;cluster &quot;&gt;&lt;span class=&quot;aside__icon box-block &quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 128 128&quot; style=&quot;enable-background:new 0 0 128 128&quot; xml:space=&quot;preserve&quot;&gt;&lt;path d=&quot;M7.5 123.3c2.2 2.4 11.6-1.9 19-5.3C32 115.4 54 106.3 65 101.6c3-1.2 7.3-2.9 10.4-7 2.8-3.6 10-19-4.6-34.7-15-16-30.4-11.5-36.2-7.5A28.5 28.5 0 0 0 27.3 63c-5.2 11.6-12.7 32.9-15.7 41.3-2.3 6.1-6.4 16.5-4.1 19z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M18 86.8s.7 6.5 6.1 14.6c6.3 9.6 15 11.2 15 11.2l-5.8 2.4s-6.5-2-12.7-10.4c-3.8-5.3-5-11.6-5-11.6l2.3-6.2zm-5.6 15.4s1.5 5.6 4.7 9.7c3.8 5 8.6 6.5 8.6 6.5l-4.5 2s-3.3-.8-7-5.5c-2.9-3.5-3.7-7.6-3.7-7.6l1.9-5.1z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M10 116.4c-.2-.5-.2-1 0-1.4l25.4-53 4.2 16-26.8 38.7c-.7 1-2.3 1-2.8-.2z&quot; style=&quot;opacity:.44&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M41.6 83.2c12 14 25.5 12.2 30 8.6 4.5-3.5 8.1-15.6-3.7-29.3C55.3 48.2 41.3 52.2 38 55.3s-7.4 15.1 3.5 27.9z&quot; style=&quot;fill: var(--color-state-good-bg);&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M82.5 89c-4.3-3.7-6.6-3-9.7-1.8a26 26 0 0 1-18.9 0l2.6-6.2c5 1.7 8.7 1 12-1 4-2.4 9.6-5.6 18.3 1.6 3.6 3 7.3 5.1 10 4.2 2-.7 3-3.6 3.6-6l.2-1.3c.4-3.7 1.2-11.6 7.1-15.7 6.4-4.3 13-4.3 13-4.3l1.2 12c-3-.5-5.2.1-7 1-6.7 3.8-.8 18.2-11.3 23-10.1 4.8-18.4-3.3-21-5.6zM45.4 73.7l-4.3-3.9c8-8.9 5.8-15.4 4.3-20.2A26.4 26.4 0 0 1 44 38.8c-3-3.8-4.4-7.8-4.5-8-1.9-5.7-.5-11.2 2.8-16.4C48.7 4 60.5 4 60.5 4l4 10.5c-3-.1-12.8 0-15.8 4.8-3.8 6-1.3 9.6-1.2 10 .8-1 1.5-1.7 2.2-2.3 4.8-4.2 9-4.8 11.6-4.6a11 11 0 0 1 7.6 4.2c2 2.7 3 6.2 2.3 9.4a11 11 0 0 1-5.8 7.4 16 16 0 0 1-13 1.5v.3l.6 2c1.8 5.4 5 14.1-7.6 26.5zm7.4-37.5c.5.4 1.1.8 1.8 1 2 .8 4.4.6 7-.8 1.5-.9 1.7-1.7 1.7-2 .2-.9 0-2-.7-2.8a2.8 2.8 0 0 0-2-1.2c-1.6-.2-3.6.8-5.6 2.6-1 .9-1.7 2-2.3 3.2zm10 39.1-6.2-.1s3-16.7 12.5-19.5c1.8-.5 3.7-1 5.7-1.3l4-.8c.1-1.6-.5-3.6-1.3-5.9-.6-1.7-1.2-3.5-1.5-5.5-.6-3.9.4-7.3 3-9.6 3-2.9 7.9-3.8 13.4-2.5 3.2.7 5.5 2.2 7.6 3.6 2.9 2 4.6 3 8.2.5 4.3-2.9-1.4-14.3-4.4-21l11.3-4.6c1.5 3.3 8.8 20.3 4 30a11.5 11.5 0 0 1-8.1 6.2c-8 1.8-12.6-1.3-16-3.6-1.6-1-3-1.9-4.6-2.3-10.6-3 4.2 12.6-2.7 19.6-4.2 4.2-14.4 5.3-15 5.5-6.6 1.6-10 11.3-10 11.3z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M44 38.8c-.2 2.2-.3 3.5.3 6.4 2.7 2 8.7 2 8.7 2l-.6-2v-.3c-6.1-3-8.4-6.1-8.4-6.1zm-12.5 9.8-10.3-5 5.1-7.5 8.2 5.4zm-15.2-14A26 26 0 0 1 5 28.9l5.2-6c1.6 1.2 5 3.5 7.2 3.8l-1.1 7.9zM25.6 21.3 18 18.8a18 18 0 0 0 .7-8.3l7.9-1.3c.6 4 .3 8.2-1 12zM73 15.3l7.9-1.7L83 23.9l-7.8 1.7zM92.5 17.8 87 12c2.8-2.8 3.5-6.3 3.5-6.4L98.4 7c-.1.6-1.1 6.3-6 10.9zM95.5 48.6l7-2.2 2.3 7.7-7 2.1zM97.5 113l-7.9-1c.3-2.7-1.8-6.2-2.4-7l6.4-4.8c.5.6 4.7 6.4 4 12.8zM120.4 102.9c-3-.5-6-.6-9.1-.5l-.3-8c3.5-.2 7 0 10.6.6l-1.2 7.9zM109.6 113.9l5.6-5.7 7.8 7.6-5.6 5.7zM93.1 63.3 99 70l-6.6 5.8-5.8-6.6z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt; &lt;/span&gt;&lt;strong&gt;Celebration&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot; flow&quot;&gt; This web feature is now available in all three major browser engines! &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;Alignment using the &lt;code&gt;first&lt;/code&gt; and &lt;code&gt;last&lt;/code&gt; keywords is now available in all major engines. This means that we can use last baseline alignment as another option when aligning groups of flex or grid items.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 108, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      108
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 52, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      52
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 108, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      108
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16.2, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16.2
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id=&quot;first-baseline-alignment&quot;&gt;First baseline alignment &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/last-baseline/#first-baseline-alignment&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you set the value of &lt;code&gt;align-items&lt;/code&gt; to &lt;code&gt;baseline&lt;/code&gt;, the result will be first baseline alignment. Therefore the first baseline of the item you are aligning (described as the &lt;em&gt;alignment subject&lt;/em&gt;) will align with the first baseline of the other items in the group. You can see this in the following example, where the first two flex items are aligned using &lt;code&gt;align-items: baseline&lt;/code&gt;, so they align along the baseline created by the larger text. The final item is aligned to &lt;code&gt;flex-start&lt;/code&gt; and therefore aligns to the start of the flex container.&lt;/p&gt;
&lt;div class=&quot;codepen-embed-wrap&quot; style=&quot;height: 450px; width: 100%&quot;&gt;
&lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi;&quot; loading=&quot;lazy&quot; src=&quot;https://codepen.io/web-dot-dev/embed/xxaGaqq?height=450&amp;theme-id=light&amp;default-tab=result&amp;editable=true&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;Pen xxaGaqq by web-dot-dev on Codepen&quot;&gt;See the Pen &lt;a href=&quot;https://codepen.io/web-dot-dev/embed/xxaGaqq&quot;&gt;Pen xxaGaqq by web-dot-dev on Codepen&lt;/a&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;h2 id=&quot;last-baseline-alignment&quot;&gt;Last baseline alignment &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/last-baseline/#last-baseline-alignment&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When aligning a grid or flex item with the value &lt;code&gt;last baseline&lt;/code&gt;, the last baseline of that item will align to the last baseline of the &lt;em&gt;baseline sharing group&lt;/em&gt; that it is part of. The following example demonstrates last baseline alignment, with the first flex item aligning with the last line of text in the larger item. The final item in this group is aligned to &lt;code&gt;flex-end&lt;/code&gt;, which is the end of the flex container.&lt;/p&gt;
&lt;div class=&quot;codepen-embed-wrap&quot; style=&quot;height: 450px; width: 100%&quot;&gt;
&lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi;&quot; loading=&quot;lazy&quot; src=&quot;https://codepen.io/web-dot-dev/embed/ExejeWN?height=450&amp;theme-id=light&amp;default-tab=result&amp;editable=true&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;Pen ExejeWN by web-dot-dev on Codepen&quot;&gt;See the Pen &lt;a href=&quot;https://codepen.io/web-dot-dev/embed/ExejeWN&quot;&gt;Pen ExejeWN by web-dot-dev on Codepen&lt;/a&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;h2 id=&quot;fallback-alignment&quot;&gt;Fallback alignment &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/last-baseline/#fallback-alignment&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If the alignment subject does not have a baseline sharing group to align to, then a fallback alignment will be used. For &lt;code&gt;baseline&lt;/code&gt;, and &lt;code&gt;first baseline&lt;/code&gt; the fallback alignment is &lt;code&gt;start&lt;/code&gt;, and for &lt;code&gt;last baseline&lt;/code&gt; the fallback alignment is &lt;code&gt;end&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Photo by &lt;a href=&quot;https://unsplash.com/@heftiba?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot; rel=&quot;noopener&quot;&gt;Toa Heftiba&lt;/a&gt;.&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Interop 2023: continuing to improve the web for developers</title>
    <link href="https://web.dev/interop-2023/"/>
    <updated>2023-02-01T00:00:00Z</updated>
    <id>https://web.dev/interop-2023/</id>
    <content type="html" mode="escaped">&lt;p&gt;In 2023, all major browser vendors and other stakeholders are again working together to solve the top browser compatibility issues. The effort started on this scale with Interop 2022, and you can learn what we achieved together in the &lt;a href=&quot;https://web.dev/interop-2022-wrapup/&quot;&gt;end-of-year post&lt;/a&gt;. Everyone involved believes this will help improve the experience for web developers everywhere. This year, for the first time, we publicly announced the &lt;a href=&quot;https://web.dev/submit-your-proposals-for-interop-2023/&quot;&gt;proposal process&lt;/a&gt; and got many great suggestions from frameworks, large companies, browser vendors, and developers everywhere.&lt;/p&gt;
&lt;h2 id=&quot;the-interop-2023-focus-areas&quot;&gt;The Interop 2023 focus areas &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2023/#the-interop-2023-focus-areas&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This time around, we have no less than 26 focus areas, outlined in detail in our &lt;a href=&quot;https://github.com/web-platform-tests/interop/blob/main/2023/README.md#focus-areas&quot; rel=&quot;noopener&quot;&gt;project document&lt;/a&gt;. They are, in alphabetical order:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/border-image&quot; rel=&quot;noopener&quot;&gt;Border Image in CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/color_value&quot; rel=&quot;noopener&quot;&gt;Color Spaces and Functions in CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Container_Queries&quot; rel=&quot;noopener&quot;&gt;Container Queries in CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Containment&quot; rel=&quot;noopener&quot;&gt;Containment in CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/Pseudo-classes&quot; rel=&quot;noopener&quot;&gt;CSS Pseudo-classes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@property&quot; rel=&quot;noopener&quot;&gt;Custom Properties in CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Learn/CSS/CSS_layout/Flexbox&quot; rel=&quot;noopener&quot;&gt;Flexbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@supports#function_syntax&quot; rel=&quot;noopener&quot;&gt;Font feature detection&lt;/a&gt; and &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/font-palette&quot; rel=&quot;noopener&quot;&gt;palettes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTML/Element/form&quot; rel=&quot;noopener&quot;&gt;Forms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Grid_Layout&quot; rel=&quot;noopener&quot;&gt;Grid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/:has&quot; rel=&quot;noopener&quot;&gt;:has()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/HTMLElement/inert&quot; rel=&quot;noopener&quot;&gt;Inert&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Masking&quot; rel=&quot;noopener&quot;&gt;Masking in CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Functions#math_functions&quot; rel=&quot;noopener&quot;&gt;Math Functions in CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/Media_Queries/Using_media_queries&quot; rel=&quot;noopener&quot;&gt;Media Queries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/Web_Workers_API/Using_web_workers&quot; rel=&quot;noopener&quot;&gt;Modules in Web Workers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Motion_Path&quot; rel=&quot;noopener&quot;&gt;Motion Path in CSS Animations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/OffscreenCanvas&quot; rel=&quot;noopener&quot;&gt;Offscreen Canvas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/Pointer_events&quot; rel=&quot;noopener&quot;&gt;Pointer and mouse Events&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/URL&quot; rel=&quot;noopener&quot;&gt;URL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Web Compat 2023: A catchall focus area for small bugs that cause known site compatibility issues&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/WebCodecs_API&quot; rel=&quot;noopener&quot;&gt;Web Codecs (video)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/Web_Components&quot; rel=&quot;noopener&quot;&gt;Web Components&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can find full details of all focus areas at &lt;a href=&quot;https://github.com/web-platform-tests/interop/blob/main/2023/README.md#focus-areas&quot; rel=&quot;noopener&quot;&gt;Web Platform Tests&lt;/a&gt; based on &lt;a href=&quot;https://developer.mozilla.org/&quot; rel=&quot;noopener&quot;&gt;MDN Web Docs&lt;/a&gt;, however here are a few that we think you might be really excited about.&lt;/p&gt;
&lt;h3 id=&quot;container-queries&quot;&gt;Container Queries &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2023/#container-queries&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Container queries has been a &lt;a href=&quot;https://2021.stateofcss.com/opinions/#currently_missing_from_css_wins&quot; rel=&quot;noopener&quot;&gt;top request&lt;/a&gt; from developers for many years, and in 2022 Chrome and Safari shipped it. Firefox expects to ship container queries in Firefox 110, and the tests for this focus area help to ensure that container queries work reliably cross-browser and according to the spec.&lt;/p&gt;
&lt;h3 id=&quot;has&quot;&gt;:has(…) &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2023/#has&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Developers have for a long time asked for a parent selector in CSS. The &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/:has&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;:has()&lt;/code&gt;&lt;/a&gt; pseudo-class makes possible many of the use cases for parent selectors, as well as selecting a previous sibling element with respect to a reference element. For example, this makes it possible to style a figure that has a caption differently to one that doesn’t. Learn more about the use cases for &lt;code&gt;has()&lt;/code&gt; in &lt;a href=&quot;https://developer.chrome.com/blog/has-m105/&quot; rel=&quot;noopener&quot;&gt;:has(), the family selector&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;custom-properties&quot;&gt;Custom Properties &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2023/#custom-properties&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;CSS custom properties, also known as CSS variables, make it possible to define a value once in a stylesheet and reuse that in many places, reducing repetition. For example, you can define a common color or font size once in a stylesheet and use this across components. Basic support for custom properties has been in browsers for a long time. Interop 2023 focuses on the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@property&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;@property&lt;/code&gt;&lt;/a&gt; at-rule. &lt;code&gt;@property&lt;/code&gt; represents a custom property registration in a stylesheet, allowing for property type checking, setting default values, and whether the property should inherit values. Learn more in &lt;a href=&quot;https://web.dev/at-property/&quot;&gt;@property: giving superpowers to CSS variables&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;css-masking&quot;&gt;CSS masking &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2023/#css-masking&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Masking&quot; rel=&quot;noopener&quot;&gt;CSS masking&lt;/a&gt; provides methods to apply image effects, such as you might see in a graphics application, using CSS. Support for the various masking properties is patchy, making masking harder to use than it should be. This focus area will help developers to confidently use creative effects cross-browser. Learn more about applying effects to images in this &lt;a href=&quot;https://web.dev/css-masking/&quot;&gt;article about image masking&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;offscreencanvas&quot;&gt;OffscreenCanvas &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2023/#offscreencanvas&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTML/Element/canvas&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt;&lt;/a&gt;  element and Canvas API provide a scriptable way to draw graphics to the screen. However, this can cause performance problems as the work is completed on the same thread as user interaction.  &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/OffscreenCanvas&quot; rel=&quot;noopener&quot;&gt;OffscreenCanvas&lt;/a&gt; offers developers a canvas which is decoupled from the DOM and the Canvas API. Developers can also run rendering tasks in a Web Worker, separate from the main thread. Learn more about &lt;a href=&quot;https://developer.chrome.com/blog/offscreen-canvas/&quot; rel=&quot;noopener&quot;&gt;the performance benefits of OffscreenCanvas&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;pointer-and-mouse-events&quot;&gt;Pointer and mouse events &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2023/#pointer-and-mouse-events&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/Pointer_events&quot; rel=&quot;noopener&quot;&gt;Pointer events&lt;/a&gt; are fired when interacting with a page using a mouse, pen, stylus, or touch screen. Mouse events are fired when using a mouse, but for historical reasons also for touch. This focus area covers the behavior of pointer and mouse interaction with pages, including how they interact with hit testing and scrolling areas. The focus area for 2023 excludes touch and stylus, due to a lack of Web Platform Tests in this area.&lt;/p&gt;
&lt;h3 id=&quot;webcodecs&quot;&gt;WebCodecs &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2023/#webcodecs&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/WebCodecs_API&quot; rel=&quot;noopener&quot;&gt;WebCodecs API&lt;/a&gt; provides methods for developers to access the individual frames of video, and chunks of audio. It offers access to codecs that are already available in the browser, and various interfaces to interact with them. The article &lt;a href=&quot;https://developer.chrome.com/en/articles/webcodecs/&quot; rel=&quot;noopener&quot;&gt;Video processing with WebCodecs&lt;/a&gt; shows how to use the API to decode and render individual frames to a canvas.&lt;/p&gt;
&lt;h3 id=&quot;web-components&quot;&gt;Web Components &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2023/#web-components&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/Web_Components&quot; rel=&quot;noopener&quot;&gt;Web Components&lt;/a&gt; is an umbrella term for a number of technologies used to create reusable components, such as Custom Elements and Shadow DOM. Interop 2023 will focus on improving the interoperability of these foundational technologies.&lt;/p&gt;
&lt;h2 id=&quot;dashboard&quot;&gt;Dashboard &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2023/#dashboard&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Follow progress throughout the year &lt;a href=&quot;https://wpt.fyi/interop-2023/&quot; rel=&quot;noopener&quot;&gt;on the Interop 2023 dashboard&lt;/a&gt;, where you can see current scores and the status of addressing these focus areas across all major browser engines.&lt;/p&gt;
&lt;figure&gt;
&lt;a href=&quot;https://wpt.fyi/interop-2023/&quot;&gt;
&lt;img alt=&quot;The Scores for Interop overall: 62, Investigations: 0, and the scores per browser - 86 for Chrome and Edge, 74 for Firefox, 86 for Safari Technology Preview.&quot; decoding=&quot;async&quot; height=&quot;866&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/rK7xV8u6Jvf9oSl7VkCT.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;/a&gt;
&lt;figcaption&gt;The Interop 2023 Dashboard (screenshot taken January 31st, 2023).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The Focus Area scores are calculated based on test pass rates. If you have feedback or want to contribute improvements to &lt;a href=&quot;https://github.com/web-platform-tests/wpt&quot; rel=&quot;noopener&quot;&gt;WPT&lt;/a&gt;, please file an issue to request updating the set of tests used for scoring.&lt;/p&gt;
&lt;figure&gt;
&lt;a href=&quot;https://wpt.fyi/interop-2023/&quot;&gt;
&lt;img alt=&quot;A list of all Active Focus Areas together with browser scores and overall Interop score&quot; decoding=&quot;async&quot; height=&quot;1032&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/NYQC2r4udqv0RXxrkWVe.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/NYQC2r4udqv0RXxrkWVe.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/NYQC2r4udqv0RXxrkWVe.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/NYQC2r4udqv0RXxrkWVe.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/NYQC2r4udqv0RXxrkWVe.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/NYQC2r4udqv0RXxrkWVe.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/NYQC2r4udqv0RXxrkWVe.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/NYQC2r4udqv0RXxrkWVe.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/NYQC2r4udqv0RXxrkWVe.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/NYQC2r4udqv0RXxrkWVe.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/NYQC2r4udqv0RXxrkWVe.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/NYQC2r4udqv0RXxrkWVe.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/NYQC2r4udqv0RXxrkWVe.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/NYQC2r4udqv0RXxrkWVe.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/NYQC2r4udqv0RXxrkWVe.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/NYQC2r4udqv0RXxrkWVe.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/NYQC2r4udqv0RXxrkWVe.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/NYQC2r4udqv0RXxrkWVe.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;/a&gt;
&lt;figcaption&gt;All the Active Focus Areas and their overall Interop Score.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;more-about-interop-2023&quot;&gt;More about Interop 2023 &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2023/#more-about-interop-2023&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/13706/interop-2023/&quot; rel=&quot;noopener&quot;&gt;Apple&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bocoup.com/blog/interop-2023&quot; rel=&quot;noopener&quot;&gt;Bocoup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.igalia.com/news/2023/interop2023.html&quot; rel=&quot;noopener&quot;&gt;Igalia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.windows.com/msedgedev/2023/02/01/microsoft-edge-and-interop-2023/&quot; rel=&quot;noopener&quot;&gt;Microsoft&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hacks.mozilla.org/2023/02/announcing-interop-2023/&quot; rel=&quot;noopener&quot;&gt;Mozilla&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    <author>
      <name>Robert Nyman</name>
    </author><author>
      <name>Philip Jägenstedt</name>
    </author><author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Learn Images!</title>
    <link href="https://web.dev/learn-images/"/>
    <updated>2023-02-01T00:00:00Z</updated>
    <id>https://web.dev/learn-images/</id>
    <content type="html" mode="escaped">&lt;p&gt;Today we are excited to share with you our latest course on web.dev. &lt;a href=&quot;https://web.dev/learn/images/&quot;&gt;Learn Images&lt;/a&gt; is a new course written by &lt;a href=&quot;https://hire.wil.to/&quot; rel=&quot;noopener&quot;&gt;Mat Marquis&lt;/a&gt;, and it&#39;s a deep dive into all you need to know about images on the web.&lt;/p&gt;
&lt;p&gt;This course is created for beginner and advanced web developers alike, covering everything from the basics of ensuring image sources are efficiently requested and rendered, to the details of how common image formats are communicated from server to client. Throughout this course you’ll learn how to achieve the smallest possible transfer sizes for your images without compromising on their quality—at least, not in a way anyone will be able to see.&lt;/p&gt;
&lt;p&gt;As with all of our courses, you can go through the series from start to finish for a holistic understanding of how images work on the modern web, or use it as a reference for the specific concepts and markup patterns you’ll be using in your day-to-day work.&lt;/p&gt;
&lt;p&gt;Learn Images joins our existing courses, as we develop a library of resources to help you learn key web development skills:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/html/&quot;&gt;Learn HTML&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/css/&quot;&gt;Learn CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/accessibility/&quot;&gt;Learn Accessibility&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/design/&quot;&gt;Learn Responsive Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/forms/&quot;&gt;Learn Forms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/pwa/&quot;&gt;Learn PWA&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>New to the web platform in January</title>
    <link href="https://web.dev/web-platform-01-2023/"/>
    <updated>2023-01-31T00:00:00Z</updated>
    <id>https://web.dev/web-platform-01-2023/</id>
    <content type="html" mode="escaped">&lt;h2 id=&quot;stable-browser-releases&quot;&gt;Stable browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-01-2023/#stable-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In January 2023, &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/109&quot; rel=&quot;noopener&quot;&gt;Firefox 109&lt;/a&gt;, &lt;a href=&quot;https://developer.chrome.com/blog/new-in-chrome-109/&quot; rel=&quot;noopener&quot;&gt;Chrome 109&lt;/a&gt;, and &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_3-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 16.3&lt;/a&gt; became stable. Let&#39;s take a look at what this means for the web platform.&lt;/p&gt;
&lt;h2 id=&quot;mathml&quot;&gt;MathML &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-01-2023/#mathml&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Chrome 109 supports &lt;a href=&quot;https://developer.mozilla.org/docs/Web/MathML&quot; rel=&quot;noopener&quot;&gt;MathML&lt;/a&gt; Core, a language for describing mathematical notation embeddable in HTML and SVG. This release means that MathML is now interoperable across all the major engines.&lt;/p&gt;
&lt;h2 id=&quot;the-scrollend-event&quot;&gt;The &lt;code&gt;scrollend&lt;/code&gt; event &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-01-2023/#the-scrollend-event&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Firefox 109 implements &lt;code&gt;scrollend&lt;/code&gt;. This event provides a reliable way to detect that a scroll is complete. Find out more about this event, which is also being implemented in Chrome, in the article &lt;a href=&quot;https://developer.chrome.com/blog/scrollend-a-new-javascript-event/&quot; rel=&quot;noopener&quot;&gt;Scrollend, a new JavaScript event&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 114, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      114
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 109, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      109
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 114, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      114
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/Element/scrollend_event#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id=&quot;the-lh-css-length-unit-and-hyphenate-limit-chars&quot;&gt;The &lt;code&gt;lh&lt;/code&gt; CSS length unit and &lt;code&gt;hyphenate-limit-chars&lt;/code&gt; &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-01-2023/#the-lh-css-length-unit-and-hyphenate-limit-chars&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For CSS in Chrome we have the &lt;code&gt;lh&lt;/code&gt; length unit. This unit is equivalent to the computed value of the &lt;code&gt;line-height&lt;/code&gt; property on the element on which it is used.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 109, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      109
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 109, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
109
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari 16.4, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
16.4
&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Also, the &lt;code&gt;hyphenate-limit-chars&lt;/code&gt; property specifying the minimum number of characters in a hyphenated word.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 109, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      109
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 109, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
109
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id=&quot;content-security-policy-csp-prefetch-src&quot;&gt;Content-Security-Policy (CSP) &lt;code&gt;prefetch-src&lt;/code&gt; &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-01-2023/#content-security-policy-csp-prefetch-src&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Safari 16.3 is mostly a release of fixes, and resolves a number of CSS sizing issues. The only new feature listed in the notes, is the addition of the Content-Security-Policy (CSP) &lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTTP/Headers/Content-Security-Policy/prefetch-src&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;prefetch-src&lt;/code&gt;&lt;/a&gt; directive.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/HTTP/Headers/Content-Security-Policy/prefetch-src#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id=&quot;features-for-chrome-on-android&quot;&gt;Features for Chrome on Android &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-01-2023/#features-for-chrome-on-android&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;New in Chrome on Android is &lt;a href=&quot;https://developer.chrome.com/blog/spc-on-android/&quot; rel=&quot;noopener&quot;&gt;Secure Payment Confirmation&lt;/a&gt; (SPC). This is a proposed web standard that allows customers to authenticate with a credit card issuer, bank, or other payment service provider using a platform authenticator—typically activated with a device&#39;s screen unlock feature such as a fingerprint sensor.&lt;/p&gt;
&lt;p&gt;Also new for Chrome on Android is the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/File_System_Access_API#origin_private_file_system&quot; rel=&quot;noopener&quot;&gt;Origin Private File System (OPFS)&lt;/a&gt;, part of the File System Access API on Android. This includes all of the File System Access API surface, minus the &lt;code&gt;show{OpenFile, SaveFile, Directory}Picker()&lt;/code&gt; methods and the Drag and Drop API integration.&lt;/p&gt;
&lt;h2 id=&quot;beta-browser-releases&quot;&gt;Beta browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-01-2023/#beta-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beta browser versions give you a preview of things that will be in the next stable version of the browser. It&#39;s a great time to test new features, or removals, that could impact your site before the world gets that release. New betas are &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/110&quot; rel=&quot;noopener&quot;&gt;Firefox 110&lt;/a&gt;, and &lt;a href=&quot;https://developer.chrome.com/blog/chrome-110-beta/&quot; rel=&quot;noopener&quot;&gt;Chrome 110&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Chrome 110 includes the CSS &lt;code&gt;initial-letter&lt;/code&gt; property. This property provides a way to set the number of lines that an initial letter should sink into the text. Learn more in the article &lt;a href=&quot;https://developer.chrome.com/blog/control-your-drop-caps-with-css-initial-letter/&quot; rel=&quot;noopener&quot;&gt;Control your drop caps with CSS initial-letter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Also, for CSS in Chrome 110 is the &lt;code&gt;:picture-in-picture&lt;/code&gt; pseudo-class. This gives you a way to target and customize the media player when videos enter and exit picture-in-picture mode.&lt;/p&gt;
&lt;p&gt;Chrome includes the &lt;code&gt;setSinkID()&lt;/code&gt; method of the &lt;code&gt;AudioContext&lt;/code&gt; API. This method provides a way to &lt;a href=&quot;https://developer.chrome.com/blog/audiocontext-setsinkid/&quot; rel=&quot;noopener&quot;&gt;change the destination audio device when using Web Audio&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Firefox 110 includes size &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Container_Queries&quot; rel=&quot;noopener&quot;&gt;Container Queries&lt;/a&gt;, which will bring us interoperability across the three main browser engines for this long-awaited feature.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by &lt;a href=&quot;https://unsplash.com/images/nature/winter?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot; rel=&quot;noopener&quot;&gt;Denys Nevozhai&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>New to the web platform in December</title>
    <link href="https://web.dev/web-platform-12-2022/"/>
    <updated>2022-12-28T00:00:00Z</updated>
    <id>https://web.dev/web-platform-12-2022/</id>
    <content type="html" mode="escaped">&lt;h2 id=&quot;stable-browser-releases&quot;&gt;Stable browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-12-2022/#stable-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In December, &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/108&quot; rel=&quot;noopener&quot;&gt;Firefox 108&lt;/a&gt;, and &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_2-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 16.2&lt;/a&gt; became stable. Let&#39;s take a look at what this means for the web platform.&lt;/p&gt;
&lt;h3 id=&quot;support-for-height-and-width-attributes-of-lesssourcegreater&quot;&gt;Support for &lt;code&gt;height&lt;/code&gt; and &lt;code&gt;width&lt;/code&gt; attributes of &lt;code&gt;&amp;lt;source&amp;gt;&lt;/code&gt; &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-12-2022/#support-for-height-and-width-attributes-of-lesssourcegreater&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Firefox 108 supports &lt;code&gt;height&lt;/code&gt; and &lt;code&gt;width&lt;/code&gt; attributes for the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTML/Element/source&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;&amp;lt;source&amp;gt;&lt;/code&gt;&lt;/a&gt; element, when it is a child of a &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element. These attributes accept the height or width of the image, in pixels, as an integer without a unit.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 90, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      90
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 108, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      108
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 12, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      12
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id=&quot;trigonometric-css-functions&quot;&gt;Trigonometric CSS functions &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-12-2022/#trigonometric-css-functions&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Firefox also now supports trigonometric functions in CSS—&lt;code&gt;sin()&lt;/code&gt;, &lt;code&gt;cos()&lt;/code&gt;, &lt;code&gt;tan()&lt;/code&gt;, &lt;code&gt;asin()&lt;/code&gt;, &lt;code&gt;acos()&lt;/code&gt;, &lt;code&gt;atan()&lt;/code&gt;, and &lt;code&gt;atan2()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 111, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      111
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 108, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      108
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 111, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      111
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/sin#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;support-for-last-baseline-in-all-three-engines&quot;&gt;Support for last baseline in all three engines &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-12-2022/#support-for-last-baseline-in-all-three-engines&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In addition to a number of CSS fixes, Safari 16.2 includes &lt;code&gt;last baseline&lt;/code&gt; alignment for CSS grid and flexbox layout, which means this feature now supported in the three main browser engines.&lt;/p&gt;
&lt;h3 id=&quot;css-font-variant-alternates&quot;&gt;CSS &lt;code&gt;font-variant-alternates&lt;/code&gt; &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-12-2022/#css-font-variant-alternates&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Safari also adds support for additional values for the &lt;code&gt;font-variant-alternates&lt;/code&gt; CSS property: annotation(value-name), character-variant(value-name), ornaments(value-name), styleset(value-name), stylistic(value-name), swash(value-name), along with the associated &lt;code&gt;@font-feature-values&lt;/code&gt; at-rule.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 111, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      111
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 34, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      34
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 111, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      111
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 9.1, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      9.1
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id=&quot;beta-browser-releases&quot;&gt;Beta browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-12-2022/#beta-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beta browser versions give you a preview of things that will be in the next stable version of the browser. It&#39;s a great time to test new features, or removals, that could impact your site before the world gets that release. New betas are &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/109&quot; rel=&quot;noopener&quot;&gt;Firefox 109&lt;/a&gt;, &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_3-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 16.3&lt;/a&gt;, and &lt;a href=&quot;https://developer.chrome.com/blog/chrome-109-beta/&quot; rel=&quot;noopener&quot;&gt;Chrome 109&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The only new feature listed for Safari 16.3 is the addition of the Content-Security-Policy (CSP) &lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTTP/Headers/Content-Security-Policy/prefetch-src&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;prefetch-src&lt;/code&gt;&lt;/a&gt; directive. There are also a number of fixes in this beta.&lt;/p&gt;
&lt;p&gt;Chrome 109 supports &lt;a href=&quot;https://developer.mozilla.org/docs/Web/MathML&quot; rel=&quot;noopener&quot;&gt;MathML&lt;/a&gt; Core, a language for describing mathematical notation embeddable in HTML and SVG.&lt;/p&gt;
&lt;p&gt;New in Chrome on Android is &lt;a href=&quot;https://developer.chrome.com/blog/spc-on-android/&quot; rel=&quot;noopener&quot;&gt;Secure Payment Confirmation&lt;/a&gt; (SPC). This is a proposed web standard that allows customers to authenticate with a credit card issuer, bank, or other payment service provider using a platform authenticator—typically activated with a device&#39;s screen unlock feature such as a fingerprint sensor.&lt;/p&gt;
&lt;p&gt;Also new for Chrome on Android is the Origin Private File System (OPFS), part of the File System Access API on Android. This includes all of the File System Access API surface, minus the &lt;code&gt;show{OpenFile, SaveFile, Directory}Picker()&lt;/code&gt; methods and the Drag and Drop API integration.&lt;/p&gt;
&lt;p&gt;For CSS in Chrome we have the &lt;code&gt;lh&lt;/code&gt; length unit. This unit is equivalent to the computed value of the line-height property on the element on which it is used. Also, the &lt;code&gt;hyphenate-limit-chars&lt;/code&gt; property specifying the minimum number of characters in a hyphenated word.&lt;/p&gt;
&lt;p&gt;At the time of writing, and perhaps due to the holiday season, Firefox release notes haven&#39;t been updated.&lt;/p&gt;
&lt;h2 id=&quot;other-news&quot;&gt;Other news &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-12-2022/#other-news&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This post marks the 12th edition of this &lt;a href=&quot;https://web.dev/tags/new-to-the-web/&quot;&gt;blog post series&lt;/a&gt;, bringing you a selection of interesting things landing in browsers each month in 2022. I&#39;ll be back in 2023 to continue sharing some of the interesting things landing on the web platform each month.&lt;/p&gt;
&lt;p&gt;Many of the features landing in browsers over this past year, and lots of those things mentioned as &amp;quot;CSS fixes,&amp;quot; were part of Interop 2022. For more information, read the Chrome team&#39;s &lt;a href=&quot;https://web.dev/interop-2022-wrapup/&quot;&gt;end-of-year report&lt;/a&gt; on this cross-browser initiative to improve some of the top interoperability pain points on the web platform.&lt;/p&gt;
&lt;p&gt;And finally, of interest to people who read this post, is this &lt;a href=&quot;https://developer.mozilla.org//plus/updates&quot; rel=&quot;noopener&quot;&gt;list of updates&lt;/a&gt; based on the MDN browser compatibility data, released by our friends over at MDN.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by &lt;a href=&quot;https://unsplash.com/@worldsbetweenlines?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot; rel=&quot;noopener&quot;&gt;Patrick Hendry&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Interop 2022: end of year update</title>
    <link href="https://web.dev/interop-2022-wrapup/"/>
    <updated>2022-12-19T00:00:00Z</updated>
    <id>https://web.dev/interop-2022-wrapup/</id>
    <content type="html" mode="escaped">&lt;p&gt;We&#39;ve reached the end of another year, and it&#39;s time to look at the improvements made by browsers as we work together to improve the interoperability of the web platform. You can check out how things started in &lt;a href=&quot;https://web.dev/interop-2022/&quot;&gt;our post in March this year&lt;/a&gt;, as the initiative was launched.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Scores showing Chrome and Edge Dev on 71, Firefox Nightly on 74, Safari Technology Preview on 73.&quot; decoding=&quot;async&quot; height=&quot;372&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/s0O6F22XtjN6K9x9NLDs.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/s0O6F22XtjN6K9x9NLDs.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/s0O6F22XtjN6K9x9NLDs.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/s0O6F22XtjN6K9x9NLDs.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/s0O6F22XtjN6K9x9NLDs.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/s0O6F22XtjN6K9x9NLDs.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/s0O6F22XtjN6K9x9NLDs.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/s0O6F22XtjN6K9x9NLDs.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/s0O6F22XtjN6K9x9NLDs.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/s0O6F22XtjN6K9x9NLDs.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/s0O6F22XtjN6K9x9NLDs.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/s0O6F22XtjN6K9x9NLDs.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/s0O6F22XtjN6K9x9NLDs.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/s0O6F22XtjN6K9x9NLDs.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/s0O6F22XtjN6K9x9NLDs.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/s0O6F22XtjN6K9x9NLDs.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/s0O6F22XtjN6K9x9NLDs.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/s0O6F22XtjN6K9x9NLDs.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;The scores for experimental browsers in March 2022.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The overall scores at the end of the year show a great improvement across all engines.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Scores showing Chrome and Edge Dev on 90, Firefox Nightly on 89, Safari Technology Preview on 94.&quot; decoding=&quot;async&quot; height=&quot;391&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/bNJOIpIdpPbN4AFnrcQA.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/bNJOIpIdpPbN4AFnrcQA.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/bNJOIpIdpPbN4AFnrcQA.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/bNJOIpIdpPbN4AFnrcQA.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/bNJOIpIdpPbN4AFnrcQA.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/bNJOIpIdpPbN4AFnrcQA.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/bNJOIpIdpPbN4AFnrcQA.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/bNJOIpIdpPbN4AFnrcQA.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/bNJOIpIdpPbN4AFnrcQA.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/bNJOIpIdpPbN4AFnrcQA.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/bNJOIpIdpPbN4AFnrcQA.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/bNJOIpIdpPbN4AFnrcQA.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/bNJOIpIdpPbN4AFnrcQA.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/bNJOIpIdpPbN4AFnrcQA.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/bNJOIpIdpPbN4AFnrcQA.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/bNJOIpIdpPbN4AFnrcQA.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/bNJOIpIdpPbN4AFnrcQA.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/bNJOIpIdpPbN4AFnrcQA.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;The scores for experimental browsers in December 2022.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;In this post, learn about the progress made during 2022. In addition to these headline features, there were many smaller improvements made by all engines. Small issues that can cause inconsistencies between engines and trip you up during development, have been fixed. Seeing &lt;a href=&quot;https://web.dev/tags/newly-interoperable/&quot;&gt;big features available cross-browser&lt;/a&gt; is definitely exciting, but it&#39;s sometimes the small things that cause the most problems, and it&#39;s great to see how much has been improved.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; &lt;a href=&quot;https://wpt.fyi/results/?view=subtest&amp;amp;q=%28label%3Ainterop-2021-aspect-ratio%20or%20label%3Ainterop-2021-flexbox%20or%20label%3Ainterop-2021-grid%20or%20label%3Ainterop-2021-position-sticky%20or%20label%3Ainterop-2021-transforms%20or%20label%3Ainterop-2022-cascade%20or%20label%3Ainterop-2022-color%20or%20label%3Ainterop-2022-contain%20or%20label%3Ainterop-2022-dialog%20or%20label%3Ainterop-2022-forms%20or%20label%3Ainterop-2022-scrolling%20or%20label%3Ainterop-2022-subgrid%20or%20label%3Ainterop-2022-text%20or%20label%3Ainterop-2022-viewport%20or%20label%3Ainterop-2022-webcompat%29%20exists%28status%3A%21pass%29%20seq%28status%3A%21missing%20status%3A%21missing%20status%3A%21missing%20status%3Apass%20status%3Apass%20status%3Apass%29&amp;amp;run_id=5694898400395264&amp;amp;run_id=5671385434161152&amp;amp;run_id=5747379813744640&amp;amp;run_id=4818947338141696&amp;amp;run_id=4882567984054272&amp;amp;run_id=5158468428759040&quot;&gt;Explore the tests&lt;/a&gt; that failed in at least one browser at the start of the year and now pass in all engines. Note that this link may be a little unreliable, try reloading if it&#39;s not working for you. &lt;/div&gt;&lt;/aside&gt;
&lt;h2 id=&quot;cascade-layers&quot;&gt;Cascade layers &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2022-wrapup/#cascade-layers&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Learn/CSS/Building_blocks/Cascade_layers&quot; rel=&quot;noopener&quot;&gt;Cascade layers&lt;/a&gt; let you manage the cascade by grouping selectors into layers. It&#39;s the kind of feature that only becomes useful when it is supported everywhere. All major engines now support cascade layers, and the scores across all browsers reflect how interoperable the feature is, with just a few tests left to pass for Firefox.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 99, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      99
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 97, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      97
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 99, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      99
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/@layer#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id=&quot;the-dialog-element&quot;&gt;The dialog element &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2022-wrapup/#the-dialog-element&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTML/Element/dialog&quot; rel=&quot;noopener&quot;&gt;The dialog element&lt;/a&gt; allows the creation of modal and non-modal dialogs. This is a common pattern on the web, and using this element gives you usability and accessibility that you would otherwise have to develop and test when creating your own components. In the article &lt;a href=&quot;https://web.dev/building-a-dialog-component/&quot;&gt;Building a dialog component&lt;/a&gt;, Adam Argyle explains how to build on top of this element to build different types of dialogs.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 37, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      37
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 98, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      98
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 79, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      79
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/HTML/Element/dialog#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id=&quot;subgrid&quot;&gt;Subgrid &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2022-wrapup/#subgrid&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;At the beginning of 2022, the only browser supporting the &lt;code&gt;subgrid&lt;/code&gt; value for &lt;code&gt;grid-template-rows&lt;/code&gt; and &lt;code&gt;grid-template-columns&lt;/code&gt; was Firefox. During 2022 Safari has landed support, and the feature is under development in Chrome. It&#39;s going to miss the end of year deadline for interoperability, but it&#39;s on the way.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 114, Behind a flag&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;flag&quot; title=&quot;Behind a flag&quot; aria-label=&quot;Behind a flag&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Firefox 71, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
71
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 114, Behind a flag&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;flag&quot; title=&quot;Behind a flag&quot; aria-label=&quot;Behind a flag&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari 16, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
16
&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Grid_Layout/Subgrid#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id=&quot;viewport-units&quot;&gt;Viewport units &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2022-wrapup/#viewport-units&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Viewport units are the only feature that has hit 100% of passing tests across all engines. This includes the concepts of the small and large viewport, that accounts for the changing viewport size on mobile as device UI elements appear and disappear. You can find out more about these units in the post &lt;a href=&quot;https://web.dev/viewport-units/&quot;&gt;the large, small, and dynamic viewport units&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 108, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      108
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 101, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      101
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 108, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      108
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id=&quot;color-4&quot;&gt;Color 4 &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2022-wrapup/#color-4&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This collection of color work enables CSS to not only specify colors in higher definition gamuts (for example, display p3, rec2020), but also provides new color functions that each have unique utilities for working with color. New color spaces are &lt;code&gt;lch()&lt;/code&gt;, &lt;code&gt;oklch()&lt;/code&gt;, &lt;code&gt;lab()&lt;/code&gt;, &lt;code&gt;oklab()&lt;/code&gt;, &lt;code&gt;display-p3&lt;/code&gt;, &lt;code&gt;rec2020&lt;/code&gt;, &lt;code&gt;a98-rgb&lt;/code&gt;, &lt;code&gt;prophoto-rgb&lt;/code&gt;, &lt;code&gt;xyz&lt;/code&gt;, &lt;code&gt;xyz-d50&lt;/code&gt;, &lt;code&gt;xzy-d65&lt;/code&gt;: &lt;a href=&quot;https://codepen.io/argyleink/pen/RwyOyeq&quot; rel=&quot;noopener&quot;&gt;try these in Canary&lt;/a&gt; today with &lt;a href=&quot;chrome://flags/#enable-experimental-web-platform-features&quot; rel=&quot;noopener&quot;&gt;this flag enabled&lt;/a&gt;. These changes also apply to gradients, allowing authors to &lt;a href=&quot;https://codepen.io/argyleink/pen/OJObWEW&quot; rel=&quot;noopener&quot;&gt;specify which colorspace their gradients use&lt;/a&gt;. The same flag also enables &lt;a href=&quot;https://codepen.io/argyleink/pen/YzLMaor&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;color-mix()&lt;/code&gt;&lt;/a&gt; support, allowing you to mix two colors together in a space of your choice. The color-mix() function is also behind a flag in Safari and Firefox. More colors, better colors, better gradients, and better tools.&lt;/p&gt;
&lt;h2 id=&quot;interop-2023&quot;&gt;Interop 2023 &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2022-wrapup/#interop-2023&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I hope you&#39;ll be happy to know that we aren&#39;t intending to stop at the end of 2022, and &lt;a href=&quot;https://web.dev/submit-your-proposals-for-interop-2023/&quot;&gt;Interop 2023&lt;/a&gt; is already well through the initial planning stage. In the New Year we&#39;ll be able to announce the features that have been selected, and look forward to another year of making it easier to develop for the web.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Hero image by &lt;a href=&quot;https://unsplash.com/fr/@goian?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot; rel=&quot;noopener&quot;&gt;Ian Schneider&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>New to the web platform in November</title>
    <link href="https://web.dev/web-platform-11-2022/"/>
    <updated>2022-11-30T00:00:00Z</updated>
    <id>https://web.dev/web-platform-11-2022/</id>
    <content type="html" mode="escaped">&lt;h2 id=&quot;stable-browser-releases&quot;&gt;Stable browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-11-2022/#stable-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In November, &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/107&quot; rel=&quot;noopener&quot;&gt;Firefox 107&lt;/a&gt;, and &lt;a href=&quot;https://developer.chrome.com/blog/new-in-chrome-108/&quot; rel=&quot;noopener&quot;&gt;Chrome 108&lt;/a&gt; became stable. Let&#39;s take a look at what this means for the web platform.&lt;/p&gt;
&lt;h3 id=&quot;a-change-to-layout-viewport-behavior-in-chrome-on-android&quot;&gt;A change to Layout Viewport behavior in Chrome on Android &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-11-2022/#a-change-to-layout-viewport-behavior-in-chrome-on-android&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;There&#39;s a change to how the Layout Viewport behaves from Chrome 108 on Android when the on-screen keyboard is shown. Read &lt;a href=&quot;https://developer.chrome.com/blog/viewport-resize-behavior/&quot; rel=&quot;noopener&quot;&gt;Prepare for viewport resize behavior changes coming to Chrome on Android&lt;/a&gt; to learn more.&lt;/p&gt;
&lt;h3 id=&quot;new-viewport-units&quot;&gt;New viewport units &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-11-2022/#new-viewport-units&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Also in Chrome 108 are the new CSS Viewport Units. These include small (&lt;code&gt;svw&lt;/code&gt;, &lt;code&gt;svh&lt;/code&gt;, &lt;code&gt;svi&lt;/code&gt;, &lt;code&gt;svb&lt;/code&gt;, &lt;code&gt;svmin&lt;/code&gt;, &lt;code&gt;svmax&lt;/code&gt;), large (&lt;code&gt;lvw&lt;/code&gt;, &lt;code&gt;lvh&lt;/code&gt;, &lt;code&gt;lvi&lt;/code&gt;, &lt;code&gt;lvb&lt;/code&gt;, &lt;code&gt;lvmin&lt;/code&gt;, &lt;code&gt;lvmax&lt;/code&gt;), dynamic (&lt;code&gt;dvw&lt;/code&gt;, &lt;code&gt;dvh&lt;/code&gt;, &lt;code&gt;dvi&lt;/code&gt;, &lt;code&gt;dvb&lt;/code&gt;, &lt;code&gt;dvmin&lt;/code&gt;, &lt;code&gt;dvmax&lt;/code&gt;), and logical (&lt;code&gt;vi&lt;/code&gt;, &lt;code&gt;vb&lt;/code&gt;) units. These units are already implemented in Firefox and Safari, meaning that we now have interop across the three main browser engines for these units.&lt;/p&gt;
&lt;p&gt;Read &lt;a href=&quot;https://web.dev/viewport-units/&quot;&gt;The large, small, and dynamic viewport units&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 108, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      108
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 101, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      101
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 108, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      108
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-size&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;contain-intrinsic-size&lt;/code&gt;&lt;/a&gt; shorthand CSS property is supported in Firefox 107, along with the longhand &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-width&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;contain-intrinsic-width&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-height&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;contain-intrinsic-height&lt;/code&gt;&lt;/a&gt; and logical properties &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-block-size&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;contain-intrinsic-block-size&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-inline-size&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;contain-intrinsic-inline-size&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These are applied to specify the size of a UI element that is subject to size containment. This allows a user agent to determine the size of an element without needing to render its child elements. They are useful when an element is subject to &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Containment#size_containment&quot; rel=&quot;noopener&quot;&gt;size containment&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 83, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      83
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 107, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      107
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 83, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      83
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 17, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      17
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-size#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;support-for-the-css-fragmentation-avoid-keyword&quot;&gt;Support for the CSS fragmentation &lt;code&gt;avoid&lt;/code&gt; keyword &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-11-2022/#support-for-the-css-fragmentation-avoid-keyword&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Chrome 108 includes support for the &lt;code&gt;avoid&lt;/code&gt; value of the CSS fragmentation properties &lt;code&gt;break-before&lt;/code&gt;, &lt;code&gt;break-after&lt;/code&gt;, and &lt;code&gt;break-inside&lt;/code&gt; when printing. This value tell the browser to avoid breaking before, after or inside the element it is applied to. For example, the following CSS avoids a figure being broken at a page break.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;figure&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;break-inside&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; avoid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;This addition is due to the inclusion of print support using LayoutNG, this brings a modern, lessy buggy experience. &lt;a href=&quot;https://developer.chrome.com/articles/layoutng/&quot; rel=&quot;noopener&quot;&gt;Learn more about LayoutNG&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;federated-credential-management-api&quot;&gt;Federated Credential Management API &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-11-2022/#federated-credential-management-api&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The Federated Credential Management API (FedCM) provides an abstraction for federated identity flows on the web. It exposes a browser mediated dialog that allows users to choose accounts from identify providers to login to websites. FedCM is shipping in Chrome 108, find out more about it in the &lt;a href=&quot;https://developer.chrome.com/blog/fedcm-shipping/&quot; rel=&quot;noopener&quot;&gt;FedCM announcement blog post&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;beta-browser-releases&quot;&gt;Beta browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-11-2022/#beta-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beta browser versions give you a preview of things that will be in the next stable version of the browser. It&#39;s a great time to test new features, or removals, that could impact your site before the world gets that release. Due to where release dates fall, the only new beta this month is &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/108&quot; rel=&quot;noopener&quot;&gt;Firefox 108&lt;/a&gt;, with &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_2-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 16.2 beta&lt;/a&gt; still ongoing.&lt;/p&gt;
&lt;p&gt;Firefox 108 supports &lt;code&gt;height&lt;/code&gt; and &lt;code&gt;width&lt;/code&gt; attributes for the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTML/Element/source&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;&amp;lt;source&amp;gt;&lt;/code&gt;&lt;/a&gt; element, when it is a child of a &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element. These attributes accept the height or width of the image, in pixels, as an integer without a unit.&lt;/p&gt;
&lt;p&gt;Implementation of container queries is underway in Firefox. Behind the &lt;code&gt;layout.css.container-queries.enabled&lt;/code&gt; flag in Firefox 108 beta, you will find the container query length units—&lt;code&gt;cqw&lt;/code&gt;, &lt;code&gt;cqh&lt;/code&gt;, &lt;code&gt;cqi&lt;/code&gt;, &lt;code&gt;cqb&lt;/code&gt;, &lt;code&gt;cqmin&lt;/code&gt;, &lt;code&gt;cqmax&lt;/code&gt;. These are units of length relative to the size of a query container.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by &lt;a href=&quot;https://unsplash.com/@mattseymour?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot; rel=&quot;noopener&quot;&gt;Matt Seymour&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Accessibility Week</title>
    <link href="https://web.dev/accessibility-week-2022/"/>
    <updated>2022-11-18T00:00:00Z</updated>
    <id>https://web.dev/accessibility-week-2022/</id>
    <content type="html" mode="escaped">&lt;p&gt;This week we highlighted accessibility resources to help you make your sites
and applications usable by everyone.&lt;/p&gt;
&lt;p&gt;We&#39;re continuing to roll out &lt;a href=&quot;https://web.dev/learn/accessibility/&quot;&gt;Learn Accessibility&lt;/a&gt;, a
brand new course written by &lt;a href=&quot;https://twitter.com/cariefisher&quot; rel=&quot;noopener&quot;&gt;Carie Fisher&lt;/a&gt;
that will take you through the essentials for building accessible websites and
web apps.&lt;/p&gt;
&lt;p&gt;We&#39;ve had 3 community spotlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/community-highlight-melanie/&quot;&gt;Melanie Sumner&lt;/a&gt; told us about her journey
into engineering, accessible design, Ember.js, and the importance of funding
these efforts.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/community-highlight-shuyi/&quot;&gt;Olutimilehin Olushuyi&lt;/a&gt; told us about his move
from the law to web development, building accessible community, and creating
accessible layouts.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/community-highlight-albert-kim/&quot;&gt;Albert Kim&lt;/a&gt; told us about mental health
awareness, building for invisible disabilities, the  COGA Accessibility
Community Group, and more practical wisdom.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;watch-us-answer-your-questions&quot;&gt;Watch us answer your questions &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/accessibility-week-2022/#watch-us-answer-your-questions&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;On Thursday, Alexandra White spoke with Carie Fisher and Melanie Sumner about
accessibility, and we answered some of your questions.&lt;/p&gt;
&lt;div class=&quot;youtube&quot;&gt;  &lt;lite-youtube videoid=&quot;xvGDgDRWl_E&quot;&gt;  &lt;/lite-youtube&gt;&lt;/div&gt;
&lt;p&gt;Have more questions? Ask us on Twitter,
&lt;a href=&quot;https://twitter.com/chromiumdev&quot; rel=&quot;noopener&quot;&gt;@ChromiumDev&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;more-resources&quot;&gt;More resources &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/accessibility-week-2022/#more-resources&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A solid document structure is a great start for accessible development. Find
out how to really use HTML in  our &lt;a href=&quot;https://web.dev/learn/html&quot;&gt;Learn HTML&lt;/a&gt; course. Follow it
up with Learn Accessibility&#39;s &lt;a href=&quot;https://web.dev/learn/accessibility/structure/&quot;&gt;Content structure module&lt;/a&gt;
for more on semantic HTML, landmarks, and tables for accessible content.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://web.dev/testing-web-design-color-contrast/&quot;&gt;Testing web design color contrast&lt;/a&gt; get
an overview of three tools and techniques to ensure your content is readable by
everyone.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://web.dev/website-navigation/&quot;&gt;Building the main navigation for a website&lt;/a&gt; learn how to create accessible navigation using semantic HTML.&lt;/p&gt;
&lt;h2 id=&quot;on-the-web&quot;&gt;On the web &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/accessibility-week-2022/#on-the-web&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The W3C hosts a collection of &lt;a href=&quot;https://www.w3.org/WAI/courses/list/&quot; rel=&quot;noopener&quot;&gt;courses, training, and certification on digital accessibility&lt;/a&gt; from different providers.&lt;/li&gt;
&lt;li&gt;Read &lt;a href=&quot;https://www.smashingmagazine.com/category/accessibility/&quot; rel=&quot;noopener&quot;&gt;Accessibility articles on Smashing Magazine&lt;/a&gt;, including &lt;a href=&quot;https://www.smashingmagazine.com/2022/07/article-section-elements-accessibility/&quot; rel=&quot;noopener&quot;&gt;&amp;lt;article&amp;gt; vs. &amp;lt;section&amp;gt;: How To Choose The Right One&lt;/a&gt; by Olushuyi Olutimilehin.&lt;/li&gt;
&lt;li&gt;If you&#39;re making a case for accessibility work at your company, check out Melanie Sumner&#39;s &lt;a href=&quot;https://pleasefunda11y.com/&quot; rel=&quot;noopener&quot;&gt;pleasefunda11y.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If you want to support the Cognitive and Learning Disabilities Accessibility Task Force, join the &lt;a href=&quot;https://www.w3.org/community/coga-community/&quot; rel=&quot;noopener&quot;&gt;COGA Accessibility Community Group&lt;/a&gt;. This group supplies user needs and feedback to the COGA Task Force.&lt;/li&gt;
&lt;/ul&gt;
</content>
    <author>
      <name>Alexandra White</name>
    </author><author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>New to the web platform in October</title>
    <link href="https://web.dev/web-platform-10-2022/"/>
    <updated>2022-10-31T00:00:00Z</updated>
    <id>https://web.dev/web-platform-10-2022/</id>
    <content type="html" mode="escaped">&lt;h2 id=&quot;stable-browser-releases&quot;&gt;Stable browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-10-2022/#stable-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In October, &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/106&quot; rel=&quot;noopener&quot;&gt;Firefox 106&lt;/a&gt;, &lt;a href=&quot;https://developer.chrome.com/blog/new-in-chrome-107/&quot; rel=&quot;noopener&quot;&gt;Chrome 107&lt;/a&gt;, and &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_1-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 16.1&lt;/a&gt; became stable. Let&#39;s take a look at what this means for the web platform.&lt;/p&gt;
&lt;h3 id=&quot;animation-of-grid-tracks&quot;&gt;Animation of grid tracks &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-10-2022/#animation-of-grid-tracks&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Thanks to the work of our contributors at Microsoft, Chrome is now able to interpolate &lt;code&gt;grid-template-columns&lt;/code&gt; and &lt;code&gt;grid-template-rows&lt;/code&gt; values. This means that grid layouts can smoothly transition between states, instead of snapping at the halfway point of an animation or transition.&lt;/p&gt;
&lt;figure&gt;
&lt;div class=&quot;codepen-embed-wrap&quot; style=&quot;height: 480px; width: 100%&quot;&gt;
&lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi;&quot; loading=&quot;lazy&quot; src=&quot;https://codepen.io/web-dot-dev/embed/XWqVowx?height=480&amp;theme-id=light&amp;default-tab=result&amp;editable=true&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;Pen XWqVowx by web-dot-dev on Codepen&quot;&gt;See the Pen &lt;a href=&quot;https://codepen.io/web-dot-dev/embed/XWqVowx&quot;&gt;Pen XWqVowx by web-dot-dev on Codepen&lt;/a&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;figcaption&gt;Hover over the avatars to see the animation. This example is from the article &lt;a href=&quot;https://web.dev/css-animated-grid-layouts/&quot;&gt;CSS animated grid layouts&lt;/a&gt;, where you can find out more.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 107, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      107
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 66, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      66
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 107, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      107
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;h3 id=&quot;additions-to-getdisplaymedia&quot;&gt;Additions to &lt;code&gt;getDisplayMedia()&lt;/code&gt; &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-10-2022/#additions-to-getdisplaymedia&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Also in Chrome are some additions to &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/MediaDevices/getDisplayMedia&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;getDisplayMedia()&lt;/code&gt;&lt;/a&gt; that aim to prevent &lt;a href=&quot;https://developer.chrome.com/blog/avoiding-oversharing-when-screen-sharing/&quot; rel=&quot;noopener&quot;&gt;accidental oversharing when screen sharing&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href=&quot;https://developer.chrome.com/docs/web-platform/screen-sharing-controls/#displaySurface&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;displaySurface&lt;/code&gt;&lt;/a&gt; option can indicate that the web app prefers to offer a specific display surface type (tabs, windows, or screens).&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://developer.chrome.com/docs/web-platform/screen-sharing-controls/#surfaceSwitching&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;surfaceSwitching&lt;/code&gt;&lt;/a&gt; option indicates whether Chrome should allow the user to dynamically switch between shared tabs.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://developer.chrome.com/docs/web-platform/screen-sharing-controls/#selfBrowserSurface&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;selfBrowserSurface&lt;/code&gt;&lt;/a&gt; option can be used to prevent the user from sharing the current tab. This avoids the &amp;quot;hall of mirrors&amp;quot; effect.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://developer.chrome.com/docs/web-platform/screen-sharing-controls/#systemAudio&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;systemAudio&lt;/code&gt;&lt;/a&gt; option ensures Chrome only offers relevant audio-capture to the user.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Safari 16.1 also includes support for &lt;code&gt;getDisplayMedia&lt;/code&gt;, adding support for capturing a specific Safari window.&lt;/p&gt;
&lt;h3 id=&quot;testing-for-support-of-font-technology-and-features-from-css&quot;&gt;Testing for support of font technology and features from CSS &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-10-2022/#testing-for-support-of-font-technology-and-features-from-css&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Firefox has added the &lt;code&gt;font-tech()&lt;/code&gt; and &lt;code&gt;font-format()&lt;/code&gt; functions to feature queries with &lt;code&gt;@supports&lt;/code&gt;. The following example tests for support of &lt;a href=&quot;https://developer.chrome.com/blog/colrv1-fonts/&quot; rel=&quot;noopener&quot;&gt;COLRv1 fonts&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@supports&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;font-tech&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;color-COLRv1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;You can find more examples &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@supports#testing_for_the_support_of_a_font_technology&quot; rel=&quot;noopener&quot;&gt;on MDN&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;scroll-to-text-fragment&quot;&gt;Scroll to text fragment &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-10-2022/#scroll-to-text-fragment&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Safari 16.1 includes support for &lt;a href=&quot;https://wicg.github.io/scroll-to-text-fragment/&quot; rel=&quot;noopener&quot;&gt;scroll to text fragment&lt;/a&gt; which adds support for navigating to a URL with a particular text fragment specified.&lt;/p&gt;
&lt;h3 id=&quot;avif-support&quot;&gt;AVIF support &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-10-2022/#avif-support&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Safari 16 included support for still AVIF images, Safari 16.1 includes support for animated AVIF images on macOS Ventura, iOS 16, and iPadOS 16.&lt;/p&gt;
&lt;h3 id=&quot;web-push-for-safari&quot;&gt;Web Push for Safari &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-10-2022/#web-push-for-safari&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Safari 16.1 brings Web Push support to Safari on macOS Ventura. This uses the Push API and Notifications API, you can read more about this in the article &lt;a href=&quot;https://webkit.org/blog/12945/meet-web-push/&quot; rel=&quot;noopener&quot;&gt;Meet Web Push&lt;/a&gt;. Web Push landing in Safari means that it is now available across all three major engines.&lt;/p&gt;
&lt;h2 id=&quot;beta-browser-releases&quot;&gt;Beta browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-10-2022/#beta-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beta browser versions give you a preview of things that will be in the next stable version of the browser. It&#39;s a great time to test new features, or removals, that could impact your site before the world gets that release. New betas this month are &lt;a href=&quot;https://developer.chrome.com/blog/chrome-108-beta/&quot; rel=&quot;noopener&quot;&gt;Chrome 108&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/107&quot; rel=&quot;noopener&quot;&gt;Firefox 107&lt;/a&gt;, and &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_2-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 16.2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Chrome 108 includes support for the &lt;code&gt;avoid&lt;/code&gt; value of the CSS fragmentation properties &lt;code&gt;break-before&lt;/code&gt;, &lt;code&gt;break-after&lt;/code&gt;, and &lt;code&gt;break-inside&lt;/code&gt; when printing. This value tell the browser to avoid breaking before, after or inside the element it is applied to. For example, the following CSS avoids a figure being broken at a page break.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;figure&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;break-inside&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; avoid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Chrome 108 starts to roll out a change to the way overflow behaves on replaced elements, which may cause visual changes in some circumstances. Read the article &lt;a href=&quot;https://developer.chrome.com/blog/overflow-replaced-elements/&quot; rel=&quot;noopener&quot;&gt;A change to overflow on replaced elements in CSS&lt;/a&gt; for more details and to see how to address any issues you see.&lt;/p&gt;
&lt;p&gt;There&#39;s a change to how the Layout Viewport behaves in Chrome on Android when the on-screen keyboard is shown. Read &lt;a href=&quot;https://developer.chrome.com/blog/viewport-resize-behavior/&quot; rel=&quot;noopener&quot;&gt;Prepare for viewport resize behavior changes coming to Chrome on Android&lt;/a&gt; to learn more and find out how to prepare for this shipping to stable next month.&lt;/p&gt;
&lt;p&gt;Also in Chrome are the new CSS Viewport Units. These include small (&lt;code&gt;svw&lt;/code&gt;, &lt;code&gt;svh&lt;/code&gt;, &lt;code&gt;svi&lt;/code&gt;, &lt;code&gt;svb&lt;/code&gt;, &lt;code&gt;svmin&lt;/code&gt;, &lt;code&gt;svmax&lt;/code&gt;), large (&lt;code&gt;lvw&lt;/code&gt;, &lt;code&gt;lvh&lt;/code&gt;, &lt;code&gt;lvi&lt;/code&gt;, &lt;code&gt;lvb&lt;/code&gt;, &lt;code&gt;lvmin&lt;/code&gt;, &lt;code&gt;lvmax&lt;/code&gt;), dynamic (&lt;code&gt;dvw&lt;/code&gt;, &lt;code&gt;dvh&lt;/code&gt;, &lt;code&gt;dvi&lt;/code&gt;, &lt;code&gt;dvb&lt;/code&gt;, &lt;code&gt;dvmin&lt;/code&gt;, &lt;code&gt;dvmax&lt;/code&gt;), and logical (&lt;code&gt;vi&lt;/code&gt;, &lt;code&gt;vb&lt;/code&gt;) units. These units are already implemented in Firefox and Safari.&lt;/p&gt;
&lt;p&gt;Firefox 107 enables COLRv1 font support, joining Chrome in supporting this font technology. Also in fonts, Chrome 108 adds support for the &lt;code&gt;font-tech()&lt;/code&gt; and &lt;code&gt;font-format()&lt;/code&gt; functions to feature queries with &lt;code&gt;@supports&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Firefox also adds &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-size&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;contain-intrinsic-size&lt;/code&gt;&lt;/a&gt; support, joining Chrome to make two browsers with support for this feature.&lt;/p&gt;
&lt;p&gt;Safari 16.2 Beta includes a bunch of CSS fixes including sizing and scroll snap.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by &lt;a href=&quot;https://unsplash.com/@ahmedzaid?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot; rel=&quot;noopener&quot;&gt;ahmed zid&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>New to the web platform in September</title>
    <link href="https://web.dev/web-platform-09-2022/"/>
    <updated>2022-09-30T00:00:00Z</updated>
    <id>https://web.dev/web-platform-09-2022/</id>
    <content type="html" mode="escaped">&lt;h2 id=&quot;stable-browser-releases&quot;&gt;Stable browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-09-2022/#stable-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In September, &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/105&quot; rel=&quot;noopener&quot;&gt;Firefox 105&lt;/a&gt;, &lt;a href=&quot;https://developer.chrome.com/blog/new-in-chrome-106/&quot; rel=&quot;noopener&quot;&gt;Chrome 106&lt;/a&gt;, and &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 16&lt;/a&gt; became stable. This means that the September post is full of exciting things for the web platform.&lt;/p&gt;
&lt;h3 id=&quot;container-queries&quot;&gt;Container queries &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-09-2022/#container-queries&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Safari 16 adds support for &lt;a href=&quot;https://web.dev/blog/has-with-cq-m105/&quot;&gt;container queries&lt;/a&gt;, a feature which is now available in two engines. Safari also adds support for the new &lt;a href=&quot;https://www.bram.us/2021/09/21/css-container-queries-container-relative-lengths/&quot; rel=&quot;noopener&quot;&gt;container query units&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 105, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      105
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 110, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      110
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 105, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      105
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/@container#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;grid-layout&quot;&gt;Grid layout &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-09-2022/#grid-layout&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Safari has landed support for the &lt;code&gt;subgrid&lt;/code&gt; value of &lt;code&gt;grid-template-columns&lt;/code&gt; and &lt;code&gt;grid-template-rows&lt;/code&gt;. Using this value on a grid that is also a grid item means that instead of defining new tracks, the grid uses those that it spans of the parent.&lt;/p&gt;
&lt;figure&gt;
&lt;div class=&quot;codepen-embed-wrap&quot; style=&quot;height: 500px; width: 100%&quot;&gt;
&lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi;&quot; loading=&quot;lazy&quot; src=&quot;https://codepen.io/web-dot-dev/embed/XWzqrLR?height=500&amp;theme-id=dark&amp;default-tab=result&amp;editable=true&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;Pen XWzqrLR by web-dot-dev on Codepen&quot;&gt;See the Pen &lt;a href=&quot;https://codepen.io/web-dot-dev/embed/XWzqrLR&quot;&gt;Pen XWzqrLR by web-dot-dev on Codepen&lt;/a&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;figcaption&gt;In Safari or Firefox the headers and footers in these cards will align, as their tracks are a subgrid of the parent.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 114, Behind a flag&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;flag&quot; title=&quot;Behind a flag&quot; aria-label=&quot;Behind a flag&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Firefox 71, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
71
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 114, Behind a flag&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;flag&quot; title=&quot;Behind a flag&quot; aria-label=&quot;Behind a flag&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari 16, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
16
&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Grid_Layout/Subgrid#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Also, in Safari, for grid layout is the ability to animate grid tracks.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 107, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      107
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 66, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      66
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 107, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      107
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Safari has also added support for &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/offset-path&quot; rel=&quot;noopener&quot;&gt;offset-path&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior&quot; rel=&quot;noopener&quot;&gt;overscroll-behavior&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/text-align-last&quot; rel=&quot;noopener&quot;&gt;text-align-last&lt;/a&gt;, and the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@media/resolution&quot; rel=&quot;noopener&quot;&gt;resolution&lt;/a&gt; media query.&lt;/p&gt;
&lt;h3 id=&quot;encoding-api&quot;&gt;Encoding API &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-09-2022/#encoding-api&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Firefox 105 supports the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/TextDecoderStream&quot; rel=&quot;noopener&quot;&gt;TextDecoderStream&lt;/a&gt; and &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/TextEncoderStream&quot; rel=&quot;noopener&quot;&gt;TextEncoderStream&lt;/a&gt; interfaces of the Encoding API.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 71, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      71
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 105, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      105
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 79, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      79
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 14.1, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      14.1
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/TextEncoderStream#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;new-intl-apis&quot;&gt;New Intl APIs &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-09-2022/#new-intl-apis&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat&quot; rel=&quot;noopener&quot;&gt;Intl APIs&lt;/a&gt; help to display content in a localized format and Chrome 106 adds a slew of new number format functionality.&lt;/p&gt;
&lt;p&gt;Like other Intl APIs, this shifts the burden to the system—so you don’t need to ship or maintain complex localization code to every user. The API knows where the currency symbol goes, how to format dates and times, or compile a list.&lt;/p&gt;
&lt;h3 id=&quot;the-showpicker-method&quot;&gt;The showPicker() method &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-09-2022/#the-showpicker-method&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Safari 16 contains the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/HTMLInputElement/showPicker&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;showPicker()&lt;/code&gt;&lt;/a&gt; method, enabling a canonical way to show a browser picker for dates, time, color, and files is included. You can find out more about this in &lt;a href=&quot;https://developer.chrome.com/blog/show-picker/&quot; rel=&quot;noopener&quot;&gt;show a browser picker for date, time, color, and files&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;beta-browser-releases&quot;&gt;Beta browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-09-2022/#beta-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beta browser versions give you a preview of things that will be in the next stable version of the browser. It&#39;s a great time to test new features, or removals, that could impact your site before the world gets that release. New betas this month are &lt;a href=&quot;https://web.dev/blog/chrome-107-beta/&quot;&gt;Chrome 107&lt;/a&gt;, &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16_1-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 16.1&lt;/a&gt;, and &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/106&quot; rel=&quot;noopener&quot;&gt;Firefox 106&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Chrome 107 includes the ability to animate grid tracks, that also shipped in Safari this month. Once this lands in Chrome it will be supported in all three major engines.&lt;/p&gt;
&lt;p&gt;Also in Chrome are some additions to &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/MediaDevices/getDisplayMedia&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;getDisplayMedia()&lt;/code&gt;&lt;/a&gt; that aim to prevent &lt;a href=&quot;https://web.dev/web-platform-09-2022/(https://developer.chrome.com/blog/avoiding-oversharing-when-screen-sharing/)&quot;&gt;accidental oversharing when screen sharing&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href=&quot;https://developer.chrome.com/docs/web-platform/screen-sharing-controls/#displaySurface&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;displaySurface&lt;/code&gt;&lt;/a&gt; option can indicate that the web app prefers to offer a specific display surface type (tabs, windows, or screens).&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://developer.chrome.com/docs/web-platform/screen-sharing-controls/#surfaceSwitching&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;surfaceSwitching&lt;/code&gt;&lt;/a&gt; option indicates whether Chrome should allow the user to dynamically switch between shared tabs.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://developer.chrome.com/docs/web-platform/screen-sharing-controls/#selfBrowserSurface&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;selfBrowserSurface&lt;/code&gt;&lt;/a&gt; option can be used to prevent the user from sharing the current tab. This avoids the &amp;quot;hall of mirrors&amp;quot; effect.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://developer.chrome.com/docs/web-platform/screen-sharing-controls/#systemAudio&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;systemAudio&lt;/code&gt;&lt;/a&gt; option ensures Chrome only offers relevant audio-capture to the user.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Safari 16.1 includes an additional fix to accessibility of &lt;code&gt;display: contents&lt;/code&gt;, a fix to dynamic viewport height (&lt;code&gt;dvh&lt;/code&gt;) units, and support for scroll to text fragments.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by &lt;a href=&quot;https://unsplash.com/@freestockpro?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot; rel=&quot;noopener&quot;&gt;Alexandr Podvalny&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Introducing Learn HTML</title>
    <link href="https://web.dev/introducing-learn-html/"/>
    <updated>2022-09-27T00:00:00Z</updated>
    <id>https://web.dev/introducing-learn-html/</id>
    <content type="html" mode="escaped">&lt;p&gt;Today we are excited to announce the latest in our series of courses on web.dev. &lt;a href=&quot;https://web.dev/learn/html/&quot;&gt;Learn HTML&lt;/a&gt; is a brand new course written by &lt;a href=&quot;https://twitter.com/estellevw&quot; rel=&quot;noopener&quot;&gt;Estelle Weyl&lt;/a&gt; that will take you through all you need to know about HTML today.&lt;/p&gt;
&lt;p&gt;We&#39;re landing the first five modules today, the rest will follow in staged launches over the next couple of months. You can work through these modules beginning to end, or dip into those that interest you. Even if you have been working on the web for years, you&#39;ll discover things you didn&#39;t know. HTML is a Living Standard, constantly evolving to meet the needs of the web, so it&#39;s worth revisiting it from time to time.&lt;/p&gt;
&lt;p&gt;Learn HTML joins our existing courses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/css/&quot;&gt;Learn CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/design/&quot;&gt;Learn Responsive Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/forms/&quot;&gt;Learn Forms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/pwa/&quot;&gt;Learn PWA&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Watch this space for more opportunities to learn key web development skills, coming up very soon!&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Submit your proposals for Interop 2023</title>
    <link href="https://web.dev/submit-your-proposals-for-interop-2023/"/>
    <updated>2022-09-21T00:00:00Z</updated>
    <id>https://web.dev/submit-your-proposals-for-interop-2023/</id>
    <content type="html" mode="escaped">&lt;p&gt;The Chrome team has worked with other browser vendors and partners in the ecosystem to help improve browser compatibility since 2019, starting with the &lt;a href=&quot;https://insights.developer.mozilla.org/reports/mdn-web-developer-needs-assessment-2019.html&quot; rel=&quot;noopener&quot;&gt;MDN Developer Needs Assessment&lt;/a&gt; survey and most recently on &lt;a href=&quot;https://web.dev/interop-2022/&quot;&gt;Interop 2022&lt;/a&gt;. For Interop 2022, all major browser vendors and other stakeholders worked together to improve top browser compatibility issues identified by web developers. We are thrilled at &lt;a href=&quot;https://wpt.fyi/interop-2022&quot; rel=&quot;noopener&quot;&gt;the progress that we’ve made together&lt;/a&gt; and are excited to announce Interop 2023 is happening!&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Showing three circles with scores: 71 for Chrome Dev and Edge Dev, 74 for Firefox Nightly, and 73 for Safari Technology Preview.&quot; decoding=&quot;async&quot; height=&quot;375&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8ryQRYl1NBObumG4IA97.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8ryQRYl1NBObumG4IA97.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8ryQRYl1NBObumG4IA97.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8ryQRYl1NBObumG4IA97.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8ryQRYl1NBObumG4IA97.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8ryQRYl1NBObumG4IA97.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8ryQRYl1NBObumG4IA97.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8ryQRYl1NBObumG4IA97.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8ryQRYl1NBObumG4IA97.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8ryQRYl1NBObumG4IA97.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8ryQRYl1NBObumG4IA97.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8ryQRYl1NBObumG4IA97.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8ryQRYl1NBObumG4IA97.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8ryQRYl1NBObumG4IA97.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8ryQRYl1NBObumG4IA97.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8ryQRYl1NBObumG4IA97.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8ryQRYl1NBObumG4IA97.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8ryQRYl1NBObumG4IA97.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;March 2022.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Showing three circles with scores: 80 for Chrome Dev and Edge Dev, 82 for Firefox Nightly, and 86 for Safari Technology Preview.&quot; decoding=&quot;async&quot; height=&quot;501&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8fXDfdtPWAh2xMF6iiYT.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8fXDfdtPWAh2xMF6iiYT.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8fXDfdtPWAh2xMF6iiYT.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8fXDfdtPWAh2xMF6iiYT.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8fXDfdtPWAh2xMF6iiYT.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8fXDfdtPWAh2xMF6iiYT.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8fXDfdtPWAh2xMF6iiYT.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8fXDfdtPWAh2xMF6iiYT.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8fXDfdtPWAh2xMF6iiYT.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8fXDfdtPWAh2xMF6iiYT.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8fXDfdtPWAh2xMF6iiYT.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8fXDfdtPWAh2xMF6iiYT.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8fXDfdtPWAh2xMF6iiYT.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8fXDfdtPWAh2xMF6iiYT.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8fXDfdtPWAh2xMF6iiYT.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8fXDfdtPWAh2xMF6iiYT.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8fXDfdtPWAh2xMF6iiYT.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/8fXDfdtPWAh2xMF6iiYT.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;September 2022.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The Interop 2023 proposal process is now open for submissions. Suggestions can include features that behave differently across browsers, or features that are not yet implemented in all browsers. Keep in mind that proposals with high quality specifications and web platform tests are more likely to be included, as this project is about reaching interoperability rather than specifying new features. &lt;a href=&quot;https://github.com/web-platform-tests/interop/issues/new?template=focus-area-proposal.yml&quot; rel=&quot;noopener&quot;&gt;The proposal submission process&lt;/a&gt; ends October 15, 2022.&lt;/p&gt;
&lt;p&gt;Once the proposal period ends, the &lt;a href=&quot;https://github.com/web-platform-tests/interop/issues?q=is%3Aissue+is%3Aopen+label%3Afocus-area-proposal&quot; rel=&quot;noopener&quot;&gt;collected submissions&lt;/a&gt; will be discussed by browser vendors and other partners to determine the final list.  It’s likely that there will be more proposals than can be achieved during 2023, so some high quality proposals may not be selected. We are looking forward to reviewing all the submissions, and we’ll post the final list here once Interop 2023 gets underway.&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author><author>
      <name>Robert Nyman</name>
    </author><author>
      <name>Philip Jägenstedt</name>
    </author>
  </entry>
  
  <entry>
    <title>New to the web platform in August</title>
    <link href="https://web.dev/web-platform-08-2022/"/>
    <updated>2022-08-31T00:00:00Z</updated>
    <id>https://web.dev/web-platform-08-2022/</id>
    <content type="html" mode="escaped">&lt;h2 id=&quot;stable-browser-releases&quot;&gt;Stable browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-08-2022/#stable-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In August, &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/104&quot; rel=&quot;noopener&quot;&gt;Firefox 104&lt;/a&gt;, &lt;a href=&quot;https://developer.chrome.com/blog/new-in-chrome-104/&quot; rel=&quot;noopener&quot;&gt;Chrome 104&lt;/a&gt;, and &lt;a href=&quot;https://developer.chrome.com/blog/new-in-chrome-105/&quot; rel=&quot;noopener&quot;&gt;Chrome 105&lt;/a&gt; became stable.&lt;/p&gt;
&lt;h3 id=&quot;individual-transforms&quot;&gt;Individual transforms &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-08-2022/#individual-transforms&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Chrome 104 includes &lt;a href=&quot;https://web.dev/css-individual-transform-properties/&quot;&gt;individual properties for CSS Transforms&lt;/a&gt;. The properties are &lt;code&gt;scale&lt;/code&gt;, &lt;code&gt;rotate&lt;/code&gt;, and &lt;code&gt;translate&lt;/code&gt;, which you can use to individually define those parts of a transformation.&lt;/p&gt;
&lt;p&gt;By doing so, Chrome joins Firefox and Safari which already support these properties.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 104, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      104
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 72, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      72
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 104, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      104
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 14.1, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      14.1
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/scale#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;new-media-query-syntax&quot;&gt;New media query syntax &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-08-2022/#new-media-query-syntax&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Chrome 104 also includes &lt;a href=&quot;https://developer.chrome.com/blog/media-query-range-syntax/&quot; rel=&quot;noopener&quot;&gt;the media query range syntax&lt;/a&gt;. This has already been shipped by Firefox, and helps streamline media queries. For example the following media query:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 400px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  // Styles for viewports with a width of 400 pixels or greater.&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Can be written using a comparison operator:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;width &gt;= 400px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  // Styles for viewports with a width of 400 pixels or greater.&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 104, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      104
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 102, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      102
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 104, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      104
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/Media_Queries/Using_media_queries#syntax_improvements_in_level_4#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;container-queries&quot;&gt;Container queries &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-08-2022/#container-queries&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Chrome 105 is an exciting release bringing the long-awaited feature of container queries to the web platform. While media queries give you a way to query against the size of the viewport, container queries provide a method of querying against the size of a container.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 105, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      105
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 110, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      110
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 105, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      105
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/@container#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;To use container queries, turn on containment using the &lt;code&gt;container-type&lt;/code&gt; property.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.card-container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;container-type&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inline-size&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Setting the &lt;code&gt;container-type&lt;/code&gt; to &lt;code&gt;inline-size&lt;/code&gt; queries the inline-direction size of the parent. In latin languages like english, this would be the width of the card, since the text flows inline from left to right.&lt;/p&gt;
&lt;p&gt;Now, we can use that container to apply styles to any of its children using &lt;code&gt;@container&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.card&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;grid-template-columns&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1fr 1fr&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 400px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;.card&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;grid-template-columns&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1fr&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;You can find out more about container queries in the post &lt;a href=&quot;https://developer.chrome.com/blog/has-with-cq-m105/&quot; rel=&quot;noopener&quot;&gt;@container and :has(): two powerful new responsive APIs landing in Chromium 105&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;the-has-parent-pseudo-class&quot;&gt;The :has() parent pseudo-class &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-08-2022/#the-has-parent-pseudo-class&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The post mentioned above also mentions &lt;code&gt;:has()&lt;/code&gt;. This new pseudo-class The CSS :has() pseudo-class gives you a way to target the parent element and siblings based on conditions. Learn more in &lt;a href=&quot;https://developer.chrome.com/blog/has-m105/&quot; rel=&quot;noopener&quot;&gt;:has() the family selector&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 105, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      105
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 103, Behind a flag&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;flag&quot; title=&quot;Behind a flag&quot; aria-label=&quot;Behind a flag&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 105, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
105
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari 15.4, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
15.4
&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/:has#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;sanitizer-api&quot;&gt;Sanitizer API &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-08-2022/#sanitizer-api&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Also in Chrome 105 is the &lt;a href=&quot;https://developer.chrome.com/blog/new-in-chrome-105/#sanitizer-api&quot; rel=&quot;noopener&quot;&gt;Sanitizer API&lt;/a&gt;. This API builds sanitization into the platform to help remove cross-site scripting vulnerabilities.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 105, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      105
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 83, Behind a flag&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;flag&quot; title=&quot;Behind a flag&quot; aria-label=&quot;Behind a flag&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 105, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
105
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/Sanitizer#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Also in Chrome 105 is the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/:modal&quot; rel=&quot;noopener&quot;&gt;:modal&lt;/a&gt; CSS pseudo-class. This matches an element that is in a state in which it excludes all interaction with elements outside it. For example, a &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; opened with the &lt;code&gt;showModal()&lt;/code&gt; API.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 105, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      105
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 103, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      103
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 105, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      105
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15.6, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15.6
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/:modal#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;the-findlast-and-findlastindex-methods&quot;&gt;The findLast() and findLastIndex() methods &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-08-2022/#the-findlast-and-findlastindex-methods&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Firefox 104 adds support behind a flag for the methods &lt;a href=&quot;https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/findLast&quot; rel=&quot;noopener&quot;&gt;Array.prototype.findLast()&lt;/a&gt;,
&lt;a href=&quot;https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/findLastIndex&quot; rel=&quot;noopener&quot;&gt;Array.prototype.findLastIndex()&lt;/a&gt;,
&lt;a href=&quot;https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/findLast&quot; rel=&quot;noopener&quot;&gt;TypedArray.prototype.findLast()&lt;/a&gt;, and &lt;a href=&quot;https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/findLastIndex&quot; rel=&quot;noopener&quot;&gt;TypedArray.prototype.findLastIndex()&lt;/a&gt;. These are used to find the value and index (respectively) of the last element in an Array or TypedArray that matches a supplied test function.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 97, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      97
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 104, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      104
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 97, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      97
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/findLast#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id=&quot;beta-browser-releases&quot;&gt;Beta browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-08-2022/#beta-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beta browser versions give you a preview of things that will be in the next stable version of the browser. It&#39;s a great time to test new features, or removals, that could impact your site before the world gets that release.&lt;/p&gt;
&lt;p&gt;Due to release dates falling just outside the month, the only new beta in August was &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/105&quot; rel=&quot;noopener&quot;&gt;Firefox 105&lt;/a&gt;, which is currently light on details.&lt;/p&gt;
&lt;p&gt;The Safari 16 beta &lt;a href=&quot;https://web.dev/web-platform-06-2022/#safari-16-brings-several-key-features-to-the-browser&quot;&gt;mentioned in June&lt;/a&gt; is also still ongoing.&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>New to the web platform in July</title>
    <link href="https://web.dev/web-platform-07-2022/"/>
    <updated>2022-07-29T00:00:00Z</updated>
    <id>https://web.dev/web-platform-07-2022/</id>
    <content type="html" mode="escaped">&lt;h2 id=&quot;stable-browser-releases&quot;&gt;Stable browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-07-2022/#stable-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In July, &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/103&quot; rel=&quot;noopener&quot;&gt;Firefox 103&lt;/a&gt; and &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-15_6-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 15.6&lt;/a&gt; became stable, and with this we get interoperability on a couple of nice CSS features.&lt;/p&gt;
&lt;h3 id=&quot;the-backdrop-filter-property&quot;&gt;The &lt;code&gt;backdrop-filter&lt;/code&gt; property &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-07-2022/#the-backdrop-filter-property&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Firefox 103 includes the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/backdrop-filter&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;backdrop-filter&lt;/code&gt;&lt;/a&gt; property which is used to apply effects such as blurring to the area behind an element. With this value in Firefox, it is now available in all three engines, though Safari requires the &lt;code&gt;-webkit&lt;/code&gt; prefix.&lt;/p&gt;
&lt;div class=&quot;codepen-embed-wrap&quot; style=&quot;height: 520px; width: 100%&quot;&gt;
&lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi;&quot; loading=&quot;lazy&quot; src=&quot;https://codepen.io/web-dot-dev/embed/LYdOrLv?height=520&amp;theme-id=light&amp;default-tab=result&amp;editable=true&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;Pen LYdOrLv by web-dot-dev on Codepen&quot;&gt;See the Pen &lt;a href=&quot;https://codepen.io/web-dot-dev/embed/LYdOrLv&quot;&gt;Pen LYdOrLv by web-dot-dev on Codepen&lt;/a&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 76, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      76
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 103, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      103
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 17, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      17
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 9, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      9
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/backdrop-filter#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;the-scroll-snap-stop-property&quot;&gt;The &lt;code&gt;scroll-snap-stop&lt;/code&gt; property &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-07-2022/#the-scroll-snap-stop-property&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Firefox also implemented the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/scroll-snap-stop&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;scroll-snap-stop&lt;/code&gt;&lt;/a&gt; property. This property gives you control over whether a scrolling element passes over possible snap positions (with the default value of &lt;code&gt;normal&lt;/code&gt;) or must snap to the first (with the value &lt;code&gt;always&lt;/code&gt;). The &lt;code&gt;scroll-snap-stop&lt;/code&gt; property is now in all three browser engines.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 75, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      75
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 103, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      103
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 79, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      79
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/scroll-snap-stop#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Safari 15.6 was a release mostly dedicated to resolving issues, however it did land one new CSS feature with the &lt;code&gt;:modal&lt;/code&gt; pseudo-class. This feature was also shipped in Firefox 103. The &lt;code&gt;:modal&lt;/code&gt; pseudo-class selects an element when everything outside of that element cannot be interacted with until the element is dismissed. For example, a &lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTML/Element/dialog&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;dialog&lt;/code&gt;&lt;/a&gt; element opened with &lt;code&gt;showModal()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 105, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      105
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 103, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      103
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 105, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      105
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15.6, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15.6
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/:modal#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id=&quot;beta-browser-releases&quot;&gt;Beta browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-07-2022/#beta-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beta browser versions give you a preview of things that will be in the next stable version of the browser. It&#39;s a great time to test new features, or removals, that could impact your site before the world gets that release.&lt;/p&gt;
&lt;p&gt;Due to release dates falling just outside the month, the only new beta in June was &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/104&quot; rel=&quot;noopener&quot;&gt;Firefox 104&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Included in Firefox 104 is the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/CSS_Font_Loading_API&quot; rel=&quot;noopener&quot;&gt;CSS Font Loading API&lt;/a&gt; in Web Workers, and the CSS &lt;code&gt;animation-composition&lt;/code&gt; property, that defines the composition operation used when multiple animations affect the same property simultaneously.&lt;/p&gt;
&lt;p&gt;The Safari 16 beta &lt;a href=&quot;https://web.dev/web-platform-06-2022/#safari-16-brings-several-key-features-to-the-browser&quot;&gt;mentioned last month&lt;/a&gt; is also still ongoing.&lt;/p&gt;
&lt;p&gt;These beta features will land in stable browsers soon.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Hero image by &lt;a href=&quot;https://unsplash.com/@jannerboy62&quot; rel=&quot;noopener&quot;&gt;Nick Fewings&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>New to the web platform in June</title>
    <link href="https://web.dev/web-platform-06-2022/"/>
    <updated>2022-06-30T00:00:00Z</updated>
    <id>https://web.dev/web-platform-06-2022/</id>
    <content type="html" mode="escaped">&lt;h2 id=&quot;stable-browser-releases&quot;&gt;Stable browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-06-2022/#stable-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In June, &lt;a href=&quot;https://developer.chrome.com/blog/new-in-chrome-103/&quot; rel=&quot;noopener&quot;&gt;Chrome 103&lt;/a&gt; and &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/102&quot; rel=&quot;noopener&quot;&gt;Firefox 102&lt;/a&gt; became stable.&lt;/p&gt;
&lt;h3 id=&quot;transform-streams-and-readable-byte-streams&quot;&gt;Transform streams and readable byte streams &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-06-2022/#transform-streams-and-readable-byte-streams&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Firefox 102 includes support for &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/TransformStream&quot; rel=&quot;noopener&quot;&gt;Transform Streams&lt;/a&gt;. This enables piping from &lt;code&gt;ReadableStream&lt;/code&gt; to a &lt;code&gt;WritableStream&lt;/code&gt;, executing a transformation on the chunks. It&#39;s great to see this feature become available in all three engines, making this a very good time to learn about &lt;a href=&quot;https://web.dev/streams/&quot;&gt;Streams&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 67, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      67
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 102, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      102
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 79, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      79
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 14.1, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      14.1
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/TransformStream#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/Streams_API#bytestream-related_interfaces&quot; rel=&quot;noopener&quot;&gt;Readable byte streams&lt;/a&gt; are also now supported in Firefox 102, enabling a BYOB (bring your own buffer) reader with the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBReader&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;ReadableStreamBYOBReader&lt;/code&gt;&lt;/a&gt; interface. This can be used to stream data supplied by the developer.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 89, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      89
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 102, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      102
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 89, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      89
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/ReadableStreamBYOBReader#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;access-locally-installed-fonts&quot;&gt;Access locally installed fonts &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-06-2022/#access-locally-installed-fonts&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Chrome 103 includes the &lt;a href=&quot;https://web.dev/local-fonts/&quot;&gt;Local Font Access API&lt;/a&gt;, which allows access to the user&#39;s locally installed fonts. After requesting access to the fonts installed on the device, call &lt;code&gt;window.queryLocalFonts()&lt;/code&gt; to get an array of the installed fonts.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; pickedFonts &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;queryLocalFonts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fontData &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt; pickedFonts&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fontData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;postscriptName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fontData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fullName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fontData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;family&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fontData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;h3 id=&quot;the-update-media-feature&quot;&gt;The &lt;code&gt;update&lt;/code&gt; media feature &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-06-2022/#the-update-media-feature&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Firefox 102 includes the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@media/update-frequency&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;update&lt;/code&gt;&lt;/a&gt; media feature. This is used to query whether the output device can modify the appearance of content once it has been rendered.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 113, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      113
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 102, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      102
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 113, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      113
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/@media/update-frequency#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;a-new-http-status-code—103-early-hints&quot;&gt;A new HTTP status code—103 early hints &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-06-2022/#a-new-http-status-code%E2%80%94103-early-hints&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Chrome 103 adds a new status code HTTP 103 Early Hints. If the server or CDN knows that a certain set of subresources is required to load a page, it can advise the browser to preconnect to origins or even preload resources as the page that requires them comes in. This requires updates to your server or CDN to take advantage of the feature, &lt;a href=&quot;https://developer.chrome.com/blog/early-hints/&quot; rel=&quot;noopener&quot;&gt;find out more about Early Hints&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;beta-browser-releases&quot;&gt;Beta browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-06-2022/#beta-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beta browser versions give you a preview of things that will be in the next stable version of the browser. It&#39;s a great time to test new features, or removals, that could impact your site before the world gets that release.&lt;/p&gt;
&lt;p&gt;New betas in April were &lt;a href=&quot;https://blog.chromium.org/2022/06/chrome-104-beta-new-media-query-syntax.html&quot; rel=&quot;noopener&quot;&gt;Chrome 104&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/103&quot; rel=&quot;noopener&quot;&gt;Firefox 103&lt;/a&gt;, and &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 16&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;new-syntax-for-range-media-queries&quot;&gt;New syntax for range media queries &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-06-2022/#new-syntax-for-range-media-queries&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Chrome 104 includes the new syntax for &lt;a href=&quot;https://developer.chrome.com/blog/media-query-range-syntax/&quot; rel=&quot;noopener&quot;&gt;range media queries&lt;/a&gt;, from the Media Queries Level 4 specification. For example, a media query previously written like this:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 400px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; … &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Can now be written like this:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;width &gt;= 400px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; … &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 104, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      104
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 102, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      102
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 104, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      104
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/Media_Queries/Using_media_queries#syntax_improvements_in_level_4#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h3 id=&quot;region-capture-api&quot;&gt;Region Capture API &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-06-2022/#region-capture-api&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Chrome 104 on desktop also includes the &lt;a href=&quot;https://developer.chrome.com/docs/web-platform/region-capture/&quot; rel=&quot;noopener&quot;&gt;Region Capture API&lt;/a&gt;. This enables cropping and removing content from captured video before sharing it.&lt;/p&gt;
&lt;h3 id=&quot;safari-16-brings-several-key-features-to-the-browser&quot;&gt;Safari 16 brings several key features to the browser &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-06-2022/#safari-16-brings-several-key-features-to-the-browser&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Safari 16 looks to be another exciting release from the Safari team. This release adds many of the features that are included in &lt;a href=&quot;https://web.dev/interop-2022/&quot;&gt;Interop 2022&lt;/a&gt;, it&#39;s great to see so much landing at this mid-year point. I&#39;m highlighting a few of my favorite features here, but do check out the &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-16-release-notes&quot; rel=&quot;noopener&quot;&gt;release notes&lt;/a&gt; for more.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; To try out the Safari 16 beta you need to be running the macOS beta, however many of these features can also be found in &lt;a href=&quot;https://webkit.org/blog/12960/release-notes-for-safari-technology-preview-147-with-safari-16-features/&quot;&gt;Safari Technology Preview from version 147&lt;/a&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;Along with many developers, I&#39;m really excited to see size queries support for Container Queries, a feature that is also behind a flag in Chrome currently.&lt;/p&gt;
&lt;p&gt;Also in Safari 16 is support for the &lt;code&gt;subgrid&lt;/code&gt; value for &lt;code&gt;grid-template-columns&lt;/code&gt; and &lt;code&gt;grid-template-rows&lt;/code&gt;. This feature is already in Firefox, and in development in Chrome, and enables grid track sizing to be inherited by nested grids.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 114, Behind a flag&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;flag&quot; title=&quot;Behind a flag&quot; aria-label=&quot;Behind a flag&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Firefox 71, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
71
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 114, Behind a flag&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;flag&quot; title=&quot;Behind a flag&quot; aria-label=&quot;Behind a flag&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari 16, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
16
&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Grid_Layout/Subgrid#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Also for grid layout is the ability to animate grid tracks.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 107, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      107
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 66, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      66
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 107, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      107
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/HTMLInputElement/showPicker&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;showPicker()&lt;/code&gt;&lt;/a&gt; method, enabling a canonical way to show a browser picker for dates, time, color, and files is included. You can find out more about this in &lt;a href=&quot;https://developer.chrome.com/blog/show-picker/&quot; rel=&quot;noopener&quot;&gt;show a browser picker for date, time, color, and files&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 99, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      99
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 101, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      101
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 99, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      99
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/HTMLInputElement/showPicker#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://hidde.blog/more-accessible-markup-with-display-contents/&quot; rel=&quot;noopener&quot;&gt;Accessibility issues&lt;/a&gt; for &lt;code&gt;display: contents&lt;/code&gt; have also been addressed, making this useful feature safe to use without danger of removing elements from the accessibility tree.&lt;/p&gt;
&lt;p&gt;These beta features will land in stable browsers soon.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Hero image by &lt;a href=&quot;https://unsplash.com/@jannerboy62&quot; rel=&quot;noopener&quot;&gt;Nick Fewings&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>New to the web platform in May</title>
    <link href="https://web.dev/web-platform-05-2022/"/>
    <updated>2022-05-31T00:00:00Z</updated>
    <id>https://web.dev/web-platform-05-2022/</id>
    <content type="html" mode="escaped">&lt;h2 id=&quot;stable-browser-releases&quot;&gt;Stable browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-05-2022/#stable-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In May, Chrome 102, &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-15_5-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 15.5&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/100&quot; rel=&quot;noopener&quot;&gt;Firefox 100&lt;/a&gt;, and &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/101&quot; rel=&quot;noopener&quot;&gt;Firefox 101&lt;/a&gt; became stable.&lt;/p&gt;
&lt;p&gt;Chrome 102 and Safari 15.5 include &lt;a href=&quot;https://developer.chrome.com/blog/inert/&quot; rel=&quot;noopener&quot;&gt;the &lt;code&gt;inert&lt;/code&gt; attribute&lt;/a&gt;. This removes elements from the tab order and accessibility tree if they are non-interactive. For example, an element that is currently offscreen or hidden.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 102, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      102
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 112, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      112
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 102, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      102
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15.5, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15.5
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/HTML/Global_attributes/inert#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Chrome 102 includes the new value &lt;code&gt;until-found&lt;/code&gt; for the HTML &lt;code&gt;hidden&lt;/code&gt; attribute. This enables find-in-page and scroll to text fragment on text that is inside a collapsed area of the page, as you might find in an accordion pattern. Find out more in the post &lt;a href=&quot;https://developer.chrome.com/blog/hidden-until-found/&quot; rel=&quot;noopener&quot;&gt;Making collapsed content accessible with hidden=until-found&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 102, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      102
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 102, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
102
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/HTML/Global_attributes/hidden#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Chrome 102 ships the &lt;a href=&quot;https://developer.chrome.com/docs/web-platform/navigation-api/&quot; rel=&quot;noopener&quot;&gt;Navigation API&lt;/a&gt;, an API that standardizes client-side routing in single-page applications. This API was previously named the App History API.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 102, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      102
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 102, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
102
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Firefox 101 supports &lt;a href=&quot;https://web.dev/constructable-stylesheets/&quot;&gt;constructable stylesheets&lt;/a&gt;. Support includes the &lt;code&gt;CSSStyleSheet()&lt;/code&gt; constructor, and the &lt;code&gt;replace()&lt;/code&gt;, and &lt;code&gt;replaceSync()&lt;/code&gt; methods. Constructable stylesheets make it easier to create stylesheets for use with the Shadow DOM. In the following example, a stylesheet is created using the &lt;code&gt;CSSStyleSheet()&lt;/code&gt; constructor, a CSS rule is added with the &lt;code&gt;replaceSync()&lt;/code&gt; method, and the resulting rule is printed to the console.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; stylesheet &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CSSStyleSheet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replaceSync&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;body { color: red; }&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rules&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cssText&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 73, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      73
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 101, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      101
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 79, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      79
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/CSSStyleSheet/CSSStyleSheet#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Also in Firefox 101 is the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@media/prefers-contrast&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;prefers-contrast&lt;/code&gt;&lt;/a&gt; media feature, making this feature available cross-browser.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 96, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      96
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 101, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      101
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 96, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      96
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 14.1, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      14.1
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/@media/prefers-contrast#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id=&quot;beta-browser-releases&quot;&gt;Beta browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-05-2022/#beta-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beta browser versions give you a preview of things that will be in the next stable version of the browser. It&#39;s a great time to test new features, or removals, that could impact your site before the world gets that release.&lt;/p&gt;
&lt;p&gt;New betas in April were &lt;a href=&quot;https://blog.chromium.org/2022/05/chrome-103-beta-early-navigation-hints.html&quot; rel=&quot;noopener&quot;&gt;Chrome 103&lt;/a&gt; and &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/102&quot; rel=&quot;noopener&quot;&gt;Firefox 102&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Firefox 102 includes the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@media/update-frequency&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;update&lt;/code&gt;&lt;/a&gt; media feature. This is used to query whether the output device can modify the appearance of content once it has been rendered. It accepts the following values:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;code&gt;none&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Once rendered the content cannot be updated. For example, a printed document.&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;slow&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;The device can update the content, but too slowly to display smooth animation. For example, E-ink screens.&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;fast&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;The content can change dynamically, and quickly enough to render animations. For example, a computer or phone screen.&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 113, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      113
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 102, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      102
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 113, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      113
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/@media/update-frequency#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Chrome 103 includes the &lt;a href=&quot;https://web.dev/local-fonts/&quot;&gt;Local Font Access API&lt;/a&gt;, which allows access to the user&#39;s locally installed fonts.&lt;/p&gt;
&lt;p&gt;These beta features will land in stable browsers soon.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Edit: A previous version of this post included mention of the &lt;a href=&quot;https://chromestatus.com/feature/5163102852087808&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;Element.isVisible()&lt;/code&gt;&lt;/a&gt; method, which is not shipping in this release.&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>The Front-End Developer&#39;s Guide to the Terminal</title>
    <link href="https://web.dev/terminal-for-js-devs/"/>
    <updated>2022-05-20T00:00:00Z</updated>
    <id>https://web.dev/terminal-for-js-devs/</id>
    <content type="html" mode="escaped">&lt;p&gt;If you are used to working in a GUI, then the terminal can seem a complicated and unforgiving place. By learning a few commands however, you can achieve most tasks quickly and easily.&lt;/p&gt;
&lt;p&gt;Josh Comeau has written an excellent guide for front-end developers who are new to the terminal. Providing the information that many tutorials seem to assume you already know, in easy to follow steps.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;It&#39;s the missing manual of terminal fundamentals needed to work with modern JS frameworks like React, so you can move onto the fun stuff: building user interfaces!&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Check it out at &lt;a href=&quot;https://www.joshwcomeau.com/javascript/terminal-for-js-devs/&quot; rel=&quot;noopener&quot;&gt;The Front-End Developer&#39;s Guide to the Terminal&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by &lt;a href=&quot;https://unsplash.com/@etiennegirardet&quot; rel=&quot;noopener&quot;&gt;Etienne Girardet&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Bridging the gap</title>
    <link href="https://web.dev/bridging-the-gap/"/>
    <updated>2022-05-11T00:00:00Z</updated>
    <id>https://web.dev/bridging-the-gap/</id>
    <content type="html" mode="escaped">&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; Watch the talk &lt;a href=&quot;https://www.youtube.com/watch?v=fGlhRnp5M-g&quot;&gt;Bridging the Gap&lt;/a&gt; from Google I/O &#39;22: &lt;div class=&quot;youtube&quot;&gt;  &lt;lite-youtube videoid=&quot;fGlhRnp5M-g&quot;&gt;  &lt;/lite-youtube&gt;&lt;/div&gt; &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;When we talk to developers, be that individually or via surveys such as the &lt;a href=&quot;https://stateofcss.com/&quot; rel=&quot;noopener&quot;&gt;State of CSS&lt;/a&gt;, we repeatedly hear the same things. Developers find it hard to make websites and applications that work well across browsers, and find it hard to know when exciting new features are safe to use.&lt;/p&gt;
&lt;h2 id=&quot;flexbox-gap&quot;&gt;Flexbox gap &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/bridging-the-gap/#flexbox-gap&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As an example of a problematic property, the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/gap&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;gap&lt;/code&gt;&lt;/a&gt; property lets you make gaps between &lt;a href=&quot;https://web.dev/learn/css/grid/&quot;&gt;grid&lt;/a&gt; or &lt;a href=&quot;https://web.dev/learn/css/flexbox/&quot;&gt;flex&lt;/a&gt; items, or columns in a &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Columns&quot; rel=&quot;noopener&quot;&gt;multicol&lt;/a&gt; container. While we have had &lt;code&gt;column-gap&lt;/code&gt; in multicol for a long time, the property first appeared in grid layout as &lt;code&gt;grid-gap&lt;/code&gt;, along with &lt;code&gt;grid-column-gap&lt;/code&gt; and &lt;code&gt;grid-row-gap&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Just after grid layout landed in browsers, the property was renamed as &lt;code&gt;gap&lt;/code&gt;, along with &lt;code&gt;row-gap&lt;/code&gt; and &lt;code&gt;column-gap&lt;/code&gt;. It was then specified to work in flex layout too. The renaming means that we don’t have multiple properties doing the same thing.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.box&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; flex&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;gap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Firefox shipped the property for flex layouts in October 2018. It didn’t show up in Chrome until July 2020, followed by Safari in April 2021. This meant there was a gap of two years and six months before we could safely use &lt;code&gt;gap&lt;/code&gt;. In reality, for most developers the wait was much longer, due to needing to support browser versions older than the latest one. Supporting &lt;code&gt;gap&lt;/code&gt; in flex layout was made more problematic by the fact we can’t use &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Conditional_Rules/Using_Feature_Queries&quot; rel=&quot;noopener&quot;&gt;feature queries&lt;/a&gt; to detect gap support in flex layout. As the &lt;code&gt;gap&lt;/code&gt; property is supported in grid, &lt;code&gt;@supports (gap:1em)&lt;/code&gt; will return true.&lt;/p&gt;
&lt;p&gt;An additional problem is that when a new feature lands in one browser, people start to talk about it and share demos. This often begins long before the feature is in any stable browser at all. This can be confusing for developers, or at the least, frustrating. Repeatedly, shiny new features are being talked about everywhere, and then you discover you can’t actually use them due to lack of support.&lt;/p&gt;
&lt;h2 id=&quot;why-are-there-gaps-in-support&quot;&gt;Why are there gaps in support? &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/bridging-the-gap/#why-are-there-gaps-in-support&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is not a post pointing the finger at one browser for being slow. If you look across different platform features, you’ll discover that different browsers take the lead on different features.&lt;/p&gt;
&lt;p&gt;Most features will be prototyped in one browser. For example, the grid layout specification was first created by Microsoft and implemented in an initial form in Internet Explorer 10. An engineer at Mozilla did a lot of work to figure out how subgrid should behave, and so this feature landed in Firefox first. We’re seeing Safari take the lead on some exciting new color functions.&lt;/p&gt;
&lt;p&gt;While one browser may take the lead on prototyping, representatives of all browsers (and other organizations) in the CSS Working Group discuss CSS features. It’s very important that a feature can be implemented in all browsers, and that it isn’t designed in such a way as to make it impossible to implement in one browser. That would lead to a permanent gap in support, and lack of adoption of the feature.&lt;/p&gt;
&lt;p&gt;When it comes to implementing a feature however, it needs to be prioritized alongside all the other possible features for that browser. And, sometimes things are held up behind other work that needs to be done to make the browser better. A great example of this is the &lt;a href=&quot;https://developer.chrome.com/blog/renderingng/&quot; rel=&quot;noopener&quot;&gt;RenderingNG&lt;/a&gt; work in Chromium. This has paved the way for the implementation of subgrid; however, the long gap between Firefox and Chromium shipping subgrid is due to the need for grid layout to be reimplemented in the new rendering engine first.&lt;/p&gt;
&lt;h2 id=&quot;the-problems&quot;&gt;The problems &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/bridging-the-gap/#the-problems&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We have two problems here. The first is the interoperability problem, the fact that it can take a long time from the point at which a feature lands in one browser to when it is available everywhere.&lt;/p&gt;
&lt;p&gt;The second is a problem of messaging. How can we make it clear where the gaps in support are? How do we share new features without causing everyone to have to carefully research each thing to work out how well supported it is?&lt;/p&gt;
&lt;h3 id=&quot;interoperability&quot;&gt;Interoperability &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/bridging-the-gap/#interoperability&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Browsers are already working together to solve the interoperability issue. Last year &lt;a href=&quot;https://web.dev/compat2021/&quot;&gt;Compat 2021&lt;/a&gt; helped to close the gap in support on a number of features, including the gap property in flex layout. This year the &lt;a href=&quot;https://web.dev/interop-2022/&quot;&gt;Interop 2022&lt;/a&gt; effort is focussing on 15 features, and there has already been movement on some of these.&lt;/p&gt;
&lt;p&gt;You can follow progress on the &lt;a href=&quot;https://wpt.fyi/interop-2022&quot; rel=&quot;noopener&quot;&gt;Interop 2022 dashboard&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;messaging&quot;&gt;Messaging &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/bridging-the-gap/#messaging&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The second problem is something that I’m keen to help with when we talk about features here on web.dev and on &lt;a href=&quot;https://developer.chrome.com/&quot; rel=&quot;noopener&quot;&gt;developer.chrome.com&lt;/a&gt;. I want the status of features to be really clear when you read our content, and for us to provide practical ways to navigate support issues.&lt;/p&gt;
&lt;p&gt;We’ve launched a number of fundamental courses, with more to come. These courses help you to learn how to build for the modern web, using core web platform technologies. Check out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/css/&quot;&gt;Learn CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/forms/&quot;&gt;Learn Forms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/design/&quot;&gt;Learn Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/pwa/&quot;&gt;Learn PWA&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We’re working to focus our content on this site on those things that you can safely use. We’re not completely there yet; however, you should start to see a bit of a shift towards the practical over the coming months.&lt;/p&gt;
&lt;p&gt;We also contribute to open web documentation through our support of the &lt;a href=&quot;https://opencollective.com/open-web-docs&quot; rel=&quot;noopener&quot;&gt;Open Web Docs&lt;/a&gt; project. This ensures we have first-class documentation on &lt;a href=&quot;https://developer.mozilla.org/&quot; rel=&quot;noopener&quot;&gt;MDN&lt;/a&gt;, along with up-to-date &lt;a href=&quot;https://github.com/mdn/browser-compat-data&quot; rel=&quot;noopener&quot;&gt;browser compatibility data&lt;/a&gt;. We then use this data here on web.dev to show support for features. Here’s the current support of &lt;code&gt;gap&lt;/code&gt; in flex layout.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 84, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      84
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 63, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      63
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 84, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      84
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 14.1, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      14.1
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;If you want to know more about Chrome’s vision for the web, the things we are experimenting with in Origin and Developer trials, then you’ll increasingly find that content on our sister site—&lt;a href=&quot;https://developer.chrome.com/&quot; rel=&quot;noopener&quot;&gt;developer.chrome.com&lt;/a&gt;. The content there may well be experimental, or only supported in Chrome right now, but we’d love you to explore it and offer feedback.&lt;/p&gt;
&lt;p&gt;It really is an exciting time for the web right now. We hope we can help to bring key features to you more quickly, and be clear about the gaps that do exist, making web development more fun and less frustrating.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by &lt;a href=&quot;https://unsplash.com/es/@cristofer&quot; rel=&quot;noopener&quot;&gt;Cristofer Maximilian&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Variable fonts in real life</title>
    <link href="https://web.dev/variable-fonts-in-real-life/"/>
    <updated>2022-05-06T00:00:00Z</updated>
    <id>https://web.dev/variable-fonts-in-real-life/</id>
    <content type="html" mode="escaped">&lt;p&gt;If you have not yet taken the plunge into using &lt;a href=&quot;https://web.dev/variable-fonts/&quot;&gt;variable fonts&lt;/a&gt;, the article &lt;a href=&quot;https://evilmartians.com/chronicles/variable-fonts-in-real-life-how-to-use-and-love-them&quot; rel=&quot;noopener&quot;&gt;Variable fonts in real life&lt;/a&gt; from &lt;a href=&quot;https://twitter.com/romanshamin_en&quot; rel=&quot;noopener&quot;&gt;Roman Shamin&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/_Travis_Turner&quot; rel=&quot;noopener&quot;&gt;Travis Turner&lt;/a&gt; at Evil Martians gives some excellent use cases,
and reasons why your next project should make the change.&lt;/p&gt;
&lt;p&gt;Variable fonts now have excellent browser support. They can help with performance, as the browser only needs to download a single font file for all variations.
However, as this article shows, they can also help match font weights to logos and other elements, assist with contrast issues between light and dark mode, and make small text more readable.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 62, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      62
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 62, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      62
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 17, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      17
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 11, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      11
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/font-variation-settings#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Hero image by &lt;a href=&quot;https://unsplash.com/@florianklauer&quot; rel=&quot;noopener&quot;&gt;Florian Klauer&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>New to the web platform in April</title>
    <link href="https://web.dev/web-platform-04-2022/"/>
    <updated>2022-04-29T00:00:00Z</updated>
    <id>https://web.dev/web-platform-04-2022/</id>
    <content type="html" mode="escaped">&lt;h2 id=&quot;stable-browser-releases&quot;&gt;Stable browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-04-2022/#stable-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In April, Chrome 101 and &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/99&quot; rel=&quot;noopener&quot;&gt;Firefox 99&lt;/a&gt; became stable. After the bumper crop of features landing &lt;a href=&quot;https://web.dev/web-platform-03-2022/&quot;&gt;last month&lt;/a&gt;, it was a bit quieter during April, but a few interesting things landed for us to use.&lt;/p&gt;
&lt;p&gt;Chrome 101 includes &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/color_value/hwb&quot; rel=&quot;noopener&quot;&gt;hwb color notation&lt;/a&gt;. This specifies color according to its hue, whiteness, and blackness. As with other color notation, an optional alpha component specifies opacity.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;h1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;hwb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;194 0% 0% / .5&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* #00c3ff with 50% opacity */&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;To learn more about &lt;code&gt;hwb()&lt;/code&gt;, read this article by &lt;a href=&quot;https://twitter.com/stefanjudis/&quot; rel=&quot;noopener&quot;&gt;Stefan Judis&lt;/a&gt;: &lt;a href=&quot;https://www.stefanjudis.com/blog/hwb-a-color-notation-for-humans/&quot; rel=&quot;noopener&quot;&gt;hwb() – a color notation for humans?&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 101, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      101
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 96, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      96
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 101, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      101
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/color_value/hwb#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Also in Chrome 101 is the &lt;a href=&quot;https://web.dev/fetch-priority/&quot;&gt;Fetch Priority&lt;/a&gt; feature. This gives you a way to hint to the browser which order resources should be downloaded in, by using the &lt;code&gt;fetchpriority&lt;/code&gt; attribute. In the example below, a low priority image is indicated with &lt;code&gt;fetchpriority=&amp;quot;low&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/images/in_viewport_but_not_important.svg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;fetchpriority&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;low&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;I&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;m an unimportant image!&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Fetch Priority isn&#39;t yet available in other browsers, however you can start using them right now to benefit anyone with a browser based on Chromium 101.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 102, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      102
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 102, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
102
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari preview, Preview&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;preview&quot; title=&quot;Preview&quot; aria-label=&quot;Preview&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/HTMLImageElement/fetchPriority#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Firefox 99 includes the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/Navigator/pdfViewerEnabled&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;pdfViewerEnabled&lt;/code&gt;&lt;/a&gt; property of the Navigator interface. This property indicates if the browser supports inline display of PDF files.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pdfViewerEnabled&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token comment&quot;&gt;// The browser does not support inline viewing of PDF files.&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 94, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      94
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 99, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      99
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 94, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      94
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/Navigator/pdfViewerEnabled#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id=&quot;beta-browser-releases&quot;&gt;Beta browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-04-2022/#beta-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beta browser versions give you a preview of things that will be in the next stable version of the browser. It&#39;s a great time to test new features, or removals, that could impact your site before the world gets that release.&lt;/p&gt;
&lt;p&gt;New betas in April were &lt;a href=&quot;https://blog.chromium.org/2022/04/chrome-102-window-controls-overlay-host.html&quot; rel=&quot;noopener&quot;&gt;Chrome 102&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/100&quot; rel=&quot;noopener&quot;&gt;Firefox 100&lt;/a&gt;, and &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-15_5-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 15.5&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Chrome 102, Safari 15.5, and Firefox preview versions include &lt;a href=&quot;https://developer.chrome.com/blog/inert/&quot; rel=&quot;noopener&quot;&gt;the &lt;code&gt;inert&lt;/code&gt; attribute&lt;/a&gt;. This removes elements from the tab order and accessibility tree if they are non-interactive. For example, an element that is currently offscreen or hidden.&lt;/p&gt;
&lt;p&gt;Chrome 102 includes the new value &lt;code&gt;until-found&lt;/code&gt; for the HTML &lt;code&gt;hidden&lt;/code&gt; attribute. This enables find-in-page and scroll to text fragment on text that is inside a collapsed area of the page, as you might find in an accordion pattern. Find out more in the post &lt;a href=&quot;https://developer.chrome.com/blog/hidden-until-found/&quot; rel=&quot;noopener&quot;&gt;Making collapsed content accessible with hidden=until-found&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 102, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      102
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Edge 102, Supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
102
&lt;/span&gt;
&lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
&lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
&lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
&lt;/span&gt;
&lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/HTML/Global_attributes/hidden#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Chrome 102 also includes the &lt;a href=&quot;https://web.dev/local-fonts/&quot;&gt;Local Font Access API&lt;/a&gt;, which allows access to the user&#39;s locally installed fonts.&lt;/p&gt;
&lt;p&gt;These beta features will land in stable browsers soon.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Hero image by &lt;a href=&quot;https://unsplash.com/@ninjason&quot; rel=&quot;noopener&quot;&gt;Jason Leung&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>New to the web platform in March</title>
    <link href="https://web.dev/web-platform-03-2022/"/>
    <updated>2022-03-31T00:00:00Z</updated>
    <id>https://web.dev/web-platform-03-2022/</id>
    <content type="html" mode="escaped">&lt;h2 id=&quot;stable-browser-releases&quot;&gt;Stable browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-03-2022/#stable-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In March, &lt;a href=&quot;https://developer.chrome.com/blog/new-in-chrome-99/&quot; rel=&quot;noopener&quot;&gt;Chrome 99&lt;/a&gt;, &lt;a href=&quot;https://developer.chrome.com/blog/new-in-chrome-100/&quot; rel=&quot;noopener&quot;&gt;Chrome 100&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/98&quot; rel=&quot;noopener&quot;&gt;Firefox 98&lt;/a&gt;, and &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-15_4-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari 15.4&lt;/a&gt; became stable. This brought a whole batch of new features to the platform, and many of these additions meant that the feature became available in all three browser engines. In this post I&#39;ve concentrated on those additions that give us interoperability cross-browser, but do check out the release notes to see all of the features added to each engine.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; With Chrome reaching version 100 we had a look back at some of the fun, cool, and interesting things that have happened over the past 14 years. Take a look at &lt;a href=&quot;https://developer.chrome.com/100/&quot;&gt;#100CoolWebMoments&lt;/a&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;Chrome 99 and Safari 15.4 included &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@layer&quot; rel=&quot;noopener&quot;&gt;Cascade Layers&lt;/a&gt;. The &lt;code&gt;@layer&lt;/code&gt; at-rule defines a cascade layer, helping you to control specificity. They join Firefox, and so Cascade Layers is now available in all three browser engines. Find out more about Cascade Layers in &lt;a href=&quot;https://developer.chrome.com/blog/cascade-layers/&quot; rel=&quot;noopener&quot;&gt;Cascade layers are coming to your browser&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 99, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      99
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 97, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      97
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 99, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      99
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/@layer#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Chrome 100 includes the new value of &lt;code&gt;plus-lighter&lt;/code&gt; for the CSS &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/mix-blend-mode&quot; rel=&quot;noopener&quot;&gt;mix-blend-mode&lt;/a&gt; property. This value is useful when cross-fading two elements when all or a subset of pixels have the same values. You can read more about the problem this solves in &lt;a href=&quot;https://jakearchibald.com/2021/dom-cross-fade/&quot; rel=&quot;noopener&quot;&gt;Cross-fading any two DOM elements is currently impossible&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 100, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      100
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 99, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      99
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 100, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      100
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 9.1, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      9.1
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Safari 15.4 includes the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/contain&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;contain&lt;/code&gt;&lt;/a&gt; property, allowing for CSS containment.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 52, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      52
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 69, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      69
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 79, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      79
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/contain#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Also in Safari 15.4 is &lt;a href=&quot;https://web.dev/accent-color/&quot;&gt;&lt;code&gt;accent-color&lt;/code&gt;&lt;/a&gt;, which gives control over the accent color used on some form controls.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 93, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      93
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 92, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      92
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 93, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      93
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/accent-color#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Firefox 98 and Safari 15.4 landed the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTML/Element/dialog&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;&lt;/a&gt; element, which represents a dialog box.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 37, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      37
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 98, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      98
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 79, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      79
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/HTML/Element/dialog#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Safari 15.4 also completed support for the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/:focus-visible&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;:focus-visible&lt;/code&gt;&lt;/a&gt; pseudo-class. The &lt;a href=&quot;https://blogs.igalia.com/mrego/2021/06/07/focus-visible-in-webkit-may-2021/&quot; rel=&quot;noopener&quot;&gt;implementation work&lt;/a&gt; on this was by Igalia.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 86, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      86
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 85, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      85
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 86, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      86
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/:focus-visible#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id=&quot;beta-browser-releases&quot;&gt;Beta browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-03-2022/#beta-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beta browser versions give you a preview of things that will be in the next stable version of the browser. It&#39;s a great time to test new features, or removals, that could impact your site before the world gets that release.&lt;/p&gt;
&lt;p&gt;New betas in March were &lt;a href=&quot;https://blog.chromium.org/2022/03/chrome-101-federated-credential.html&quot; rel=&quot;noopener&quot;&gt;Chrome 101&lt;/a&gt;, and &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/99&quot; rel=&quot;noopener&quot;&gt;Firefox 99&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Chrome 101 beta includes &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/color_value/hwb&quot; rel=&quot;noopener&quot;&gt;hwb color notation&lt;/a&gt;. This specifies color according to its hue, whiteness, and blackness. As with other color notation, an optional alpha component specifies opacity.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;h1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;hwb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;194 0% 0% / .5&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* #00c3ff with 50% opacity */&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 101, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      101
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 96, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      96
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 101, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      101
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/color_value/hwb#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Firefox 99 includes the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/Navigator/pdfViewerEnabled&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;pdfViewerEnabled&lt;/code&gt;&lt;/a&gt; property of the Navigator interface. This property indicates if the browser supports inline display of PDF files.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pdfViewerEnabled&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token comment&quot;&gt;// The browser does not support inline viewing of PDF files.&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 94, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      94
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 99, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      99
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 94, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      94
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 16.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      16.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/Navigator/pdfViewerEnabled#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;These beta features will land in stable browsers soon.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Hero image by &lt;a href=&quot;https://unsplash.com/@brandonzack&quot; rel=&quot;noopener&quot;&gt;Brandon Zack&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Interop 2022: browsers working together to improve the web for developers</title>
    <link href="https://web.dev/interop-2022/"/>
    <updated>2022-03-03T00:00:00Z</updated>
    <id>https://web.dev/interop-2022/</id>
    <content type="html" mode="escaped">&lt;p&gt;For the first time ever, all major browser vendors, and other stakeholders, have come together to solve the top browsers compatibility issues identified by web developers. Interop 2022 will improve the experience of developing for the web in 15 key areas. In this article, find out how we got here, what the project focuses on, how success will be measured, and how you can track progress.&lt;/p&gt;
&lt;h2 id=&quot;it-all-started-in-2019&quot;&gt;It all started in 2019 &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2022/#it-all-started-in-2019&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Back in 2019 Mozilla, Google, and others started &lt;a href=&quot;https://insights.developer.mozilla.org/&quot; rel=&quot;noopener&quot;&gt;a major effort&lt;/a&gt; to understand developers&#39; pain points, in the form of the &lt;a href=&quot;https://insights.developer.mozilla.org/&quot; rel=&quot;noopener&quot;&gt;MDN Developer Needs Assessment surveys&lt;/a&gt;, and the deep-dive &lt;a href=&quot;https://insights.developer.mozilla.org/reports/mdn-browser-compatibility-report-2020.html&quot; rel=&quot;noopener&quot;&gt;Browser Compatibility Report&lt;/a&gt;. These reports gave us detailed and actionable information to address top challenges for developers with the web platform, and led to the &lt;a href=&quot;https://web.dev/compat2021/&quot;&gt;Compat 2021 effort&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Among other things, Compat 2021 led to creating a solid foundation for powerful features such as &lt;a href=&quot;https://wpt.fyi/compat2021?feature=css-grid&quot; rel=&quot;noopener&quot;&gt;CSS grid&lt;/a&gt; (&lt;a href=&quot;https://chromestatus.com/metrics/feature/timeline/popularity/1693&quot; rel=&quot;noopener&quot;&gt;12% usage and steadily growing&lt;/a&gt;) and &lt;a href=&quot;https://wpt.fyi/compat2021?feature=css-flexbox&quot; rel=&quot;noopener&quot;&gt;CSS flexbox&lt;/a&gt; (&lt;a href=&quot;https://chromestatus.com/metrics/feature/timeline/popularity/1692&quot; rel=&quot;noopener&quot;&gt;77% usage&lt;/a&gt;), including the &lt;code&gt;gap&lt;/code&gt; property in flexbox, which solves a top pain point for developers when adopting new layout methods.&lt;/p&gt;
&lt;p&gt;We were delighted to reach &lt;a href=&quot;https://web.dev/compat2021-holiday-update/&quot;&gt;a score of over 90%&lt;/a&gt; across all implementations at the end of 2021!&lt;/p&gt;
&lt;h2 id=&quot;what-is-interop-2022&quot;&gt;What is Interop 2022? &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2022/#what-is-interop-2022&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Interop 2022 is a benchmark, agreed on by representatives of three major browser implementations, and developed through a process of &lt;a href=&quot;https://github.com/web-platform-tests/interop-2022/labels/proposal&quot; rel=&quot;noopener&quot;&gt;public nomination&lt;/a&gt; and review with input from &lt;a href=&quot;https://github.com/web-platform-tests/interop-2022/blob/main/supporters.md&quot; rel=&quot;noopener&quot;&gt;supporters&lt;/a&gt; &lt;a href=&quot;https://webkit.org/blog/12288/working-together-on-interop-2022/&quot; rel=&quot;noopener&quot;&gt;Apple&lt;/a&gt;, &lt;a href=&quot;https://bocoup.com/blog/interop-2022&quot; rel=&quot;noopener&quot;&gt;Bocoup&lt;/a&gt;, Google, &lt;a href=&quot;https://igalia.com/news/interop2022.html&quot; rel=&quot;noopener&quot;&gt;Igalia&lt;/a&gt;, &lt;a href=&quot;https://aka.ms/microsoft-interop2022&quot; rel=&quot;noopener&quot;&gt;Microsoft&lt;/a&gt;, and &lt;a href=&quot;https://hacks.mozilla.org/2022/03/interop-2022/&quot; rel=&quot;noopener&quot;&gt;Mozilla&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The benchmark focuses on 15 areas, &lt;a href=&quot;https://web.dev/state-of-css-2021/&quot;&gt;identified by developers&lt;/a&gt; as being particularly troublesome when they are missing or have compatibility issues across browsers. All browser vendors have agreed to focus on these areas, and everyone involved is excited to get started on making the experience of developing for the web measurably better.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; The terms &amp;quot;compatibility&amp;quot; and &amp;quot;interoperability&amp;quot; are typically distinguished by browser vendors, where compat refers to site compat, and interop refers to two or more browsers behaving the same. In that terminology,this effort is about interoperability and so the project has aligned with that naming. &lt;/div&gt;&lt;/aside&gt;
&lt;h2 id=&quot;the-15-areas-of-focus&quot;&gt;The 15 areas of focus &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2022/#the-15-areas-of-focus&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The following features will be the focus of Interop 2022. They include 10 new areas, plus 5 carried over from Compat 2021. The new areas of focus are:&lt;/p&gt;
&lt;h3 id=&quot;cascade-layers&quot;&gt;Cascade layers &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2022/#cascade-layers&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@layer&quot; rel=&quot;noopener&quot;&gt;Cascade layers&lt;/a&gt; give web developers more control over the cascade. They provide a way to group selectors into layers, each with its own specificity. This means you don&#39;t need to order selectors carefully or create highly specific selectors to overwrite base CSS rules.&lt;/p&gt;
&lt;h3 id=&quot;color-spaces-and-css-color-functions&quot;&gt;Color spaces and CSS color functions &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2022/#color-spaces-and-css-color-functions&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To use color functions in a design system, you currently need to rely on Sass, PostCSS, or &lt;code&gt;calc()&lt;/code&gt; on HSL values. Color functions built into CSS mean that colors can be dynamically updated, and new color spaces remove the restriction to the sRGB gamut, and perceptual limitations of HSL.&lt;/p&gt;
&lt;p&gt;There are two functions defined in &lt;a href=&quot;https://drafts.csswg.org/css-color-5/&quot; rel=&quot;noopener&quot;&gt;CSS Color Level 5&lt;/a&gt; that enable more dynamic theming on the web platform:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;color-mix()&lt;/code&gt;: Takes two colors and returns the result of mixing them in a specified color space by a specified amount.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;color-contrast()&lt;/code&gt;: Selects from a list of colors the color with the highest contrast to a specified single color.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These functions support expanded color spaces (LAB, LCH, and P3), and in addition to HSL and sRGB, they default to the uniform LCH color space.&lt;/p&gt;
&lt;h3 id=&quot;new-viewport-units&quot;&gt;New viewport units &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2022/#new-viewport-units&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Difficulties dealing with viewport sizing are prominent in both the &lt;a href=&quot;https://insights.developer.mozilla.org/reports/mdn-browser-compatibility-report-2020.html#findings-viewport&quot; rel=&quot;noopener&quot;&gt;MDN Browser Compatibility Report 2020&lt;/a&gt; and the new &lt;a href=&quot;https://2021.stateofcss.com/en-US/opinions/#browser_interoperability_features&quot; rel=&quot;noopener&quot;&gt;State of CSS 2021&lt;/a&gt; survey. &lt;a href=&quot;https://drafts.csswg.org/css-values-4/#viewport-relative-lengths&quot; rel=&quot;noopener&quot;&gt;CSS Values and Units Level 4&lt;/a&gt; adds new units for the largest, smallest, and dynamic viewport sizes, &lt;code&gt;lv*&lt;/code&gt;, &lt;code&gt;sv*&lt;/code&gt;, and &lt;code&gt;dv*&lt;/code&gt;. These units will make it easier to create layouts that fill the visible viewport on mobile devices while taking the address bar into account.&lt;/p&gt;
&lt;img alt=&quot;The different parts of the viewport for each type of viewport unit.&quot; decoding=&quot;async&quot; height=&quot;664&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/JUvvIgXen1zmHFH53CBS.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/JUvvIgXen1zmHFH53CBS.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/JUvvIgXen1zmHFH53CBS.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/JUvvIgXen1zmHFH53CBS.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/JUvvIgXen1zmHFH53CBS.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/JUvvIgXen1zmHFH53CBS.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/JUvvIgXen1zmHFH53CBS.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/JUvvIgXen1zmHFH53CBS.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/JUvvIgXen1zmHFH53CBS.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/JUvvIgXen1zmHFH53CBS.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/JUvvIgXen1zmHFH53CBS.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/JUvvIgXen1zmHFH53CBS.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/JUvvIgXen1zmHFH53CBS.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/JUvvIgXen1zmHFH53CBS.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/JUvvIgXen1zmHFH53CBS.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/JUvvIgXen1zmHFH53CBS.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/JUvvIgXen1zmHFH53CBS.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/JUvvIgXen1zmHFH53CBS.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;p&gt;Additionally, the cross vendor team behind Interop 2022 will collaborate on researching and improving the state of interoperability of existing viewport measurement features, including the existing &lt;code&gt;vh&lt;/code&gt; unit.&lt;/p&gt;
&lt;h3 id=&quot;scrolling&quot;&gt;Scrolling &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2022/#scrolling&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://web.dev/2021-scroll-survey-report/&quot;&gt;2021 Scroll Survey Report&lt;/a&gt; confirms that scrolling features and scrolling compatibility are difficult to implement and have many areas for improvement. We&#39;ll focus on &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Scroll_Snap&quot; rel=&quot;noopener&quot;&gt;scroll snap&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/scroll-behavior&quot; rel=&quot;noopener&quot;&gt;scroll-behavior&lt;/a&gt;, and &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior&quot; rel=&quot;noopener&quot;&gt;overscroll-behavior&lt;/a&gt; to help scrolling be more consistent and smooth across platforms.&lt;/p&gt;
&lt;p&gt;We are also exploring new &lt;a href=&quot;https://github.com/argyleink/ScrollSnapExplainers&quot; rel=&quot;noopener&quot;&gt;scroll snap feature proposals&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;subgrid&quot;&gt;Subgrid &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2022/#subgrid&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Grid_Layout/Subgrid&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;subgrid&lt;/code&gt;&lt;/a&gt; value of &lt;code&gt;grid-template-columns&lt;/code&gt; and &lt;code&gt;grid-template-rows&lt;/code&gt; means that a grid item that has &lt;code&gt;display: grid&lt;/code&gt; applied can inherit the track definition from the part of the parent grid it is placed over.&lt;/p&gt;
&lt;p&gt;For example, the following three card components have a header and footer aligned with the adjacent card headers and footers, even though each card has an independent grid. This pattern works because each card is an item that spans three rows of the parent grid, then uses subgrid to inherit those rows into the card.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt=&quot;A three card component where the headers and footers are aligned between the cards.&quot; decoding=&quot;async&quot; height=&quot;209&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/yYDiYpyyTkH9IJK4KxvA.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/yYDiYpyyTkH9IJK4KxvA.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/yYDiYpyyTkH9IJK4KxvA.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/yYDiYpyyTkH9IJK4KxvA.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/yYDiYpyyTkH9IJK4KxvA.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/yYDiYpyyTkH9IJK4KxvA.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/yYDiYpyyTkH9IJK4KxvA.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/yYDiYpyyTkH9IJK4KxvA.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/yYDiYpyyTkH9IJK4KxvA.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/yYDiYpyyTkH9IJK4KxvA.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/yYDiYpyyTkH9IJK4KxvA.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/yYDiYpyyTkH9IJK4KxvA.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/yYDiYpyyTkH9IJK4KxvA.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/yYDiYpyyTkH9IJK4KxvA.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/yYDiYpyyTkH9IJK4KxvA.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/yYDiYpyyTkH9IJK4KxvA.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/yYDiYpyyTkH9IJK4KxvA.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/yYDiYpyyTkH9IJK4KxvA.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;&lt;a href=&quot;https://codepen.io/web-dot-dev/pen/XWzqrLR&quot;&gt;See this on CodePen&lt;/a&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;also-included&quot;&gt;Also included &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2022/#also-included&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CSS Containment (the &lt;code&gt;contain&lt;/code&gt; property)&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; element&lt;/li&gt;
&lt;li&gt;Form controls&lt;/li&gt;
&lt;li&gt;Typography and Encodings: including &lt;code&gt;font-variant-alternates&lt;/code&gt;, &lt;code&gt;font-variant-position&lt;/code&gt;,  the &lt;code&gt;ic&lt;/code&gt; unit, and CJK text encodings&lt;/li&gt;
&lt;li&gt;Web Compat, which focuses on differences between browsers that have caused site compatibility issues affecting end users&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following areas made great progress through the Compat 2021 project, but there is still room for improvement. Therefore, they have been included in Interop 2022, in order that the remaining issues can be addressed.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aspect Ratio&lt;/li&gt;
&lt;li&gt;Flexbox&lt;/li&gt;
&lt;li&gt;Grid&lt;/li&gt;
&lt;li&gt;Sticky Positioning&lt;/li&gt;
&lt;li&gt;Transforms&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;investigation-efforts&quot;&gt;Investigation efforts &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2022/#investigation-efforts&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In addition to the 15 focus areas, Interop 2022 includes three investigation efforts. These are areas that are problematic and need improvement, but where the current state of the specifications or tests aren’t yet good enough to be able to score progress using test results:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Editing, &lt;code&gt;contenteditable&lt;/code&gt; and &lt;code&gt;execCommand&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Pointer and Mouse Events&lt;/li&gt;
&lt;li&gt;Viewport Measurement&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Browser vendors and other stakeholders will collaborate on improving the tests and specifications for these areas, so that they could be included in future iterations of this effort.&lt;/p&gt;
&lt;h2 id=&quot;measuring-success-and-tracking-progress&quot;&gt;Measuring success and tracking progress &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2022/#measuring-success-and-tracking-progress&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;img alt=&quot;The scores per browser - 71 for Chrome and Edge, 74 for Firefox, 73 for Safari Technology Preview.&quot; decoding=&quot;async&quot; height=&quot;374&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/MfdXmrXC3aspp2CIQCdb.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/MfdXmrXC3aspp2CIQCdb.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/MfdXmrXC3aspp2CIQCdb.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/MfdXmrXC3aspp2CIQCdb.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/MfdXmrXC3aspp2CIQCdb.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/MfdXmrXC3aspp2CIQCdb.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/MfdXmrXC3aspp2CIQCdb.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/MfdXmrXC3aspp2CIQCdb.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/MfdXmrXC3aspp2CIQCdb.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/MfdXmrXC3aspp2CIQCdb.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/MfdXmrXC3aspp2CIQCdb.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/MfdXmrXC3aspp2CIQCdb.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/MfdXmrXC3aspp2CIQCdb.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/MfdXmrXC3aspp2CIQCdb.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/MfdXmrXC3aspp2CIQCdb.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/MfdXmrXC3aspp2CIQCdb.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/MfdXmrXC3aspp2CIQCdb.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/MfdXmrXC3aspp2CIQCdb.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;p&gt;The existing &lt;a href=&quot;https://wpt.fyi/&quot; rel=&quot;noopener&quot;&gt;web-platform-tests dashboard&lt;/a&gt; will be used to track the progress in the 15 focus areas. For each area, a set of tests have been identified. Browsers are then scored against these tests, giving a score for each area and an overall score for all 15 areas.&lt;/p&gt;
&lt;p&gt;To follow along and track the progress, check out the &lt;a href=&quot;https://wpt.fyi/interop-2022&quot; rel=&quot;noopener&quot;&gt;Interop 2022 dashboard&lt;/a&gt;. Over the course of the year, you can follow along and see how the platform you build for is improving.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;An image of a table with scores for many areas for all major web browsers&quot; decoding=&quot;async&quot; height=&quot;1146&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/jrtdwPgBhznFQ5u8cZmk.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/jrtdwPgBhznFQ5u8cZmk.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/jrtdwPgBhznFQ5u8cZmk.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/jrtdwPgBhznFQ5u8cZmk.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/jrtdwPgBhznFQ5u8cZmk.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/jrtdwPgBhznFQ5u8cZmk.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/jrtdwPgBhznFQ5u8cZmk.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/jrtdwPgBhznFQ5u8cZmk.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/jrtdwPgBhznFQ5u8cZmk.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/jrtdwPgBhznFQ5u8cZmk.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/jrtdwPgBhznFQ5u8cZmk.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/jrtdwPgBhznFQ5u8cZmk.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/jrtdwPgBhznFQ5u8cZmk.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/jrtdwPgBhznFQ5u8cZmk.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/jrtdwPgBhznFQ5u8cZmk.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/jrtdwPgBhznFQ5u8cZmk.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/jrtdwPgBhznFQ5u8cZmk.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/RYmV5NPuMZRoF3PVwIXTUpdYeQ23/jrtdwPgBhznFQ5u8cZmk.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;&lt;a href=&quot;https://wpt.fyi/interop-2022&quot;&gt;See all browser scores per focus area on wpt.fyi/interop-2022.&lt;/a&gt;&lt;/figcaption&gt; 
&lt;/figure&gt;
&lt;h2 id=&quot;what-will-all-this-mean-for-developers&quot;&gt;What will all this mean for developers? &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2022/#what-will-all-this-mean-for-developers&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The goal of these multi-year interoperability efforts, in the form of Compat 2021, Interop 2022 and much more, is to fully acknowledge and address the pain points developers have experienced through for many years. And it&#39;s not a one-browser effort but rather a strong collaboration between all major browser vendors and friends for improving the web platform across the board.&lt;/p&gt;
&lt;p&gt;In essence, the goal is to make the web platform more usable and reliable for developers, so that they can spend more time building great web experiences instead of working around browser inconsistencies.&lt;/p&gt;
&lt;h2 id=&quot;let-us-know-what-you-think&quot;&gt;Let us know what you think &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/interop-2022/#let-us-know-what-you-think&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you have feedback on the improvements made during &lt;a href=&quot;https://web.dev/compat2021/&quot;&gt;Compat 2021&lt;/a&gt;, or on any of the features included in Interop 2022, we would love to hear from you. Which of these features will make the most difference to your work? What are you really excited about? &lt;a href=&quot;https://github.com/web-platform-tests/interop-2022/issues/&quot; rel=&quot;noopener&quot;&gt;File issues for the GitHub repo&lt;/a&gt; or &lt;a href=&quot;https://twitter.com/chromiumdev&quot; rel=&quot;noopener&quot;&gt;let us know on Twitter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;More about Interop 2022 from:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://webkit.org/blog/12288/working-together-on-interop-2022/&quot; rel=&quot;noopener&quot;&gt;Apple&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bocoup.com/blog/interop-2022&quot; rel=&quot;noopener&quot;&gt;Bocoup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://igalia.com/news/interop2022.html&quot; rel=&quot;noopener&quot;&gt;Igalia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aka.ms/microsoft-interop2022&quot; rel=&quot;noopener&quot;&gt;Microsoft&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hacks.mozilla.org/2022/03/interop-2022/&quot; rel=&quot;noopener&quot;&gt;Mozilla&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author><author>
      <name>Robert Nyman</name>
    </author><author>
      <name>Philip Jägenstedt</name>
    </author>
  </entry>
  
  <entry>
    <title>New to the web platform in February</title>
    <link href="https://web.dev/web-platform-02-2022/"/>
    <updated>2022-03-02T00:00:00Z</updated>
    <id>https://web.dev/web-platform-02-2022/</id>
    <content type="html" mode="escaped">&lt;h2 id=&quot;stable-browser-releases&quot;&gt;Stable browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-02-2022/#stable-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In February, Chrome 98 and Firefox 97 became stable.&lt;/p&gt;
&lt;p&gt;Chrome 98 shipped the &lt;code&gt;self.structuredClone&lt;/code&gt; method. It creates a deep clone of a value using the structured clone algorithm. &lt;a href=&quot;https://web.dev/structured-clone/&quot;&gt;Read more about &lt;code&gt;structuredClone()&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 98, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      98
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 94, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      94
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 98, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      98
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/API/structuredClone#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Firefox 97 includes &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@layer&quot; rel=&quot;noopener&quot;&gt;Cascade Layers&lt;/a&gt;. The &lt;code&gt;@layer&lt;/code&gt; at-rule defines a cascade layer, helping you to control specificity.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@layer&lt;/span&gt; framework&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token comment&quot;&gt;/* creates a new layer named framework */&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Firefox is the first browser to land this in a release version. However, check out the section of this post on &lt;a href=&quot;https://web.dev/web-platform-02-2022/#beta-browser-releases&quot;&gt;beta releases&lt;/a&gt;, as it won&#39;t be too long before this feature is available everywhere. Find out more about Cascade Layers in &lt;a href=&quot;https://developer.chrome.com/blog/cascade-layers/&quot; rel=&quot;noopener&quot;&gt;Cacade layers are coming to your browser&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 99, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      99
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 97, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      97
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 99, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      99
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/@layer#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Firefox also lands the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/scrollbar-gutter&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;scrollbar-gutter&lt;/code&gt;&lt;/a&gt; property. This property helps to remove layout shifts caused by a scrollbar appearing as content grows.&lt;/p&gt;
&lt;p&gt;A scrollbar gutter is the space between the inner border edge and the outer padding edge. This is where a scrollbar will appear if needed. If no scrollbar is present, the gutter displays as an extension of the padding. The following CSS would add spacing accounting for the scrollbar size to both sides of the box, to keep the appearance symmetrical.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;scrollbar-gutter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; stable both-edges&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 94, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      94
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 97, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      97
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 94, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      94
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;
&lt;p&gt;&lt;/p&gt;&lt;/span&gt;
&lt;/li&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/scrollbar-gutter#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Chrome 98 supports COLRv1 color gradient vector fonts as an additional new font format. A color font contains glyphs with multiple colors in them, which can be for example an emoji or a country flag or a multi-colored letter.&lt;/p&gt;
&lt;p&gt;Read more about this new font format in &lt;a href=&quot;https://developer.chrome.com/blog/colrv1-fonts/&quot; rel=&quot;noopener&quot;&gt;COLRv1 Color Gradient Vector Fonts in Chrome 98&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;beta-browser-releases&quot;&gt;Beta browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-02-2022/#beta-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beta browser versions give you a preview of things that will be in the next stable version of the browser. It&#39;s a great time to test new features, or removals, that could impact your site before the world gets that release.&lt;/p&gt;
&lt;p&gt;New betas in February were &lt;a href=&quot;https://blog.chromium.org/2022/02/chrome-99-css-cascade-layers-new-picker.html&quot; rel=&quot;noopener&quot;&gt;Chrome 99&lt;/a&gt;, and &lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Firefox/Releases/98&quot; rel=&quot;noopener&quot;&gt;Firefox 98&lt;/a&gt;. Safari Beta 15.4 is still ongoing, I covered some of the things included &lt;a href=&quot;https://web.dev/web-platform-01-2022/&quot;&gt;last month&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Chrome 99 includes Cascade Layers, with Cascade Layers also in &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-15_4-release-notes&quot; rel=&quot;noopener&quot;&gt;Safari Beta 15.4&lt;/a&gt; we can expect to see this feature in all evergreen browsers very soon.&lt;/p&gt;
&lt;p&gt;Also in Chrome 99 are several new attributes for &lt;code&gt;CanvasRenderingContext2D&lt;/code&gt;, and a new &lt;code&gt;showPicker()&lt;/code&gt; method on &lt;code&gt;HTMLInputElement&lt;/code&gt; which is a way to &lt;a href=&quot;https://developer.chrome.com/blog/show-picker/&quot; rel=&quot;noopener&quot;&gt;show a browser picker for date, time, color, and files&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In Firefox 98 you&#39;ll find the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTML/Element/dialog&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;&lt;/a&gt; element. Another feature that will be in all evergreen browsers once the Firefox and Safari betas become stable.&lt;/p&gt;
&lt;p&gt;All of these beta features will land in stable browsers soon.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Hero image by &lt;a href=&quot;https://unsplash.com/@eurphan&quot; rel=&quot;noopener&quot;&gt;Erfan Moradi&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>New to the web platform in January</title>
    <link href="https://web.dev/web-platform-01-2022/"/>
    <updated>2022-02-01T00:00:00Z</updated>
    <id>https://web.dev/web-platform-01-2022/</id>
    <content type="html" mode="escaped">&lt;h2 id=&quot;stable-browser-releases&quot;&gt;Stable browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-01-2022/#stable-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In January, Chrome 97 and Firefox 96 became stable.&lt;/p&gt;
&lt;p&gt;Firefox 96 shipped the color function &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/color_value/hwb()&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;hwb()&lt;/code&gt;&lt;/a&gt;. This function expresses a color by hue, whiteness, and blackness.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 101, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      101
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 96, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      96
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 101, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      101
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/color_value/hwb#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Also in Firefox 96 is the CSS &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/color-scheme&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;color-scheme&lt;/code&gt;&lt;/a&gt; property. This property gives you a way to indicate the color schemes an element can be rendered in. For example, to indicate that &lt;code&gt;.widget&lt;/code&gt; can be rendered in the operating system&#39;s light or dark modes, use the following CSS.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.widget&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;color-scheme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; light dark&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;With color-scheme landing in Firefox, this means the property is available in Chrome, Firefox, and Safari.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 81, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      81
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 96, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      96
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 81, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      81
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 13, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      13
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/color-scheme#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id=&quot;beta-browser-releases&quot;&gt;Beta browser releases &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/web-platform-01-2022/#beta-browser-releases&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Beta browser versions give you a preview of things that will be in the next stable version of the browser. It&#39;s a great time to test new features, or removals, that could impact your site before the world gets that release.&lt;/p&gt;
&lt;p&gt;The betas for January were &lt;a href=&quot;https://blog.chromium.org/2022/01/chrome-98-beta-color-gradient-vector.html&quot; rel=&quot;noopener&quot;&gt;Chrome 98&lt;/a&gt;, &lt;a href=&quot;https://www.mozilla.org/en-US/firefox/97.0beta/releasenotes/&quot; rel=&quot;noopener&quot;&gt;Firefox 97&lt;/a&gt;, and Safari 15.4 Beta 1.&lt;/p&gt;
&lt;p&gt;Chrome 98 supports COLRv1 color gradient vector fonts as an additional new font format. A color font contains glyphs with multiple colors in them, which can be for example an emoji or a country flag or a multi-colored letter.&lt;/p&gt;
&lt;p&gt;Read more about this new font format in &lt;a href=&quot;https://developer.chrome.com/blog/colrv1-fonts/&quot; rel=&quot;noopener&quot;&gt;COLRv1 Color Gradient Vector Fonts in Chrome 98&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Also included is the &lt;a href=&quot;https://web.dev/structured-clone/&quot;&gt;structuredClone()&lt;/a&gt; method for making deep copies of objects, and the CSS media queries &lt;code&gt;dynamic-range&lt;/code&gt; and &lt;code&gt;video-dynamic-range&lt;/code&gt;. Find more features to test in the &lt;a href=&quot;https://blog.chromium.org/2022/01/chrome-98-beta-color-gradient-vector.html&quot; rel=&quot;noopener&quot;&gt;Chrome 98 Beta post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.chrome.com/blog/new-in-devtools-98/&quot; rel=&quot;noopener&quot;&gt;Chrome 98 DevTools&lt;/a&gt; brings you a whole collection of new features including the new &lt;a href=&quot;https://developer.chrome.com/blog/full-accessibility-tree/&quot; rel=&quot;noopener&quot;&gt;Full Accessibility Tree&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Firefox 97 Beta supports the &lt;code&gt;cap&lt;/code&gt; and &lt;code&gt;ic&lt;/code&gt; units for &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/length&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;length&lt;/code&gt;&lt;/a&gt;, and also implements the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/scrollbar-gutter&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;scrollbar-gutter&lt;/code&gt;&lt;/a&gt; property.&lt;/p&gt;
&lt;p&gt;There is a whole collection of good things included in Safari 15.4 Beta. Features include implementation of the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/::backdrop&quot; rel=&quot;noopener&quot;&gt;::backdrop&lt;/a&gt; pseudo-element, &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/:focus-visible&quot; rel=&quot;noopener&quot;&gt;:focus-visible&lt;/a&gt; pseudo-class, the &lt;a href=&quot;https://web.dev/accent-color/&quot;&gt;accent-color&lt;/a&gt; property, and CSS Containment with the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/contain&quot; rel=&quot;noopener&quot;&gt;contain&lt;/a&gt; property. This beta also includes the HTML &lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTML/Element/dialog&quot; rel=&quot;noopener&quot;&gt;&amp;lt;dialog&amp;gt;&lt;/a&gt; element, the &lt;code&gt;lazy&lt;/code&gt; attribute on images to enable &lt;a href=&quot;https://web.dev/browser-level-image-lazy-loading/&quot;&gt;lazy-loading&lt;/a&gt;, plus support for Web App Manifest icons.&lt;/p&gt;
&lt;p&gt;All of these beta features will land in stable browsers soon.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Hero image by &lt;a href=&quot;https://unsplash.com/@sadswim?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&quot; rel=&quot;noopener&quot;&gt;ian dooley&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Community highlight: Lynn Fisher</title>
    <link href="https://web.dev/community-highlight-lynn-fisher/"/>
    <updated>2021-12-30T00:00:00Z</updated>
    <id>https://web.dev/community-highlight-lynn-fisher/</id>
    <content type="html" mode="escaped">&lt;p&gt;&lt;em&gt;This post is part of &lt;a href=&quot;https://designcember.com/&quot; rel=&quot;noopener&quot;&gt;Designcember&lt;/a&gt;. A celebration of web design, brought to you by web.dev.&lt;/em&gt;&lt;/p&gt;
&lt;img alt=&quot;Lynn Fisher&quot; decoding=&quot;async&quot; height=&quot;474&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/tKe0NESCAhvU0SCaOBSb.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/tKe0NESCAhvU0SCaOBSb.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/tKe0NESCAhvU0SCaOBSb.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/tKe0NESCAhvU0SCaOBSb.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/tKe0NESCAhvU0SCaOBSb.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/tKe0NESCAhvU0SCaOBSb.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/tKe0NESCAhvU0SCaOBSb.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/tKe0NESCAhvU0SCaOBSb.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/tKe0NESCAhvU0SCaOBSb.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/tKe0NESCAhvU0SCaOBSb.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/tKe0NESCAhvU0SCaOBSb.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/tKe0NESCAhvU0SCaOBSb.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/tKe0NESCAhvU0SCaOBSb.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/tKe0NESCAhvU0SCaOBSb.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/tKe0NESCAhvU0SCaOBSb.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/tKe0NESCAhvU0SCaOBSb.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/tKe0NESCAhvU0SCaOBSb.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/tKe0NESCAhvU0SCaOBSb.jpg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;p&gt;Lynn Fisher is an American artist known for her work on the web. After attending art school in Arizona, she began working as a designer and CSS developer in software consulting. She has spent her career pursuing cross-discipline endeavors, experimenting with the web as a creative medium, and creating fun, niche web projects. She currently works with the creative folks at &lt;a href=&quot;https://netlify.com/&quot; rel=&quot;noopener&quot;&gt;Netlify&lt;/a&gt;. I talked to her about her many fun projects.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rachel&lt;/strong&gt; What was your route into web design and development?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lynn:&lt;/strong&gt; In high school, a friend of mine introduced me to GeoCities. I remember having such a &amp;quot;my eyes are finally open&amp;quot; moment realizing I could make websites. My first site was a fansite for a local band in Phoenix that I was obsessed with. Over the next few years I learned HTML and CSS via the LiveJournal to MySpace pipeline and made lots of sites for local bands and artists. I learned just enough to get my first job as an &amp;quot;HTML Production Assistant&amp;quot; at a web agency after college.&lt;/p&gt;
&lt;p&gt;After that, I learned on the job and via the design and dev community sharing knowledge and resources. I studied fine art in school which did help me develop confidence in my creative voice and introduced me to critique, but it wasn&#39;t formal design training. I was able to improve over time with practice and learning from coworkers and folks in the industry.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; How did you get started creating &lt;a href=&quot;https://a.singlediv.com/&quot; rel=&quot;noopener&quot;&gt;single div CSS artworks&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lynn:&lt;/strong&gt; At CSSConf 2013, I saw Lea Verou give her &lt;a href=&quot;https://youtu.be/b9HGzJIcfDE&quot; rel=&quot;noopener&quot;&gt;Humble Border-radius&lt;/a&gt; talk and it was another eye-opening moment. There was this whole world of artistic potential in CSS properties I was already using and I was so excited to explore and experiment. I went home and made &lt;a href=&quot;https://why.az/&quot; rel=&quot;noopener&quot;&gt;WhyAZ&lt;/a&gt; and drew all the illustrations with CSS. At the time, each illustration was made of two HTML elements (which followed a lot of icon system markup that was floating around). So it looked something like:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;icon&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;clock&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;I then wanted to see how complex I could make illustrations with only one HTML element. Turned out to be a really fun, super-constrained challenge that I could do with a couple hours here or there. So I bought a domain and started adding them to a site and now it‘s been almost eight years! It&#39;s still really fun to try and stretch the medium and to work on my illustration skills at the same time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; You have so many cool projects! Do you always have something in your mind that you would like to build?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lynn:&lt;/strong&gt; Thank you! I keep a backlog of rough ideas that might make fun projects: things I&#39;m interested in, patterns I start noticing, shows and movies I&#39;m obsessing over. Sometimes it takes a long time for an idea to turn into a clear project. I had &amp;quot;fake movies in real movies&amp;quot; in my backlog for a few years before the &lt;a href=&quot;https://nestflix.fun/&quot; rel=&quot;noopener&quot;&gt;Nestflix&lt;/a&gt; fake streaming service developed into an executable project. I don&#39;t keep a schedule, but I usually have an idea that feels ready once I&#39;m looking for something new to work on.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; Some other projects that Lynn has created are:  - &lt;a href=&quot;https://airportcod.es/&quot;&gt;Airport Codes&lt;/a&gt; - &lt;a href=&quot;https://topchefstats.com/&quot;&gt;Top Chef Stats&lt;/a&gt; - &lt;a href=&quot;https://davidrose.style/&quot;&gt;Dress David Rose&lt;/a&gt; - &lt;a href=&quot;https://hollywoodagegap.com/&quot;&gt;Hollywood Age Gap&lt;/a&gt; - &lt;a href=&quot;https://thefoodplace.cafe/&quot;&gt;The Food Place&lt;/a&gt; - &lt;a href=&quot;https://usflags.design/&quot;&gt;US Flags [dot] Design&lt;/a&gt;  &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; Your yearly refreshes have become something of an event. Do you feel a pressure to do these now, or is it still a lot of fun?&lt;/p&gt;
&lt;figure&gt;
    &lt;img alt=&quot;The portfolio archive on lynnandtonic.com.&quot; decoding=&quot;async&quot; height=&quot;407&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/aVuPAt9P1MnVV2UVEfHG.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/aVuPAt9P1MnVV2UVEfHG.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/aVuPAt9P1MnVV2UVEfHG.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/aVuPAt9P1MnVV2UVEfHG.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/aVuPAt9P1MnVV2UVEfHG.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/aVuPAt9P1MnVV2UVEfHG.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/aVuPAt9P1MnVV2UVEfHG.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/aVuPAt9P1MnVV2UVEfHG.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/aVuPAt9P1MnVV2UVEfHG.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/aVuPAt9P1MnVV2UVEfHG.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/aVuPAt9P1MnVV2UVEfHG.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/aVuPAt9P1MnVV2UVEfHG.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/aVuPAt9P1MnVV2UVEfHG.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/aVuPAt9P1MnVV2UVEfHG.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/aVuPAt9P1MnVV2UVEfHG.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/aVuPAt9P1MnVV2UVEfHG.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/aVuPAt9P1MnVV2UVEfHG.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/aVuPAt9P1MnVV2UVEfHG.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
    &lt;figcaption&gt;You can see an &lt;a href=&quot;https://lynnandtonic.com/archive/&quot;&gt;archive of all the designs&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Lynn:&lt;/strong&gt; It&#39;s still really fun and a project I look forward to. It&#39;s the one project I know I can make as weird as I want. It&#39;s always a good opportunity to experiment, try something new, and learn whatever new techniques gained traction that year. And because it gets replaced each year, it&#39;s really helped me to strengthen my ability to deal with change. It forces me to move on, even if I feel a particular affinity for any one version.&lt;/p&gt;
&lt;p&gt;I do feel pressure though! It&#39;s easy to feel like each version needs to be more creative, more innovative than the previous ones. It can be stressful! It does push me to be ambitious though and I appreciate that. While I have the time and energy, I&#39;m happy to try and keep raising the bar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; You&#39;ve recently started working at Netlify, how has the shift from client work to working on a product been?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lynn:&lt;/strong&gt; So I&#39;m working on the marketing design team at Netlify, so in a lot of ways the work is really similar to the agency work we would do for product teams. The biggest difference is being able to see so much more of the big picture. Sometimes when you&#39;re hired as an outside agency to work on a project, your view can be limited to those specific goals and timelines. Not that that&#39;s a bad thing, though. Focus is super valuable! Being inside the product company opens up so much information and you get to see how different parts of the business work together, how competing goals are prioritized, and how individual projects effectively contribute (or don&#39;t) to long term revenue and growth goals.&lt;/p&gt;
&lt;p&gt;I guess maybe my experience has been more like going from an outside agency to an in-house team. I do love the variety client work offers, but it&#39;s been fun digging into deeply understanding Netlify as a platform and the Jamstack ecosystem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; What feature or functionality would you love to see added to CSS?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lynn:&lt;/strong&gt; A lot of things I&#39;ve always wanted are being actively worked on which is really cool. Container queries and the &lt;code&gt;:has()&lt;/code&gt; pseudo-class are at the top of the list.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.csswg.org/ideas/timelines&quot; rel=&quot;noopener&quot;&gt;Interpolation timelines&lt;/a&gt; feel like they could be super useful. &lt;a href=&quot;https://twitter.com/ScottKellum&quot; rel=&quot;noopener&quot;&gt;Scott Kellum&lt;/a&gt; recently talked me through how they might help with some issues I&#39;ve been running into with my responsive experiments and it&#39;s super cool.&lt;/p&gt;
&lt;p&gt;I often reach for JS to give me the height of an element when it&#39;s not explicitly set, so it might be cool if CSS could do that on its own. I&#39;m sure that&#39;s complicated though!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; Who else is doing really interesting, fun, or creative work on the web right now?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lynn:&lt;/strong&gt; So many people are doing fun work! Some I&#39;m loving lately:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nealagarwal.me/&quot; rel=&quot;noopener&quot;&gt;Neal Agarwal&#39;s&lt;/a&gt; &lt;a href=&quot;https://neal.fun/&quot; rel=&quot;noopener&quot;&gt;neal.fun&lt;/a&gt; is a treasure trove of delightful web projects.&lt;/li&gt;
&lt;li&gt;I love the fun and creative SVG work from &lt;a href=&quot;https://twitter.com/cassiecodes&quot; rel=&quot;noopener&quot;&gt;Cassie Evans&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jhey.dev/&quot; rel=&quot;noopener&quot;&gt;Jhey Tompkins&lt;/a&gt; does really fun CSS demos.&lt;/li&gt;
&lt;li&gt;I love the project &lt;a href=&quot;https://stylestage.dev/&quot; rel=&quot;noopener&quot;&gt;Style Stage&lt;/a&gt; (a next generation CSS Zen Garden) from &lt;a href=&quot;https://thinkdobecreate.com/&quot; rel=&quot;noopener&quot;&gt;Stephanie Eckles&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Mind-blowing CSS artwork from &lt;a href=&quot;https://www.tinydesign.co.uk/ben-evans-portfolio/&quot; rel=&quot;noopener&quot;&gt;Ben Evans&lt;/a&gt; and &lt;a href=&quot;https://diana-adrianne.com/&quot; rel=&quot;noopener&quot;&gt;Diana Smith&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Charlie Gerard is making extremely cool hands-free and motion-controlled demos.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://georgefrancis.dev/&quot; rel=&quot;noopener&quot;&gt;George Francis&lt;/a&gt; is creating beautiful generative artwork.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can find out what Lynn creates next via her portfolio website at &lt;a href=&quot;https://lynnandtonic.com/&quot; rel=&quot;noopener&quot;&gt;lynnandtonic.com&lt;/a&gt;, or by following her on &lt;a href=&quot;https://twitter.com/lynnandtonic&quot; rel=&quot;noopener&quot;&gt;Twitter&lt;/a&gt;.&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Community highlight: Miriam Suzanne</title>
    <link href="https://web.dev/community-highlight-miriam-suzanne/"/>
    <updated>2021-12-24T00:00:00Z</updated>
    <id>https://web.dev/community-highlight-miriam-suzanne/</id>
    <content type="html" mode="escaped">&lt;p&gt;&lt;em&gt;This post is part of &lt;a href=&quot;https://designcember.com/&quot; rel=&quot;noopener&quot;&gt;Designcember&lt;/a&gt;. A celebration of web design, brought to you by web.dev.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Miriam Suzanne is an author, artist, and web developer in Denver, Colorado. She’s a co-founder of &lt;a href=&quot;https://oddbird.net/&quot; rel=&quot;noopener&quot;&gt;OddBird&lt;/a&gt; (a web agency), staff writer for CSS Tricks, member of the Sass core team, and W3C Invited Expert on the CSS Working Group. Lately she&#39;s been focused on &lt;a href=&quot;https://web.dev/community-highlight-miriam-suzanne/css.oddbird.net&quot;&gt;developing new CSS features&lt;/a&gt; like Cascade Layers, Container Queries, and Scope. Offline, Miriam is a published novelist, playwright, and musician. We talked about her work with Sass and CSS.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Miriam onstage, smiling, lit by a spotlight.&quot; decoding=&quot;async&quot; height=&quot;534&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/waVF92Q2nGF3zqWcRkLc.jpeg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/waVF92Q2nGF3zqWcRkLc.jpeg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/waVF92Q2nGF3zqWcRkLc.jpeg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/waVF92Q2nGF3zqWcRkLc.jpeg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/waVF92Q2nGF3zqWcRkLc.jpeg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/waVF92Q2nGF3zqWcRkLc.jpeg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/waVF92Q2nGF3zqWcRkLc.jpeg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/waVF92Q2nGF3zqWcRkLc.jpeg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/waVF92Q2nGF3zqWcRkLc.jpeg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/waVF92Q2nGF3zqWcRkLc.jpeg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/waVF92Q2nGF3zqWcRkLc.jpeg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/waVF92Q2nGF3zqWcRkLc.jpeg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/waVF92Q2nGF3zqWcRkLc.jpeg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/waVF92Q2nGF3zqWcRkLc.jpeg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/waVF92Q2nGF3zqWcRkLc.jpeg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/waVF92Q2nGF3zqWcRkLc.jpeg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/waVF92Q2nGF3zqWcRkLc.jpeg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/waVF92Q2nGF3zqWcRkLc.jpeg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;Photo credit &lt;a href=&quot;https://fromthehipphoto.com/&quot;&gt;From the Hip Photo&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; I first learned about your work due to your grid framework &lt;a href=&quot;https://www.oddbird.net/susy/&quot; rel=&quot;noopener&quot;&gt;Susy&lt;/a&gt;, what led you to create that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Miriam:&lt;/strong&gt; Back in 2008, layout on the web was a very different experience. Developers had moved away from table layout to more semantic (but still hacky) floated grids. There was a boom in one-size-fits-all 12-column &amp;quot;grid frameworks&amp;quot;–providing a pre-defined (usually static) grid with a set of pre-defined CSS classes. If you needed anything more customizable, you were on your own. It was clear that websites needed to become more responsive, but media-queries weren&#39;t available yet, and there were a load of browser compatibility issues around fluid floats.&lt;/p&gt;
&lt;p&gt;I was using Natalie Downe&#39;s &lt;a href=&quot;https://blog.natbat.net/post/46614243624/css-systems&quot; rel=&quot;noopener&quot;&gt;CSS Systems&lt;/a&gt; approach, which was clever about responding to both font and viewport sizes, but I was frustrated by all the repetitive math and browser hacks required. At the same time, Sass was starting to get some attention, and it fit perfectly for what I needed. The first draft of Susy was very simple: just a couple mixins to do the math and add the hacks I needed. The goal was to be minimal, and only output the essential code. Totally customizable grids, without any predefined classes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; How did you make the shift from working on a CSS preprocessor to working on CSS specifications? Do you think working on the preprocessor was a good background for specification writing?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Miriam:&lt;/strong&gt; In my experience there is a lot of overlap, and I&#39;m still very active on both sides of that divide. But I think that&#39;s largely thanks to the Sass team in particular, led by &lt;a href=&quot;https://twitter.com/nex3&quot; rel=&quot;noopener&quot;&gt;Natalie Weizenbaum&lt;/a&gt;, which takes a very long-term view—trying to develop tools that integrate smoothly with developing web standards. Pushing beyond one-size-fits-all &amp;quot;opinionated&amp;quot; solutions and building for long-term flexibility is essential when you are thinking about the future of core web standards.&lt;/p&gt;
&lt;p&gt;How can we build tools that respect the diversity of developer needs and approaches, while still encouraging and facilitating accessibility and other important considerations?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; We’ve got a bunch of stuff coming into CSS that essentially replaces functionality that was traditionally part of Sass. Are there strong reasons to still use something like Sass?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Miriam:&lt;/strong&gt; Yes, for some people—but there&#39;s no universal answer here. Take variables for example. Sass variables are lexically scoped, and compiled on the server, with organized data structures like lists and objects, color manipulation, etc. That&#39;s great for design system logic that doesn&#39;t need to run in the browser.&lt;/p&gt;
&lt;p&gt;CSS variables have some overlap, they can also store values, but they provide an entirely different set of cascade-based strengths and weaknesses. Sass can&#39;t handle custom properties, and CSS can&#39;t really handle structured data. Both are useful, and both are powerful—but your specific needs may vary.&lt;/p&gt;
&lt;p&gt;I think it&#39;s great when people can eliminate tools that they no longer need, and some projects might not require both server- and client-side variables. Wonderful! But it&#39;s too simple to assume that means they are identical, and one simply replaces the other. There will always be use-cases for some design logic to happen server-side, and some to happen client-side—even if we get to the point where the languages provide essentially the same features. Pre-processors are with us for the long term.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; Is there anything that has surprised you as you’ve got more involved in the work of creating standards, or anything that you think folk generally might not be aware of about the process?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Miriam:&lt;/strong&gt; Before getting involved, the standards process felt like a mysterious and magical black box, and I wasn&#39;t sure what to expect. I was scared that I might not have enough knowledge of browser-internals to contribute, but the reality is they don&#39;t need more browser engineers. They need more developers and designers who are building websites and applications in the wild.&lt;/p&gt;
&lt;p&gt;I was surprised to find that very few of the people involved are primarily focused on standards, but also very few of them are primarily developing or designing websites. The W3C is made up of &#39;volunteers&#39; from member organizations (often paid by those orgs, but not as their primary job) and membership isn&#39;t cheap. That skews the participants away from day-to-day designers and developers, especially those of us doing client work at small agencies, or freelance. My role as an Invited Expert would be totally volunteer, an expensive hobby, if I hadn&#39;t found outside funding for that work.&lt;/p&gt;
&lt;p&gt;In reality, the process is quite open and public and needs developer involvement–but there are always so many conversations happening at once, it can be hard to find your place. Especially if it&#39;s not your day job.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; To find out how to contribute to the web platform, check out the &lt;a href=&quot;https://wpc.guide/&quot;&gt;Web Platform Contribution Guide&lt;/a&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; Container queries have been the holy grail for a lot of web developers for many years. I’m very excited about the fact that we’re getting them. I feel as if a lot of folk are thinking about the utility of container queries—do you feel they have potential to unlock more creativity too?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Miriam:&lt;/strong&gt; Absolutely, though I don&#39;t see those as entirely separate. We all have limited time, and we&#39;re trying to write maintainable and performant code. When something is hard to do practically, we are less likely to get creative with what&#39;s possible.&lt;/p&gt;
&lt;p&gt;Still, the web industry is now dominated by large corporate interests, and so those business concerns always get more airtime than web artists. And I think we lose a lot if we ignore web creativity as a primary use-case for features. I&#39;ve been very excited to see some of the CSS art folks playing with the container query prototype. &lt;a href=&quot;https://jhey.dev/&quot; rel=&quot;noopener&quot;&gt;Jhey Tompkins&lt;/a&gt; built a particularly clever and interactive demo of &lt;a href=&quot;https://jh3y.medium.com/can-we-create-a-resize-hack-with-css-container-queries-e9fc32501293&quot; rel=&quot;noopener&quot;&gt;CSS venetian blinds&lt;/a&gt; as commentary on the old anti-CSS meme. I think there&#39;s a lot more to explore in that space, and I can&#39;t wait to see what else people come up with.&lt;/p&gt;
&lt;p&gt;The conversation has also focused on size-based queries, as the original use-case, but I&#39;m excited to see what people do with style queries–the ability to write conditional styles based on the value of a CSS property or variable. It&#39;s an extremely powerful feature, and so far mostly unexplored. I think it opens up even more creative opportunities!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; Is there anything that we can’t do (or have an upcoming way to do) in CSS that you think would be useful?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Miriam:&lt;/strong&gt; I&#39;m very excited about some other specs I&#39;ve been working on. &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@layer&quot; rel=&quot;noopener&quot;&gt;Cascade layers&lt;/a&gt; will give authors more control over specificity issues, and Scope should help with more precise selector targeting. But both of those are high-level architectural concerns. The artist in me is more excited for things like CSS toggles, a declarative way to create interactive styles, or container &#39;timelines&#39;, allowing us to smoothly transition values between media or container breakpoints. That has very practical implications for responsive typography, but would also open up a lot of creative opportunities for responsive art and animation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; Who else is doing really interesting, fun, or creative work on the web right now?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Miriam:&lt;/strong&gt; Oh, I&#39;m not even sure how to answer that, there are so many people doing creative work in such different areas. There&#39;s a lot of exciting standards work in progress from both the CSSWG and Open-UI, including some of your work on fragmentation. But I often find the most inspiration from web artists, and how people are putting these tools into production, in ways that aren&#39;t directly tied to commerce. People like &lt;a href=&quot;https://jhey.dev/&quot; rel=&quot;noopener&quot;&gt;Jhey&lt;/a&gt;, or &lt;a href=&quot;https://lynnandtonic.com/&quot; rel=&quot;noopener&quot;&gt;Lynn Fisher&lt;/a&gt;, or &lt;a href=&quot;https://twitter.com/yuanchuan23&quot; rel=&quot;noopener&quot;&gt;Yuan Chuan&lt;/a&gt;, or many others who are pushing the boundaries of what web technologies can do visually and interactively. Even people doing more business-driven work can learn a lot from their artistic techniques.&lt;/p&gt;
&lt;p&gt;I also appreciate the more conceptual web art of people like &lt;a href=&quot;https://bengrosser.com/&quot; rel=&quot;noopener&quot;&gt;Ben Grosser&lt;/a&gt;, who keeps pushing us to reconsider what we want from the web, and social media in particular. Check out his new &lt;a href=&quot;https://minus.social/&quot; rel=&quot;noopener&quot;&gt;minus.social&lt;/a&gt;, for example.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; Keep up with Miriam’s work on CSS at &lt;a href=&quot;https://css.oddbird.net/&quot; rel=&quot;noopener&quot;&gt;css.oddbird.net&lt;/a&gt; and find out what else she is up to via her website at &lt;a href=&quot;https://miriam.codes/&quot; rel=&quot;noopener&quot;&gt;miriam.codes&lt;/a&gt; and Twitter &lt;a href=&quot;https://twitter.com/TerribleMia&quot; rel=&quot;noopener&quot;&gt;@TerribleMia&lt;/a&gt;.&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>State of CSS 2021</title>
    <link href="https://web.dev/state-of-css-2021/"/>
    <updated>2021-12-17T00:00:00Z</updated>
    <id>https://web.dev/state-of-css-2021/</id>
    <content type="html" mode="escaped">&lt;p&gt;The &lt;a href=&quot;https://2021.stateofcss.com/en-US/&quot; rel=&quot;noopener&quot;&gt;State of CSS 2021&lt;/a&gt; survey ran for the third year in a row, and reached over 8,000 developers worldwide. Let&#39;s  look at some of the results and how they map to plans browsers have for adding CSS features in 2022.&lt;/p&gt;
&lt;h1&gt;Feature usage and awareness&lt;/h1&gt;
&lt;p&gt;For some features, there&#39;s a clear trend in usage and awareness year-over-year. &lt;a href=&quot;https://2021.stateofcss.com/en-US/features/layout/#grid&quot; rel=&quot;noopener&quot;&gt;CSS grid&lt;/a&gt; is an example of this.&lt;/p&gt;
&lt;img alt=&quot;Awareness of CSS Grid in State of CSS over time. The usage has grown from 55% to 83% between 2019 and 2021.&quot; decoding=&quot;async&quot; height=&quot;360&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/i1D3fea4SShlOWR9GvCYL83Xw822/JCCwRm9rKUZQikjZhiXj.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/i1D3fea4SShlOWR9GvCYL83Xw822/JCCwRm9rKUZQikjZhiXj.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/i1D3fea4SShlOWR9GvCYL83Xw822/JCCwRm9rKUZQikjZhiXj.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/i1D3fea4SShlOWR9GvCYL83Xw822/JCCwRm9rKUZQikjZhiXj.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/i1D3fea4SShlOWR9GvCYL83Xw822/JCCwRm9rKUZQikjZhiXj.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/i1D3fea4SShlOWR9GvCYL83Xw822/JCCwRm9rKUZQikjZhiXj.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/i1D3fea4SShlOWR9GvCYL83Xw822/JCCwRm9rKUZQikjZhiXj.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/i1D3fea4SShlOWR9GvCYL83Xw822/JCCwRm9rKUZQikjZhiXj.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/i1D3fea4SShlOWR9GvCYL83Xw822/JCCwRm9rKUZQikjZhiXj.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/i1D3fea4SShlOWR9GvCYL83Xw822/JCCwRm9rKUZQikjZhiXj.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/i1D3fea4SShlOWR9GvCYL83Xw822/JCCwRm9rKUZQikjZhiXj.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/i1D3fea4SShlOWR9GvCYL83Xw822/JCCwRm9rKUZQikjZhiXj.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/i1D3fea4SShlOWR9GvCYL83Xw822/JCCwRm9rKUZQikjZhiXj.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/i1D3fea4SShlOWR9GvCYL83Xw822/JCCwRm9rKUZQikjZhiXj.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/i1D3fea4SShlOWR9GvCYL83Xw822/JCCwRm9rKUZQikjZhiXj.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/i1D3fea4SShlOWR9GvCYL83Xw822/JCCwRm9rKUZQikjZhiXj.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/i1D3fea4SShlOWR9GvCYL83Xw822/JCCwRm9rKUZQikjZhiXj.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/i1D3fea4SShlOWR9GvCYL83Xw822/JCCwRm9rKUZQikjZhiXj.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;p&gt;This matches the trend for CSS Grid in the &lt;a href=&quot;https://almanac.httparchive.org/en/2021/css#flexbox-and-grid-adoption&quot; rel=&quot;noopener&quot;&gt;2021 Web Almanac&lt;/a&gt; and in Chrome&#39;s &lt;a href=&quot;https://www.chromestatus.com/metrics/feature/timeline/popularity/1693&quot; rel=&quot;noopener&quot;&gt;usage metrics&lt;/a&gt;.
If you haven&#39;t used CSS Grid, now is a great time to &lt;a href=&quot;https://web.dev/learn/css/grid/&quot;&gt;learn it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As more developers use grid, &lt;a href=&quot;https://2021.stateofcss.com/en-US/features/layout/#subgrid&quot; rel=&quot;noopener&quot;&gt;awareness of subgrid&lt;/a&gt; is also growing. Subgrid is already available in Firefox and will land in Chrome as part of the work by the Microsoft Team on &lt;a href=&quot;https://blogs.windows.com/msedgedev/2021/08/10/compat2021-css-grid-gridng/&quot; rel=&quot;noopener&quot;&gt;GridNG&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Other features with strong growth in usage and awareness are
&lt;a href=&quot;https://2021.stateofcss.com/en-US/features/layout/#aspect_ratio&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;aspect-ratio&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://2021.stateofcss.com/en-US/features/interactions/#scroll_snap&quot; rel=&quot;noopener&quot;&gt;scroll snap&lt;/a&gt;, and &lt;a href=&quot;https://2021.stateofcss.com/en-US/features/other-features/#variables&quot; rel=&quot;noopener&quot;&gt;custom properties&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;Browser compatibility&lt;/h1&gt;
&lt;p&gt;Browser compatibility is a common pain point for web developers and, to learn more about what CSS features cause the most issues, the survey asked, &amp;quot;Are there any CSS features you have difficulties using because of differences between browsers?&amp;quot;&lt;/p&gt;
&lt;img alt=&quot;Survey results for features with differences between browsers. The top three responses are grid, flexbox gap, and subgrid.&quot; decoding=&quot;async&quot; height=&quot;909&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/rjslQmdTEZr8lNz0EbHC.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/rjslQmdTEZr8lNz0EbHC.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/rjslQmdTEZr8lNz0EbHC.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/rjslQmdTEZr8lNz0EbHC.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/rjslQmdTEZr8lNz0EbHC.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/rjslQmdTEZr8lNz0EbHC.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/rjslQmdTEZr8lNz0EbHC.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/rjslQmdTEZr8lNz0EbHC.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/rjslQmdTEZr8lNz0EbHC.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/rjslQmdTEZr8lNz0EbHC.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/rjslQmdTEZr8lNz0EbHC.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/rjslQmdTEZr8lNz0EbHC.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/rjslQmdTEZr8lNz0EbHC.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/rjslQmdTEZr8lNz0EbHC.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/rjslQmdTEZr8lNz0EbHC.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/rjslQmdTEZr8lNz0EbHC.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/rjslQmdTEZr8lNz0EbHC.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/rjslQmdTEZr8lNz0EbHC.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt; 
&lt;p&gt;Survey results like these help guide prioritization for browser vendors. Many of the features are part of the &lt;a href=&quot;https://web.dev/compat2021-holiday-update/&quot;&gt;Compat 2021 effort&lt;/a&gt; based on the &lt;a href=&quot;https://insights.developer.mozilla.org/reports/mdn-browser-compatibility-report-2020.html&quot; rel=&quot;noopener&quot;&gt;MDN Browser Compatibility Report 2020&lt;/a&gt;, and others like subgrid are now being &lt;a href=&quot;https://github.com/web-platform-tests/interop-2022/issues/1&quot; rel=&quot;noopener&quot;&gt;proposed&lt;/a&gt; as focus areas for Interop 2022.&lt;/p&gt;
&lt;h1&gt;What&#39;s missing in CSS?&lt;/h1&gt;
&lt;p&gt;The survey also asked, &amp;quot;Which feature would you most like to be able to use in CSS today?&amp;quot;&lt;/p&gt;
&lt;img alt=&quot;Survey results for the question what&amp;#x27;s missing in CSS. The top three responses are container queries, parent selector, and browser support.&quot; decoding=&quot;async&quot; height=&quot;617&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/cZesmseagvBYouHVaRJO.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/cZesmseagvBYouHVaRJO.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/cZesmseagvBYouHVaRJO.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/cZesmseagvBYouHVaRJO.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/cZesmseagvBYouHVaRJO.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/cZesmseagvBYouHVaRJO.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/cZesmseagvBYouHVaRJO.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/cZesmseagvBYouHVaRJO.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/cZesmseagvBYouHVaRJO.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/cZesmseagvBYouHVaRJO.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/cZesmseagvBYouHVaRJO.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/cZesmseagvBYouHVaRJO.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/cZesmseagvBYouHVaRJO.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/cZesmseagvBYouHVaRJO.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/cZesmseagvBYouHVaRJO.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/cZesmseagvBYouHVaRJO.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/cZesmseagvBYouHVaRJO.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/cZesmseagvBYouHVaRJO.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;p&gt;Container Queries was the overall &amp;quot;winner&amp;quot;, matching the &lt;a href=&quot;https://2020.stateofcss.com/en-US/opinions/#currently_missing_from_css&quot; rel=&quot;noopener&quot;&gt;2020 results&lt;/a&gt;. Container queries enable &lt;a href=&quot;https://web.dev/new-responsive/&quot;&gt;component-based responsive&lt;/a&gt; design by allowing elements to query their parent selector for style changes. This is a much more local, specified scope than is currently possible with media queries.&lt;/p&gt;
&lt;p&gt;Chrome is currently working on an experimental implementation, and funding the work of &lt;a href=&quot;https://twitter.com/TerribleMia/&quot; rel=&quot;noopener&quot;&gt;Miriam Suzanne&lt;/a&gt;, as she develops the &lt;a href=&quot;https://drafts.csswg.org/css-contain-3/&quot; rel=&quot;noopener&quot;&gt;specification&lt;/a&gt; in the CSS Working Group. You can try it out by going to &lt;code&gt;about:flags&lt;/code&gt;, searching for, and enabling, the &lt;strong&gt;Container Queries&lt;/strong&gt; flag in Canary, or by using the &lt;a href=&quot;https://www.npmjs.com/package/container-query-polyfill&quot; rel=&quot;noopener&quot;&gt;container query polyfill&lt;/a&gt;. You can learn more about container queries, as well as see some demos that use them in the latest series of &lt;a href=&quot;https://www.youtube.com/watch?v=gCNMyYr7F6w&amp;amp;list=PLNYkxOF6rcIDI0QtJvW6vKonTxn6azCsD&amp;amp;index=14&quot; rel=&quot;noopener&quot;&gt;Designing in the Browser&lt;/a&gt; or trying them yourself &lt;a href=&quot;https://codepen.io/web-dot-dev/pen/LYzxgxP&quot; rel=&quot;noopener&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;youtube&quot;&gt;  &lt;lite-youtube videoid=&quot;gCNMyYr7F6w&quot;&gt;  &lt;/lite-youtube&gt;&lt;/div&gt;
&lt;h1&gt;Learn more&lt;/h1&gt;
&lt;p&gt;Please see the &lt;a href=&quot;https://2021.stateofcss.com/en-US/&quot; rel=&quot;noopener&quot;&gt;full report&lt;/a&gt; to learn more, see recommended resources, or dig into the data yourself.&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;https://sachagreif.com/&quot; rel=&quot;noopener&quot;&gt;Sacha Greif&lt;/a&gt; for running the survey, and to the over 8,000 web developers who generously took the time to answer it.&lt;/p&gt;
</content>
    <author>
      <name>Philip Jägenstedt</name>
    </author><author>
      <name>Rachel Andrew</name>
    </author><author>
      <name>Una Kravets</name>
    </author>
  </entry>
  
  <entry>
    <title>Community highlight: Chen Hui Jing</title>
    <link href="https://web.dev/community-highlight-chen-hui-jing/"/>
    <updated>2021-12-10T00:00:00Z</updated>
    <id>https://web.dev/community-highlight-chen-hui-jing/</id>
    <content type="html" mode="escaped">&lt;p&gt;&lt;em&gt;This post is part of &lt;a href=&quot;https://designcember.com/&quot; rel=&quot;noopener&quot;&gt;Designcember&lt;/a&gt;. A celebration of web design, brought to you by web.dev.&lt;/em&gt;&lt;/p&gt;
&lt;img alt=&quot;Chen Hui Jing speaking on stage on front of a large screen showing slides.&quot; decoding=&quot;async&quot; height=&quot;533&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/8tTxEc4ZW29AKRkpwjoP.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/8tTxEc4ZW29AKRkpwjoP.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/8tTxEc4ZW29AKRkpwjoP.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/8tTxEc4ZW29AKRkpwjoP.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/8tTxEc4ZW29AKRkpwjoP.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/8tTxEc4ZW29AKRkpwjoP.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/8tTxEc4ZW29AKRkpwjoP.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/8tTxEc4ZW29AKRkpwjoP.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/8tTxEc4ZW29AKRkpwjoP.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/8tTxEc4ZW29AKRkpwjoP.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/8tTxEc4ZW29AKRkpwjoP.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/8tTxEc4ZW29AKRkpwjoP.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/8tTxEc4ZW29AKRkpwjoP.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/8tTxEc4ZW29AKRkpwjoP.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/8tTxEc4ZW29AKRkpwjoP.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/8tTxEc4ZW29AKRkpwjoP.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/8tTxEc4ZW29AKRkpwjoP.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/8tTxEc4ZW29AKRkpwjoP.jpg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;p&gt;Chen Hui Jing is a self-taught designer and developer living in Singapore, with an inordinate love for CSS, as evidenced by her blog (which is mostly about CSS) and her tweets (which are largely about typography and the web). She used to play basketball full-time and launched her web career during downtime between training sessions, and hopes to be able to climb outdoors one day. I talked to her about CSS, and in particular non-English writing systems.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; What was your route into web design and development?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hui Jing:&lt;/strong&gt; When I was living in the dorms while playing basketball full-time, I had a bit more experience with computers than my peers, and my coach (bless him) thought that I could do something about our association website that hadn&#39;t been updated in years. I had zero idea what web development was, but I thought I had enough spare time to figure it out. It was more enjoyable than I expected and many years later, I&#39;m still here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; And how did you get into CSS in particular?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hui Jing:&lt;/strong&gt; I&#39;m a very visual person by nature, and there&#39;s something about being able to give &amp;quot;instructions&amp;quot; to the browser and immediately see that reflected on the screen that really appealed to me. It felt much more intuitive to me than programming logic for applications. I got serious about the web at a time when developments in the world of CSS were starting to pick up speed, so there were a lot of experimental properties that were not widely used. It felt very exciting to discover new features that few people knew about.&lt;/p&gt;
&lt;h2 id=&quot;working-with-vertical-writing-modes&quot;&gt;Working with vertical writing modes &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/community-highlight-chen-hui-jing/#working-with-vertical-writing-modes&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; You&#39;ve written a lot about vertical writing modes in CSS, and the fun bugs you find when working with vertical writing. Do you have any favorite bugs we should all go and star?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hui Jing:&lt;/strong&gt; There were a few &lt;a href=&quot;https://chenhuijing.com/blog/debugging-vertical-layouts-in-2021/#%F0%9F%92%BB&quot; rel=&quot;noopener&quot;&gt;when I checked back in May this year&lt;/a&gt;, but, most of them have been resolved except one: Chromium has an issue with the &lt;a href=&quot;https://bugs.chromium.org/p/chromium/issues/detail?id=1203251&amp;amp;q=devtools%20grid&amp;amp;can=2&quot; rel=&quot;noopener&quot;&gt;Devtools overlay in vertical writing mode&lt;/a&gt;. I think this is a testament to how this evergreen browser update cycle is really pushing web development forward.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; It’s great to hear that these issues are being fixed. Do you think playing with writing-mode has more use cases than simply typesetting vertical text?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hui Jing:&lt;/strong&gt; Oh yes, definitely. Even though typesetting East Asian scripts is the primary use-case of writing mode, I think other writing systems can make use of writing-mode to implement vertical layouts, like the style we often see in print magazines. To me, combinations of CSS properties are what makes CSS so powerful, so writing-mode together with flexbox and grid give us a fairly large number of permutations for layout directions, from a page level boxes down to individual characters in the text. I think this unlocks possibilities and more creativity as folks realize the scope of what is possible for web design moving forward. I hope to see layouts and designs on the web that I couldn&#39;t have imagined just a few years ago.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; Hui Jing often speaks about typography and writing systems on the web. Watch her speak on &lt;a href=&quot;https://www.youtube.com/watch?v=yLQHDGRLOwQ&quot;&gt;Web Typography: a non-English perspective&lt;/a&gt; and &lt;a href=&quot;https://www.youtube.com/watch?v=yLQHDGRLOwQ&quot;&gt;The web is not just left to right&lt;/a&gt; to learn more &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; I&#39;m often asked whether I think everyone should use logical properties and values now, or if it will become the default. How would you answer that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hui Jing:&lt;/strong&gt; Personally, I hope it would become the default, because from a practical perspective, it would make multi-script website development much easier. As to whether it WILL become the default, that&#39;s much harder to answer.&lt;/p&gt;
&lt;p&gt;A challenge for logical properties is that it is &amp;quot;replacing&amp;quot; an established syntax that has been in use for many years, plus the fact that support for scripts that are not the default, horizontal top-to-bottom only got much better in recent years. Content on the web is still predominantly in English, so the case for using logical properties is less strong in this context. I think a larger push for non-English speakers to create content in their respective languages for the web would forward this cause. Also, if supporting multiple languages becomes a greater priority, the value of using logical properties would become even more apparent.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; Find out about logical properties and values in the Learn CSS module on &lt;a href=&quot;https://web.dev/learn/css/logical-properties/&quot;&gt;Logical Properties&lt;/a&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;h2 id=&quot;new-features-in-css&quot;&gt;New features in CSS &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/community-highlight-chen-hui-jing/#new-features-in-css&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; What feature or functionality would you love to see added to CSS?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hui Jing:&lt;/strong&gt; I&#39;ve been following Miriam Suzanne&#39;s work on container queries for a while, and the parts of the specification that haven&#39;t been developed yet for Style and State container features are quite exciting, because they really expand the concept of responsive design. We can potentially get our designs and layouts to respond to more than just the size of our viewport. So I hope the containment module is something the different browser vendors can agree on and we can get wider support for this in the near future.&lt;/p&gt;
&lt;h2 id=&quot;inspiring-people-to-follow&quot;&gt;Inspiring people to follow &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/community-highlight-chen-hui-jing/#inspiring-people-to-follow&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; Who else is doing really interesting, fun, or creative work on the web right now?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hui Jing:&lt;/strong&gt; I&#39;m always drawn to people who do CSS art. And there are folks whom I have been a fan of for years, like &lt;a href=&quot;https://twitter.com/yuanchuan23&quot; rel=&quot;noopener&quot;&gt;Yuan Chuan&lt;/a&gt; and his generative CSS creations, &lt;a href=&quot;https://codepen.io/ivorjetski&quot; rel=&quot;noopener&quot;&gt;Ben Evans&lt;/a&gt; who does mind blowing CSS artwork and &lt;a href=&quot;https://www.patreon.com/anatudor&quot; rel=&quot;noopener&quot;&gt;Ana Tudor&lt;/a&gt; with her deep dives into really clever techniques.
Recently I&#39;ve come across Codepens by &lt;a href=&quot;https://codepen.io/miocene/pens/public&quot; rel=&quot;noopener&quot;&gt;Julia Miocene&lt;/a&gt; and &lt;a href=&quot;https://codepen.io/jackiezen&quot; rel=&quot;noopener&quot;&gt;Jackie Zen&lt;/a&gt; that have beautiful CSS animations as well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; You can read more from Chen Hui Jing on her site at &lt;a href=&quot;https://chenhuijing.com/&quot; rel=&quot;noopener&quot;&gt;chenhuijing.com&lt;/a&gt;.&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Community highlight: Bramus Van Damme</title>
    <link href="https://web.dev/community-highlight-bramus/"/>
    <updated>2021-12-04T00:00:00Z</updated>
    <id>https://web.dev/community-highlight-bramus/</id>
    <content type="html" mode="escaped">&lt;p&gt;&lt;em&gt;This post is part of &lt;a href=&quot;https://designcember.com/&quot; rel=&quot;noopener&quot;&gt;Designcember&lt;/a&gt;. A celebration of web design, brought to you by web.dev.&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;
&lt;img alt=&quot;Bramus on stage in from of a large screen showing slides.&quot; decoding=&quot;async&quot; height=&quot;533&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/6tkSbZYOqxtgJM9s5ovw.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/6tkSbZYOqxtgJM9s5ovw.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/6tkSbZYOqxtgJM9s5ovw.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/6tkSbZYOqxtgJM9s5ovw.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/6tkSbZYOqxtgJM9s5ovw.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/6tkSbZYOqxtgJM9s5ovw.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/6tkSbZYOqxtgJM9s5ovw.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/6tkSbZYOqxtgJM9s5ovw.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/6tkSbZYOqxtgJM9s5ovw.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/6tkSbZYOqxtgJM9s5ovw.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/6tkSbZYOqxtgJM9s5ovw.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/6tkSbZYOqxtgJM9s5ovw.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/6tkSbZYOqxtgJM9s5ovw.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/6tkSbZYOqxtgJM9s5ovw.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/6tkSbZYOqxtgJM9s5ovw.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/6tkSbZYOqxtgJM9s5ovw.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/6tkSbZYOqxtgJM9s5ovw.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/kheDArv5csY6rvQUJDbWRscckLr1/6tkSbZYOqxtgJM9s5ovw.jpg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
    &lt;figcaption&gt;Bramus speaking at Frontend United.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; Read some recent articles by Bramus on &lt;a href=&quot;https://www.bram.us/2021/09/15/the-future-of-css-cascade-layers-css-at-layer/&quot;&gt;Cascade Layers&lt;/a&gt;, &lt;a href=&quot;https://css-tricks.com/scroll-linked-animations-with-the-web-animations-api-waapi-and-scrolltimeline/&quot;&gt;Scroll-Linked Animations&lt;/a&gt;, and &lt;a href=&quot;https://www.bram.us/2021/09/21/css-container-queries-container-relative-lengths/&quot;&gt;Container Relative Lengths&lt;/a&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; What was your route into web development?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bramus:&lt;/strong&gt; As a kid, I always liked to tinker with things. I would spend days playing with my LEGO® bricks, building my own fantasy world and objects from scratch.&lt;/p&gt;
&lt;p&gt;When we got a computer at home—an unusual device to own in the 1990s—I soon traded in the physical toys with computer games. I wasn&#39;t an avid gamer though; I don&#39;t think I ever finished a game entirely. Instead of finishing the games, I found myself modding them.&lt;/p&gt;
&lt;p&gt;In 1997, while looking up information about those games and tools, I also discovered &lt;a href=&quot;https://www.bram.us/#view-source&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;view-source&lt;/code&gt;&lt;/a&gt;. Curious to know how things were built, I started collecting HTML-snippets of the sites that I visited. Combining those snippets with Frontpage Express (an application that came with Internet Explorer 4 and 5), I soon created my very first web pages with info about myself. Those pages never got published, they only existed on one of the floppy disks I carried around.&lt;/p&gt;
&lt;p&gt;From that time on I continued to become more interested in computers and the web. This interest led me to flunk a year in high school on purpose, so that I could switch major from economics to IT—I knew I wanted to pursue a career in IT. By 2002 I was in college, where I properly learned HTML and took my first steps into CSS and JavaScript. During those three years I realized that the web was my true passion, and in 2005, fresh out of college, I took on my first job as a professional web developer.&lt;/p&gt;
&lt;h2 id=&quot;on-being-a-front-and-backend-developer&quot;&gt;On being a front and backend developer &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/community-highlight-bramus/#on-being-a-front-and-backend-developer&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; I spotted on your site that you are both a front and backend developer, I followed a similar path being originally a Perl, then a PHP and MySQL developer. Do you feel more excited by one side or the other? Do you think the possibility of being a hybrid developer is vanishing given the complexity of learning just one part of the stack?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bramus:&lt;/strong&gt; Throughout my career I&#39;ve constantly been floating between backend and frontend. One year I would find myself elbow-deep into JavaScript and React (and even React Native), only to be creating Terraform scripts and Docker containers the year after. I like mixing the two, yet my passion always lay with the frontend, and CSS specifically.&lt;/p&gt;
&lt;p&gt;In the early days of tinkering with the web, one simply was the &amp;quot;webmaster&amp;quot; and did it all. As the scope of the work was pretty limited back then, it was quite easy to keep up. Having seen both frontend and backend explode over the past 20 years, it became harder and harder to maintain expertise across the field. That&#39;s why I decided to mainly focus on frontend again in 2020.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; Why did you start writing about CSS in particular?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bramus&lt;/strong&gt; The content on my blog has always been a reflection of the projects that I&#39;m working on. Therefore a mix of front and backend posts.&lt;/p&gt;
&lt;p&gt;Attending conferences such as &lt;a href=&quot;https://fronteers.nl/congres&quot; rel=&quot;noopener&quot;&gt;Fronteers Conference&lt;/a&gt; and &lt;a href=&quot;https://cssday.nl/&quot; rel=&quot;noopener&quot;&gt;CSS Day&lt;/a&gt; helped me to write in-depth frontend posts. For example, seeing &lt;a href=&quot;https://vimeo.com/69531455&quot; rel=&quot;noopener&quot;&gt;Tab Atkins-Bittner talk about CSS Custom Properties in 2013&lt;/a&gt;—years before they even were an official thing—or &lt;a href=&quot;https://rachelandrew.co.uk/archives/2015/07/17/css-grid-layout-at-css-day/&quot; rel=&quot;noopener&quot;&gt;you (Rachel Andrew) explaining Grid to us in 2015&lt;/a&gt; were events that directly led me to write about them. At the time, I was a lecturer in web and mobile development at a technical university, so I had a very good reason to pay attention, as later on I&#39;d be teaching my own students about those subjects.&lt;/p&gt;
&lt;p&gt;In 2019, I started to closely monitor the CSSWG and &lt;a href=&quot;https://github.com/w3c/csswg-drafts/issues&quot; rel=&quot;noopener&quot;&gt;participate in discussions&lt;/a&gt;. Browsers working on features behind feature flags meant that I was able to experiment with the things I read about, even before they shipped. This was then reflected through the contents of my blog.&lt;/p&gt;
&lt;h2 id=&quot;advice-for-new-writers&quot;&gt;Advice for new writers &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/community-highlight-bramus/#advice-for-new-writers&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; What would be your advice to someone who wants to start writing about tech?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bramus:&lt;/strong&gt; Don&#39;t hesitate and simply do it. Even when it&#39;s about a single line of CSS, or if it&#39;s 1 post per year, or if you &amp;quot;only&amp;quot; have 5 subscribers: do it. Scratch your own itch, and write the article you wanted to find yourself. Through writing on my blog I not only challenged myself to learn about technologies in finer detail, but also opened doors along the way—both personally and professionally.&lt;/p&gt;
&lt;p&gt;Don&#39;t overly rely on external services such as Medium or Twitter, but try and have your own place on the web. In the long run it&#39;ll pay off. You don&#39;t need any fancy CMS, build pipelines, or comments system, to get started. All you need is a text editor and some time to spare. HTML, combined with a simple stylesheet, can get you a long way.&lt;/p&gt;
&lt;h2 id=&quot;new-features-in-css&quot;&gt;New features in CSS &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/community-highlight-bramus/#new-features-in-css&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; You have written about lots of the new features that are being developed in the CSSWG and in browsers, what do you think is the most exciting for the future of the web? Which do you think will have the most immediate impact in your own professional work?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bramus:&lt;/strong&gt; Along with many developers I&#39;m pretty excited about CSS Container Queries. Other upcoming features—such as &lt;a href=&quot;https://www.bram.us/2021/09/15/the-future-of-css-cascade-layers-css-at-layer/&quot; rel=&quot;noopener&quot;&gt;Cascade Layers&lt;/a&gt; and &lt;a href=&quot;https://www.bram.us/2021/02/23/the-future-of-css-scroll-linked-animations-part-1/&quot; rel=&quot;noopener&quot;&gt;Scroll-linked Animations&lt;/a&gt;—also excite me, but Container Queries will definitely have the biggest impact. They will allow us to transition from responsive pages to responsive components.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; Learn about container queries in this &lt;a href=&quot;https://www.youtube.com/watch?v=gCNMyYr7F6w&quot;&gt;Designing in the Browser&lt;/a&gt; episode. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; What feature or functionality would you love to see added to CSS?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bramus:&lt;/strong&gt; Scroll-linked Animations is one of the features that I would like to see move forward. Right now it&#39;s only an Editor&#39;s Draft. Being able to define hardware-accelerated scrolling without relying on JavaScript is something that totally fits into my mental model of progressive enhancement and the &lt;a href=&quot;https://en.wikipedia.org/wiki/Rule_of_least_power&quot; rel=&quot;noopener&quot;&gt;rule of least power&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;CSS Nesting is also my radar. It took more than two years since its first Editor&#39;s Draft, but I was very glad to see its First Public Working Draft get released last summer.&lt;/p&gt;
&lt;p&gt;Apart from these bigger features, I can definitely appreciate smaller tweaks and additions. Things like &lt;a href=&quot;https://web.dev/accent-color/&quot;&gt;accent-color&lt;/a&gt; definitely put a smile on my face, as they make my life as a developer easier.&lt;/p&gt;
&lt;h2 id=&quot;recommendations-for-inspiring-web-people-to-follow&quot;&gt;Recommendations for inspiring web people to follow &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/community-highlight-bramus/#recommendations-for-inspiring-web-people-to-follow&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; Who else is doing really interesting, fun, or creative work on the web right now?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bramus:&lt;/strong&gt; That&#39;s a very difficult question to answer, so many people are producing content that amazes and inspires me. For example, &lt;a href=&quot;https://twitter.com/argyleink&quot; rel=&quot;noopener&quot;&gt;Adam Argyle&lt;/a&gt; and his GUI challenges, the projects from &lt;a href=&quot;https://twitter.com/5t3ph&quot; rel=&quot;noopener&quot;&gt;Stephanie Eckles&lt;/a&gt;, blog posts by &lt;a href=&quot;https://twitter.com/michebarks&quot; rel=&quot;noopener&quot;&gt;Michelle Barker&lt;/a&gt;, videos from &lt;a href=&quot;https://twitter.com/KevinJPowell&quot; rel=&quot;noopener&quot;&gt;Kevin J. Powell&lt;/a&gt;, the work &lt;a href=&quot;https://twitter.com/TerribleMia&quot; rel=&quot;noopener&quot;&gt;Miriam Suzanne&lt;/a&gt; is doing in the CSS Working Group, podcasts from &lt;a href=&quot;https://twitter.com/Una&quot; rel=&quot;noopener&quot;&gt;Una Kravets&lt;/a&gt;, articles by &lt;a href=&quot;https://twitter.com/jaffathecake&quot; rel=&quot;noopener&quot;&gt;Jake Archibald&lt;/a&gt;, Jake and Surma&#39;s &lt;a href=&quot;https://http203.libsyn.com/&quot; rel=&quot;noopener&quot;&gt;HTTP 203&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/georgedoescode&quot; rel=&quot;noopener&quot;&gt;George Francis&lt;/a&gt;&#39; Houdini work, and &lt;a href=&quot;https://twitter.com/ChallengesCss&quot; rel=&quot;noopener&quot;&gt;Temani Afif&lt;/a&gt;&#39;s posts. These people and their projects, and the many others that I&#39;m forgetting right now, have my respect and admiration.&lt;/p&gt;
&lt;p&gt;I think the most influential person throughout my career was &lt;a href=&quot;https://adactio.com/&quot; rel=&quot;noopener&quot;&gt;Jeremy Keith&lt;/a&gt;. His teaching us about semantic HTML, progressive enhancement, and resilience were eye-opening moments to me. It&#39;s a message I gave to my own students, and still like to spread today. In times where JavaScript is eating the world and junior developers somehow seem to have skipped out on the fundamentals of the web, his posts and talks are more relevant than they ever were before.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; Jeremy Keith has created our new &lt;a href=&quot;https://web.dev/learn/design/&quot;&gt;responsive design course&lt;/a&gt; here on web.dev. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;&lt;strong&gt;Rachel:&lt;/strong&gt; You can &lt;a href=&quot;https://twitter.com/bramus&quot; rel=&quot;noopener&quot;&gt;follow Bramus on Twitter&lt;/a&gt;, and on his blog at &lt;a href=&quot;https://www.bram.us/&quot; rel=&quot;noopener&quot;&gt;bram.us&lt;/a&gt;.&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Everything announced at Chrome Dev Summit 2021</title>
    <link href="https://web.dev/cds2021-updates/"/>
    <updated>2021-11-03T00:00:00Z</updated>
    <id>https://web.dev/cds2021-updates/</id>
    <content type="html" mode="escaped">&lt;div class=&quot;youtube&quot;&gt;  &lt;lite-youtube videoid=&quot;n57U2_-3NLQ&quot;&gt;  &lt;/lite-youtube&gt;&lt;/div&gt;
&lt;p&gt;This post rounds up all the key announcements from the 2021 Chrome Dev Summit, with the links you need to find out more.&lt;/p&gt;
&lt;h2 id=&quot;make-the-web-more-interoperable&quot;&gt;Make the web more interoperable &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/cds2021-updates/#make-the-web-more-interoperable&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Web compatibility is one of the biggest challenges for web developers,
and so Google has been working with other browser vendors to fix the top five compatibility pain points:
&lt;a href=&quot;https://web.dev/learn/css/flexbox/&quot;&gt;flexbox&lt;/a&gt;,
&lt;a href=&quot;https://web.dev/learn/css/grid/&quot;&gt;grid&lt;/a&gt;,
&lt;code&gt;position: sticky&lt;/code&gt;,
&lt;a href=&quot;https://web.dev/aspect-ratio/&quot;&gt;&lt;code&gt;aspect-ratio&lt;/code&gt;&lt;/a&gt;,
and &lt;a href=&quot;https://web.dev/learn/css/transitions/#transform&quot;&gt;transforms&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The work has already led to improvements in these key areas.
You can read about those in the &lt;a href=&quot;https://web.dev/compat2021-midyear/&quot;&gt;Compat 2021 mid-year update&lt;/a&gt;.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; The Microsoft Edge team took on the work of rewriting CSS grid layout as part of the Compat 2021 effort. You can read about their work in the post &lt;a href=&quot;https://blogs.windows.com/msedgedev/2021/08/10/compat2021-css-grid-gridng/&quot;&gt;Compat2021: Improving CSS Grid compatibility with GridNG&lt;/a&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;h2 id=&quot;allow-new-classes-of-applications-to-run-on-the-web&quot;&gt;Allow new classes of applications to run on the web &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/cds2021-updates/#allow-new-classes-of-applications-to-run-on-the-web&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.chrome.com/blog/fugu-status/&quot; rel=&quot;noopener&quot;&gt;Project Fugu&lt;/a&gt; is an effort that aims to allow new classes of applications to the web.
You can keep up to date with progress on the Fugu APIs at &lt;a href=&quot;https://fugu-tracker.web.app/&quot; rel=&quot;noopener&quot;&gt;fugu-tracker.web.app&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Adobe recently announced that they are bringing Photoshop to the web,
a feat made possible by collaboration between Adobe, Google, and web standards organizations.
Find out more in the post &lt;a href=&quot;https://web.dev/ps-on-the-web/&quot;&gt;Photoshop&#39;s journey to the web&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;ensure-privacy&quot;&gt;Ensure privacy &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/cds2021-updates/#ensure-privacy&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Many common web functions rely on third-party cookies and other cross-site tracking mechanisms that weren’t designed with privacy in mind, making it difficult for developers to meet the growing need for privacy.&lt;/p&gt;
&lt;p&gt;We are working with the web community and industry stakeholders to develop new privacy-preserving technologies to support the ecosystem,
with the aim to phase out third-party cookies and reduce covert tracking and browser fingerprinting.&lt;/p&gt;
&lt;p&gt;Find out about this work on the &lt;a href=&quot;https://privacysandbox.com/&quot; rel=&quot;noopener&quot;&gt;Privacy Sandbox&lt;/a&gt; site.
We also have &lt;a href=&quot;https://developer.chrome.com/docs/privacy-sandbox/&quot; rel=&quot;noopener&quot;&gt;information and guides to the proposals for developers&lt;/a&gt;,
a &lt;a href=&quot;https://developer.chrome.com/tags/progress-in-the-privacy-sandbox/&quot; rel=&quot;noopener&quot;&gt;monthly update or changes and progress&lt;/a&gt;,
and information on the timeline and testing details for &lt;a href=&quot;https://goo.gle/user-agent-reduction&quot; rel=&quot;noopener&quot;&gt;changes to the user-agent string&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;improve-core-web-vitals&quot;&gt;Improve Core Web Vitals &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/cds2021-updates/#improve-core-web-vitals&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We&#39;ve been working with the developers of popular JavaScript frameworks to improve Core Web Vitals,
and as part of that work have identified two new metrics that we&#39;d love your feedback on.
Read about &lt;a href=&quot;https://web.dev/responsiveness/&quot;&gt;overall responsiveness&lt;/a&gt; and
&lt;a href=&quot;https://web.dev/smoothness/&quot;&gt;smoothness&lt;/a&gt;, then let us know what you think.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; You can find out more on our collaboration with JavaScript frameworks in our post &lt;a href=&quot;https://web.dev/introducing-aurora/&quot;&gt;Introducing Aurora&lt;/a&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;Also announced is an updated version of &lt;a href=&quot;https://web.dev/whats-new-pagespeed-insights/&quot;&gt;PageSpeed Insights&lt;/a&gt;,
a new &lt;a href=&quot;https://developer.chrome.com/docs/devtools/recorder/&quot; rel=&quot;noopener&quot;&gt;Recorder Panel for Chrome DevTools&lt;/a&gt;, currently available in Canary,
and a new &lt;a href=&quot;https://web.dev/lighthouse-user-flows/&quot;&gt;user flow API for Lighthouse&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;enable-new-web-platform-features&quot;&gt;Enable new web platform features &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/cds2021-updates/#enable-new-web-platform-features&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;RenderingNG is an ambitious refactoring of Chromium&#39;s rendering engine,
a project that is fixing long standing bugs in Chrome, and also unlocking new features.
This includes one feature that has been the top request from web developers for many years—&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Container_Queries&quot; rel=&quot;noopener&quot;&gt;container queries&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Container queries look familiar to anyone who has ever used a media query to create a responsive design.
However, inside of querying the viewport size, they allow you to query the size of the container your component is in.
Google has been working on a trial implementation of the emerging specification, behind the &lt;code&gt;#enable-container-queries&lt;/code&gt; flag in Chrome.&lt;/p&gt;
&lt;p&gt;Read a blog post covering
&lt;a href=&quot;https://developer.chrome.com/blog/renderingng/&quot; rel=&quot;noopener&quot;&gt;RenderingNG in detail&lt;/a&gt;,
or watch &lt;a href=&quot;https://www.youtube.com/watch?v=sUbJPHYKZkU&quot; rel=&quot;noopener&quot;&gt;this video&lt;/a&gt;
to get all the key details of how this work unlocks implementation of features that were once thought impossible to land.&lt;/p&gt;
&lt;h2 id=&quot;help-you-to-create-beautiful-and-responsive-sites&quot;&gt;Help you to create beautiful and responsive sites &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/cds2021-updates/#help-you-to-create-beautiful-and-responsive-sites&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://web.dev/new-responsive/&quot;&gt;new responsive design&lt;/a&gt; is so much more than just screen—or container—size.
You can learn how to create modern responsive sites in our course
&lt;a href=&quot;https://web.dev/learn/design/&quot;&gt;Learn Design&lt;/a&gt;.
The first five modules launch today, the rest will be posted over the coming weeks.&lt;/p&gt;
&lt;p&gt;New CSS properties have landed in Chrome and other browsers this year to make creating beautiful experiences easier.
Find out more about &lt;a href=&quot;https://web.dev/accent-color/&quot;&gt;&lt;code&gt;accent-color&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://web.dev/css-size-adjust/&quot;&gt;&lt;code&gt;size-adjust&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To help you quickly take advantage of new CSS, we have launched a set of &lt;a href=&quot;https://web.dev/patterns/layout/&quot;&gt;layout patterns&lt;/a&gt;.
These will give you a robust starting point for many common interface patterns.&lt;/p&gt;
&lt;h2 id=&quot;provide-courses-to-help-you-learn-web-technology&quot;&gt;Provide courses to help you learn web technology &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/cds2021-updates/#provide-courses-to-help-you-learn-web-technology&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In addition to Learn Design, we are launching new modules for &lt;a href=&quot;https://web.dev/learn/css/&quot;&gt;Learn CSS&lt;/a&gt;,
our comprehensive CSS course launched earlier this year.&lt;/p&gt;
&lt;p&gt;We have also developed a complete course helping you to design functional and accessible forms—&lt;a href=&quot;https://web.dev/learn/forms/&quot;&gt;Learn Forms&lt;/a&gt;.
Along with these courses, you can find the first few modules of &lt;a href=&quot;https://web.dev/learn/pwa/&quot;&gt;Learn PWA&lt;/a&gt;.&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Examples of high-performance CSS animations</title>
    <link href="https://web.dev/animations-examples/"/>
    <updated>2020-10-23T00:00:00Z</updated>
    <id>https://web.dev/animations-examples/</id>
    <content type="html" mode="escaped">&lt;p&gt;In this post find out how some popular animations found on CodePen have been created.
These animations all use the performant techniques discussed in other articles in this section.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://web.dev/animations-overview/&quot;&gt;Why are some animations slow?&lt;/a&gt; to learn the theory behind
these recommendations, and the &lt;a href=&quot;https://web.dev/animations-guide&quot;&gt;Animations Guide&lt;/a&gt; for practical tips.&lt;/p&gt;
&lt;h2 id=&quot;wizard-loading-animation&quot;&gt;Wizard loading animation &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-examples/#wizard-loading-animation&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div style=&quot;height: 500px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;&quot; loading=&quot;lazy&quot; src=&quot;https://codepen.io/Craaftx/embed/ExyYRMK?height=458&amp;theme-id=light&amp;default-tab=result&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;Only CSS Loader - Wizard by Guilmain Dorian&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://codepen.io/Craaftx/full/ExyYRMK&quot; rel=&quot;noopener&quot;&gt;View Wizard loading animation on CodePen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This loading animation is built entirely with CSS.
The image plus all of the animation has been created in CSS and HTML,
no images or JavaScript.
To understand how it was created and how well it performs you can use Chrome DevTools.&lt;/p&gt;
&lt;h3 id=&quot;inspect-the-animation-with-chrome-devtools&quot;&gt;Inspect the animation with Chrome DevTools &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-examples/#inspect-the-animation-with-chrome-devtools&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;With the animation running, open the Performance tab in Chrome DevTools and record a few seconds of the animation.
You should see in the Summary that the browser is not doing any Layout or Paint operations when running this animation.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Summary in DevTools&quot; decoding=&quot;async&quot; height=&quot;416&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 724px) 724px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/r1h4gb24ZiYXAfI7Mskh.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/r1h4gb24ZiYXAfI7Mskh.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/r1h4gb24ZiYXAfI7Mskh.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/r1h4gb24ZiYXAfI7Mskh.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/r1h4gb24ZiYXAfI7Mskh.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/r1h4gb24ZiYXAfI7Mskh.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/r1h4gb24ZiYXAfI7Mskh.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/r1h4gb24ZiYXAfI7Mskh.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/r1h4gb24ZiYXAfI7Mskh.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/r1h4gb24ZiYXAfI7Mskh.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/r1h4gb24ZiYXAfI7Mskh.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/r1h4gb24ZiYXAfI7Mskh.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/r1h4gb24ZiYXAfI7Mskh.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/r1h4gb24ZiYXAfI7Mskh.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/r1h4gb24ZiYXAfI7Mskh.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/r1h4gb24ZiYXAfI7Mskh.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/r1h4gb24ZiYXAfI7Mskh.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/admin/r1h4gb24ZiYXAfI7Mskh.jpg?auto=format&amp;w=1448 1448w&quot; width=&quot;724&quot; /&gt;
  &lt;figcaption&gt;
    The summary after profiling the wizard animation.
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;To find out how this animation was achieved without causing layout and paint,
inspect any of the moving elements in Chrome DevTools.
You can use the &lt;strong&gt;Animations Panel&lt;/strong&gt; to locate the various animated elements,
clicking on any element will highlight it in the DOM.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;The Animations Panel showing the various parts of our animation.&quot; decoding=&quot;async&quot; height=&quot;349&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/sPoemcfld1jfUkSFhv3o.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/sPoemcfld1jfUkSFhv3o.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/sPoemcfld1jfUkSFhv3o.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/sPoemcfld1jfUkSFhv3o.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/sPoemcfld1jfUkSFhv3o.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/sPoemcfld1jfUkSFhv3o.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/sPoemcfld1jfUkSFhv3o.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/sPoemcfld1jfUkSFhv3o.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/sPoemcfld1jfUkSFhv3o.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/sPoemcfld1jfUkSFhv3o.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/sPoemcfld1jfUkSFhv3o.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/sPoemcfld1jfUkSFhv3o.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/sPoemcfld1jfUkSFhv3o.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/sPoemcfld1jfUkSFhv3o.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/sPoemcfld1jfUkSFhv3o.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/sPoemcfld1jfUkSFhv3o.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/sPoemcfld1jfUkSFhv3o.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/admin/sPoemcfld1jfUkSFhv3o.jpg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;
    Viewing and selecting items in the Chrome DevTools Animation Panel.
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;For example select the triangle,
and watch how the box of the element transforms during its journey into the air,
as it spins, and then returns to the start position.&lt;/p&gt;
&lt;figure&gt;
  &lt;video autoplay=&quot;&quot; controls=&quot;&quot; loop=&quot;&quot; muted=&quot;&quot;&gt;      &lt;source src=&quot;https://storage.googleapis.com/web-dev-uploads/video/tcFciHGuF3MxnTr1y5ue01OGLBn2/STzIqse0ekWT49oJbwX5.mp4&quot; type=&quot;video/mp4&quot; /&gt;    &lt;/video&gt;
  &lt;figcaption&gt;
    Video showing how we can track the path of the triangle in Chrome DevTools.
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;With the element still selected look at the Styles Panel.
There you can see the CSS which draws the shape of the triangle,
and the animation being used.&lt;/p&gt;
&lt;h3 id=&quot;how-it-works&quot;&gt;How it works &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-examples/#how-it-works&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The triangle is created by using the &lt;code&gt;::after&lt;/code&gt; pseudo-element to add generated content,
using borders to create the shape.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.triangle&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; absolute&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; -62px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; -10px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 110px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 110px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;border-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 50%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token selector&quot;&gt;.triangle::after&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; absolute&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; -10px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;border-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; solid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;border-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 28px 48px 28px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;border-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; transparent transparent #89beb3 transparent&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; You can find out more about making shapes with borders and generated content in &lt;a href=&quot;https://css-tricks.com/the-shapes-of-css/&quot;&gt;The Shapes of CSS&lt;/a&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;The animation is added with the following line of CSS,&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; path_triangle 10s ease-in-out infinite&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Staying in Chrome DevTools you can find the keyframes by scrolling down the Style Panel.
There you will find that the animation is created by using &lt;code&gt;transform&lt;/code&gt; to change the position of the element and rotate it.
The &lt;code&gt;transform&lt;/code&gt; property is one of the properties described in the &lt;a href=&quot;https://web.dev/animations-guide&quot;&gt;Animations Guide&lt;/a&gt;,
which does not cause the browser to do layout or paint operations (which are the main causes of slow animations).&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@keyframes&lt;/span&gt; path_triangle&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;0%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translateY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;10%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translateY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;-172px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translatex&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;10px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rotate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;-10deg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;55%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translateY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;-172px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translatex&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;10px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rotate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;-365deg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;58%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translateY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;-172px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translatex&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;10px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rotate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;-365deg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;63%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rotate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;-360deg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/animation-breakdown1-2?attributionHidden=true&amp;sidebarCollapsed=true&amp;previewSize=100&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;animation-breakdown1-2 on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Each of the different moving parts of this animation uses similar techniques.
The result is a complex animation which runs smoothly.&lt;/p&gt;
&lt;h2 id=&quot;pulsating-circle&quot;&gt;Pulsating Circle &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-examples/#pulsating-circle&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div style=&quot;height: 500px; width: 100%;&quot;&gt;
&lt;iframe allow=&quot;&quot; loading=&quot;lazy&quot; src=&quot;https://codepen.io/peeke/embed/BjxXZa?height=458&amp;theme-id=light&amp;default-tab=result&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;Pulsating Circle by Peeke&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://codepen.io/peeke/full/BjxXZa&quot; rel=&quot;noopener&quot;&gt;View Pulsating Circle on CodePen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This type of animation is sometimes used to draw attention to something on a page.
To understand the animation you can use Firefox DevTools.&lt;/p&gt;
&lt;h3 id=&quot;inspect-the-animation-with-firefox-devtools&quot;&gt;Inspect the animation with Firefox DevTools &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-examples/#inspect-the-animation-with-firefox-devtools&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;With the animation running, open the Performance tab in Firefox DevTools and record a few seconds of the animation.
Stop the recording,
in the waterfall you should see that there are no entries for &lt;strong&gt;Recalculate Style&lt;/strong&gt;.
You now know that this animation does not cause style recalculation,
and therefore layout and paint operations.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;details of the animation in the Firefox Waterfall&quot; decoding=&quot;async&quot; height=&quot;354&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/68jWlrbNhgmS07vrXMCO.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/68jWlrbNhgmS07vrXMCO.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/68jWlrbNhgmS07vrXMCO.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/68jWlrbNhgmS07vrXMCO.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/68jWlrbNhgmS07vrXMCO.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/68jWlrbNhgmS07vrXMCO.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/68jWlrbNhgmS07vrXMCO.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/68jWlrbNhgmS07vrXMCO.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/68jWlrbNhgmS07vrXMCO.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/68jWlrbNhgmS07vrXMCO.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/68jWlrbNhgmS07vrXMCO.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/68jWlrbNhgmS07vrXMCO.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/68jWlrbNhgmS07vrXMCO.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/68jWlrbNhgmS07vrXMCO.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/68jWlrbNhgmS07vrXMCO.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/68jWlrbNhgmS07vrXMCO.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/68jWlrbNhgmS07vrXMCO.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/admin/68jWlrbNhgmS07vrXMCO.jpg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;
    The Firefox DevTools Waterfall.
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Staying in Firefox DevTools inspect the circle to see how this animation works.
The &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; with a class of &lt;code&gt;pulsating-circle&lt;/code&gt; marks the position of the circle,
however it does not draw a circle itself.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.pulsating-circle&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; absolute&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 50%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 50%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translateX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;-50%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translateY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;-50%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 30px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 30px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;The visible circle and animations are achieved using the &lt;code&gt;::before&lt;/code&gt; and &lt;code&gt;::after&lt;/code&gt; pseudo-elements.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;::before&lt;/code&gt; element creates the opaque ring that extends outside of the white circle,
using an animation called &lt;code&gt;pulse-ring&lt;/code&gt;,
which animates &lt;code&gt;transform: scale&lt;/code&gt;, and &lt;code&gt;opacity&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.pulsating-circle::before&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; relative&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 300%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 300%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;box-sizing&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; border-box&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;margin-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; -100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;margin-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; -100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;border-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 45px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #01a4e9&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; pulse-ring 1.25s &lt;span class=&quot;token function&quot;&gt;cubic-bezier&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0.215&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0.61&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0.355&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; infinite&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@keyframes&lt;/span&gt; pulse-ring&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;0%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0.33&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;80%, 100%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Another way to see which properties are being animated is to select the &lt;strong&gt;Animations&lt;/strong&gt; panel in Firefox DevTools.
You will then see a visualization of the animations being used,
and the properties that are being animated.&lt;/p&gt;
&lt;figure&gt;
  &lt;video autoplay=&quot;&quot; controls=&quot;&quot; loop=&quot;&quot; muted=&quot;&quot;&gt;      &lt;source src=&quot;https://storage.googleapis.com/web-dev-uploads/video/tcFciHGuF3MxnTr1y5ue01OGLBn2/FuxnywlwqojS8YVMCmKC.mp4&quot; type=&quot;video/mp4&quot; /&gt;    &lt;/video&gt;
  &lt;figcaption&gt;
    With the ::before pseudo-element selected we can see which properties are animating.
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The white circle itself is created and animated using the &lt;code&gt;::after&lt;/code&gt; pseudo-element.
The animation &lt;code&gt;pulse-dot&lt;/code&gt; uses &lt;code&gt;transform: scale&lt;/code&gt; to grow and shrink the dot during the animation.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.pulsating-circle::after&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; absolute&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; white&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;border-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 15px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 0 8px &lt;span class=&quot;token function&quot;&gt;rgba&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0.3&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; pulse-dot 1.25s &lt;span class=&quot;token function&quot;&gt;cubic-bezier&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0.455&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0.03&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0.515&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0.955&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; -0.4s infinite&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@keyframes&lt;/span&gt; pulse-dot&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;0%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0.8&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;50%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;100%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0.8&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;An animation like this could be used in various places in your application,
it&#39;s important that these small touches don&#39;t impact the overall performance of your app.&lt;/p&gt;
&lt;h2 id=&quot;pure-css-3d-sphere&quot;&gt;Pure CSS 3D Sphere &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-examples/#pure-css-3d-sphere&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div style=&quot;height: 500px; width: 100%;&quot;&gt;
&lt;iframe allow=&quot;&quot; loading=&quot;lazy&quot; src=&quot;https://codepen.io/iamlark/embed/jYzYJg?height=458&amp;theme-id=light&amp;default-tab=result&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;Pure CSS 3d Sphere&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://codepen.io/iamlark/full/jYzYJg&quot; rel=&quot;noopener&quot;&gt;View Pure CSS 3D Sphere on CodePen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This animation seems incredibly complicated,
however it uses techniques that we have already seen in the previous examples.
The complexity comes from animating a large number of elements.&lt;/p&gt;
&lt;p&gt;Open Chrome DevTools and select one of the elements with a class of &lt;code&gt;plane&lt;/code&gt;.
The sphere is made up of a set of rotating planes and spokes.&lt;/p&gt;
&lt;figure&gt;
  &lt;video autoplay=&quot;&quot; controls=&quot;&quot; loop=&quot;&quot; muted=&quot;&quot;&gt;      &lt;source src=&quot;https://storage.googleapis.com/web-dev-uploads/video/tcFciHGuF3MxnTr1y5ue01OGLBn2/8lA3linRM6SqufzlUlJR.mp4&quot; type=&quot;video/mp4&quot; /&gt;    &lt;/video&gt;
  &lt;figcaption&gt;
    The plane appears to be rotating.
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; The &lt;a href=&quot;https://developer.chrome.com/docs/devtools/dom/#search&quot;&gt;DOM Search Tool&lt;/a&gt; in Chrome DevTools can make it easier to find an element that you want to inspect. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;These planes and spokes are inside a wrapper &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;,
and it is this element which is rotating using &lt;code&gt;transform: rotate3d&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.sphere-wrapper&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;transform-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; preserve-3d&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 300px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 300px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; relative&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; rotate3d 10s linear infinite&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@keyframes&lt;/span&gt; rotate3d&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;0%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rotate3d&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0deg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;25%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rotate3d&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 90deg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;50%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rotate3d&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 180deg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;75%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rotate3d&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 270deg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;100%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rotate3d&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 360deg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;The dots can be found nested inside the &lt;code&gt;plane&lt;/code&gt; and &lt;code&gt;spoke&lt;/code&gt; elements,
they use an animation which uses transform to scale and translate them.
This creates the pulsing effect.&lt;/p&gt;
&lt;figure&gt;
  &lt;video autoplay=&quot;&quot; controls=&quot;&quot; loop=&quot;&quot; muted=&quot;&quot;&gt;      &lt;source src=&quot;https://storage.googleapis.com/web-dev-uploads/video/tcFciHGuF3MxnTr1y5ue01OGLBn2/JoLi8L3VW9nUG25sEvkZ.mp4&quot; type=&quot;video/mp4&quot; /&gt;    &lt;/video&gt;
  &lt;figcaption&gt;
    The dot rotates with the sphere and pulses.
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.spoke-15 .dot,&lt;br /&gt;.spoke-21 .dot&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; pulsate 0.5s infinite 0.83333333s alternate both&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #55ffee&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@-webkit-keyframes&lt;/span&gt; pulsate&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;0%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rotateX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;90deg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0.3&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translateZ&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;20px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;100%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rotateX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;90deg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translateZ&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;The work involved in creating this animation has been to get the timing right,
to create the turning and pulsing effect.
The animations themselves are quite straightforward,
and use methods which perform very well.&lt;/p&gt;
&lt;p&gt;You can see how this animation performs by opening Chrome DevTools and recording Performance while it is running.
After the initial load, the animation is not triggering Layout or Paint,
and runs smoothly.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-examples/#conclusion&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;From these examples you can see how animating a few properties using performant methods can create some very cool animations.
By defaulting to the performant methods described in the &lt;a href=&quot;https://web.dev/animations-guide&quot;&gt;Animations guide&lt;/a&gt;
you can spend your time creating the effect you want, with fewer concerns about making the page slow.&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>How to create high-performance CSS animations</title>
    <link href="https://web.dev/animations-guide/"/>
    <updated>2020-10-06T00:00:00Z</updated>
    <id>https://web.dev/animations-guide/</id>
    <content type="html" mode="escaped">&lt;p&gt;This guide teaches you how to create high-performance CSS animations.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://web.dev/animations-overview/&quot;&gt;Why are some animations slow?&lt;/a&gt; to learn the theory behind
these recommendations.&lt;/p&gt;
&lt;h2 id=&quot;browser-compatibility&quot;&gt;Browser compatibility &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-guide/#browser-compatibility&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;All of the CSS properties that this guide recommends have good cross-browser support.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/transform#Browser_compatibility&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;transform&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/opacity#Browser_compatibility&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;opacity&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/will-change#Browser_compatibility&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;will-change&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;move&quot;&gt;Move an element &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-guide/#move&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To move an element, use the &lt;code&gt;translate&lt;/code&gt; or &lt;code&gt;rotation&lt;/code&gt; keyword values of the
&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/transform&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;transform&lt;/code&gt;&lt;/a&gt; property.&lt;/p&gt;
&lt;p&gt;For example to slide an item into view, use &lt;code&gt;translate&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.animate&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; slide-in 0.7s both&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@keyframes&lt;/span&gt; slide-in&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;0%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translateY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;-1000px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;100%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translateY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/animation-slide-in?attributionHidden=true&amp;sidebarCollapsed=true&amp;previewSize=100&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;animation-slide-in on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Items can also be rotated, in the example below 360 degrees.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.animate&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; rotate 0.7s ease-in-out both&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@keyframes&lt;/span&gt; rotate&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;0%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rotate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;100%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rotate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;360deg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/animation-rotate?attributionHidden=true&amp;sidebarCollapsed=true&amp;previewSize=100&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;animation-rotate on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id=&quot;resize&quot;&gt;Resize an element &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-guide/#resize&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To resize an element, use the &lt;code&gt;scale&lt;/code&gt; keyword value of the
&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/transform&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;transform&lt;/code&gt;&lt;/a&gt; property.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.animate&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; scale 1.5s both&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@keyframes&lt;/span&gt; scale&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;50%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0.5&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;100%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/animation-scale?attributionHidden=true&amp;sidebarCollapsed=true&amp;previewSize=100&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;animation-scale on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id=&quot;visibility&quot;&gt;Change an element&#39;s visibility &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-guide/#visibility&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To show or hide an element, use &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/opacity&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;opacity&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.animate&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; opacity 2.5s both&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@keyframes&lt;/span&gt; opacity&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;0%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;50%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;100%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/animation-opacity?attributionHidden=true&amp;sidebarCollapsed=true&amp;previewSize=100&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;animation-opacity on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; Find copy and paste examples of various animations at &lt;a href=&quot;https://animista.net/&quot;&gt;Animista&lt;/a&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;h2 id=&quot;triggers&quot;&gt;Avoid properties that trigger layout or paint &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-guide/#triggers&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Before using any CSS property for animation (other than &lt;code&gt;transform&lt;/code&gt; and &lt;code&gt;opacity&lt;/code&gt;),
determine the property&#39;s impact on the &lt;a href=&quot;https://web.dev/animations-overview/#pipeline&quot;&gt;rendering pipeline&lt;/a&gt;.
Avoid any property that triggers layout or paint unless absolutely necessary.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-warn-bg color-state-warn-text&quot;&gt;&lt;p class=&quot;cluster &quot;&gt;&lt;span class=&quot;aside__icon box-block color-state-warn-text&quot;&gt;&lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot; role=&quot;img&quot; aria-label=&quot;Warning sign&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;   &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M23 21L12 2 1 21h22zm-12-3v-2h2v2h-2zm0-4h2v-4h-2v4z&quot;&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/span&gt;&lt;strong&gt;Warning&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot; flow&quot;&gt; If you must use a property that triggers layout or paint, it is unlikely that you will be able to make the animation smooth and high-performance. &lt;/div&gt;&lt;/aside&gt;
&lt;h2 id=&quot;force&quot;&gt;Force layer creation &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-guide/#force&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As explained in &lt;a href=&quot;https://web.dev/animations-overview&quot;&gt;Why are some animations slow?&lt;/a&gt;,
by placing elements on a new layer they can be repainted without also requiring the rest of the layout to be repainted.&lt;/p&gt;
&lt;p&gt;Browsers will often make good decisions about which items should be placed on a new layer,
but you can manually force layer creation with the
&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/will-change&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;will-change&lt;/code&gt;&lt;/a&gt; property.
As the name suggests, this property tells the browser that this element is going to be changed in some way.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-bad-bg color-state-bad-text&quot;&gt;&lt;p class=&quot;cluster color-state-bad-text&quot;&gt;&lt;span class=&quot;aside__icon box-block &quot;&gt;&lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;Error sign&quot;&gt;   &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 15v-2h2v2h-2zm0-10v6h2V7h-2z&quot;&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/span&gt;&lt;strong&gt;Caution&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot; flow&quot;&gt; As layer creation can cause other performance issues, this property should not be used as a premature optimization. Instead, you should only use it when you are seeing jank and think that promoting the element to a new layer may help. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;In CSS this property can be applied to any selector:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;body &gt; .sidebar&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;will-change&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; transform&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;However, &lt;a href=&quot;https://drafts.csswg.org/css-will-change/&quot; rel=&quot;noopener&quot;&gt;the specification&lt;/a&gt;
suggests this approach should only be taken for elements that are always about to change.
If the above example was a sidebar the user could slide in and out, that might be the case.
Some items on your page may not frequently change,
and so it would be better to apply &lt;code&gt;will-change&lt;/code&gt; using JavaScript
at a point where it becomes likely the change will occur.
You&#39;ll need to make sure to give the browser enough time to perform the optimizations needed
and then remove the property once the changing has stopped.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; For more information and examples of correct use of &lt;code&gt;will-change&lt;/code&gt; read &lt;a href=&quot;https://dev.opera.com/articles/css-will-change-property/&quot;&gt;Everything You Need To Know About The CSS &lt;code&gt;will-change&lt;/code&gt; Property&lt;/a&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;If you need a way to force layer creation in one of the rare browsers that doesn&#39;t support
&lt;code&gt;will-change&lt;/code&gt; (most likely Internet Explorer at this point),
you can set &lt;code&gt;transform: translateZ(0)&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;debug&quot;&gt;Debug slow or janky animations &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-guide/#debug&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Chrome DevTools and Firefox DevTools have lots of tools to help you figure out why
your animations are slow or janky.&lt;/p&gt;
&lt;h3 id=&quot;layout&quot;&gt;Check if an animation triggers layout &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-guide/#layout&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;An animation that moves an element using something other than &lt;code&gt;transform&lt;/code&gt;, is likely to be slow.
In the following example, I have achieved the same visual result animating &lt;code&gt;top&lt;/code&gt; and &lt;code&gt;left&lt;/code&gt;, and using &lt;code&gt;transform&lt;/code&gt;.&lt;/p&gt;
&lt;figure class=&quot;compare flow&quot; data-type=&quot;worse&quot; data-size=&quot;full&quot;&gt;&lt;p class=&quot;compare__label&quot;&gt;Don&#39;t&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.box&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; absolute&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; move 3s ease infinite&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@keyframes&lt;/span&gt; move&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token selector&quot;&gt;50%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;     &lt;span class=&quot;token property&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;calc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;90vh - 160px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;     &lt;span class=&quot;token property&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;calc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;90vw - 200px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;figure class=&quot;compare flow&quot; data-type=&quot;better&quot; data-size=&quot;full&quot;&gt;&lt;p class=&quot;compare__label&quot;&gt;Do&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.box&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; absolute&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; move 3s ease infinite&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@keyframes&lt;/span&gt; move&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token selector&quot;&gt;50%&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;     &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;calc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;90vw - 200px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;calc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;90vh - 160px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;You can test this in the following two Glitch examples,
and explore performance using DevTools.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://glitch.com/~animation-with-top-left&quot; rel=&quot;noopener&quot;&gt;Before&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://glitch.com/~animation-with-transform&quot; rel=&quot;noopener&quot;&gt;After&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;layout-chrome&quot;&gt;Chrome DevTools &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-guide/#layout-chrome&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Open the &lt;strong&gt;Performance&lt;/strong&gt; panel.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/docs/devtools/evaluate-performance/reference/#record-runtime&quot; rel=&quot;noopener&quot;&gt;Record runtime performance&lt;/a&gt;
while your animation is happening.&lt;/li&gt;
&lt;li&gt;Inspect the &lt;strong&gt;Summary&lt;/strong&gt; tab.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you see a nonzero value for &lt;strong&gt;Rendering&lt;/strong&gt; in the &lt;strong&gt;Summary&lt;/strong&gt; tab, it may mean that your
animation is causing the browser to do layout work.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;The Summary panel shows 37ms for rendering and 79ms for painting.&quot; decoding=&quot;async&quot; height=&quot;699&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/cMNQR2jBEwa6ku5POXtZ.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/cMNQR2jBEwa6ku5POXtZ.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/cMNQR2jBEwa6ku5POXtZ.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/cMNQR2jBEwa6ku5POXtZ.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/cMNQR2jBEwa6ku5POXtZ.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/cMNQR2jBEwa6ku5POXtZ.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/cMNQR2jBEwa6ku5POXtZ.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/cMNQR2jBEwa6ku5POXtZ.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/cMNQR2jBEwa6ku5POXtZ.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/cMNQR2jBEwa6ku5POXtZ.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/cMNQR2jBEwa6ku5POXtZ.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/cMNQR2jBEwa6ku5POXtZ.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/cMNQR2jBEwa6ku5POXtZ.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/cMNQR2jBEwa6ku5POXtZ.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/cMNQR2jBEwa6ku5POXtZ.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/cMNQR2jBEwa6ku5POXtZ.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/cMNQR2jBEwa6ku5POXtZ.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/admin/cMNQR2jBEwa6ku5POXtZ.jpg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;
    The &lt;a href=&quot;https://animation-with-top-left.glitch.me/&quot;&gt;animation-with-top-left&lt;/a&gt;
    example causes rendering work.
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
  &lt;img alt=&quot;The Summary panel show zero values for rendering and painting.&quot; decoding=&quot;async&quot; height=&quot;639&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/3bn44P9h6lR93uBNRXY3.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/3bn44P9h6lR93uBNRXY3.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/3bn44P9h6lR93uBNRXY3.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/3bn44P9h6lR93uBNRXY3.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/3bn44P9h6lR93uBNRXY3.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/3bn44P9h6lR93uBNRXY3.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/3bn44P9h6lR93uBNRXY3.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/3bn44P9h6lR93uBNRXY3.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/3bn44P9h6lR93uBNRXY3.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/3bn44P9h6lR93uBNRXY3.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/3bn44P9h6lR93uBNRXY3.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/3bn44P9h6lR93uBNRXY3.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/3bn44P9h6lR93uBNRXY3.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/3bn44P9h6lR93uBNRXY3.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/3bn44P9h6lR93uBNRXY3.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/3bn44P9h6lR93uBNRXY3.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/3bn44P9h6lR93uBNRXY3.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/admin/3bn44P9h6lR93uBNRXY3.jpg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;
    The &lt;a href=&quot;https://animation-with-transform.glitch.me/&quot;&gt;animation-with-transform&lt;/a&gt;
    example does not cause rendering work.
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h4 id=&quot;layout-firefox&quot;&gt;Firefox DevTools &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-guide/#layout-firefox&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;In Firefox DevTools the &lt;a href=&quot;https://developer.mozilla.org/docs/Tools/Performance/Waterfall&quot; rel=&quot;noopener&quot;&gt;Waterfall&lt;/a&gt;
can help you to understand where the browser is spending time.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the &lt;strong&gt;Performance&lt;/strong&gt; panel.&lt;/li&gt;
&lt;li&gt;In the panel Start Recording Performance while your animation is happening.&lt;/li&gt;
&lt;li&gt;Stop the recording and inspect the &lt;strong&gt;Waterfall&lt;/strong&gt; tab.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you see entries for &lt;a href=&quot;https://developer.mozilla.org/docs/Tools/Performance/Scenarios/Animating_CSS_properties&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;Recalculate Style&lt;/strong&gt;&lt;/a&gt;
then the browser is having to begin at the start of the &lt;a href=&quot;https://developer.mozilla.org/docs/Tools/Performance/Scenarios/Animating_CSS_properties&quot; rel=&quot;noopener&quot;&gt;rendering waterfall&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;fps&quot;&gt;Check if an animation is dropping frames &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-guide/#fps&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Open the &lt;a href=&quot;https://developer.chrome.com/docs/devtools/evaluate-performance/reference/#rendering&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;Rendering&lt;/strong&gt; tab&lt;/a&gt; of Chrome DevTools.&lt;/li&gt;
&lt;li&gt;Enable the &lt;strong&gt;FPS meter&lt;/strong&gt; checkbox.&lt;/li&gt;
&lt;li&gt;Watch the values as your animation runs.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;At the top of the &lt;strong&gt;FPS meter&lt;/strong&gt; UI you see the label &lt;strong&gt;Frames&lt;/strong&gt;. Below
that you see a value along the lines of &lt;code&gt;50% 1 (938 m) dropped of 1878&lt;/code&gt;.
A high-performance animation will have a high percentage, e.g. &lt;code&gt;99%&lt;/code&gt;. A
high percentage means that few frames are being dropped and the animation will look smooth.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;The fps meter shows 50% of frames were dropped&quot; decoding=&quot;async&quot; height=&quot;469&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 710px) 710px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/i9Cg7nswyO7jB768kpdQ.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/i9Cg7nswyO7jB768kpdQ.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/i9Cg7nswyO7jB768kpdQ.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/i9Cg7nswyO7jB768kpdQ.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/i9Cg7nswyO7jB768kpdQ.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/i9Cg7nswyO7jB768kpdQ.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/i9Cg7nswyO7jB768kpdQ.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/i9Cg7nswyO7jB768kpdQ.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/i9Cg7nswyO7jB768kpdQ.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/i9Cg7nswyO7jB768kpdQ.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/i9Cg7nswyO7jB768kpdQ.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/i9Cg7nswyO7jB768kpdQ.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/i9Cg7nswyO7jB768kpdQ.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/i9Cg7nswyO7jB768kpdQ.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/i9Cg7nswyO7jB768kpdQ.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/i9Cg7nswyO7jB768kpdQ.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/i9Cg7nswyO7jB768kpdQ.jpg?auto=format&amp;w=1420 1420w&quot; width=&quot;710&quot; /&gt;
  &lt;figcaption&gt;
    The &lt;a href=&quot;https://animation-with-top-left.glitch.me/&quot;&gt;animation-with-top-left&lt;/a&gt;
    example causes 50% of frames to be dropped
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
  &lt;img alt=&quot;The fps meter shows only 1% of frames were dropped&quot; decoding=&quot;async&quot; height=&quot;468&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 710px) 710px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/FGROZ0i15tCAoiIOoEdG.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/FGROZ0i15tCAoiIOoEdG.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/FGROZ0i15tCAoiIOoEdG.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/FGROZ0i15tCAoiIOoEdG.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/FGROZ0i15tCAoiIOoEdG.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/FGROZ0i15tCAoiIOoEdG.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/FGROZ0i15tCAoiIOoEdG.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/FGROZ0i15tCAoiIOoEdG.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/FGROZ0i15tCAoiIOoEdG.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/FGROZ0i15tCAoiIOoEdG.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/FGROZ0i15tCAoiIOoEdG.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/FGROZ0i15tCAoiIOoEdG.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/FGROZ0i15tCAoiIOoEdG.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/FGROZ0i15tCAoiIOoEdG.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/FGROZ0i15tCAoiIOoEdG.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/FGROZ0i15tCAoiIOoEdG.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/FGROZ0i15tCAoiIOoEdG.jpg?auto=format&amp;w=1420 1420w&quot; width=&quot;710&quot; /&gt;
  &lt;figcaption&gt;
    The &lt;a href=&quot;https://animation-with-transform.glitch.me/&quot;&gt;animation-with-transform&lt;/a&gt;
    example causes only 1% of frames to be dropped.
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;paint&quot;&gt;Check if an animation triggers paint &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-guide/#paint&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When it comes to painting, some things are more expensive than others.
For example, anything that involves a blur (like a shadow, for example) is going to take longer to paint than drawing a red box.
In terms of CSS, however, this isn&#39;t always obvious:
&lt;code&gt;background: red;&lt;/code&gt; and &lt;code&gt;box-shadow: 0, 4px, 4px, rgba(0,0,0,0.5);&lt;/code&gt;
don&#39;t necessarily look like they have vastly different performance characteristics, but they do.&lt;/p&gt;
&lt;p&gt;Browser DevTools can help you to identify which areas need to be repainted,
and performance issues related to painting.&lt;/p&gt;
&lt;h4 id=&quot;paint-chrome&quot;&gt;Chrome DevTools &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-guide/#paint-chrome&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Open the &lt;a href=&quot;https://developer.chrome.com/docs/devtools/evaluate-performance/reference/#rendering&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;Rendering&lt;/strong&gt; tab&lt;/a&gt; of Chrome DevTools.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Paint Flashing&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Move the pointer around the screen.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
  &lt;img alt=&quot;A UI element highlighted in green to demonstrate it will be repainted&quot; decoding=&quot;async&quot; height=&quot;185&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 708px) 708px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/MzAeQc5PvCltcm3gWaNV.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/MzAeQc5PvCltcm3gWaNV.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/MzAeQc5PvCltcm3gWaNV.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/MzAeQc5PvCltcm3gWaNV.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/MzAeQc5PvCltcm3gWaNV.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/MzAeQc5PvCltcm3gWaNV.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/MzAeQc5PvCltcm3gWaNV.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/MzAeQc5PvCltcm3gWaNV.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/MzAeQc5PvCltcm3gWaNV.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/MzAeQc5PvCltcm3gWaNV.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/MzAeQc5PvCltcm3gWaNV.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/MzAeQc5PvCltcm3gWaNV.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/MzAeQc5PvCltcm3gWaNV.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/MzAeQc5PvCltcm3gWaNV.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/MzAeQc5PvCltcm3gWaNV.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/MzAeQc5PvCltcm3gWaNV.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/MzAeQc5PvCltcm3gWaNV.jpg?auto=format&amp;w=1416 1416w&quot; width=&quot;708&quot; /&gt;
  &lt;figcaption&gt;In this example from Google Maps you can see the elements that will be repainted.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If you see the whole screen flashing,
or areas that you don&#39;t think should change highlighted then you can do some investigation.&lt;/p&gt;
&lt;p&gt;If you need to dig into whether a particular property is causing performance issues due to painting,
the &lt;a href=&quot;https://developer.chrome.com/docs/devtools/evaluate-performance/reference/#paint-profiler&quot; rel=&quot;noopener&quot;&gt;paint profiler&lt;/a&gt;
in Chrome DevTools can help.&lt;/p&gt;
&lt;h4 id=&quot;paint-firefox&quot;&gt;Firefox DevTools &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-guide/#paint-firefox&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Settings&lt;/strong&gt; and add a Toolbox button for &lt;a href=&quot;https://developer.mozilla.org/docs/Tools/Paint_Flashing_Tool&quot; rel=&quot;noopener&quot;&gt;Toggle paint flashing&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;On the page you want to inspect, toggle the button on and move your mouse or scroll to see highlighted areas.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-guide/#conclusion&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Where possible restrict animations to &lt;code&gt;opacity&lt;/code&gt; and &lt;code&gt;transform&lt;/code&gt;
in order to keep animations on the compositing stage of the rendering path.
Use DevTools to check which stage of the path is being affected by your animations.&lt;/p&gt;
&lt;p&gt;Use the paint profiler to see if any paint operations are particularly expensive.
If you find anything,
see if a different CSS property will give the same look and feel with better performance.&lt;/p&gt;
&lt;p&gt;Use the &lt;code&gt;will-change&lt;/code&gt; property sparingly,
and only if you encounter a performance issue.&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author><author>
      <name>Kayce Basques</name>
    </author>
  </entry>
  
  <entry>
    <title>Why are some animations slow?</title>
    <link href="https://web.dev/animations-overview/"/>
    <updated>2020-10-06T00:00:00Z</updated>
    <id>https://web.dev/animations-overview/</id>
    <content type="html" mode="escaped">&lt;p&gt;Modern browsers can animate two CSS properties cheaply: &lt;code&gt;transform&lt;/code&gt; and &lt;code&gt;opacity&lt;/code&gt;.
If you animate anything else,
the chances are you&#39;re not going to hit a silky smooth 60 frames per second (FPS).
This post explains why this is the case.&lt;/p&gt;
&lt;h2 id=&quot;fps&quot;&gt;Animation performance and frame rate &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-overview/#fps&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It is widely accepted that a frame rate of 60 FPS is the target when animating anything on the web.
This frame rate will ensure that your animations look smooth.
On the web a frame is the time that it takes to do all of the work required to update and repaint the screen.
If each frame does not complete within 16.7ms (1000ms / 60 ≈ 16.7),
then users will perceive the delay.&lt;/p&gt;
&lt;h2 id=&quot;pipeline&quot;&gt;The rendering pipeline &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-overview/#pipeline&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To display something on a webpage the browser has to go through the following sequential steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Style&lt;/strong&gt;: Calculate the styles that apply to the elements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Layout&lt;/strong&gt;: Generate the geometry and position for each element.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paint&lt;/strong&gt;: Fill out the pixels for each element into &lt;a href=&quot;https://web.dev/animations-overview/#layers&quot;&gt;layers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Composite&lt;/strong&gt;: Draw the layers to the screen.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These four steps are known as the browser&#39;s &lt;strong&gt;rendering pipeline&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;When you animate something on a page that has already loaded
these steps have to happen again.
This process begins from the step that has to be changed in order to allow the animation to take place.&lt;/p&gt;
&lt;p&gt;As mentioned before, these steps are &lt;strong&gt;sequential&lt;/strong&gt;.
For example, if you animate something that changes layout, the paint and composite
steps also have to run again. Animating something that changes layout
is therefore more expensive than animating something that only changes compositing.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; For an in-depth look at exactly how this process happens in the browser read &lt;a href=&quot;https://alistapart.com/article/braces-to-pixels/&quot;&gt;From Braces to Pixels&lt;/a&gt; and &lt;a href=&quot;https://developer.chrome.com/blog/inside-browser-part3/&quot;&gt;Inside look at modern browser browser&lt;/a&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;h3 id=&quot;layout&quot;&gt;Animating layout properties &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-overview/#layout&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Layout changes involve calculating the geometry (position and size) of all the elements affected by the change.
If you change one element,
the geometry of other elements may need to be recalculated.
For example, if you change the width of the &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; element any of its children may be affected.
Due to the way elements overflow and affect one another,
changes further down the tree can sometimes result in layout calculations all the way back up to the top.&lt;/p&gt;
&lt;p&gt;The larger the tree of visible elements,
the longer it takes to perform layout calculations.&lt;/p&gt;
&lt;h3 id=&quot;paint&quot;&gt;Animating paint properties &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-overview/#paint&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.chrome.com/blog/inside-browser-part3/#paint&quot; rel=&quot;noopener&quot;&gt;Paint&lt;/a&gt;
is the process of determining in what order elements should be painted to the screen.
It is often the longest-running of all tasks in the pipeline.&lt;/p&gt;
&lt;p&gt;The majority of painting in modern browsers is done in
&lt;a href=&quot;https://software.intel.com/content/www/us/en/develop/articles/software-vs-gpu-rasterization-in-chromium.html&quot; rel=&quot;noopener&quot;&gt;software rasterizers&lt;/a&gt;.
Depending on how the elements in your app are grouped into layers,
other elements besides the one that changed may also need to be painted.&lt;/p&gt;
&lt;h3 id=&quot;composite&quot;&gt;Animating composite properties &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-overview/#composite&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.chrome.com/blog/inside-browser-part3/#what-is-compositing&quot; rel=&quot;noopener&quot;&gt;Compositing&lt;/a&gt;
is the process of separating the page into layers, converting the information about how the page should look
into pixels (rasterization), and putting the layers together to create a page (compositing).&lt;/p&gt;
&lt;p&gt;This is why the &lt;code&gt;opacity&lt;/code&gt; property is included in the list of things which are cheap to animate.
As long as this property is in its own layer, changes to it can be handled by the GPU during the compositing step.
Chromium-based browsers and WebKit create a new layer for any element which has a CSS transition or animation on &lt;code&gt;opacity&lt;/code&gt;.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; For an in-depth look at compositing see the article &lt;a href=&quot;https://www.smashingmagazine.com/2016/12/gpu-animation-doing-it-right/&quot;&gt;GPU Animation: Doing It Right&lt;/a&gt; &lt;/div&gt;&lt;/aside&gt;
&lt;h2 id=&quot;layers&quot;&gt;What is a layer? &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-overview/#layers&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;By placing the things that will be animated or transitioned onto a new layer,
the browser only needs to repaint those items and not everything else.
You may be familiar with Photoshop&#39;s concept of a layer which contains a bunch of elements that can be moved together.
Browser rendering layers are similar to that idea.&lt;/p&gt;
&lt;p&gt;While the browser does a good job of making decisions about what elements should be on a new layer,
if it misses one there are ways to force layer creation.
You can find out about that in &lt;a href=&quot;https://web.dev/animations-guide&quot;&gt;How to create high-performance animations&lt;/a&gt;.
However, creating new layers should be done with care because each layer uses memory.
On devices with limited memory creating new layers may cause more of a performance problem than the one you are trying to solve.
In addition, each layer&#39;s textures need to be uploaded to the GPU.
Therefore you may well hit constraints of bandwidth between the CPU and GPU.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; You can read a good explanation of layers, and how to create them in &lt;a href=&quot;https://dassur.ma/things/forcing-layers/&quot;&gt;Layers and how to force them&lt;/a&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;h2 id=&quot;css-js&quot;&gt;CSS vs JavaScript performance &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/animations-overview/#css-js&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You might wonder: is it better from a performance perspective to use CSS or JavaScript for animations?&lt;/p&gt;
&lt;p&gt;CSS-based animations, and &lt;a href=&quot;https://web.dev/web-animations/&quot;&gt;Web Animations&lt;/a&gt; (in the browsers that support the API),
are typically handled on a thread known as the &lt;em&gt;compositor thread&lt;/em&gt;.
This is different from the browser&#39;s &lt;em&gt;main thread&lt;/em&gt;, where styling, layout, painting, and JavaScript are executed.
This means that if the browser is running some expensive tasks on the main thread,
these animations can keep going without being interrupted.&lt;/p&gt;
&lt;p&gt;As explained in this article,
other changes to transforms and opacity can, in many cases, also be handled by the compositor thread.&lt;/p&gt;
&lt;p&gt;If any animation triggers paint, layout, or both,
the main thread will be required to do work.
This is true for both CSS and JavaScript animations,
and the overhead of layout or paint will likely dwarf any work associated with CSS or JavaScript execution,
rendering the question moot.&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Create interesting image shapes with CSS&#39;s clip-path property</title>
    <link href="https://web.dev/css-clipping/"/>
    <updated>2020-09-14T00:00:00Z</updated>
    <id>https://web.dev/css-clipping/</id>
    <content type="html" mode="escaped">&lt;p&gt;Elements on web pages are all defined inside a rectangular box.
However that doesn&#39;t mean that we have to make everything look like a box.
You can use the CSS &lt;code&gt;clip-path&lt;/code&gt; property to clip away parts of an image or other element,
to create interesting effects.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe src=&quot;https://glitch.com/embed/#!/embed/clip-path?path=README.md&amp;previewSize=100&quot; title=&quot;clip-path on Glitch&quot; allow=&quot;encrypted-media&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot;&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;In the example above, the balloon image is square (&lt;a href=&quot;https://cdn.glitch.com/5984697d-c5e8-4a63-a765-7e7ac3916fc0%2Fround-balloon.jpg?v=1597216988521&quot; rel=&quot;noopener&quot;&gt;source&lt;/a&gt;).
Using &lt;code&gt;clip-path&lt;/code&gt; and the basic shape value of &lt;code&gt;circle()&lt;/code&gt;
the additional sky around the balloon is clipped away leaving a circular image on the page.&lt;/p&gt;
&lt;p&gt;As the image is a link you can see something else about the &lt;code&gt;clip-path&lt;/code&gt; property.
Only the visible area of the image can be clicked on,
as events do not fire on the hidden parts of the image.&lt;/p&gt;
&lt;p&gt;Clipping can be applied to any HTML element, not just images.
There are a few different ways to create a &lt;code&gt;clip-path&lt;/code&gt;, in this post we will take a look at them.&lt;/p&gt;
&lt;h2 id=&quot;browser-compatibility&quot;&gt;Browser compatibility &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/css-clipping/#browser-compatibility&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 55, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      55
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 3.5, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      3.5
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 79, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      79
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 9.1, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      9.1
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/clip-path#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;For legacy browsers a fallback may be to allow the browser to ignore the &lt;code&gt;clip-path&lt;/code&gt; property and show the unclipped image.
If this is a problem you could test for &lt;code&gt;clip-path&lt;/code&gt; in a feature query and offer an alternate layout for unsupporting browsers.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@supports&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;clip-path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;circle&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;45%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token comment&quot;&gt;/* code that requires clip-path here. */&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;h2 id=&quot;basic-shapes&quot;&gt;Basic shapes &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/css-clipping/#basic-shapes&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;clip-path&lt;/code&gt; property can take a number of values.
The value used in the initial example was &lt;code&gt;circle()&lt;/code&gt;.
This is one of the basic shape values, which are defined in the
&lt;a href=&quot;https://www.w3.org/TR/css-shapes-1/#basic-shape-functions&quot; rel=&quot;noopener&quot;&gt;CSS Shapes specification&lt;/a&gt;.
This means that you can clip an area,
and also use the same value for &lt;code&gt;shape-outside&lt;/code&gt; to cause text to wrap around that shape.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe src=&quot;https://glitch.com/embed/#!/embed/clip-path-with-shape?path=README.md&amp;previewSize=100&quot; title=&quot;clip-path-with-shape on Glitch&quot; allow=&quot;encrypted-media&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot;&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; Note that CSS Shapes can only be applied to floated elements. The &lt;code&gt;clip-path&lt;/code&gt; property does not require the element to be floated. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;The full list of basic shapes is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Shapes/Basic_Shapes#inset&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;inset()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Shapes/Basic_Shapes#circle&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;circle()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Shapes/Basic_Shapes#ellipse&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;ellipse()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Shapes/Basic_Shapes#polygon&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;polygon()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;inset&quot;&gt;&lt;code&gt;inset()&lt;/code&gt; &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/css-clipping/#inset&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;inset()&lt;/code&gt; value insets the clipped area from the edge of the element,
and can be passed values for the top, right, bottom, and left edges.
A &lt;code&gt;border-radius&lt;/code&gt; can also be added to curve the corners of the clipped area,
by using the &lt;code&gt;round&lt;/code&gt; keyword.&lt;/p&gt;
&lt;p&gt;In my example I have two boxes both with a class of &lt;code&gt;.box&lt;/code&gt;.
The first box has no clipping, the second is clipped using &lt;code&gt;inset()&lt;/code&gt; values.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe src=&quot;https://glitch.com/embed/#!/embed/clip-path-inset?path=README.md&amp;previewSize=100&quot; title=&quot;clip-path-inset on Glitch&quot; allow=&quot;encrypted-media&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot;&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
&lt;h3 id=&quot;circle&quot;&gt;&lt;code&gt;circle()&lt;/code&gt; &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/css-clipping/#circle&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;As you have seen, the &lt;code&gt;circle()&lt;/code&gt; value creates a circular clipped area.
The first value is a length or a percentage and is the radius of the circle.
A second optional value allows you to set the center of the circle.
In the example below I am using keyword values to set my clipped circle top right.
You could also use lengths or percentages.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe src=&quot;https://glitch.com/embed/#!/embed/clip-path-circle?path=README.md&amp;previewSize=100&quot; title=&quot;clip-path-circle on Glitch&quot; allow=&quot;encrypted-media&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot;&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
&lt;h4 id=&quot;watch-out-for-flat-edges&quot;&gt;Watch out for flat edges! &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/css-clipping/#watch-out-for-flat-edges&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Be aware with all of these values that the shape will be clipped by the margin box on the element.
If you create a circle on an image,
and that shape would extend outside of the natural size of the image, you will get a flat edge.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;A clipped circle with flat edges&quot; decoding=&quot;async&quot; height=&quot;427&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/sQPOF6oaR31kjSVGzztu.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/sQPOF6oaR31kjSVGzztu.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/sQPOF6oaR31kjSVGzztu.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/sQPOF6oaR31kjSVGzztu.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/sQPOF6oaR31kjSVGzztu.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/sQPOF6oaR31kjSVGzztu.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/sQPOF6oaR31kjSVGzztu.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/sQPOF6oaR31kjSVGzztu.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/sQPOF6oaR31kjSVGzztu.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/sQPOF6oaR31kjSVGzztu.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/sQPOF6oaR31kjSVGzztu.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/sQPOF6oaR31kjSVGzztu.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/sQPOF6oaR31kjSVGzztu.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/sQPOF6oaR31kjSVGzztu.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/sQPOF6oaR31kjSVGzztu.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/sQPOF6oaR31kjSVGzztu.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/sQPOF6oaR31kjSVGzztu.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/sQPOF6oaR31kjSVGzztu.jpg?auto=format&amp;w=1600 1600w&quot; style=&quot;max-inline-size: 480px&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;The image used earlier now has &lt;code&gt;circle(50%)&lt;/code&gt; applied. As the image is not square, we hit the margin box at the top and bottom and the circle is clipped.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;ellipse&quot;&gt;&lt;code&gt;ellipse()&lt;/code&gt; &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/css-clipping/#ellipse&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;An ellipse is essentially a squashed circle,
and so acts very much like &lt;code&gt;circle()&lt;/code&gt; but accepts a radius for x and a radius for y,
plus the value for the center of the ellipse.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe src=&quot;https://glitch.com/embed/#!/embed/clip-path-ellipse?path=README.md&amp;previewSize=100&quot; title=&quot;clip-path-ellipse on Glitch&quot; allow=&quot;encrypted-media&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot;&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
&lt;h3 id=&quot;polygon&quot;&gt;&lt;code&gt;polygon()&lt;/code&gt; &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/css-clipping/#polygon&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;polygon()&lt;/code&gt; value can help you create fairly complex shapes,
defining as many points as you need,
by setting the coordinates of each point.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe src=&quot;https://glitch.com/embed/#!/embed/clip-path-polygon?path=README.md&amp;previewSize=100&quot; title=&quot;clip-path-polygon on Glitch&quot; allow=&quot;encrypted-media&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot;&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;To help you create polygons and see what is possible check out &lt;a href=&quot;https://bennettfeely.com/clippy/&quot; rel=&quot;noopener&quot;&gt;Clippy&lt;/a&gt;,
a &lt;code&gt;clip-path&lt;/code&gt; generator,
then copy and paste the code into your own project.&lt;/p&gt;
&lt;h2 id=&quot;shapes-from-box-values&quot;&gt;Shapes from box values &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/css-clipping/#shapes-from-box-values&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Also defined in CSS Shapes are shapes from &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Shapes/From_box_values&quot; rel=&quot;noopener&quot;&gt;box values&lt;/a&gt;.
These relate to the CSS Box Model -- the content box, padding box, border box,
and margin box with keyword values of &lt;code&gt;content-box&lt;/code&gt;, &lt;code&gt;border-box&lt;/code&gt;, &lt;code&gt;padding-box&lt;/code&gt;, and &lt;code&gt;margin-box&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;These values can be used alone, or alongside a basic shape to define the reference box used by the shape.
For example, the following would clip the shape to the edge of the content.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.box&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;clip-path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; content-box&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;In this example the circle would use the &lt;code&gt;content-box&lt;/code&gt; as the reference box rather than the &lt;code&gt;margin-box&lt;/code&gt; (which is the default).&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.box&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;clip-path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;circle&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;45%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; content-box&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Currently browsers do not support the use of box values for the &lt;code&gt;clip-path&lt;/code&gt; property.
They are supported for &lt;code&gt;shape-outside&lt;/code&gt; however.&lt;/p&gt;
&lt;h2 id=&quot;using-an-svg-element&quot;&gt;Using an SVG element &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/css-clipping/#using-an-svg-element&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For more control over your clipped area than is possible with basic shapes,
use an SVG &lt;code&gt;clipPath&lt;/code&gt; element.
Then reference that ID, using &lt;code&gt;url()&lt;/code&gt; as the value for &lt;code&gt;clip-path&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe src=&quot;https://glitch.com/embed/#!/embed/clip-path-svg?path=README.md&amp;previewSize=100&quot; title=&quot;clip-path-svg on Glitch&quot; allow=&quot;encrypted-media&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot;&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id=&quot;animating-the-clipped-area&quot;&gt;Animating the clipped area &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/css-clipping/#animating-the-clipped-area&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;CSS transitions and animations can be applied to the &lt;code&gt;clip-path&lt;/code&gt; to create some interesting effects.
In this next example I am animating a circle on hover by transitioning between two circles with a different radius value.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe src=&quot;https://glitch.com/embed/#!/embed/clip-path-animated?path=README.md&amp;previewSize=100&quot; title=&quot;clip-path-animated on Glitch&quot; allow=&quot;encrypted-media&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot;&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;There are lots of creative ways in which animation can be used with clipping.
&lt;a href=&quot;https://css-tricks.com/animating-with-clip-path/&quot; rel=&quot;noopener&quot;&gt;Animating with clip-path&lt;/a&gt; on CSS Tricks runs through some ideas.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by &lt;a href=&quot;https://burst.shopify.com/@matthew_henry&quot; rel=&quot;noopener&quot;&gt;Matthew Henry&lt;/a&gt; on Burst.&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Apply effects to images with CSS&#39;s mask-image property</title>
    <link href="https://web.dev/css-masking/"/>
    <updated>2020-09-14T00:00:00Z</updated>
    <id>https://web.dev/css-masking/</id>
    <content type="html" mode="escaped">&lt;p&gt;When you &lt;a href=&quot;https://web.dev/css-clipping&quot;&gt;clip an element&lt;/a&gt; using the &lt;code&gt;clip-path&lt;/code&gt; property the clipped area becomes invisible.
If instead you want to make part of the image opaque or apply some other effect to it, then you need to use masking.
This post explains how to use the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/mask-image&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;mask-image&lt;/code&gt;&lt;/a&gt; property in CSS,
which lets you specify an image to use as a mask layer.
This gives you three options. You can use an image file as your mask, an SVG, or a gradient.&lt;/p&gt;
&lt;h2 id=&quot;browser-compatibility&quot;&gt;Browser compatibility &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/css-masking/#browser-compatibility&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Most browsers only have partial support for the standard CSS masking property.
You will need to use the &lt;code&gt;-webkit-&lt;/code&gt; prefix in addition to the standard property in order to achieve the best browser compatibility.
See &lt;a href=&quot;https://caniuse.com/#feat=css-masks&quot; rel=&quot;noopener&quot;&gt;Can I use CSS Masks?&lt;/a&gt; for full browser support information.&lt;/p&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 1, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      1
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 53, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      53
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 79, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      79
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 15.4, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      15.4
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/CSS/mask-image#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;While browser support using the prefixed property is good,
when using masking to make text on top of an image visible take care of what will happen if masking is unavailable.
It may be worth using feature queries to detect support for &lt;code&gt;mask-image&lt;/code&gt; or &lt;code&gt;-webkit-mask-image&lt;/code&gt;
and providing a readable fallback before adding your masked version.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@supports&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;-webkit-mask-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token function&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;#mask&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;mask-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token function&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;#mask&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token comment&quot;&gt;/* code that requires mask-image here. */&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;h2 id=&quot;masking-with-an-image&quot;&gt;Masking with an image &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/css-masking/#masking-with-an-image&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;mask-image&lt;/code&gt; property works in a similar way to the &lt;code&gt;background-image&lt;/code&gt; property.
Use a &lt;code&gt;url()&lt;/code&gt; value to pass in an image.
Your mask image needs to have a transparent or semi-transparent area.&lt;/p&gt;
&lt;p&gt;A fully transparent area will cause the part of the image under that area to be invisible.
Using an area which is semi-transparent however will allow some of the original image to show through.
You can see the difference in the Glitch below.
The first image is the original image of balloons with no mask.
The second image has a mask applied which has a white star on a fully transparent background.
The third image has a white star on a background with a gradient transparency.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe src=&quot;https://glitch.com/embed/#!/embed/mask-image?path=index.html&amp;previewSize=100&quot; title=&quot;mask-image on Glitch&quot; allow=&quot;encrypted-media&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot;&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;In this example I am also using the &lt;code&gt;mask-size&lt;/code&gt; property with a value of &lt;code&gt;cover&lt;/code&gt;.
This property works in the same way as &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/background-size&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;background-size&lt;/code&gt;&lt;/a&gt;.
You can use the keywords &lt;code&gt;cover&lt;/code&gt; and &lt;code&gt;contain&lt;/code&gt; or you can give the background a size using any valid length unit, or a percentage.&lt;/p&gt;
&lt;p&gt;You can also repeat your mask just as you might repeat a background image,
in order to use a small image as a repeating pattern.&lt;/p&gt;
&lt;h2 id=&quot;masking-with-svg&quot;&gt;Masking with SVG &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/css-masking/#masking-with-svg&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Rather than using an image file as the mask, you could use SVG.
There are a couple of ways this can be achieved.
The first is to have a &lt;code&gt;&amp;lt;mask&amp;gt;&lt;/code&gt; element inside the SVG and reference the ID of that element in the &lt;code&gt;mask-image&lt;/code&gt; property.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;svg&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;viewBox&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;0 0 400 300&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;defs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;mask&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;mask&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;rect&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;fill&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#000000&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;400&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;300&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;rect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;circle&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;fill&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#FFFFFF&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;cx&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;150&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;cy&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;150&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;100&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;circle&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;fill&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#FFFFFF&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;cx&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;50&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;cy&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;50&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;150&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;mask&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;defs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;svg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;container&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;balloons.jpg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Balloons&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container img&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;object-fit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cover&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;-webkit-mask-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token function&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;#mask&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;mask-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token function&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;#mask&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;figure&gt;
  &lt;img alt=&quot;An example of using an SVG mask&quot; decoding=&quot;async&quot; height=&quot;490&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 699px) 699px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/3HnPhISiVazDTwezxfcy.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/3HnPhISiVazDTwezxfcy.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/3HnPhISiVazDTwezxfcy.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/3HnPhISiVazDTwezxfcy.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/3HnPhISiVazDTwezxfcy.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/3HnPhISiVazDTwezxfcy.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/3HnPhISiVazDTwezxfcy.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/3HnPhISiVazDTwezxfcy.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/3HnPhISiVazDTwezxfcy.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/3HnPhISiVazDTwezxfcy.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/3HnPhISiVazDTwezxfcy.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/3HnPhISiVazDTwezxfcy.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/3HnPhISiVazDTwezxfcy.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/3HnPhISiVazDTwezxfcy.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/3HnPhISiVazDTwezxfcy.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/3HnPhISiVazDTwezxfcy.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/3HnPhISiVazDTwezxfcy.jpg?auto=format&amp;w=1398 1398w&quot; width=&quot;699&quot; /&gt;
&lt;/figure&gt;
&lt;p&gt;The advantage of this approach is that the mask could be applied to any HTML element, not just an image.
Unfortunately Firefox is the only browser that supports this approach.&lt;/p&gt;
&lt;p&gt;All is not lost however, as for the most common scenario of masking an image,
we can include the image in the SVG.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe src=&quot;https://glitch.com/embed/#!/embed/mask-image-svg-image?path=README.md&amp;previewSize=100&quot; title=&quot;mask-image-svg-image on Glitch&quot; allow=&quot;encrypted-media&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot;&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id=&quot;masking-with-a-gradient&quot;&gt;Masking with a gradient &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/css-masking/#masking-with-a-gradient&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Using a CSS gradient as your mask is an elegant way of achieving a masked area without needing to go to the trouble of creating an image or SVG.&lt;/p&gt;
&lt;p&gt;A simple linear gradient used as a mask could ensure that the bottom part of an image will not be too dark underneath a caption, for example.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe src=&quot;https://glitch.com/embed/#!/embed/mask-linear-gradient?path=README.md&amp;previewSize=100&quot; title=&quot;mask-linear-gradient on Glitch&quot; allow=&quot;encrypted-media&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot;&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;You can use any of the supported gradient types, and get as creative as you like.
This next example uses a radial gradient to create a circular mask to illuminate behind the caption.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe src=&quot;https://glitch.com/embed/#!/embed/mask-radial-gradient?path=README.md&amp;previewSize=100&quot; title=&quot;mask-radial-gradient on Glitch&quot; allow=&quot;encrypted-media&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot;&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id=&quot;using-multiple-masks&quot;&gt;Using multiple masks &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/css-masking/#using-multiple-masks&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As with background images you can specify multiple mask sources,
combining them to get the effect that you want.
This is particularly useful if you want to use a pattern generated with CSS gradients as your mask.
These typically will use multiple background images and so can be translated easily into a mask.&lt;/p&gt;
&lt;p&gt;As an example, I found a nice checkerboard pattern in &lt;a href=&quot;https://cssgradient.io/blog/gradient-patterns/&quot; rel=&quot;noopener&quot;&gt;this article&lt;/a&gt;.
The code, using background images, looks like this:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;background-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token function&quot;&gt;linear-gradient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;45deg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #ccc 25%&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; transparent 25%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token function&quot;&gt;linear-gradient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;-45deg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #ccc 25%&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; transparent 25%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token function&quot;&gt;linear-gradient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;45deg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; transparent 75%&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #ccc 75%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token function&quot;&gt;linear-gradient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;-45deg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; transparent 75%&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #ccc 75%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token property&quot;&gt;background-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;20px 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token property&quot;&gt;background-position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0 10px&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 10px -10px&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; -10px 0px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;To turn this, or any other pattern designed for background images, into a mask,
you will need to replace the &lt;code&gt;background-*&lt;/code&gt; properties with the relevant &lt;code&gt;mask&lt;/code&gt; properties,
including the &lt;code&gt;-webkit&lt;/code&gt; prefixed ones.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;-webkit-mask-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token function&quot;&gt;linear-gradient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;45deg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #000000 25%&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgba&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;0.2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 25%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token function&quot;&gt;linear-gradient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;-45deg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #000000 25%&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgba&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;0.2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 25%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token function&quot;&gt;linear-gradient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;45deg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgba&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;0.2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 75%&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #000000 75%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token function&quot;&gt;linear-gradient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;-45deg&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgba&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;0.2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 75%&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #000000 75%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token property&quot;&gt;-webkit-mask-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;20px 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;-webkit-mask-position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 0 10px&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 10px -10px&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; -10px 0px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;There are some really nice effects to be made by applying gradient patterns to images.
Try remixing the Glitch and testing out some other variations.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe src=&quot;https://glitch.com/embed/#!/embed/mask-checkers?path=README.md&amp;previewSize=100&quot; title=&quot;mask-checkers on Glitch&quot; allow=&quot;encrypted-media&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot;&gt;
  &lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Along with clipping,
CSS masks are a way to add interest to images and other HTML elements without needing to use a graphics application.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;span&gt;Photo by &lt;a href=&quot;https://unsplash.com/@juliorionaldo&quot;&gt;Julio Rionaldo&lt;/a&gt; on Unsplash&lt;/span&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Content reordering</title>
    <link href="https://web.dev/content-reordering/"/>
    <updated>2020-05-29T00:00:00Z</updated>
    <id>https://web.dev/content-reordering/</id>
    <content type="html" mode="escaped">&lt;p&gt;The order of content in your document is important for the accessibility of your site.
A screen reader will read out content based on the document order,
using the HTML elements that you have selected to give meaning to that content.
A person navigating the site using a keyboard, rather than a touchscreen or mouse, will tab around the document.
This means that they will jump from active element to active element,
tabbing between links and form fields, once again in the order they exist in the document.&lt;/p&gt;
&lt;p&gt;Starting with a well-structured document and using all of the right HTML elements
is therefore a key part of creating an accessible site.
However, it is possible to undo some of that good work when you start using CSS. Let&#39;s take a look at why.&lt;/p&gt;
&lt;h2 id=&quot;source-vs-visual-order&quot;&gt;Source vs. visual order &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/content-reordering/#source-vs-visual-order&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Website navigation is often marked up as a list of links.
You can then use &lt;a href=&quot;https://web.dev/responsive-web-design-basics/#flexbox&quot;&gt;Flexbox&lt;/a&gt; to turn these into a horizontal bar.
In the Glitch example below, I have created this commonly used pattern.
Click into the example, and tab between the links.
The focus will move in a logical direction from left to right,
the order that we read in English.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/flex-nav-source-ordered?attributionHidden=true&amp;sidebarCollapsed=true&amp;path=index.html&amp;previewSize=100&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;flex-nav-source-ordered on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;If you have created this sort of pattern and then were asked to move &lt;strong&gt;Contact Us&lt;/strong&gt;,
which is second in the source, to the end. You could use the &lt;code&gt;order&lt;/code&gt; property which works in Flexbox.
Try tabbing through the items in the example below, which has used the &lt;code&gt;order&lt;/code&gt; property to rearrange the items.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/flex-nav-ordered?attributionHidden=true&amp;sidebarCollapsed=true&amp;path=style.css&amp;previewSize=100&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;flex-nav-ordered on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;The focus jumps to the final item and then back again.
As far as the tab order is concerned that item is the second item.
Visually however, it&#39;s the last item.&lt;/p&gt;
&lt;p&gt;The above example highlights the problem that we face if we rearrange and reorder content using CSS.
If you were dealing with this issue then the right thing to do would be to change the order in the source,
rather than using CSS.&lt;/p&gt;
&lt;h2 id=&quot;which-css-properties-can-cause-reordering&quot;&gt;Which CSS properties can cause reordering? &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/content-reordering/#which-css-properties-can-cause-reordering&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Any layout method that allows you to move elements around can cause this problem.
The following CSS properties commonly cause content reordering problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Using &lt;code&gt;position: absolute&lt;/code&gt; and taking an item out of flow visually.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;order&lt;/code&gt; property in Flexbox and Grid layout.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;row-reverse&lt;/code&gt; and &lt;code&gt;column-reverse&lt;/code&gt; values for &lt;code&gt;flex-direction&lt;/code&gt; in Flexbox.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;dense&lt;/code&gt; value for &lt;code&gt;grid-auto-flow&lt;/code&gt; in Grid Layout.&lt;/li&gt;
&lt;li&gt;Any positioning by line name or number, or with &lt;code&gt;grid-template-areas&lt;/code&gt; in Grid Layout.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this next example, I have created a layout using CSS Grid and positioned the items
using line numbers, without considering where they are in the source.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/grid-mixed-up-order?attributionHidden=true&amp;sidebarCollapsed=true&amp;path=index.html&amp;previewSize=100&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;grid-mixed-up-order on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Try tabbing around this example, and see how the focus jumps about.
This makes for a very confusing experience, especially if this is a long page.&lt;/p&gt;
&lt;h2 id=&quot;testing-for-the-problem&quot;&gt;Testing for the problem &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/content-reordering/#testing-for-the-problem&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A very simple test is to keyboard navigate through your page. Can you get to everything?
Are there any strange jumps as you do so?&lt;/p&gt;
&lt;p&gt;For a visual demonstration of content reordering,
try the Tab Stop checker in the &lt;a href=&quot;https://accessibilityinsights.io/&quot; rel=&quot;noopener&quot;&gt;Accessibility Insights&lt;/a&gt; extension for Chrome.
The image below shows the CSS Grid example in that tool.
You can see how the focus has to jump around the layout.&lt;/p&gt;
&lt;figure style=&quot;max-width: 600px&quot;&gt;
  &lt;img alt=&quot;A screenshot of the Accessibility Insights Tool demonstrating the confusing order of items.&quot; decoding=&quot;async&quot; height=&quot;919&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/n0i0TJf3OdZYvwswrHDV.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/n0i0TJf3OdZYvwswrHDV.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/n0i0TJf3OdZYvwswrHDV.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/n0i0TJf3OdZYvwswrHDV.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/n0i0TJf3OdZYvwswrHDV.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/n0i0TJf3OdZYvwswrHDV.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/n0i0TJf3OdZYvwswrHDV.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/n0i0TJf3OdZYvwswrHDV.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/n0i0TJf3OdZYvwswrHDV.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/n0i0TJf3OdZYvwswrHDV.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/n0i0TJf3OdZYvwswrHDV.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/n0i0TJf3OdZYvwswrHDV.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/n0i0TJf3OdZYvwswrHDV.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/n0i0TJf3OdZYvwswrHDV.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/n0i0TJf3OdZYvwswrHDV.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/n0i0TJf3OdZYvwswrHDV.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/n0i0TJf3OdZYvwswrHDV.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/admin/n0i0TJf3OdZYvwswrHDV.jpg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;content-reordering-and-responsive-web-design&quot;&gt;Content reordering and responsive web design &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/content-reordering/#content-reordering-and-responsive-web-design&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you only have one presentation of your content,
then having your source in a logical order, and reflecting that in layout is not usually difficult.
It can become harder, when you consider the layout at different breakpoints.
It might make sense to have an element moved to the bottom of the layout on smaller screens for example.&lt;/p&gt;
&lt;p&gt;There is not at this time a good solution for this problem.
In most situations developing &amp;quot;mobile first&amp;quot;, will help you keep your source and layout in order.
The choices you make about priority on mobile, are often solid ones for the content in general.
The key is to be aware when there is a possibility of this type of content reordering,
and to test that the end experience is not too jarring at each breakpoint.&lt;/p&gt;
</content>
    <author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Accessible tap targets</title>
    <link href="https://web.dev/accessible-tap-targets/"/>
    <updated>2020-03-31T00:00:00Z</updated>
    <id>https://web.dev/accessible-tap-targets/</id>
    <content type="html" mode="escaped">&lt;p&gt;When your design is displayed on a mobile device,
you should ensure that interactive elements like buttons or links are large enough,
and have enough space around them,
to make them easy to press without accidentally overlapping onto other elements.
This benefits all users,
but is especially helpful for anyone with a motor impairment.&lt;/p&gt;
&lt;p&gt;A minimum recommended touch target size is around 48 device independent pixels
on a site with a properly set mobile viewport.
For example, while an icon may only have a width and height of 24px,
you can use additional padding to bring the tap target size up to 48px.
The 48x48 pixel area corresponds to around 9mm,
which is about the size of a person&#39;s finger pad area.&lt;/p&gt;
&lt;p&gt;In the demo, I have added padding to all of the links in order to make sure they meet the minimum size.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/tap-targets?attributionHidden=true&amp;sidebarCollapsed=true&amp;path=index.html&amp;previewSize=100&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;tap-targets on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Touch targets should also be spaced about 8 pixels apart,
both horizontally and vertically,
so that a user&#39;s finger pressing on one tap target does not inadvertently touch another tap target.&lt;/p&gt;
&lt;h2 id=&quot;testing-your-touch-targets&quot;&gt;Testing your touch targets &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/accessible-tap-targets/#testing-your-touch-targets&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If your target is text and you have used relative values such as &lt;code&gt;em&lt;/code&gt; or &lt;code&gt;rem&lt;/code&gt; to size the text and any padding,
you can use DevTools to check that the computed value of that area is large enough.
In the example below I am using &lt;code&gt;em&lt;/code&gt; for my text and padding.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/tap-targets-2?attributionHidden=true&amp;sidebarCollapsed=true&amp;path=style.css&amp;previewSize=100&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;tap-targets-2 on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Inspect the &lt;code&gt;a&lt;/code&gt; of the link,
and in Chrome DevTools switch to the &lt;a href=&quot;https://developer.chrome.com/docs/devtools/css/overrides/#computed&quot; rel=&quot;noopener&quot;&gt;Computed pane&lt;/a&gt;  where you can inspect the various parts of the box
and see what pixel size they resolve to.
In Firefox DevTools there is a Layout Panel.
In that Panel you get the actual size of the inspected element.&lt;/p&gt;
&lt;figure style=&quot;max-width: 500px&quot;&gt;
  &lt;img alt=&quot;The Layout Panel in Firefox DevTools showing the size of the a element&quot; decoding=&quot;async&quot; height=&quot;565&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/vmFzREveRttHVDfLqqCx.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/vmFzREveRttHVDfLqqCx.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/vmFzREveRttHVDfLqqCx.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/vmFzREveRttHVDfLqqCx.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/vmFzREveRttHVDfLqqCx.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/vmFzREveRttHVDfLqqCx.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/vmFzREveRttHVDfLqqCx.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/vmFzREveRttHVDfLqqCx.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/vmFzREveRttHVDfLqqCx.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/vmFzREveRttHVDfLqqCx.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/vmFzREveRttHVDfLqqCx.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/vmFzREveRttHVDfLqqCx.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/vmFzREveRttHVDfLqqCx.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/vmFzREveRttHVDfLqqCx.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/vmFzREveRttHVDfLqqCx.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/vmFzREveRttHVDfLqqCx.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/vmFzREveRttHVDfLqqCx.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/admin/vmFzREveRttHVDfLqqCx.jpg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;using-media-queries-to-detect-touchscreen-use&quot;&gt;Using media queries to detect touchscreen use &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/accessible-tap-targets/#using-media-queries-to-detect-touchscreen-use&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Instead of simply testing for viewport dimensions, and then guessing
that small dimensions are likely to be phones or tablets, which in turn
use a touchscreen, there are now more robust ways to adapt
your design based on actual device capabilities.&lt;/p&gt;
&lt;p&gt;One of the media features we can now test for with media queries
is whether the user&#39;s &lt;em&gt;primary input&lt;/em&gt; is a touchscreen (&lt;code&gt;pointer&lt;/code&gt;) and
whether &lt;em&gt;any&lt;/em&gt; of the currently detected inputs is a touchscreen (&lt;code&gt;any-pointer&lt;/code&gt;).
The &lt;code&gt;pointer&lt;/code&gt; and &lt;code&gt;any-pointer&lt;/code&gt; features will return &lt;code&gt;fine&lt;/code&gt; or &lt;code&gt;coarse&lt;/code&gt;.
A fine pointer will be someone using a mouse or trackpad,
even if that mouse is connected via Bluetooth to a phone.
A &lt;code&gt;coarse&lt;/code&gt; pointer indicates a touchscreen,
which could be a mobile device but may also be a laptop screen or large tablet.&lt;/p&gt;
&lt;p&gt;If you are adjusting your CSS within a media query to increase the touch target,
testing for a coarse pointer allows you to increase the tap targets for all touchscreen users.
This gives the larger tap area whether the device is a phone or larger device.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container a&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; .2em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;any-pointer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; coarse&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;.container a&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; .8em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;You can find out more about interaction media features such as pointer
in the &lt;a href=&quot;https://web.dev/responsive-web-design-basics/&quot;&gt;Responsive web design basics&lt;/a&gt; article.&lt;/p&gt;
</content>
    <author>
      <name>Dave Gash</name>
    </author><author>
      <name>Meggin Kearney</name>
    </author><author>
      <name>Rachel Andrew</name>
    </author><author>
      <name>Rob Dodson</name>
    </author><author>
      <name>Patrick H. Lauke</name>
    </author>
  </entry>
  
  <entry>
    <title>Accessible responsive design</title>
    <link href="https://web.dev/accessible-responsive-design/"/>
    <updated>2020-03-31T00:00:00Z</updated>
    <id>https://web.dev/accessible-responsive-design/</id>
    <content type="html" mode="escaped">&lt;p&gt;We know that it&#39;s a good idea to design responsively to provide the best multi-device experience,
but responsive design also yields a win for accessibility.&lt;/p&gt;
&lt;p&gt;Consider a site like &lt;a href=&quot;https://udacity.com/&quot; rel=&quot;noopener&quot;&gt;Udacity&lt;/a&gt;:&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;The Udacity site&quot; decoding=&quot;async&quot; height=&quot;393&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/5q9dDtEubSM23SzokQNu.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/5q9dDtEubSM23SzokQNu.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/5q9dDtEubSM23SzokQNu.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/5q9dDtEubSM23SzokQNu.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/5q9dDtEubSM23SzokQNu.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/5q9dDtEubSM23SzokQNu.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/5q9dDtEubSM23SzokQNu.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/5q9dDtEubSM23SzokQNu.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/5q9dDtEubSM23SzokQNu.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/5q9dDtEubSM23SzokQNu.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/5q9dDtEubSM23SzokQNu.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/5q9dDtEubSM23SzokQNu.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/5q9dDtEubSM23SzokQNu.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/5q9dDtEubSM23SzokQNu.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/5q9dDtEubSM23SzokQNu.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/5q9dDtEubSM23SzokQNu.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/5q9dDtEubSM23SzokQNu.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/admin/5q9dDtEubSM23SzokQNu.jpg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;/figure&gt;
&lt;p&gt;A low-vision user who has difficulty reading small print might zoom in the page,
perhaps as much as 400%.
Because the site is designed responsively,
the UI will rearrange itself for the &amp;quot;smaller viewport&amp;quot; (actually for the larger page),
which is great for desktop users who require screen magnification
and for mobile screen reader users as well. It&#39;s a win-win.
Here&#39;s the same page magnified to 400%:&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;The Udacity site zoomed to 400%&quot; decoding=&quot;async&quot; height=&quot;393&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/WKHO21uWQz5lJ7Aqej1E.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/WKHO21uWQz5lJ7Aqej1E.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/WKHO21uWQz5lJ7Aqej1E.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/WKHO21uWQz5lJ7Aqej1E.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/WKHO21uWQz5lJ7Aqej1E.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/WKHO21uWQz5lJ7Aqej1E.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/WKHO21uWQz5lJ7Aqej1E.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/WKHO21uWQz5lJ7Aqej1E.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/WKHO21uWQz5lJ7Aqej1E.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/WKHO21uWQz5lJ7Aqej1E.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/WKHO21uWQz5lJ7Aqej1E.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/WKHO21uWQz5lJ7Aqej1E.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/WKHO21uWQz5lJ7Aqej1E.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/WKHO21uWQz5lJ7Aqej1E.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/WKHO21uWQz5lJ7Aqej1E.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/WKHO21uWQz5lJ7Aqej1E.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/WKHO21uWQz5lJ7Aqej1E.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/admin/WKHO21uWQz5lJ7Aqej1E.jpg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;/figure&gt;
&lt;p&gt;In fact, just by designing responsively,
we&#39;re meeting rule &lt;a href=&quot;https://webaim.org/standards/wcag/checklist#sc1.4.4&quot; rel=&quot;noopener&quot;&gt;1.4.4 of the WebAIM checklist&lt;/a&gt;,
which states that a page &amp;quot;… should be readable and functional when the text size is doubled.&amp;quot;&lt;/p&gt;
&lt;p&gt;Going over all of responsive design is outside the scope of this guide,
but here are a few important takeaways that will benefit your responsive experience
and give your users better access to your content.&lt;/p&gt;
&lt;h2 id=&quot;use-the-viewport-meta-tag&quot;&gt;Use the viewport meta tag &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/accessible-responsive-design/#use-the-viewport-meta-tag&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;viewport&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;width=device-width, initial-scale=1.0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Setting &lt;code&gt;width=device-width&lt;/code&gt; will match the screen&#39;s width in device-independent pixels,
and setting &lt;code&gt;initial-scale=1&lt;/code&gt; establishes a 1:1 relationship between CSS pixels and device-independent pixels.
Doing this instructs the browser to fit your content to the screen size,
so users don&#39;t just see a bunch of scrunched-up text.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://web.dev/responsive-web-design-basics/#viewport&quot;&gt;Size content to viewport&lt;/a&gt; to learn more.&lt;/p&gt;
&lt;h2 id=&quot;allow-users-to-zoom&quot;&gt;Allow users to zoom &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/accessible-responsive-design/#allow-users-to-zoom&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It is possible to use the viewport meta tag to prevent zooming,
by setting &lt;code&gt;maximum-scale=1&lt;/code&gt; or &lt;code&gt;user-scaleable=no&lt;/code&gt;.
Avoid doing this, and let your users zoom in if they need to.&lt;/p&gt;
&lt;h2 id=&quot;design-with-flexibility&quot;&gt;Design with flexibility &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/accessible-responsive-design/#design-with-flexibility&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Avoid targetting specific screen sizes and instead use a flexible grid,
making changes to the layout when the content dictates.
As we saw with the Udacity example above, this approach ensures that the design responds
whether the reduced space is due to a smaller screen or a higher zoom level.&lt;/p&gt;
&lt;p&gt;You can read more about these techniques in the &lt;a href=&quot;https://web.dev/responsive-web-design-basics/&quot;&gt;Responsive web design basics&lt;/a&gt; article.&lt;/p&gt;
&lt;h2 id=&quot;use-relative-units-for-text&quot;&gt;Use relative units for text &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/accessible-responsive-design/#use-relative-units-for-text&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To get the best out of your flexible grid
use relative units like em or rem for things like text size, instead of pixel values.
Some browsers support resizing text only in user preferences,
and if you&#39;re using a pixel value for text, this setting will not affect your copy.
If, however, you&#39;ve used relative units throughout,
then the site copy will update to reflect the user&#39;s preference.&lt;/p&gt;
&lt;p&gt;This will enable the whole site to reflow as the user zooms,
creating the reading experience they need to use your site.&lt;/p&gt;
&lt;h2 id=&quot;avoid-disconnecting-the-visual-view-from-the-source-order&quot;&gt;Avoid disconnecting the visual view from the source order &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/accessible-responsive-design/#avoid-disconnecting-the-visual-view-from-the-source-order&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A visitor who is tabbing through your site with the keyboard
will be following the order of the content in the HTML document.
When using modern layout methods such as &lt;a href=&quot;https://web.dev/responsive-web-design-basics/#flexbox&quot;&gt;Flexbox&lt;/a&gt; and &lt;a href=&quot;https://web.dev/responsive-web-design-basics/#grid&quot;&gt;Grid&lt;/a&gt;,
it is easy to make the visual rendering not match the source order.
This can lead to disconcerting jumps around the page for someone using the keyboard to move around.&lt;/p&gt;
&lt;p&gt;Make sure to test your design at each breakpoint by tabbing through the content,
does the flow through the page still make sense?&lt;/p&gt;
&lt;p&gt;Read more about &lt;a href=&quot;https://web.dev/content-reordering/&quot;&gt;the source and visual display disconnect&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;take-care-with-spatial-clues&quot;&gt;Take care with spatial clues &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/accessible-responsive-design/#take-care-with-spatial-clues&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When writing microcopy avoid using language which indicates the location of an element on the page.
For example, referring to navigation &amp;quot;on your left&amp;quot; makes no sense in a mobile version
when the navigation is at the top of the screen.&lt;/p&gt;
&lt;h2 id=&quot;ensure-tap-targets-are-large-enough-on-touchscreen-devices&quot;&gt;Ensure tap targets are large enough on touchscreen devices &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/accessible-responsive-design/#ensure-tap-targets-are-large-enough-on-touchscreen-devices&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;On touchscreen devices make sure your tap targets are large enough
to make them easy to activate without hitting other links.
A good size for any tappable element is 48px,
read more guidance on &lt;a href=&quot;https://web.dev/accessible-tap-targets/&quot;&gt;tap targets&lt;/a&gt;.&lt;/p&gt;
</content>
    <author>
      <name>Dave Gash</name>
    </author><author>
      <name>Meggin Kearney</name>
    </author><author>
      <name>Rachel Andrew</name>
    </author><author>
      <name>Rob Dodson</name>
    </author>
  </entry>
  
  <entry>
    <title>Color and contrast accessibility</title>
    <link href="https://web.dev/color-and-contrast-accessibility/"/>
    <updated>2020-03-31T00:00:00Z</updated>
    <id>https://web.dev/color-and-contrast-accessibility/</id>
    <content type="html" mode="escaped">&lt;p&gt;If you have good vision, it&#39;s easy to assume that everyone perceives colors,
or text legibility, the same way you do—but of course that&#39;s not the case.&lt;/p&gt;
&lt;p&gt;As you might imagine,
some color combinations that are easy for some people to read are difficult or impossible for others.
This usually comes down to color contrast,
the relationship between the foreground and background colors&#39; luminance.
When the colors are similar, the contrast ratio is low;
when they are different, the contrast ratio is high.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://webaim.org/standards/wcag/&quot; rel=&quot;noopener&quot;&gt;WebAIM guidelines&lt;/a&gt; recommend an AA (minimum) contrast ratio of 4.5:1 for all text.
An exception is made for very large text (120-150% larger than the default body text),
for which the ratio can go down to 3:1. Notice the difference in the contrast ratios shown below.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;An image showing the different contrast ratios&quot; decoding=&quot;async&quot; height=&quot;328&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/DcYclKelVqhQ2CWlIG97.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/DcYclKelVqhQ2CWlIG97.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/DcYclKelVqhQ2CWlIG97.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/DcYclKelVqhQ2CWlIG97.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/DcYclKelVqhQ2CWlIG97.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/DcYclKelVqhQ2CWlIG97.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/DcYclKelVqhQ2CWlIG97.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/DcYclKelVqhQ2CWlIG97.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/DcYclKelVqhQ2CWlIG97.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/DcYclKelVqhQ2CWlIG97.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/DcYclKelVqhQ2CWlIG97.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/DcYclKelVqhQ2CWlIG97.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/DcYclKelVqhQ2CWlIG97.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/DcYclKelVqhQ2CWlIG97.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/DcYclKelVqhQ2CWlIG97.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/DcYclKelVqhQ2CWlIG97.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/DcYclKelVqhQ2CWlIG97.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/admin/DcYclKelVqhQ2CWlIG97.jpg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;/figure&gt;
&lt;p&gt;The contrast ratio of 4.5:1 was chosen for level AA
because it compensates for the loss in contrast sensitivity
usually experienced by users with vision loss equivalent to approximately 20/40 vision.
20/40 is commonly reported as typical visual acuity of people at about age 80.
For users with low vision impairments or color deficiencies,
we can increase the contrast up to 7:1 for body text.&lt;/p&gt;
&lt;p&gt;You can use the Accessibility Audit in Lighthouse to check your color contrast.
Open DevTools, click Audits, and select Accessibility to run the report.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;A screenshot of the output of an audit for color contrast.&quot; decoding=&quot;async&quot; height=&quot;218&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/vSFzNOurQO6z2xV6qWuW.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/vSFzNOurQO6z2xV6qWuW.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/vSFzNOurQO6z2xV6qWuW.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/vSFzNOurQO6z2xV6qWuW.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/vSFzNOurQO6z2xV6qWuW.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/vSFzNOurQO6z2xV6qWuW.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/vSFzNOurQO6z2xV6qWuW.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/vSFzNOurQO6z2xV6qWuW.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/vSFzNOurQO6z2xV6qWuW.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/vSFzNOurQO6z2xV6qWuW.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/vSFzNOurQO6z2xV6qWuW.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/vSFzNOurQO6z2xV6qWuW.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/vSFzNOurQO6z2xV6qWuW.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/vSFzNOurQO6z2xV6qWuW.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/vSFzNOurQO6z2xV6qWuW.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/vSFzNOurQO6z2xV6qWuW.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/vSFzNOurQO6z2xV6qWuW.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/admin/vSFzNOurQO6z2xV6qWuW.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;/figure&gt;
&lt;p&gt;Chrome also includes an experimental feature to help you &lt;a href=&quot;https://developer.chrome.com/blog/new-in-devtools-87/#css-overview&quot; rel=&quot;noopener&quot;&gt;detect all the low contrast texts of your page&lt;/a&gt;. You can also use the &lt;a href=&quot;https://developer.chrome.com/blog/new-in-devtools-86/#accessible-color&quot; rel=&quot;noopener&quot;&gt;accessible color suggestion&lt;/a&gt; to fix the low contrast text.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;A screenshot of the output of the Chrome low contrast text experimental feature.&quot; decoding=&quot;async&quot; height=&quot;521&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/VYZeK2l2vs6pIoWhH2hO.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/VYZeK2l2vs6pIoWhH2hO.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/VYZeK2l2vs6pIoWhH2hO.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/VYZeK2l2vs6pIoWhH2hO.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/VYZeK2l2vs6pIoWhH2hO.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/VYZeK2l2vs6pIoWhH2hO.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/VYZeK2l2vs6pIoWhH2hO.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/VYZeK2l2vs6pIoWhH2hO.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/VYZeK2l2vs6pIoWhH2hO.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/VYZeK2l2vs6pIoWhH2hO.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/VYZeK2l2vs6pIoWhH2hO.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/VYZeK2l2vs6pIoWhH2hO.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/VYZeK2l2vs6pIoWhH2hO.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/VYZeK2l2vs6pIoWhH2hO.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/VYZeK2l2vs6pIoWhH2hO.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/VYZeK2l2vs6pIoWhH2hO.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/VYZeK2l2vs6pIoWhH2hO.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/admin/VYZeK2l2vs6pIoWhH2hO.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;/figure&gt;
&lt;p&gt;For a more complete report, install the &lt;a href=&quot;https://accessibilityinsights.io/&quot; rel=&quot;noopener&quot;&gt;Accessibility Insights Extension&lt;/a&gt;.
One of the checks in the Fastpass report, is color contrast.
You will get a detailed report of any failing elements.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;The report in Accessibility Insights&quot; decoding=&quot;async&quot; height=&quot;473&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/CR21TFMZw8gWsSTWOGIF.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/CR21TFMZw8gWsSTWOGIF.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/CR21TFMZw8gWsSTWOGIF.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/CR21TFMZw8gWsSTWOGIF.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/CR21TFMZw8gWsSTWOGIF.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/CR21TFMZw8gWsSTWOGIF.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/CR21TFMZw8gWsSTWOGIF.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/CR21TFMZw8gWsSTWOGIF.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/CR21TFMZw8gWsSTWOGIF.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/CR21TFMZw8gWsSTWOGIF.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/CR21TFMZw8gWsSTWOGIF.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/CR21TFMZw8gWsSTWOGIF.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/CR21TFMZw8gWsSTWOGIF.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/CR21TFMZw8gWsSTWOGIF.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/CR21TFMZw8gWsSTWOGIF.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/CR21TFMZw8gWsSTWOGIF.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/CR21TFMZw8gWsSTWOGIF.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/admin/CR21TFMZw8gWsSTWOGIF.jpg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;advanced-perceptual-contrast-algorithm-apca&quot;&gt;Advanced Perceptual Contrast Algorithm (APCA) &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/color-and-contrast-accessibility/#advanced-perceptual-contrast-algorithm-apca&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://git.apcacontrast.com/documentation/WhyAPCA&quot; rel=&quot;noopener&quot;&gt;Advanced Perceptual Contrast Algorithm (APCA)&lt;/a&gt; is a new way to compute contrast based on modern research on color perception.&lt;/p&gt;
&lt;p&gt;Compared to &lt;a href=&quot;https://www.w3.org/WAI/WCAG21/quickref/#contrast-minimum&quot; rel=&quot;noopener&quot;&gt;AA&lt;/a&gt;/&lt;a href=&quot;https://www.w3.org/WAI/WCAG21/quickref/#contrast-enhanced&quot; rel=&quot;noopener&quot;&gt;AAA&lt;/a&gt; guidelines, APCA is more context-dependent.&lt;/p&gt;
&lt;p&gt;The contrast is calculated based on the following features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spatial properties (font weight and text size)&lt;/li&gt;
&lt;li&gt;Text color (perceived lightness difference between text and background)&lt;/li&gt;
&lt;li&gt;Context (ambient light, surroundings, and intended purpose of the text)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Chrome includes an &lt;a href=&quot;https://developer.chrome.com/blog/new-in-devtools-89/#apca&quot; rel=&quot;noopener&quot;&gt;experimental feature to replace the AA/AAA contrast ratio guidelines with APCA&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;A screenshot of the output of the APCA feature in Chrome.&quot; decoding=&quot;async&quot; height=&quot;543&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/YhGKRLYvt37j3ldlwiXE.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/YhGKRLYvt37j3ldlwiXE.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/YhGKRLYvt37j3ldlwiXE.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/YhGKRLYvt37j3ldlwiXE.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/YhGKRLYvt37j3ldlwiXE.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/YhGKRLYvt37j3ldlwiXE.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/YhGKRLYvt37j3ldlwiXE.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/YhGKRLYvt37j3ldlwiXE.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/YhGKRLYvt37j3ldlwiXE.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/YhGKRLYvt37j3ldlwiXE.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/YhGKRLYvt37j3ldlwiXE.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/YhGKRLYvt37j3ldlwiXE.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/YhGKRLYvt37j3ldlwiXE.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/YhGKRLYvt37j3ldlwiXE.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/YhGKRLYvt37j3ldlwiXE.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/YhGKRLYvt37j3ldlwiXE.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/YhGKRLYvt37j3ldlwiXE.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/admin/YhGKRLYvt37j3ldlwiXE.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;dont-convey-information-with-color-alone&quot;&gt;Don&#39;t convey information with color alone &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/color-and-contrast-accessibility/#dont-convey-information-with-color-alone&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There are roughly 320 million people worldwide with color vision deficiency.
About 1 in 12 men and 1 in 200 women have some form of &amp;quot;color blindness&amp;quot;;
that means about 1/20th, or 5%, of your users will not experience your site the way you intended.
When we rely on color to convey information, we push that number to unacceptable levels.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; Note: The term &amp;quot;color blindness&amp;quot; is often used to describe a visual condition where a person has trouble distinguishing colors, but in fact very few people are truly color blind. Most people with color deficiencies can see some or most colors, but have difficulty differentiating between certain colors such as reds and greens (most common), browns and oranges, and blues and purples. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;For example, in an input form,
a telephone number might be underlined in red to show that it is invalid.
But to a color deficient or screen reader user, that information is not conveyed well, if at all.
Thus, you should always try to provide multiple avenues for the user to access critical information.&lt;/p&gt;
&lt;figure style=&quot;width: 200px&quot;&gt;
  &lt;img alt=&quot;A image of an input form with an incorrect phone number highlighted only with a red color.&quot; decoding=&quot;async&quot; height=&quot;323&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 293px) 293px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/MKmlhejyjNpk7XE9R2KV.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/MKmlhejyjNpk7XE9R2KV.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/MKmlhejyjNpk7XE9R2KV.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/MKmlhejyjNpk7XE9R2KV.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/MKmlhejyjNpk7XE9R2KV.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/MKmlhejyjNpk7XE9R2KV.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/MKmlhejyjNpk7XE9R2KV.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/MKmlhejyjNpk7XE9R2KV.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/MKmlhejyjNpk7XE9R2KV.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/MKmlhejyjNpk7XE9R2KV.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/MKmlhejyjNpk7XE9R2KV.png?auto=format&amp;w=586 586w&quot; width=&quot;293&quot; /&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;a href=&quot;https://webaim.org/standards/wcag/checklist#sc1.4.1&quot; rel=&quot;noopener&quot;&gt;WebAIM checklist states in section 1.4.1&lt;/a&gt; that
&amp;quot;color should not be used as the sole method of conveying content or distinguishing visual elements.&amp;quot;
It also notes that &amp;quot;color alone should not be used to distinguish links from surrounding text&amp;quot;
unless they meet certain contrast requirements.
Instead, the checklist recommends adding an additional indicator such as an underscore
(using the CSS &lt;code&gt;text-decoration&lt;/code&gt; property) to indicate when the link is active.&lt;/p&gt;
&lt;p&gt;An easy way to fix the previous example is to add an additional message to the field,
announcing that it is invalid and why.&lt;/p&gt;
&lt;figure style=&quot;width: 200px&quot;&gt;
  &lt;img alt=&quot;The same input form as in the last example, this time with a text label indicating the problem with the field.&quot; decoding=&quot;async&quot; height=&quot;343&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 292px) 292px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/FLQPcG16akNRoElx3pnz.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/FLQPcG16akNRoElx3pnz.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/FLQPcG16akNRoElx3pnz.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/FLQPcG16akNRoElx3pnz.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/FLQPcG16akNRoElx3pnz.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/FLQPcG16akNRoElx3pnz.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/FLQPcG16akNRoElx3pnz.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/FLQPcG16akNRoElx3pnz.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/FLQPcG16akNRoElx3pnz.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/FLQPcG16akNRoElx3pnz.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/FLQPcG16akNRoElx3pnz.png?auto=format&amp;w=584 584w&quot; width=&quot;292&quot; /&gt;
&lt;/figure&gt;
&lt;p&gt;When you&#39;re building an app, keep these sorts of things in mind
and watch out for areas where you may be relying too heavily on color to convey important information.&lt;/p&gt;
&lt;p&gt;If you&#39;re curious about how your site looks to different people,
or if you rely heavily on the use of color in your UI,
you can use DevTools to simulate various forms of visual impairment,
including different types of color blindness.
Chrome includes an &lt;a href=&quot;https://developer.chrome.com/blog/new-in-devtools-83/#vision-deficiencies&quot; rel=&quot;noopener&quot;&gt;Emulate Vision Deficiencies feature&lt;/a&gt;.
To access it open DevTools and then open the &lt;strong&gt;Rendering&lt;/strong&gt; tab in the Drawer,
you can then emulate the following color deficiencies.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Protanopia: the inability to perceive any red light.&lt;/li&gt;
&lt;li&gt;Deuteranopia: the inability to perceive any green light.&lt;/li&gt;
&lt;li&gt;Tritanopia: the inability to perceive any blue light.&lt;/li&gt;
&lt;li&gt;Achromatopsia: the inability to perceive any color except for shades of grey (extremely rare).&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Emulating the vision of a person with Achromatopsia shows our page in greyscale.&quot; decoding=&quot;async&quot; height=&quot;393&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/VAnFxYhzFcpovdTCToPl.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/VAnFxYhzFcpovdTCToPl.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/VAnFxYhzFcpovdTCToPl.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/VAnFxYhzFcpovdTCToPl.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/VAnFxYhzFcpovdTCToPl.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/VAnFxYhzFcpovdTCToPl.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/VAnFxYhzFcpovdTCToPl.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/VAnFxYhzFcpovdTCToPl.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/VAnFxYhzFcpovdTCToPl.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/VAnFxYhzFcpovdTCToPl.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/VAnFxYhzFcpovdTCToPl.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/VAnFxYhzFcpovdTCToPl.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/VAnFxYhzFcpovdTCToPl.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/VAnFxYhzFcpovdTCToPl.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/VAnFxYhzFcpovdTCToPl.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/VAnFxYhzFcpovdTCToPl.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/VAnFxYhzFcpovdTCToPl.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/admin/VAnFxYhzFcpovdTCToPl.jpg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;high-contrast-mode&quot;&gt;High contrast mode &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/color-and-contrast-accessibility/#high-contrast-mode&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;High-contrast mode allows a user to invert foreground and background colors,
which often helps text stand out better.
For someone with a low vision impairment,
high-contrast mode can make it much easier to navigate the content on the page.
There are a few ways to get a high-contrast setup on your machine.&lt;/p&gt;
&lt;p&gt;Operating systems like Mac OSX and Windows offer high-contrast modes
that can be enabled for everything at the system level.&lt;/p&gt;
&lt;p&gt;A useful exercise is to turn on high-contrast settings
and verify that all of the UI in your application is still visible and usable.&lt;/p&gt;
&lt;p&gt;For example, a navigation bar might use a subtle background color
to indicate which page is currently selected.
If you view it in a high-contrast extension, that subtlety completely disappears,
and with it goes the reader&#39;s understanding of which page is active.&lt;/p&gt;
&lt;figure style=&quot;width: 500px&quot;&gt;
  &lt;img alt=&quot;Screenshot of a navigation bar in high contrast mode where the acvtive tab is hard to read&quot; decoding=&quot;async&quot; height=&quot;57&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 640px) 640px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/dgmA4W1Qu8JmcgsH80HD.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/dgmA4W1Qu8JmcgsH80HD.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/dgmA4W1Qu8JmcgsH80HD.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/dgmA4W1Qu8JmcgsH80HD.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/dgmA4W1Qu8JmcgsH80HD.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/dgmA4W1Qu8JmcgsH80HD.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/dgmA4W1Qu8JmcgsH80HD.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/dgmA4W1Qu8JmcgsH80HD.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/dgmA4W1Qu8JmcgsH80HD.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/dgmA4W1Qu8JmcgsH80HD.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/dgmA4W1Qu8JmcgsH80HD.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/dgmA4W1Qu8JmcgsH80HD.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/dgmA4W1Qu8JmcgsH80HD.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/dgmA4W1Qu8JmcgsH80HD.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/dgmA4W1Qu8JmcgsH80HD.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/dgmA4W1Qu8JmcgsH80HD.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/dgmA4W1Qu8JmcgsH80HD.png?auto=format&amp;w=1280 1280w&quot; width=&quot;640&quot; /&gt;
&lt;/figure&gt;
&lt;p&gt;Similarly, if you consider the example from the previous lesson,
the red underline on the invalid phone number field might be
displayed in a hard-to-distinguish blue-green color.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Screenshot of the address form used earlier, this time in high contrast mode. The color change of the invalid element is hard to read.&quot; decoding=&quot;async&quot; height=&quot;328&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 700px) 700px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/HtlXwmHQHBcAO4LYSfAA.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/HtlXwmHQHBcAO4LYSfAA.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/HtlXwmHQHBcAO4LYSfAA.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/HtlXwmHQHBcAO4LYSfAA.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/HtlXwmHQHBcAO4LYSfAA.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/HtlXwmHQHBcAO4LYSfAA.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/HtlXwmHQHBcAO4LYSfAA.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/HtlXwmHQHBcAO4LYSfAA.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/HtlXwmHQHBcAO4LYSfAA.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/HtlXwmHQHBcAO4LYSfAA.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/HtlXwmHQHBcAO4LYSfAA.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/HtlXwmHQHBcAO4LYSfAA.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/HtlXwmHQHBcAO4LYSfAA.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/HtlXwmHQHBcAO4LYSfAA.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/HtlXwmHQHBcAO4LYSfAA.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/HtlXwmHQHBcAO4LYSfAA.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/HtlXwmHQHBcAO4LYSfAA.jpg?auto=format&amp;w=1400 1400w&quot; width=&quot;700&quot; /&gt;
&lt;/figure&gt;
&lt;p&gt;If you are meeting the contrast ratios covered earlier
you should be fine when it comes to supporting high-contrast mode.
But for added peace of mind, consider installing the
&lt;a href=&quot;https://chrome.google.com/webstore/detail/high-contrast/djcfdncoelnlbldjfhinnjlhdjlikmph&quot; rel=&quot;noopener&quot;&gt;High Contrast Chrome Extension&lt;/a&gt;
and giving your page a once-over just to check that everything works, and looks, as expected.&lt;/p&gt;
</content>
    <author>
      <name>Dave Gash</name>
    </author><author>
      <name>Meggin Kearney</name>
    </author><author>
      <name>Rachel Andrew</name>
    </author><author>
      <name>Rob Dodson</name>
    </author>
  </entry>
  
  <entry>
    <title>Fixing mixed content</title>
    <link href="https://web.dev/fixing-mixed-content/"/>
    <updated>2019-09-07T00:00:00Z</updated>
    <id>https://web.dev/fixing-mixed-content/</id>
    <content type="html" mode="escaped">&lt;p&gt;Supporting HTTPS for your website is an important step to protecting your site and your users from attack,
but mixed content can render that protection useless.
Increasingly insecure mixed content will be blocked by browsers, as explained in &lt;a href=&quot;https://web.dev/what-is-mixed-content&quot;&gt;What is mixed content?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In this guide we will demonstrate techniques and tools for fixing existing mixed content issues
and preventing new ones from happening.&lt;/p&gt;
&lt;h2 id=&quot;finding-mixed-content-by-visiting-your-site&quot;&gt;Finding mixed content by visiting your site &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/fixing-mixed-content/#finding-mixed-content-by-visiting-your-site&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When visiting an HTTPS page in Google Chrome,
the browser alerts you to mixed content as errors and warnings in the JavaScript console.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://web.dev/what-is-mixed-content&quot;&gt;What is mixed content?&lt;/a&gt;,
you can find a number of examples and see how the problems are reported in Chrome DevTools.&lt;/p&gt;
&lt;p&gt;The example of &lt;a href=&quot;https://passive-mixed-content.glitch.me/&quot; rel=&quot;noopener&quot;&gt;passive mixed content&lt;/a&gt; will give the following warnings.
If the browser is able to find the content at an &lt;code&gt;https&lt;/code&gt; URL it automatically upgrades it, then shows a message.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Chrome DevTools showing the warnings displayed when mixed content is detected and upgraded&quot; decoding=&quot;async&quot; height=&quot;294&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/Y7b4EWAbSL6BgI07FdQq.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/Y7b4EWAbSL6BgI07FdQq.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/Y7b4EWAbSL6BgI07FdQq.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/Y7b4EWAbSL6BgI07FdQq.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/Y7b4EWAbSL6BgI07FdQq.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/Y7b4EWAbSL6BgI07FdQq.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/Y7b4EWAbSL6BgI07FdQq.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/Y7b4EWAbSL6BgI07FdQq.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/Y7b4EWAbSL6BgI07FdQq.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/Y7b4EWAbSL6BgI07FdQq.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/Y7b4EWAbSL6BgI07FdQq.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/Y7b4EWAbSL6BgI07FdQq.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/Y7b4EWAbSL6BgI07FdQq.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/Y7b4EWAbSL6BgI07FdQq.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/Y7b4EWAbSL6BgI07FdQq.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/Y7b4EWAbSL6BgI07FdQq.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/Y7b4EWAbSL6BgI07FdQq.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/Y7b4EWAbSL6BgI07FdQq.jpg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;https://active-mixed-content.glitch.me/&quot; rel=&quot;noopener&quot;&gt;Active mixed content&lt;/a&gt; is blocked and displays a warning.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Chrome DevTools showing the warnings displayed when active mixed content is blocked&quot; decoding=&quot;async&quot; height=&quot;304&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/KafrfEz1adCP2eUHQEWy.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/KafrfEz1adCP2eUHQEWy.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/KafrfEz1adCP2eUHQEWy.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/KafrfEz1adCP2eUHQEWy.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/KafrfEz1adCP2eUHQEWy.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/KafrfEz1adCP2eUHQEWy.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/KafrfEz1adCP2eUHQEWy.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/KafrfEz1adCP2eUHQEWy.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/KafrfEz1adCP2eUHQEWy.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/KafrfEz1adCP2eUHQEWy.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/KafrfEz1adCP2eUHQEWy.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/KafrfEz1adCP2eUHQEWy.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/KafrfEz1adCP2eUHQEWy.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/KafrfEz1adCP2eUHQEWy.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/KafrfEz1adCP2eUHQEWy.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/KafrfEz1adCP2eUHQEWy.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/KafrfEz1adCP2eUHQEWy.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/KafrfEz1adCP2eUHQEWy.jpg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;/figure&gt;
&lt;p&gt;If you find warnings like these for &lt;code&gt;http://&lt;/code&gt; URLs on your site,
you need to fix them in your site&#39;s source.
It&#39;s helpful to make a list of these URLs, along with the page you found them on, for use when you fix them.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; Mixed content errors and warnings are only shown for the page you are currently viewing, and the JavaScript console is cleared every time you navigate to a new  page. This means you will have to view every page of your site individually to find these errors. &lt;/div&gt;&lt;/aside&gt;
&lt;h3 id=&quot;finding-mixed-content-in-your-site&quot;&gt;Finding mixed content in your site &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/fixing-mixed-content/#finding-mixed-content-in-your-site&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You can search for mixed content directly in your source code.
Search for &lt;code&gt;http://&lt;/code&gt; in your source and look for tags that include HTTP URL attributes.
Note that having &lt;code&gt;http://&lt;/code&gt; in the &lt;code&gt;href&lt;/code&gt; attribute of anchor tags (&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;)
is often not a mixed content issue, with some notable exceptions discussed later.&lt;/p&gt;
&lt;p&gt;If your site is published using a content management system,
it is possible that links to insecure URLs are inserted when pages are published.
For example, images may be included with a full URL rather than a relative path.
You will need to find and fix these within the CMS content.&lt;/p&gt;
&lt;h3 id=&quot;fixing-mixed-content&quot;&gt;Fixing mixed content &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/fixing-mixed-content/#fixing-mixed-content&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Once you&#39;ve found mixed content in your site&#39;s source,
you can follow these steps to fix it.&lt;/p&gt;
&lt;p&gt;If you get a console message that a resource request has been automatically upgraded from HTTP to HTTPS,
you can safely change the &lt;code&gt;http://&lt;/code&gt; URL for the resource in your code to &lt;code&gt;https://&lt;/code&gt;.
You can also check to see if a resource is available securely by changing &lt;code&gt;http://&lt;/code&gt; to &lt;code&gt;https://&lt;/code&gt; in the browser URL bar
and attempting to open the URL in a browser tab.&lt;/p&gt;
&lt;p&gt;If the resource is not available via &lt;code&gt;https://&lt;/code&gt;, you should consider one of the following options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Include the resource from a different host, if one is available.&lt;/li&gt;
&lt;li&gt;Download and host the content on your site directly, if you are legally allowed to do so.&lt;/li&gt;
&lt;li&gt;Exclude the resource from your site altogether.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Having fixed the problem,
view the page where you found the error originally and verify that the error no longer appears.&lt;/p&gt;
&lt;h3 id=&quot;beware-of-non-standard-tag-usage&quot;&gt;Beware of non-standard tag usage &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/fixing-mixed-content/#beware-of-non-standard-tag-usage&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Beware of non-standard tag usage on your site.
For instance, anchor (&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;) tag URLs don&#39;t result in mixed content errors,
as they cause the browser to navigate to a new page.
This means they usually don&#39;t need to be fixed.
However some image gallery scripts override the functionality of the &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;
tag and load the HTTP resource specified by the &lt;code&gt;href&lt;/code&gt; attribute into a lightbox display on the page,
causing a mixed content problem.&lt;/p&gt;
&lt;h2 id=&quot;handle-mixed-content-at-scale&quot;&gt;Handle mixed content at scale &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/fixing-mixed-content/#handle-mixed-content-at-scale&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The manual steps above work well for smaller websites;
but for large websites or sites with many separate development teams,
it can be tough to keep track of all the content being loaded.
To help with this task, you can use content security policy
to instruct the browser to notify you about mixed content and ensure that your pages never unexpectedly load insecure resources.&lt;/p&gt;
&lt;h3 id=&quot;content-security-policy&quot;&gt;Content security policy &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/fixing-mixed-content/#content-security-policy&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://web.dev/csp/&quot;&gt;Content security policy&lt;/a&gt; (CSP)
is a multi-purpose browser feature that you can use to manage mixed content at scale.
The CSP reporting mechanism can be used to track mixed content on your site,
and provide enforcement policies to protect users by upgrading or blocking mixed content.&lt;/p&gt;
&lt;p&gt;You can enable these features for a page by including the
&lt;code&gt;Content-Security-Policy&lt;/code&gt; or &lt;code&gt;Content-Security-Policy-Report-Only&lt;/code&gt; header in the response sent from your server.
Additionally you can set &lt;code&gt;Content-Security-Policy&lt;/code&gt;
(though &lt;strong&gt;not&lt;/strong&gt; &lt;code&gt;Content-Security-Policy-Report-Only&lt;/code&gt;) using a &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; tag in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section of your page.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; Modern browsers enforce all content security policies that they receive. Multiple CSP header values received by the browser in the response header or &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; elements are combined and enforced as a single policy; reporting policies are likewise combined. Policies are combined by taking the intersection of the policies; that is to say, each policy after the first can only further restrict the allowed content, not broaden it. &lt;/div&gt;&lt;/aside&gt;
&lt;h3 id=&quot;finding-mixed-content-with-content-security-policy&quot;&gt;Finding mixed content with content security policy &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/fixing-mixed-content/#finding-mixed-content-with-content-security-policy&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You can use content security policy to collect reports of mixed content on your site.
To enable this feature, set the &lt;code&gt;Content-Security-Policy-Report-Only&lt;/code&gt; directive by adding it as a response header for your site.&lt;/p&gt;
&lt;p&gt;Response header:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Content-Security-Policy-Report-Only: default-src https: &#39;unsafe-inline&#39; &#39;unsafe-eval&#39;; report-uri https://example.com/reportingEndpoint&lt;/code&gt;&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; The &lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTTP/Headers/Content-Security-Policy/report-uri&quot;&gt;report-uri&lt;/a&gt; response header is being deprecated in favor of &lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTTP/Headers/Content-Security-Policy/report-to&quot;&gt;report-to&lt;/a&gt;. &lt;div class=&quot;wdi-browser-compat&quot;&gt; &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt; &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt; &lt;li class=&quot;wdi-browser-compat__item&quot;&gt; &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt; &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 70, Supported&lt;/span&gt; &lt;/span&gt; &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt; 70 &lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt; &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt; &lt;span class=&quot;visually-hidden&quot;&gt;Firefox, Not supported&lt;/span&gt; &lt;/span&gt; &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;  &lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt; &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt; &lt;span class=&quot;visually-hidden&quot;&gt;Edge 79, Supported&lt;/span&gt; &lt;/span&gt; &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt; 79 &lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt; &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt; &lt;span class=&quot;visually-hidden&quot;&gt;Safari, Not supported&lt;/span&gt; &lt;/span&gt; &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;no&quot; title=&quot;Not supported&quot; aria-label=&quot;Not supported&quot;&gt;  &lt;/span&gt; &lt;/li&gt; &lt;/ul&gt; &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/HTTP/Headers/Content-Security-Policy/report-to#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt; &lt;/div&gt;  You can provide both headers, in which case &lt;code&gt;report-uri&lt;/code&gt; will be ignored if the browser supports &lt;code&gt;report-to&lt;/code&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;Whenever a user visits a page on your site,
their browser sends JSON-formatted reports regarding anything that violates the content security policy to
&lt;code&gt;https://example.com/reportingEndpoint&lt;/code&gt;.
In this case, anytime a subresource is loaded over HTTP, a report is sent.
These reports include the page URL where the policy violation occurred and the subresource URL that violated the policy.
If you configure your reporting endpoint to log these reports,
you can track the mixed content on your site without visiting each page yourself.&lt;/p&gt;
&lt;p&gt;The two caveats to this are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Users have to visit your page in a browser that understands the CSP header. This is true for most modern browsers.&lt;/li&gt;
&lt;li&gt;You only get reports for pages visited by your users.
So if you have pages that don&#39;t get much traffic,
it might be some time before you get reports for your entire site.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;a href=&quot;https://web.dev/csp/&quot;&gt;Content security policy&lt;/a&gt;
guide has more information and an example endpoint.&lt;/p&gt;
&lt;h3 id=&quot;alternatives-to-reporting-with-csp&quot;&gt;Alternatives to reporting with CSP &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/fixing-mixed-content/#alternatives-to-reporting-with-csp&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If your site is hosted for you by a platform such as Blogger,
you may not have access to modify headers and add a CSP.
Instead, a viable alternative could be to use a website crawler to find issues across your site for you, such as
&lt;a href=&quot;https://httpschecker.net/how-it-works#httpsChecker&quot; rel=&quot;noopener&quot;&gt;HTTPSChecker&lt;/a&gt;
or
&lt;a href=&quot;https://github.com/bramus/mixed-content-scan&quot; rel=&quot;noopener&quot;&gt;Mixed Content Scan&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;upgrading-insecure-requests&quot;&gt;Upgrading insecure requests &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/fixing-mixed-content/#upgrading-insecure-requests&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;wdi-browser-compat&quot;&gt;
  &lt;span class=&quot;wdi-browser-compat__label&quot;&gt;Browser support&lt;/span&gt;
  &lt;ul class=&quot;wdi-browser-compat__items&quot;&gt;
    &lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;chrome&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Chrome 44, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      44
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;firefox&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Firefox 48, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      48
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;edge&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Edge 17, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      17
    &lt;/span&gt;
    &lt;/li&gt;&lt;li class=&quot;wdi-browser-compat__item&quot;&gt;
    &lt;span class=&quot;wdi-browser-compat__icon&quot; data-browser=&quot;safari&quot;&gt;
      &lt;span class=&quot;visually-hidden&quot;&gt;Safari 10.1, Supported&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class=&quot;wdi-browser-compat__version&quot; data-compat=&quot;yes&quot; title=&quot;Supported&quot; aria-label=&quot;Supported&quot;&gt;
      10.1
    &lt;/span&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  &lt;a class=&quot;wdi-browser-compat__link&quot; href=&quot;https://developer.mozilla.org/docs/Web/HTTP/Headers/Upgrade-Insecure-Requests#browser_compatibility&quot; target=&quot;_blank&quot;&gt;Source&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Browsers are beginning to upgrade and block insecure requests.
You can use CSP directives to force automatic upgrading or blocking of these assets.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.w3.org/TR/upgrade-insecure-requests/&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;upgrade-insecure-requests&lt;/code&gt;&lt;/a&gt;
CSP directive instructs the browser to upgrade insecure URLs before making network requests.&lt;/p&gt;
&lt;p&gt;As an example, if a page contains an image tag with an HTTP URL such as
&lt;code&gt;&amp;lt;img src=&amp;quot;http://example.com/image.jpg&amp;quot;&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The browser instead makes a secure request for
&lt;code&gt;https://example.com/image.jpg&lt;/code&gt;, thus saving the user from mixed content.&lt;/p&gt;
&lt;p&gt;You can enable this behavior either by sending a &lt;code&gt;Content-Security-Policy&lt;/code&gt; header with this directive:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;Content-Security-Policy: upgrade-insecure-requests&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Or by embedding that same directive inline in the document&#39;s &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;
section using a &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; element:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;http-equiv&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Content-Security-Policy&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;upgrade-insecure-requests&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;As with browser automatic upgrading, if the resource is not available over HTTPS,
the upgraded request fails and the resource is not loaded.
This maintains the security of your page. The &lt;code&gt;upgrade-insecure-requests&lt;/code&gt; directive will go further than automatic browser upgrading,
attempting to upgrade requests that the browser currently does not.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;upgrade-insecure-requests&lt;/code&gt; directive cascades into &lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt; documents,
ensuring the entire page is protected.&lt;/p&gt;
</content>
    <author>
      <name>Jo-el van Bergen</name>
    </author><author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>What is mixed content?</title>
    <link href="https://web.dev/what-is-mixed-content/"/>
    <updated>2019-09-07T00:00:00Z</updated>
    <id>https://web.dev/what-is-mixed-content/</id>
    <content type="html" mode="escaped">&lt;p&gt;&lt;strong&gt;Mixed content&lt;/strong&gt; occurs when initial HTML is loaded over a secure
&lt;a href=&quot;https://web.dev/why-https-matters/&quot;&gt;HTTPS&lt;/a&gt; connection, but other resources (such as images,
videos, stylesheets, scripts) are loaded over an insecure HTTP connection.
This is called mixed content
because both HTTP and HTTPS content are being loaded to display the same page,
and the initial request was secure over HTTPS.&lt;/p&gt;
&lt;p&gt;Requesting subresources using the insecure HTTP protocol weakens the security of the entire page,
as these requests are vulnerable to &lt;a href=&quot;https://www.ietf.org/rfc/rfc7835.html#section-2.1.1&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;on-path attacks&lt;/strong&gt;&lt;/a&gt;,
where an attacker eavesdrops on a network connection and views or modifies the communication between two parties.
Using these resources, attackers can track users and replace content on a website,
and in the case of active mixed content, take complete control over the page, not just the insecure resources.&lt;/p&gt;
&lt;p&gt;Although many browsers report mixed content warnings to the user,
by the time this happens, it is too late:
the insecure requests have already been performed and the security of the page is compromised.&lt;/p&gt;
&lt;p&gt;This is why browsers are increasingly blocking mixed content.
If you have mixed content on your site,
then fixing it will ensure the content continues to load as browsers become more strict.&lt;/p&gt;
&lt;h2 id=&quot;the-two-types-of-mixed-content&quot;&gt;The two types of mixed content &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/what-is-mixed-content/#the-two-types-of-mixed-content&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The two types of mixed content are: active and passive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Passive mixed content&lt;/strong&gt; refers to content that doesn&#39;t interact with the rest of the page,
and thus a man-in-the-middle attack is restricted to what they can do if they intercept or change that content.
Passive mixed content is defined as images, video, and audio content.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Active mixed content&lt;/strong&gt; interacts with the page as a whole and allows an attacker to do almost anything with the page.
Active mixed content includes scripts, stylesheets, iframes,
and other code that the browser can download and execute.&lt;/p&gt;
&lt;h3 id=&quot;passive-mixed-content&quot;&gt;Passive mixed content &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/what-is-mixed-content/#passive-mixed-content&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Passive mixed content is seen as less problematic yet still poses a security threat to your site and your users.
For example, an attacker can intercept HTTP requests for images on your site and swap or replace these images;
the attacker can swap the &lt;em&gt;save&lt;/em&gt; and &lt;em&gt;delete&lt;/em&gt; button images,
causing your users to delete content without intending to;
replace your product diagrams with lewd or pornographic content,
defacing your site; or replace your product pictures with ads for a different site or product.&lt;/p&gt;
&lt;p&gt;Even if the attacker doesn&#39;t alter the content of your site,
an attacker can track users via mixed content requests.
The attacker can tell which pages a user visits and which products they view based on images or other resources that the browser loads.&lt;/p&gt;
&lt;p&gt;If passive mixed content is present most browsers will indicate in the URL bar that the page is not secure,
even when the page itself was loaded over HTTPS.
You can observe this behavior with this &lt;a href=&quot;https://passive-mixed-content.glitch.me/&quot; rel=&quot;noopener&quot;&gt;demo&lt;/a&gt;
that contains examples of passive mixed content.&lt;/p&gt;
&lt;p&gt;Until recently passive mixed content was loaded in all browsers,
as to block it would have broken many websites.
This is now beginning to change and so it is vital to update any instances of mixed content on your site.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.chromium.org/2019/10/no-more-mixed-messages-about-https.html&quot; rel=&quot;noopener&quot;&gt;Chrome is currently rolling out&lt;/a&gt;
automatic upgrading of passive mixed content where possible.
Automatic upgrading means that if the asset is available over HTTPS, but has been hardcoded as HTTP,
the browser will load the HTTPS version. If no secure version can be found the asset will not load.&lt;/p&gt;
&lt;p&gt;Whenever it detects mixed content or auto-upgrades passive mixed content,
Chrome logs detailed messages to the &lt;strong&gt;Issues&lt;/strong&gt; tab in DevTools
to guide you on how to fix the specific issue.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;The Issues tab in Chrome DevTools shows detailed information about the specific mixed content issue and how to fix it&quot; decoding=&quot;async&quot; height=&quot;310&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/HNxoomaHi2ksvYHGuNiE.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/HNxoomaHi2ksvYHGuNiE.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/HNxoomaHi2ksvYHGuNiE.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/HNxoomaHi2ksvYHGuNiE.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/HNxoomaHi2ksvYHGuNiE.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/HNxoomaHi2ksvYHGuNiE.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/HNxoomaHi2ksvYHGuNiE.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/HNxoomaHi2ksvYHGuNiE.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/HNxoomaHi2ksvYHGuNiE.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/HNxoomaHi2ksvYHGuNiE.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/HNxoomaHi2ksvYHGuNiE.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/HNxoomaHi2ksvYHGuNiE.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/HNxoomaHi2ksvYHGuNiE.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/HNxoomaHi2ksvYHGuNiE.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/HNxoomaHi2ksvYHGuNiE.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/HNxoomaHi2ksvYHGuNiE.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/HNxoomaHi2ksvYHGuNiE.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/HNxoomaHi2ksvYHGuNiE.jpg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;active-mixed-content&quot;&gt;Active mixed content &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/what-is-mixed-content/#active-mixed-content&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Active mixed content poses a greater threat than passive mixed content.
An attacker can intercept and rewrite active content,
thereby taking full control of your page or even your entire website.
This allows the attacker to change anything about the page,
including displaying entirely different content,
stealing user passwords or other login credentials,
stealing user session cookies,
or redirecting the user to a different site entirely.&lt;/p&gt;
&lt;p&gt;Due to the severity of this threat,
most browsers already block this type of content by default to protect users,
but functionality varies between browser vendors and versions.&lt;/p&gt;
&lt;p&gt;This other &lt;a href=&quot;https://active-mixed-content.glitch.me/&quot; rel=&quot;noopener&quot;&gt;demo&lt;/a&gt; contains examples of active mixed content.
&lt;a href=&quot;http://active-mixed-content.glitch.me/&quot; rel=&quot;noopener&quot;&gt;Load the example over HTTP&lt;/a&gt;
to see the content that&#39;s blocked when you &lt;a href=&quot;https://active-mixed-content.glitch.me/&quot; rel=&quot;noopener&quot;&gt;load the example over
HTTPS&lt;/a&gt;. Blocked content will also
be detailed in the &lt;strong&gt;Issues&lt;/strong&gt; tab.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;The Issues tab in Chrome DevTools shows detailed information about the specific mixed content issue and how to fix it&quot; decoding=&quot;async&quot; height=&quot;361&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/xRG5zpKLr0Z3OwfYpn2H.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/xRG5zpKLr0Z3OwfYpn2H.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/xRG5zpKLr0Z3OwfYpn2H.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/xRG5zpKLr0Z3OwfYpn2H.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/xRG5zpKLr0Z3OwfYpn2H.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/xRG5zpKLr0Z3OwfYpn2H.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/xRG5zpKLr0Z3OwfYpn2H.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/xRG5zpKLr0Z3OwfYpn2H.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/xRG5zpKLr0Z3OwfYpn2H.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/xRG5zpKLr0Z3OwfYpn2H.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/xRG5zpKLr0Z3OwfYpn2H.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/xRG5zpKLr0Z3OwfYpn2H.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/xRG5zpKLr0Z3OwfYpn2H.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/xRG5zpKLr0Z3OwfYpn2H.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/xRG5zpKLr0Z3OwfYpn2H.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/xRG5zpKLr0Z3OwfYpn2H.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/xRG5zpKLr0Z3OwfYpn2H.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/tcFciHGuF3MxnTr1y5ue01OGLBn2/xRG5zpKLr0Z3OwfYpn2H.jpg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
&lt;/figure&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; Browsers also highlight blocked content in their DevTools. Blocked content issues are detailed in the &lt;strong&gt;Issues&lt;/strong&gt; tab in Chromium-based browsers. Firefox and Safari log messages in the console. &lt;/div&gt;&lt;/aside&gt;
&lt;h2 id=&quot;the-mixed-content-specification&quot;&gt;The mixed content specification &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/what-is-mixed-content/#the-mixed-content-specification&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Browsers follow the &lt;a href=&quot;https://w3c.github.io/webappsec-mixed-content/&quot; rel=&quot;noopener&quot;&gt;mixed content specification&lt;/a&gt;,
which defines the &lt;a href=&quot;https://w3c.github.io/webappsec-mixed-content/#optionally-blockable-mixed-content&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;optionally blockable content&lt;/strong&gt;&lt;/a&gt;
and &lt;a href=&quot;https://w3c.github.io/webappsec-mixed-content/#category-blockable&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;blockable content&lt;/strong&gt;&lt;/a&gt; categories.&lt;/p&gt;
&lt;p&gt;From the spec,
a resource qualifies as optionally blockable content
&amp;quot;when the risk of allowing its usage as mixed content is outweighed by the risk of breaking significant portions of the web&amp;quot;;
this is a subset of the passive mixed content category described above.&lt;/p&gt;
&lt;p&gt;All content that is not &lt;strong&gt;optionally blockable&lt;/strong&gt; is considered &lt;strong&gt;blockable&lt;/strong&gt;,
and should be blocked by the browser.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; There is a &lt;a href=&quot;https://w3c.github.io/webappsec-mixed-content/level2.html&quot;&gt;Level 2 of the Mixed Content specification&lt;/a&gt; in progress, which will add automatic upgrading to the spec. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;In recent years, &lt;a href=&quot;https://transparencyreport.google.com/https/overview&quot; rel=&quot;noopener&quot;&gt;HTTPS usage has risen dramatically&lt;/a&gt;,
and has become the clear default on the web.
This makes it more feasible now for browsers to consider blocking all mixed content,
even those subresource types defined in the &lt;a href=&quot;https://w3c.github.io/webappsec/specs/mixedcontent/&quot; rel=&quot;noopener&quot;&gt;mixed content specification&lt;/a&gt; as &lt;strong&gt;optionally blockable&lt;/strong&gt;.
This is why we now see Chrome taking a stricter approach to these subresources.&lt;/p&gt;
&lt;h3 id=&quot;older-browsers&quot;&gt;Older browsers &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/what-is-mixed-content/#older-browsers&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;It is important to remember that not every visitor to your website uses the most up-to-date browsers.
Different versions from different browser vendors each treat mixed content differently.
At worst, older browsers and versions don&#39;t block any mixed content at all,
which is very unsafe for the user.&lt;/p&gt;
&lt;p&gt;By fixing your mixed content problems you ensure that your content is visible in new browsers.
You also help protect users from dangerous content that isn&#39;t blocked by older browsers.&lt;/p&gt;
</content>
    <author>
      <name>Jo-el van Bergen</name>
    </author><author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Use lazy loading to improve loading speed</title>
    <link href="https://web.dev/lazy-loading/"/>
    <updated>2019-08-16T00:00:00Z</updated>
    <id>https://web.dev/lazy-loading/</id>
    <content type="html" mode="escaped">&lt;p&gt;The portion of
&lt;a href=&quot;http://beta.httparchive.org/reports/state-of-images?start=earliest&amp;amp;end=latest&quot; rel=&quot;noopener&quot;&gt;images&lt;/a&gt;
and &lt;a href=&quot;http://beta.httparchive.org/reports/page-weight#bytesVideo&quot; rel=&quot;noopener&quot;&gt;video&lt;/a&gt; in the
typical payload of a website can be significant.
Unfortunately, project stakeholders may be unwilling to cut any media resources from their existing
applications.
Such impasses are frustrating,
especially when all parties involved want to improve site performance,
but can&#39;t agree on how to get there.
Fortunately, lazy loading is a solution that lowers initial page payload &lt;em&gt;and&lt;/em&gt;
load time, but doesn&#39;t skimp on content.&lt;/p&gt;
&lt;h2 id=&quot;what&quot;&gt;What is lazy loading? &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/lazy-loading/#what&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Lazy loading is a technique that defers loading of non-critical resources at page
load time. Instead, these non-critical resources are loaded at the moment of
need. Where images are concerned, &amp;quot;non-critical&amp;quot; is often synonymous with
&amp;quot;off-screen&amp;quot;. If you&#39;ve used Lighthouse and examined some opportunities for
improvement, you may have seen some guidance in this realm in the form of the
&lt;a href=&quot;https://developer.chrome.com/docs/lighthouse/performance/offscreen-images/&quot; rel=&quot;noopener&quot;&gt;Defer offscreen images audit&lt;/a&gt;:&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;A screenshot of the Defer offscreen images audit in Lighthouse.&quot; decoding=&quot;async&quot; height=&quot;102&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/63NnMISWUUWD3mvAliwe.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/63NnMISWUUWD3mvAliwe.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/63NnMISWUUWD3mvAliwe.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/63NnMISWUUWD3mvAliwe.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/63NnMISWUUWD3mvAliwe.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/63NnMISWUUWD3mvAliwe.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/63NnMISWUUWD3mvAliwe.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/63NnMISWUUWD3mvAliwe.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/63NnMISWUUWD3mvAliwe.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/63NnMISWUUWD3mvAliwe.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/63NnMISWUUWD3mvAliwe.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/63NnMISWUUWD3mvAliwe.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/63NnMISWUUWD3mvAliwe.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/63NnMISWUUWD3mvAliwe.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/63NnMISWUUWD3mvAliwe.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/63NnMISWUUWD3mvAliwe.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/63NnMISWUUWD3mvAliwe.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/admin/63NnMISWUUWD3mvAliwe.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;One of Lighthouse&#39;s performance audits is to
identify off screen images, which are candidates for lazy loading.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;You&#39;ve probably already seen lazy loading in action, and it goes something like
this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You arrive at a page, and begin to scroll as you read content.&lt;/li&gt;
&lt;li&gt;At some point, you scroll a placeholder image into the viewport.&lt;/li&gt;
&lt;li&gt;The placeholder image is suddenly replaced by the final image.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An example of image lazy loading can be found on the popular publishing platform
&lt;a href=&quot;https://medium.com/&quot; rel=&quot;noopener&quot;&gt;Medium&lt;/a&gt;, which loads lightweight placeholder images at
page load, and replaces them with lazily-loaded images as they&#39;re scrolled into
the viewport.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;A screenshot of the website Medium in the browsing, demonstrating lazy loading in action. The blurry placeholder is on the left, and the loaded resource is on the right.&quot; decoding=&quot;async&quot; height=&quot;493&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/p5ahQ67QtZ20bgto7Kpy.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/p5ahQ67QtZ20bgto7Kpy.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/p5ahQ67QtZ20bgto7Kpy.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/p5ahQ67QtZ20bgto7Kpy.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/p5ahQ67QtZ20bgto7Kpy.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/p5ahQ67QtZ20bgto7Kpy.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/p5ahQ67QtZ20bgto7Kpy.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/p5ahQ67QtZ20bgto7Kpy.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/p5ahQ67QtZ20bgto7Kpy.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/p5ahQ67QtZ20bgto7Kpy.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/p5ahQ67QtZ20bgto7Kpy.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/p5ahQ67QtZ20bgto7Kpy.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/p5ahQ67QtZ20bgto7Kpy.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/p5ahQ67QtZ20bgto7Kpy.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/p5ahQ67QtZ20bgto7Kpy.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/p5ahQ67QtZ20bgto7Kpy.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/p5ahQ67QtZ20bgto7Kpy.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/admin/p5ahQ67QtZ20bgto7Kpy.jpg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;An example of image lazy loading in action. A
placeholder image is loaded at page load (left), and when scrolled into the
viewport, the final image loads at the time of need.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If you&#39;re unfamiliar with lazy loading, you might be wondering just how useful
the technique is, and what its benefits are. Read on to find out!&lt;/p&gt;
&lt;h2 id=&quot;why&quot;&gt;Why lazy-load images or video instead of just &lt;em&gt;loading&lt;/em&gt; them? &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/lazy-loading/#why&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Because it&#39;s possible you&#39;re loading stuff the user may never see. This is
problematic for a couple reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It wastes data. On unmetered connections, this isn&#39;t the worst thing that could
happen (although you could be using that precious bandwidth for downloading
other resources that are indeed going to be seen by the user). On limited data
plans, however, loading stuff the user never sees could effectively be a waste
of their money.&lt;/li&gt;
&lt;li&gt;It wastes processing time, battery, and other system resources. After a media
resource is downloaded, the browser must decode it and render its content in the
viewport.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lazy loading images and video reduces initial page load time, initial
page weight, and system resource usage, all of which have positive impacts on
performance.&lt;/p&gt;
&lt;h2 id=&quot;implementing&quot;&gt;Implementing lazy loading &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/lazy-loading/#implementing&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There are a number of ways to implement lazy loading.
Your choice of solution must take into account the browsers you support,
and also what you are trying to lazy-load.&lt;/p&gt;
&lt;p&gt;Modern browsers implement &lt;a href=&quot;https://web.dev/browser-level-image-lazy-loading/&quot;&gt;browser-level lazy loading&lt;/a&gt;,
which can be enabled using the &lt;code&gt;loading&lt;/code&gt; attribute on images and iframes.
To provide compatibility with older browsers
or to perform lazy loading on elements without built-in lazy loading
you can implement a solution with your own JavaScript.
There are also a number of existing libraries to help you to do this.
See the posts on this site for full details of all of these approaches:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/lazy-loading-images/&quot;&gt;Lazy loading images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/lazy-loading-video/&quot;&gt;Lazy loading video&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also, we have compiled a list of &lt;a href=&quot;https://web.dev/lazy-loading-best-practices&quot;&gt;potential issues with lazy loading&lt;/a&gt;,
and things to watch out for in your implementation.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/lazy-loading/#conclusion&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Used with care, lazy loading images and video can seriously lower the initial
load time and page payloads on your site, including &lt;a href=&quot;https://web.dev/vitals/&quot;&gt;Core Web Vitals&lt;/a&gt;. Users won&#39;t incur unnecessary network
activity—including network contention on slower connections—and processing costs of media resources they may never see, but they
can still view those resources if they want.&lt;/p&gt;
&lt;p&gt;As far as performance improvement techniques go, lazy loading is reasonably
uncontroversial. If you have a lot of inline imagery in your site, it&#39;s a
perfectly fine way to cut down on unnecessary downloads. Your site&#39;s users and
project stakeholders will appreciate it!&lt;/p&gt;
</content>
    <author>
      <name>Jeremy Wagner</name>
    </author><author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Lazy loading video</title>
    <link href="https://web.dev/lazy-loading-video/"/>
    <updated>2019-08-16T00:00:00Z</updated>
    <id>https://web.dev/lazy-loading-video/</id>
    <content type="html" mode="escaped">&lt;p&gt;As with &lt;a href=&quot;https://web.dev/lazy-loading-images&quot;&gt;image elements&lt;/a&gt;, you can also lazy-load video. Videos are commonly loaded with the &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; element (although &lt;a href=&quot;https://calendar.perfplanet.com/2017/animated-gif-without-the-gif/&quot; rel=&quot;noopener&quot;&gt;an
alternate method using
&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;&lt;/a&gt; has
emerged with limited implementation). &lt;em&gt;How&lt;/em&gt; to lazy-load &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; depends on the
use case, though. Let&#39;s discuss a couple of scenarios that each require a
different solution.&lt;/p&gt;
&lt;h2 id=&quot;video-no-autoplay&quot;&gt;For video that doesn&#39;t autoplay &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/lazy-loading-video/#video-no-autoplay&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For videos where playback is initiated by the user (that is, videos that &lt;em&gt;don&#39;t&lt;/em&gt;
autoplay), specifying the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTML/Element/video#attr-preload&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;preload&lt;/code&gt;
attribute&lt;/a&gt;
on the &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; element may be desirable:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;video&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;controls&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;preload&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;none&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;poster&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;one-does-not-simply-placeholder.jpg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;source&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;one-does-not-simply.webm&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;video/webm&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;source&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;one-does-not-simply.mp4&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;video/mp4&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;video&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;aside class=&quot;aside flow bg-tertiary-box-bg color-tertiary-box-text&quot;&gt;&lt;p class=&quot;cluster &quot;&gt;&lt;span class=&quot;aside__icon box-block &quot;&gt;&lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; role=&quot;img&quot; aria-label=&quot;Lightbulb&quot; fill=&quot;currentColor&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;   &lt;path d=&quot;M9 21c0 .55.45 1 1 1h4c.55 0 1-.45 1-1v-1H9v1zm3-19C8.14 2 5 5.14 5 9c0 2.38 1.19 4.47 3 5.74V17c0 .55.45 1 1 1h6c.55 0 1-.45 1-1v-2.26c1.81-1.27 3-3.36 3-5.74 0-3.86-3.14-7-7-7zm2.85 11.1l-.85.6V16h-4v-2.3l-.85-.6A4.997 4.997 0 017 9c0-2.76 2.24-5 5-5s5 2.24 5 5c0 1.63-.8 3.16-2.15 4.1z&quot;&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/span&gt;&lt;strong&gt;Important&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot; flow&quot;&gt; A video &lt;code&gt;poster&lt;/code&gt; image can qualify as an &lt;a href=&quot;https://web.dev/lcp/#what-elements-are-considered&quot;&gt;LCP candidates&lt;/a&gt;. If your &lt;code&gt;poster&lt;/code&gt; image is an LCP candidate, you should &lt;a href=&quot;https://web.dev/preload-critical-assets/&quot;&gt;preload it&lt;/a&gt; with a &lt;a href=&quot;https://web.dev/fetch-priority/#the-fetchpriority-attribute&quot;&gt;&lt;code&gt;fetchpriority&lt;/code&gt; attribute value of &lt;code&gt;&amp;quot;high&amp;quot;&lt;/code&gt;&lt;/a&gt; so the user sees it as soon as possible. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;The example above uses a &lt;code&gt;preload&lt;/code&gt; attribute with a value of &lt;code&gt;none&lt;/code&gt; to prevent browsers
from preloading &lt;em&gt;any&lt;/em&gt; video data. The &lt;code&gt;poster&lt;/code&gt;
attribute gives the &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; element a placeholder that will occupy the space while the video loads. The reason for this is
that default behaviors for loading video can vary from browser to browser:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In Chrome, the default for &lt;code&gt;preload&lt;/code&gt; used to be &lt;code&gt;auto&lt;/code&gt;, but as of Chrome 64, it now
defaults to &lt;code&gt;metadata&lt;/code&gt;. Even so, on the desktop version of Chrome, a portion of
the video may be preloaded using the &lt;code&gt;Content-Range&lt;/code&gt; header. Other Chromium-based browsers and Firefox behave similarly.&lt;/li&gt;
&lt;li&gt;As with Chrome on desktop, 11.0 desktop versions of Safari will preload a range
of the video.
From version 11.2, only the video metadata is preloaded. &lt;a href=&quot;https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/AudioandVideoTagBasics/AudioandVideoTagBasics.html#//apple_ref/doc/uid/TP40009523-CH2-SW9&quot; rel=&quot;noopener&quot;&gt;In Safari on iOS, videos are never
preloaded&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;When &lt;a href=&quot;https://support.google.com/chrome/answer/2392284&quot; rel=&quot;noopener&quot;&gt;Data Saver mode&lt;/a&gt; is
enabled, &lt;code&gt;preload&lt;/code&gt; defaults to &lt;code&gt;none&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because browser default behaviors with regard to &lt;code&gt;preload&lt;/code&gt; are not set in stone,
being explicit is probably your best bet. In this cases where the user initiates
playback, using &lt;code&gt;preload=&amp;quot;none&amp;quot;&lt;/code&gt; is the easiest way to defer loading of video on
all platforms. The &lt;code&gt;preload&lt;/code&gt; attribute isn&#39;t the only way to defer the loading
of video content. &lt;a href=&quot;https://web.dev/fast-playback-with-preload/&quot;&gt;&lt;em&gt;Fast Playback with Video
Preload&lt;/em&gt;&lt;/a&gt; may give you
some ideas and insight into working with video playback in JavaScript.&lt;/p&gt;
&lt;p&gt;Unfortunately, it doesn&#39;t prove useful when you want to use video in place of
animated GIFs, which is covered next.&lt;/p&gt;
&lt;h2 id=&quot;video-gif-replacement&quot;&gt;For video acting as an animated GIF replacement &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/lazy-loading-video/#video-gif-replacement&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While animated GIFs enjoy wide use, they&#39;re subpar to video equivalents in a
number of ways, particularly in file size. Animated GIFs can stretch into
the range of several megabytes of data. Videos of similar visual quality tend to
be far smaller.&lt;/p&gt;
&lt;p&gt;Using the &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; element as a replacement for animated GIF is not as
straightforward as the &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; element. Animated GIFs have three characteristics:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;They play automatically when loaded.&lt;/li&gt;
&lt;li&gt;They loop continuously (&lt;a href=&quot;https://davidwalsh.name/prevent-gif-loop&quot; rel=&quot;noopener&quot;&gt;though that&#39;s not always the
case&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;They don&#39;t have an audio track.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Achieving this with the &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; element looks something like this:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;video&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;autoplay&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;muted&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;loop&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;playsinline&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;source&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;one-does-not-simply.webm&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;video/webm&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;source&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;one-does-not-simply.mp4&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;video/mp4&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;video&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;autoplay&lt;/code&gt;, &lt;code&gt;muted&lt;/code&gt;, and &lt;code&gt;loop&lt;/code&gt; attributes are self-explanatory.
&lt;a href=&quot;https://webkit.org/blog/6784/new-video-policies-for-ios/&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;playsinline&lt;/code&gt; is necessary for autoplaying to occur in
iOS&lt;/a&gt;. Now you have a
serviceable video-as-GIF replacement that works across platforms. But how to go
about lazy loading it? To start, modify your &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; markup accordingly:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;video&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;lazy&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;autoplay&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;muted&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;loop&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;playsinline&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;610&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;254&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;poster&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;one-does-not-simply.jpg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;source&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;data-src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;one-does-not-simply.webm&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;video/webm&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;source&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;data-src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;one-does-not-simply.mp4&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;video/mp4&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;video&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;You&#39;ll notice the addition of the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTML/Element/video#attr-poster&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;poster&lt;/code&gt;
attribute&lt;/a&gt;,
which lets you specify a placeholder to occupy the &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; element&#39;s space
until the video is lazy-loaded. As with the &lt;a href=&quot;https://web.dev/lazy-loading-images/&quot;&gt;&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; lazy-loading examples&lt;/a&gt;,
stash the video URL in the &lt;code&gt;data-src&lt;/code&gt; attribute on each &lt;code&gt;&amp;lt;source&amp;gt;&lt;/code&gt;
element. From there, use JavaScript code similar to the
Intersection Observer-based image lazy loading examples:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;DOMContentLoaded&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; lazyVideos &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;video.lazy&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;IntersectionObserver&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; lazyVideoObserver &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;IntersectionObserver&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;entries&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; observer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;      entries&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;video&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;isIntersecting&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;          &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; source &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;children&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; videoSource &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;children&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;source&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; videoSource&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tagName &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; videoSource&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tagName &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;SOURCE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;              videoSource&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;src &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; videoSource&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dataset&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;src&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;          video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;load&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;          video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;remove&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;lazy&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;          lazyVideoObserver&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;unobserve&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    lazyVideos&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;lazyVideo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;      lazyVideoObserver&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;observe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;lazyVideo&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;When you lazy-load a &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; element, you need to iterate through all of the child
&lt;code&gt;&amp;lt;source&amp;gt;&lt;/code&gt; elements and flip their &lt;code&gt;data-src&lt;/code&gt; attributes to &lt;code&gt;src&lt;/code&gt; attributes. Once
you&#39;ve done that, you need to trigger loading of the video by calling the
element&#39;s &lt;code&gt;load&lt;/code&gt; method, after which the media will begin playing automatically
per the &lt;code&gt;autoplay&lt;/code&gt; attribute.&lt;/p&gt;
&lt;p&gt;Using this method, you have a video solution that emulates animated GIF behavior,
but doesn&#39;t incur the same intensive data usage as animated GIFs do,
and you can lazy-load that content.&lt;/p&gt;
&lt;h2 id=&quot;libraries&quot;&gt;Lazy loading libraries &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/lazy-loading-video/#libraries&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The following libraries can help you to lazy-load video:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/verlok/vanilla-lazyload&quot; rel=&quot;noopener&quot;&gt;vanilla-lazyload&lt;/a&gt; and
&lt;a href=&quot;https://github.com/ApoorvSaxena/lozad.js&quot; rel=&quot;noopener&quot;&gt;lozad.js&lt;/a&gt; are super lightweight options
that use Intersection Observer only. As such, they are highly performant, but
will need to be polyfilled before you can use them on older browsers.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/malchata/yall.js&quot; rel=&quot;noopener&quot;&gt;yall.js&lt;/a&gt; is a library that uses
Intersection Observer and falls back to event handlers. It can also lazy load video &lt;code&gt;poster&lt;/code&gt; images using a &lt;code&gt;data-poster&lt;/code&gt; attribute.&lt;/li&gt;
&lt;li&gt;If you need a React-specific lazy loading library, you might consider
&lt;a href=&quot;https://github.com/jasonslyvia/react-lazyload&quot; rel=&quot;noopener&quot;&gt;react-lazyload&lt;/a&gt;. While it
doesn&#39;t use Intersection Observer, it &lt;em&gt;does&lt;/em&gt; provide a familiar method of lazy
loading images for those accustomed to developing applications with React.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each of these lazy loading libraries is well documented, with plenty of markup
patterns for your various lazy loading endeavors.&lt;/p&gt;
</content>
    <author>
      <name>Jeremy Wagner</name>
    </author><author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Lazy loading images</title>
    <link href="https://web.dev/lazy-loading-images/"/>
    <updated>2019-08-16T00:00:00Z</updated>
    <id>https://web.dev/lazy-loading-images/</id>
    <content type="html" mode="escaped">&lt;p&gt;Images can appear on a webpage due to being inline in the HTML as &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; elements
or as CSS background images. In this post you will find out how to lazy-load both types of image.&lt;/p&gt;
&lt;h2 id=&quot;images-inline&quot;&gt;Inline images &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/lazy-loading-images/#images-inline&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The most common lazy loading candidates are images as used in &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; elements.
With inline images we have three options for lazy loading,
which may be used in combination for the best compatibility across browsers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/lazy-loading-images/#images-inline-browser-level&quot;&gt;Using browser-level lazy loading&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/lazy-loading-images/#images-inline-intersection-observer&quot;&gt;Using Intersection Observer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;images-inline-browser-level&quot;&gt;Using browser-level lazy loading &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/lazy-loading-images/#images-inline-browser-level&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Chrome and Firefox both support lazy loading with the &lt;code&gt;loading&lt;/code&gt; attribute.
This attribute can be added to &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; elements, and also to &lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt; elements.
A value of &lt;code&gt;lazy&lt;/code&gt; tells the browser to load the image immediately if it is in the viewport,
and to fetch other images when the user scrolls near them.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; Note &lt;code&gt;&amp;lt;iframe loading=&amp;quot;lazy&amp;quot;&amp;gt;&lt;/code&gt; is currently non-standard. While implemented in Chromium, it does not yet have a specification and is subject to future change when this does happen. We suggest not to lazy-load iframes using the &lt;code&gt;loading&lt;/code&gt; attribute until it becomes part of the specification. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;See the &lt;code&gt;loading&lt;/code&gt; field of MDN&#39;s
&lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTML/Element/img#Browser_compatibility&quot; rel=&quot;noopener&quot;&gt;browser compatibility&lt;/a&gt;
table for details of browser support.
If the browser does not support lazy loading then the attribute will be ignored
and images will load immediately, as normal.&lt;/p&gt;
&lt;p&gt;For most websites, adding this attribute to inline images will be a performance boost
and save users loading images that they may not ever scroll to.
If you have large numbers of images and want to be sure that users of browsers without support for lazy loading benefit
you will need to combine this with one of the methods explained next.&lt;/p&gt;
&lt;p&gt;To learn more, check out &lt;a href=&quot;https://web.dev/browser-level-image-lazy-loading/&quot;&gt;Browser-level lazy loading for the web&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;images-inline-intersection-observer&quot;&gt;Using Intersection Observer &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/lazy-loading-images/#images-inline-intersection-observer&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To polyfill lazy loading of &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; elements, we use JavaScript to check if they&#39;re in the
viewport. If they are, their &lt;code&gt;src&lt;/code&gt; (and sometimes &lt;code&gt;srcset&lt;/code&gt;) attributes are
populated with URLs to the desired image content.&lt;/p&gt;
&lt;p&gt;If you&#39;ve written lazy loading code before, you may have accomplished your task
by using event handlers such as &lt;code&gt;scroll&lt;/code&gt; or &lt;code&gt;resize&lt;/code&gt;. While this approach is the
most compatible across browsers, modern browsers offer a more performant and
efficient way to do the work of checking element visibility via &lt;a href=&quot;https://developer.chrome.com/blog/intersectionobserver/&quot; rel=&quot;noopener&quot;&gt;the
Intersection Observer API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Intersection Observer is easier to use and read than code relying on various
event handlers, because you only need to register an observer to watch
elements rather than writing tedious element visibility detection code. All
that&#39;s left to do is to decide what to do when an element is visible.
Let&#39;s assume this basic markup pattern for your lazily loaded &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; elements:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;lazy&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;placeholder-image.jpg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;data-src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;image-to-lazy-load-1x.jpg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;data-srcset&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;image-to-lazy-load-2x.jpg 2x, image-to-lazy-load-1x.jpg 1x&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;I&lt;span class=&quot;token punctuation&quot;&gt;&#39;&lt;/span&gt;m an image!&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;There are three relevant pieces of this markup that you should focus on:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The &lt;code&gt;class&lt;/code&gt; attribute, which is what you&#39;ll select the element with in
JavaScript.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;src&lt;/code&gt; attribute, which references a placeholder image that will appear when
the page first loads.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;data-src&lt;/code&gt; and &lt;code&gt;data-srcset&lt;/code&gt; attributes, which are placeholder attributes
containing the URL for the image you&#39;ll load once the element is in the viewport.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now let&#39;s see how to use Intersection Observer in JavaScript to lazy-load
images using this markup pattern:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;DOMContentLoaded&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; lazyImages &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;img.lazy&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;IntersectionObserver&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; lazyImageObserver &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;IntersectionObserver&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;entries&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; observer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;      entries&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;entry&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;entry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;isIntersecting&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;          &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; lazyImage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; entry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;          lazyImage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;src &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; lazyImage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dataset&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;src&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;          lazyImage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;srcset &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; lazyImage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dataset&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;srcset&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;          lazyImage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;remove&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;lazy&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;          lazyImageObserver&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;unobserve&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;lazyImage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    lazyImages&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;lazyImage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;      lazyImageObserver&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;observe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;lazyImage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token comment&quot;&gt;// Possibly fall back to event handlers here&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;On the document&#39;s &lt;code&gt;DOMContentLoaded&lt;/code&gt; event, this script queries the DOM for all
&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; elements with a class of &lt;code&gt;lazy&lt;/code&gt;. If Intersection Observer is available,
create a new observer that runs a callback when &lt;code&gt;img.lazy&lt;/code&gt; elements enter the
viewport.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/lazy-intersection-observer?attributionHidden=true&amp;sidebarCollapsed=true&amp;path=index.html&amp;previewSize=0&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;lazy-intersection-observer on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Intersection Observer is available in all modern browsers.
Therefore using it as a polyfill for &lt;code&gt;loading=&amp;quot;lazy&amp;quot;&lt;/code&gt; will ensure that lazy loading is available for most visitors.&lt;/p&gt;
&lt;h2 id=&quot;images-css&quot;&gt;Images in CSS &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/lazy-loading-images/#images-css&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tags are the most common way of using images on web pages, images
can also be invoked via the CSS
&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/background-image&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;background-image&lt;/code&gt;&lt;/a&gt;
property (and other properties). Browser-level lazy loading does not apply to CSS background images,
so you need to consider other methods if you have background images to lazy-load.&lt;/p&gt;
&lt;p&gt;Unlike &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; elements which load regardless
of their visibility, image loading behavior in CSS is done with more
speculation. When &lt;a href=&quot;https://web.dev/critical-rendering-path-constructing-the-object-model/&quot;&gt;the document and CSS object
models&lt;/a&gt;
and &lt;a href=&quot;https://web.dev/critical-rendering-path-render-tree-construction/&quot;&gt;render
tree&lt;/a&gt;
are built, the browser examines how CSS is applied to a document before
requesting external resources. If the browser has determined a CSS rule
involving an external resource doesn&#39;t apply to the document as it&#39;s currently
constructed, the browser doesn&#39;t request it.&lt;/p&gt;
&lt;p&gt;This speculative behavior can be used to defer the loading of images in CSS by
using JavaScript to determine when an element is within the viewport, and
subsequently applying a class to that element that applies styling invoking a
background image. This causes the image to be downloaded at the time of need
instead of at initial load. For example, let&#39;s take an element that contains a
large hero background image:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;lazy-background&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Here&#39;s a hero heading to get your attention!&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Here&#39;s hero copy to convince you to buy a thing!&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/buy-a-thing&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Buy a thing!&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;div.lazy-background&lt;/code&gt; element would normally contain the hero background
image invoked by some CSS. In this lazy loading example, however, you can isolate
the &lt;code&gt;div.lazy-background&lt;/code&gt; element&#39;s &lt;code&gt;background-image&lt;/code&gt; property via a &lt;code&gt;visible&lt;/code&gt;
class added to the element when it&#39;s in the viewport:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.lazy-background&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;background-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token function&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string url&quot;&gt;&quot;hero-placeholder.jpg&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* Placeholder image */&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token selector&quot;&gt;.lazy-background.visible&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;background-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token function&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string url&quot;&gt;&quot;hero.jpg&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* The final image */&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;From here, use JavaScript to check if the element is in the viewport (with
Intersection Observer!), and add the &lt;code&gt;visible&lt;/code&gt; class to the
&lt;code&gt;div.lazy-background&lt;/code&gt; element at that time, which loads the image:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;DOMContentLoaded&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; lazyBackgrounds &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.lazy-background&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;IntersectionObserver&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; lazyBackgroundObserver &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;IntersectionObserver&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;entries&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; observer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;      entries&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;entry&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;entry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;isIntersecting&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;          entry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;visible&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;          lazyBackgroundObserver&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;unobserve&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;entry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    lazyBackgrounds&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;lazyBackground&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;      lazyBackgroundObserver&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;observe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;lazyBackground&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/lazy-background?attributionHidden=true&amp;sidebarCollapsed=true&amp;path=index.html&amp;previewSize=0&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;lazy-background on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h3 id=&quot;effects-on-largest-contentful-paint-lcp&quot;&gt;Effects on Largest Contentful Paint (LCP) &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/lazy-loading-images/#effects-on-largest-contentful-paint-lcp&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Lazy loading is a great optimization that reduces both overall data usage and network contention during startup by deferring the loading of images to when they&#39;re actually needed. This can improve startup time, and reduce processing on the main thread by reducing time needed for image decodes.&lt;/p&gt;
&lt;p&gt;However, lazy loading is a technique that can affect your website&#39;s &lt;a href=&quot;https://web.dev/lcp/&quot;&gt;Largest Contentful Paint LCP&lt;/a&gt; in a negative way if you&#39;re too eager with the technique. One thing you will want to avoid is lazy loading images that are in the viewport during startup.&lt;/p&gt;
&lt;p&gt;When using JavaScript-based lazy loaders, you will want to avoid lazy loading in-viewport images because these solutions often use a &lt;code&gt;data-src&lt;/code&gt; or &lt;code&gt;data-srcset&lt;/code&gt; attribute as a placeholder for &lt;code&gt;src&lt;/code&gt; and &lt;code&gt;srcset&lt;/code&gt; attributes. The problem here is that the loading of these images will be delayed because &lt;a href=&quot;https://web.dev/preload-scanner/#lazy-loading-with-javascript&quot;&gt;the browser preload scanner can&#39;t find them during startup&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Even using browser-level lazy loading to lazy load an in-viewport image can backfire. When &lt;code&gt;loading=&amp;quot;lazy&amp;quot;&lt;/code&gt; is applied to an in-viewport image, &lt;a href=&quot;https://web.dev/optimize-lcp/#optimize-the-priority-the-resource-is-given&quot;&gt;that image will be delayed until the browser knows for sure it&#39;s in the viewport&lt;/a&gt;, which can affect a page&#39;s LCP.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Never&lt;/em&gt; lazy load images that are visible in the viewport during startup. It&#39;s a pattern that will affect your site&#39;s LCP negatively, and therefore the user experience. If you need an image at startup, load it at startup as quickly as possible by not lazy loading it!&lt;/p&gt;
&lt;h2 id=&quot;libraries&quot;&gt;Lazy loading libraries &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/lazy-loading-images/#libraries&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You should use browser-level lazy loading whenever possible, but if you find yourself in a situation where that isn&#39;t an option—such as a significant group of users still reliant on older browsers—the following libraries can be used to lazy-load images:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/aFarkas/lazysizes&quot; rel=&quot;noopener&quot;&gt;lazysizes&lt;/a&gt; is a full-featured lazy
loading library that lazy-loads images and iframes. The pattern it uses is quite
similar to the code examples shown here in that it automatically binds to a
&lt;code&gt;lazyload&lt;/code&gt; class on &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; elements, and requires you to specify image URLs in
&lt;code&gt;data-src&lt;/code&gt; and/or &lt;code&gt;data-srcset&lt;/code&gt; attributes, the contents of which are swapped
into &lt;code&gt;src&lt;/code&gt; and/or &lt;code&gt;srcset&lt;/code&gt; attributes, respectively. It uses Intersection
Observer (which you can polyfill), and can be extended with &lt;a href=&quot;https://github.com/aFarkas/lazysizes#available-plugins-in-this-repo&quot; rel=&quot;noopener&quot;&gt;a number of
plugins&lt;/a&gt; to
do things like lazy-load video. &lt;a href=&quot;https://web.dev/use-lazysizes-to-lazyload-images/&quot;&gt;Find out more about using lazysizes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/verlok/vanilla-lazyload&quot; rel=&quot;noopener&quot;&gt;vanilla-lazyload&lt;/a&gt; is a
lightweight option for lazy loading images, background images, videos, iframes,
and scripts. It leverages Intersection Observer, supports responsive images, and
enables browser-level lazy loading.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ApoorvSaxena/lozad.js&quot; rel=&quot;noopener&quot;&gt;lozad.js&lt;/a&gt; is a another lightweight
option that uses Intersection Observer only. As such, it&#39;s highly performant,
but will need to be polyfilled before you can use it on older browsers.&lt;/li&gt;
&lt;li&gt;If you need a React-specific lazy loading library, consider
&lt;a href=&quot;https://github.com/jasonslyvia/react-lazyload&quot; rel=&quot;noopener&quot;&gt;react-lazyload&lt;/a&gt;. While it
doesn&#39;t use Intersection Observer, it &lt;em&gt;does&lt;/em&gt; provide a familiar method of lazy
loading images for those accustomed to developing applications with React.&lt;/li&gt;
&lt;/ul&gt;
</content>
    <author>
      <name>Jeremy Wagner</name>
    </author><author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Lazy loading best practices</title>
    <link href="https://web.dev/lazy-loading-best-practices/"/>
    <updated>2019-08-16T00:00:00Z</updated>
    <id>https://web.dev/lazy-loading-best-practices/</id>
    <content type="html" mode="escaped">&lt;p&gt;While lazy loading images and video have positive and measurable performance
benefits, it&#39;s not a task to be taken lightly. If you get it wrong, there could
be unintended consequences. As such, it&#39;s important to keep the following
concerns in mind.&lt;/p&gt;
&lt;h2 id=&quot;wrong-fold&quot;&gt;Mind the fold &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/lazy-loading-best-practices/#wrong-fold&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It may be tempting to lazy-load every single media resource on the page with
JavaScript, but you need to resist this temptation. Anything resting above the
fold shouldn&#39;t be lazy-loaded. Such resources should be considered critical
assets, and thus should be loaded normally.&lt;/p&gt;
&lt;p&gt;Lazy loading delays the loading of resources until after the DOM is interactive
when scripts have finished loading and begin execution. For images below the
fold, this is fine, but critical resources above the fold should be loaded with
the standard &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; element so they&#39;re displayed as soon as possible.&lt;/p&gt;
&lt;p&gt;Of course, where the fold lies is not so clear these days when websites are
viewed on so many screens of varying sizes. What lies above the fold on a laptop
may well lie &lt;em&gt;below&lt;/em&gt; it on mobile devices. There&#39;s no bulletproof advice for
addressing this optimally in every situation. You&#39;ll need to conduct an
inventory of your page&#39;s critical assets, and load those images in typical
fashion.&lt;/p&gt;
&lt;p&gt;Additionally, you may not want to be so strict about the fold line as the
threshold for triggering lazy loading. It may be more ideal for your purposes to
establish a buffer zone some distance below the fold so that images begin
loading well before the user scrolls them into the viewport. For example, the
Intersection Observer API allows you to specify a &lt;code&gt;rootMargin&lt;/code&gt; property in an
options object when you create a new &lt;code&gt;IntersectionObserver&lt;/code&gt; instance. This
effectively gives elements a buffer, which triggers lazy loading behavior before
the element is in the viewport:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; lazyImageObserver &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;IntersectionObserver&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;entries&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; observer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token comment&quot;&gt;// lazy-loading image code goes here&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token literal-property property&quot;&gt;rootMargin&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0px 0px 256px 0px&quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;If the value for &lt;code&gt;rootMargin&lt;/code&gt; looks similar to values you&#39;d specify for a CSS
&lt;code&gt;margin&lt;/code&gt; property, that&#39;s because it is! In this case, the
bottom margin of the observed element (the browser viewport by default, but
this can be changed to a specific element using the &lt;code&gt;root&lt;/code&gt; property) is broadened by 256
pixels. That means the callback function will execute when an image element is
within 256 pixels of the viewport and the image will begin to load
before the user actually sees it.&lt;/p&gt;
&lt;p&gt;To achieve this same effect in browsers that don&#39;t support Intersection Observe, use scroll event handling code and adjust your
&lt;code&gt;getBoundingClientRect&lt;/code&gt; check to include a buffer.&lt;/p&gt;
&lt;h2 id=&quot;wrong-layout-shifting&quot;&gt;Layout shifting and placeholders &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/lazy-loading-best-practices/#wrong-layout-shifting&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Lazy loading media can cause &lt;a href=&quot;https://web.dev/cls&quot;&gt;shifting in the layout&lt;/a&gt; if placeholders aren&#39;t used.
These changes can be disorienting for users and trigger expensive DOM layout
operations that consume system resources and contribute to jank. At a minimum,
consider using a solid color placeholder occupying the same dimensions as the
target image, or techniques such as
&lt;a href=&quot;http://www.guypo.com/introducing-lqip-low-quality-image-placeholders&quot; rel=&quot;noopener&quot;&gt;LQIP&lt;/a&gt; or
&lt;a href=&quot;https://github.com/technopagan/sqip&quot; rel=&quot;noopener&quot;&gt;SQIP&lt;/a&gt; that hint at the content of a media
item before it loads.&lt;/p&gt;
&lt;p&gt;For &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tags, &lt;code&gt;src&lt;/code&gt; should initially point to a placeholder until that
attribute is updated with the final image URL. Use the &lt;code&gt;poster&lt;/code&gt; attribute in a
&lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; element to point to a placeholder image. Additionally, use &lt;code&gt;width&lt;/code&gt; and
&lt;code&gt;height&lt;/code&gt; attributes on both &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; tags. This ensures that
transitioning from placeholders to final images won&#39;t change the rendered size
of the element as media loads.&lt;/p&gt;
&lt;h2 id=&quot;wrong-decoding-delays&quot;&gt;Image decoding delays &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/lazy-loading-best-practices/#wrong-decoding-delays&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Loading large images in JavaScript and dropping them into the DOM can tie up the
main thread, causing the user interface to be unresponsive for a short period of
time while decoding occurs. &lt;a href=&quot;https://medium.com/dailyjs/image-loading-with-image-decode-b03652e7d2d2&quot; rel=&quot;noopener&quot;&gt;Asynchronously decoding images using the &lt;code&gt;decode&lt;/code&gt;
method&lt;/a&gt;
prior to inserting them into the DOM can cut down on this sort of jank, but
beware: It&#39;s not available everywhere yet, and it adds complexity to lazy loading logic.
If you want to use it, you&#39;ll need to check for it. Below shows
how you might use &lt;code&gt;Image.decode()&lt;/code&gt; with a fallback:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; newImage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;newImage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;src &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;my-awesome-image.jpg&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;decode&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; newImage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token comment&quot;&gt;// Fancy decoding logic&lt;/span&gt;&lt;br /&gt;  newImage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;decode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    imageContainer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newImage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token comment&quot;&gt;// Regular image load&lt;/span&gt;&lt;br /&gt;  imageContainer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newImage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Check out &lt;a href=&quot;https://codepen.io/malchata/pen/WzeZGW&quot; rel=&quot;noopener&quot;&gt;this CodePen link&lt;/a&gt; to see
code similar to this example in action. If most of your images are fairly small,
this may not do much for you, but it can certainly help cut down on jank when
lazy loading large images and inserting them into the DOM.&lt;/p&gt;
&lt;h2 id=&quot;wrong-loading-failure&quot;&gt;When stuff doesn&#39;t load &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/lazy-loading-best-practices/#wrong-loading-failure&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sometimes media resources fail to load for one reason or another and errors
occur. When might this happen? It depends, but here&#39;s one hypothetical scenario
for you: You have an HTML caching policy for a short period of time (e.g., five
minutes), and the user visits the site &lt;em&gt;or&lt;/em&gt; a user has a left a stale tab open for
a long period of time (e.g., several hours) and comes back to read your content.
At some point in this process, a redeployment occurs. During this deployment, an
image resource&#39;s name changes due to hash-based versioning, or is removed
altogether. By the time the user lazy-loads the image, the resource is
unavailable, and thus fails.&lt;/p&gt;
&lt;p&gt;While these are relatively rare occurrences, it may behoove you to have a backup
plan if lazy loading fails. For images, such a solution may look something like
this:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; newImage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;newImage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;src &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;my-awesome-image.jpg&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;newImage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onerror&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token comment&quot;&gt;// Decide what to do on error&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;newImage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onload&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token comment&quot;&gt;// Load the image&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;What you decide to do in the event of an error depends on your application. For
example, you could replace the image placeholder area with a button that allows
the user to attempt to load the image again, or simply display an error message
in the image placeholder area.&lt;/p&gt;
&lt;p&gt;Other scenarios could arise as well. Whatever you do, it&#39;s never a bad idea to
signal to the user when an error has occurred, and possibly give them an action
to take if something goes awry.&lt;/p&gt;
&lt;h2 id=&quot;wrong-no-js&quot;&gt;JavaScript availability &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/lazy-loading-best-practices/#wrong-no-js&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It shouldn&#39;t be assumed that JavaScript is always available. If you&#39;re going to
lazy-load images, consider offering &lt;code&gt;&amp;lt;noscript&amp;gt;&lt;/code&gt; markup that will show images in
case JavaScript is unavailable. The simplest possible fallback example involves
using &lt;code&gt;&amp;lt;noscript&amp;gt;&lt;/code&gt; elements to serve images if JavaScript is turned off:&lt;/p&gt;
&lt;!-- An image that eventually gets lazy-loaded by JavaScript --&gt;
&lt;img class=&quot;lazy&quot; src=&quot;https://web.dev/lazy-loading-best-practices/placeholder-image.jpg&quot; data-src=&quot;image-to-lazy-load.jpg&quot; alt=&quot;I&#39;m an image!&quot; /&gt;
&lt;!-- An image that is shown if JavaScript is turned off --&gt;
&lt;noscript&gt;
  &lt;img src=&quot;https://web.dev/lazy-loading-best-practices/image-to-lazy-load.jpg&quot; alt=&quot;I&#39;m an image!&quot; /&gt;
&lt;/noscript&gt;
&lt;p&gt;If JavaScript is turned off, users will see &lt;em&gt;both&lt;/em&gt; the placeholder image and the
image contained with the &lt;code&gt;&amp;lt;noscript&amp;gt;&lt;/code&gt; elements. To get around this, place
a class of &lt;code&gt;no-js&lt;/code&gt; on the &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; tag like so:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;no-js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Then place one line of inline script in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; before any style sheets
are requested via &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; tags that removes the &lt;code&gt;no-js&lt;/code&gt; class from the &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;
element if JavaScript is on:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;documentElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;remove&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;no-js&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Finally, use some CSS to hide elements with a class of lazy when
JavaScript is unavailable:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.no-js .lazy&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;This doesn&#39;t prevent placeholder images from loading, but the outcome is more
desirable. People with JavaScript turned off get something more than placeholder
images, which is better than placeholders and no meaningful image content at
all.&lt;/p&gt;
</content>
    <author>
      <name>Jeremy Wagner</name>
    </author><author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Responsive web design basics</title>
    <link href="https://web.dev/responsive-web-design-basics/"/>
    <updated>2019-02-12T00:00:00Z</updated>
    <id>https://web.dev/responsive-web-design-basics/</id>
    <content type="html" mode="escaped">&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; Take a look at our complete course on Responsive Web Design—&lt;a href=&quot;https://web.dev/learn/design/&quot;&gt;Learn Design&lt;/a&gt;. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;The use of mobile devices to surf the web continues to grow at an astronomical pace, and these devices are often constrained by display size and require a different approach to how content is laid out on the screen.&lt;/p&gt;
&lt;p&gt;Responsive web design, originally defined by &lt;a href=&quot;http://alistapart.com/article/responsive-web-design/&quot; rel=&quot;noopener&quot;&gt;Ethan Marcotte in A List Apart&lt;/a&gt;, responds to the needs of the users and the devices they&#39;re using. The layout changes based on the size and capabilities of the device. For example, on a phone users would see content shown in a single column view; a tablet might show the same content in two columns.&lt;/p&gt;
&lt;figure&gt;
  &lt;video autoplay=&quot;&quot; controls=&quot;&quot; loop=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot;&gt;      &lt;source src=&quot;https://storage.googleapis.com/web-dev-uploads/video/tcFciHGuF3MxnTr1y5ue01OGLBn2/8RKRFvbuoXGkOSuEArb7.mp4&quot; type=&quot;video/mp4&quot; /&gt;    &lt;/video&gt;
  &lt;figcaption&gt;In this video the design moves from a narrow to a wide viewport, responding to the available screen real estate.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;A multitude of different screen sizes exist across phones, &amp;quot;phablets,&amp;quot; tablets, desktops, game consoles, TVs, and even wearables. Screen sizes are always changing, so it&#39;s important that your site can adapt to any screen size, today or in the future. In addition, devices have different features with which we interact with them. For example some of your visitors will be using a touchscreen. Modern responsive design considers all of these things to optimize the experience for everyone.&lt;/p&gt;
&lt;h2 id=&quot;viewport&quot;&gt;Set the viewport &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/responsive-web-design-basics/#viewport&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pages optimized for a variety of devices must include a meta viewport tag in the head of the document.
A meta viewport tag gives the browser instructions on how to control the page&#39;s dimensions and scaling.&lt;/p&gt;
&lt;p&gt;To attempt to provide the best experience, mobile browsers render
the page at a desktop screen width (usually about &lt;code&gt;980px&lt;/code&gt;, though this varies
across devices), and then try to make the content look better by increasing
font sizes and scaling the content to fit the screen.
This means that font sizes may appear inconsistent to users,
who may have to double-tap or pinch-to-zoom
in order to see and interact with the content.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;en&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;    …&lt;/span&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;viewport&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;width=device-width, initial-scale=1&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;    …&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  …&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Using the meta viewport value &lt;code&gt;width=device-width&lt;/code&gt; instructs the page to match
the screen&#39;s width in device-independent pixels. A device (or density) independent pixel being a representation of a single pixel, which may on a high density screen consist of many physical pixels. This allows the page to reflow
content to match different screen sizes, whether rendered on a small mobile
phone or a large desktop monitor.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Screenshot of a page with the text hard to read as it is very zoomed out.&quot; decoding=&quot;async&quot; height=&quot;640&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 500px) 500px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/SrMBH5gokGU06S0GsjLS.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/SrMBH5gokGU06S0GsjLS.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/SrMBH5gokGU06S0GsjLS.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/SrMBH5gokGU06S0GsjLS.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/SrMBH5gokGU06S0GsjLS.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/SrMBH5gokGU06S0GsjLS.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/SrMBH5gokGU06S0GsjLS.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/SrMBH5gokGU06S0GsjLS.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/SrMBH5gokGU06S0GsjLS.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/SrMBH5gokGU06S0GsjLS.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/SrMBH5gokGU06S0GsjLS.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/SrMBH5gokGU06S0GsjLS.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/SrMBH5gokGU06S0GsjLS.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/SrMBH5gokGU06S0GsjLS.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/SrMBH5gokGU06S0GsjLS.png?auto=format&amp;w=1000 1000w&quot; width=&quot;500&quot; /&gt;
  &lt;figcaption&gt;
    An example of how the page loads in a device without the viewport meta tag. &lt;a href=&quot;https://without-vp-meta.glitch.me/&quot;&gt;See this example on Glitch&lt;/a&gt;.
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Screenshot of the same page with the text at a size that can be read.&quot; decoding=&quot;async&quot; height=&quot;888&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 500px) 500px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/9NrJxt3aEv37A3E7km65.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/9NrJxt3aEv37A3E7km65.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/9NrJxt3aEv37A3E7km65.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/9NrJxt3aEv37A3E7km65.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/9NrJxt3aEv37A3E7km65.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/9NrJxt3aEv37A3E7km65.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/9NrJxt3aEv37A3E7km65.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/9NrJxt3aEv37A3E7km65.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/9NrJxt3aEv37A3E7km65.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/9NrJxt3aEv37A3E7km65.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/9NrJxt3aEv37A3E7km65.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/9NrJxt3aEv37A3E7km65.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/9NrJxt3aEv37A3E7km65.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/9NrJxt3aEv37A3E7km65.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/9NrJxt3aEv37A3E7km65.png?auto=format&amp;w=1000 1000w&quot; width=&quot;500&quot; /&gt;
  &lt;figcaption&gt;
    An example of how the page loads in a device with the viewport meta tag. &lt;a href=&quot;https://with-vp-meta.glitch.me/&quot;&gt;See this example on Glitch&lt;/a&gt;.
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;https://css-tricks.com/probably-use-initial-scale1/&quot; rel=&quot;noopener&quot;&gt;Some browsers&lt;/a&gt;
keep the page&#39;s width constant when rotating to landscape
mode, and zoom rather than reflow to fill the screen. Adding the value
&lt;code&gt;initial-scale=1&lt;/code&gt; instructs browsers to establish a 1:1 relationship between CSS
pixels and device-independent pixels regardless of device orientation, and
allows the page to take advantage of the full landscape width.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-bad-bg color-state-bad-text&quot;&gt;&lt;p class=&quot;cluster color-state-bad-text&quot;&gt;&lt;span class=&quot;aside__icon box-block &quot;&gt;&lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;currentColor&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; role=&quot;img&quot; aria-label=&quot;Error sign&quot;&gt;   &lt;path fill-rule=&quot;evenodd&quot; clip-rule=&quot;evenodd&quot; d=&quot;M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 15v-2h2v2h-2zm0-10v6h2V7h-2z&quot;&gt;&lt;/path&gt; &lt;/svg&gt;&lt;/span&gt;&lt;strong&gt;Caution&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot; flow&quot;&gt; To ensure that older browsers can properly parse the attributes, use a comma to separate attributes. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.chrome.com/docs/lighthouse/pwa/viewport/&quot; rel=&quot;noopener&quot;&gt;Does not have a &lt;code&gt;&amp;lt;meta name=&amp;quot;viewport&amp;quot;&amp;gt;&lt;/code&gt; tag with &lt;code&gt;width&lt;/code&gt; or &lt;code&gt;initial-scale&lt;/code&gt;&lt;/a&gt;
Lighthouse audit can help you automate the process of making sure that your HTML documents are using the viewport meta tag correctly.&lt;/p&gt;
&lt;h3 id=&quot;accessible-viewport&quot;&gt;Ensure an accessible viewport &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/responsive-web-design-basics/#accessible-viewport&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In addition to setting an &lt;code&gt;initial-scale&lt;/code&gt;,
you can also set the following attributes on the viewport:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;minimum-scale&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;maximum-scale&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user-scalable&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When set, these can disable the user&#39;s ability to zoom the viewport,
potentially causing accessibility issues.
Therefore we would not recommend using these attributes.&lt;/p&gt;
&lt;h2 id=&quot;size-content&quot;&gt;Size content to the viewport &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/responsive-web-design-basics/#size-content&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;On both desktop and mobile devices,
users are used to scrolling websites vertically but not horizontally;
forcing the user to scroll horizontally or to zoom out
in order to see the whole page results in a poor user experience.&lt;/p&gt;
&lt;p&gt;When developing a mobile site with a meta viewport tag,
it&#39;s easy to accidentally create page content that doesn&#39;t quite fit within the specified viewport.
For example, an image that is displayed at a width wider than the viewport
can cause the viewport to scroll horizontally.
You should adjust this content to fit within the width of the viewport,
so that the user does not need to scroll horizontally.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.chrome.com/docs/lighthouse/pwa/content-width/&quot; rel=&quot;noopener&quot;&gt;Content is not sized correctly for the viewport&lt;/a&gt;
Lighthouse audit can help you automate the process of detecting overflowing content.&lt;/p&gt;
&lt;h3 id=&quot;images&quot;&gt;Images &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/responsive-web-design-basics/#images&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;An image has fixed dimensions and if it is larger than the viewport will cause a scrollbar.
A common way to deal with this problem is to give all images a &lt;code&gt;max-width&lt;/code&gt; of &lt;code&gt;100%&lt;/code&gt;.
This will cause the image to shrink to fit the space it has,
should the viewport size be smaller than the image.
However because the &lt;code&gt;max-width&lt;/code&gt;, rather than the &lt;code&gt;width&lt;/code&gt; is &lt;code&gt;100%&lt;/code&gt;,
the image will not stretch larger than its natural size.
It is generally safe to add the following to your stylesheet
so that you will never have a problem with images causing a scrollbar.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;h4 id=&quot;image-dimensions&quot;&gt;Add the dimensions of the image to the img element &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/responsive-web-design-basics/#image-dimensions&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;When using &lt;code&gt;max-width: 100%&lt;/code&gt; you are overriding the natural dimensions of the image,
however you should still use the &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; attributes on your &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag.
This is because modern browsers will use this information to reserve space for the image
before it loads in,
this will help to avoid &lt;a href=&quot;https://web.dev/optimize-cls/&quot;&gt;layout shifts&lt;/a&gt; as content loads.&lt;/p&gt;
&lt;h3 id=&quot;layout&quot;&gt;Layout &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/responsive-web-design-basics/#layout&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Since screen dimensions and width in CSS pixels vary widely between devices
(for example, between phones and tablets, and even between different phones),
content should not rely on a particular viewport width to render well.&lt;/p&gt;
&lt;p&gt;In the past, this required setting elements used to create layout in percentages.
In the example below, you can see a two-column layout with floated elements, sized using pixels.
Once the viewport becomes smaller than the total width of the columns, we have to scroll horizontally
to see the content.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Screenshot of a two-column layout with most of the second column outside the viewport&quot; decoding=&quot;async&quot; height=&quot;504&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/exFCZNQLUveUnpMFjvcj.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/exFCZNQLUveUnpMFjvcj.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/exFCZNQLUveUnpMFjvcj.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/exFCZNQLUveUnpMFjvcj.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/exFCZNQLUveUnpMFjvcj.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/exFCZNQLUveUnpMFjvcj.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/exFCZNQLUveUnpMFjvcj.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/exFCZNQLUveUnpMFjvcj.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/exFCZNQLUveUnpMFjvcj.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/exFCZNQLUveUnpMFjvcj.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/exFCZNQLUveUnpMFjvcj.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/exFCZNQLUveUnpMFjvcj.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/exFCZNQLUveUnpMFjvcj.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/exFCZNQLUveUnpMFjvcj.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/exFCZNQLUveUnpMFjvcj.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/exFCZNQLUveUnpMFjvcj.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/exFCZNQLUveUnpMFjvcj.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/admin/exFCZNQLUveUnpMFjvcj.jpg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;
    A floated layout using pixels. &lt;a href=&quot;https://layout-floats-px.glitch.me/&quot;&gt;See this example on Glitch&lt;/a&gt;.
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;By using percentages for the widths, the columns always remain a certain percentage of the container.
This means that the columns become narrower, rather than creating a scrollbar.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/layout-floats-percent?attributionHidden=true&amp;sidebarCollapsed=true&amp;path=README.md&amp;previewSize=100&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;layout-floats-percent on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Modern CSS layout techniques such as Flexbox, Grid Layout, and Multicol
make the creation of these flexible grids much easier.&lt;/p&gt;
&lt;h4 id=&quot;flexbox&quot;&gt;Flexbox &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/responsive-web-design-basics/#flexbox&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;This layout method is ideal when you have a set of items of different sizes
and you would like them to fit comfortably in a row or rows,
with smaller items taking less space and larger ones getting more space.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.items&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; flex&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;justify-content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; space-between&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;In a responsive design, you can use Flexbox to display items as a single row,
or wrapped onto multiple rows as the available space decreases.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 220px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/responsive-flexbox?attributionHidden=true&amp;sidebarCollapsed=true&amp;previewSize=100&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;responsive-flexbox on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Learn/CSS/CSS_layout/Flexbox&quot; rel=&quot;noopener&quot;&gt;Read more about Flexbox&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&quot;grid&quot;&gt;CSS Grid Layout &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/responsive-web-design-basics/#grid&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;CSS Grid Layout allows for the straightforward creation of flexible grids.
If we consider the earlier floated example,
rather than creating our columns with percentages,
we could use grid layout and the &lt;code&gt;fr&lt;/code&gt; unit,
which represents a portion of the available space in the container.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;grid-template-columns&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1fr 3fr&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/two-column-grid?attributionHidden=true&amp;sidebarCollapsed=true&amp;previewSize=100&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;two-column-grid on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Grid can also be used to create regular grid layouts,
with as many items as will fit.
The number of available tracks will be reduced as the screen size shrinks.
In the below demo, we have as many cards as will fit on each row,
with a minimum size of &lt;code&gt;200px&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/grid-as-many-as-fit?attributionHidden=true&amp;sidebarCollapsed=true&amp;previewSize=100&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;grid-as-many-as-fit on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Learn/CSS/CSS_layout/Grids&quot; rel=&quot;noopener&quot;&gt;Read more about CSS Grid Layout&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&quot;multicol&quot;&gt;Multiple-column layout &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/responsive-web-design-basics/#multicol&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;For some types of layout you can use Multiple-column Layout (Multicol),
which can create responsive numbers of columns with the &lt;code&gt;column-width&lt;/code&gt; property.
In the demo below, you can see that columns are added if there is room for another &lt;code&gt;200px&lt;/code&gt; column.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/responsive-multicol?attributionHidden=true&amp;sidebarCollapsed=true&amp;path=style.css&amp;previewSize=100&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;responsive-multicol on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Learn/CSS/CSS_layout/Multiple-column_Layout&quot; rel=&quot;noopener&quot;&gt;Read more about Multicol&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;media-queries&quot;&gt;Use CSS media queries for responsiveness &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/responsive-web-design-basics/#media-queries&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sometimes you will need to make more extensive changes to your layout
to support a certain screen size than the techniques shown above will allow.
This is where media queries become useful.&lt;/p&gt;
&lt;p&gt;Media queries are simple filters that can be applied to CSS styles.
They make it easy to change styles based on the types of device rendering the content,
or the features of that device, for example width, height, orientation, ability to hover,
and whether the device is being used as a touchscreen.&lt;/p&gt;
&lt;p&gt;To provide different styles for printing,
you need to target a &lt;em&gt;type&lt;/em&gt; of output so you could include a stylesheet with print styles as follows:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;en&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;    …&lt;/span&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;print.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;media&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;print&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;    …&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Alternatively, you could include print styles within your main stylesheet using a media query:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; print&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token comment&quot;&gt;/* print styles go here */&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; It is also possible to include separate stylesheets in your main CSS file using the &lt;code&gt;@import&lt;/code&gt; syntax, &lt;code&gt;@import url(print.css) print;&lt;/code&gt;, however this use is not recommended for performance reasons. See &lt;a href=&quot;https://web.dev/critical-rendering-path-page-speed-rules-and-recommendations/#avoid-css-imports&quot;&gt;Avoid CSS imports&lt;/a&gt; for more details. &lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;For responsive web design, we are typically querying the &lt;em&gt;features&lt;/em&gt; of the device
in order to provide a different layout for smaller screens,
or when we detect that our visitor is using a touchscreen.&lt;/p&gt;
&lt;h3 id=&quot;viewport-media-queries&quot;&gt;Media queries based on viewport size &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/responsive-web-design-basics/#viewport-media-queries&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Media queries enable us to create a responsive experience
where specific styles are applied to small screens, large screens, and anywhere in between.
The feature we are detecting here is therefore screen size,
and we can test for the following things.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;width&lt;/code&gt; (&lt;code&gt;min-width&lt;/code&gt;, &lt;code&gt;max-width&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;height&lt;/code&gt; (&lt;code&gt;min-height&lt;/code&gt;, &lt;code&gt;max-height&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;orientation&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aspect-ratio&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/media-queries-size?attributionHidden=true&amp;sidebarCollapsed=true&amp;path=index.html&amp;previewSize=100&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;media-queries-size on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;All of these features have excellent browser support,
for more details including browser support information see
&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@media/width&quot; rel=&quot;noopener&quot;&gt;width&lt;/a&gt;,
&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@media/height&quot; rel=&quot;noopener&quot;&gt;height&lt;/a&gt;,
&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@media/orientation&quot; rel=&quot;noopener&quot;&gt;orientation&lt;/a&gt;, and
&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@media/aspect-ratio&quot; rel=&quot;noopener&quot;&gt;aspect-ratio&lt;/a&gt; on MDN.&lt;/p&gt;
&lt;aside class=&quot;aside flow bg-state-info-bg color-state-info-text&quot;&gt;&lt;div class=&quot; flow&quot;&gt; The specification did include tests for &lt;code&gt;device-width&lt;/code&gt; and &lt;code&gt;device-height&lt;/code&gt;. These have been deprecated and should be avoided. &lt;code&gt;device-width&lt;/code&gt; and &lt;code&gt;device-height&lt;/code&gt; tested for the actual size of the device window which was not useful in practice because this may be different from the viewport the user is looking at, for example if they have resized the browser window. &lt;/div&gt;&lt;/aside&gt;
&lt;h3 id=&quot;capability-media-queries&quot;&gt;Media queries based on device capability &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/responsive-web-design-basics/#capability-media-queries&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Given the range of devices available, we cannot make the assumption that every large device is a regular desktop
or laptop computer, or that people are only using a touchscreen on a small device.
With some newer additions to the media queries specification
we can test for features such as the type of pointer used to interact with the device
and whether the user can hover over elements.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hover&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pointer&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;any-hover&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;any-pointer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Try viewing this demo on different devices,
such as a regular desktop computer and a phone or tablet.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/media-query-pointer?attributionHidden=true&amp;sidebarCollapsed=true&amp;previewSize=100&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;media-query-pointer on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;These newer features have good support in all modern browsers. Find out more on the MDN pages for
&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@media/hover&quot; rel=&quot;noopener&quot;&gt;hover&lt;/a&gt;,
&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@media/any-hover&quot; rel=&quot;noopener&quot;&gt;any-hover&lt;/a&gt;,
&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@media/pointer&quot; rel=&quot;noopener&quot;&gt;pointer&lt;/a&gt;,
&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/@media/any-pointer&quot; rel=&quot;noopener&quot;&gt;any-pointer&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&quot;using-any-hover-and-any-pointer&quot;&gt;Using &lt;code&gt;any-hover&lt;/code&gt; and &lt;code&gt;any-pointer&lt;/code&gt; &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/responsive-web-design-basics/#using-any-hover-and-any-pointer&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The features &lt;code&gt;any-hover&lt;/code&gt; and &lt;code&gt;any-pointer&lt;/code&gt; test if the user has the capability
to hover, or use that type of pointer even if it is not the primary way they are interacting with their device.
Be very careful when using these.
Forcing a user to switch to a mouse when they are using their touchscreen is not very friendly!
However, &lt;code&gt;any-hover&lt;/code&gt; and &lt;code&gt;any-pointer&lt;/code&gt; may be useful if it is important to work out what kind of device a user has.
For example, a laptop with a touchscreen and trackpad should match coarse and fine pointers,
in addition to the ability to hover.&lt;/p&gt;
&lt;h2 id=&quot;breakpoints&quot;&gt;How to choose breakpoints &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/responsive-web-design-basics/#breakpoints&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Don&#39;t define breakpoints based on device classes.
Defining breakpoints based on specific devices, products, brand names,
or operating systems that are in use today can result in a maintenance nightmare.
Instead, the content itself should determine how the layout adjusts to its container.&lt;/p&gt;
&lt;h3 id=&quot;major-breakpoints&quot;&gt;Pick major breakpoints by starting small, then working up &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/responsive-web-design-basics/#major-breakpoints&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Design the content to fit on a small screen size first,
then expand the screen until a breakpoint becomes necessary.
This allows you to optimize breakpoints based on content
and maintain the least number of breakpoints possible.&lt;/p&gt;
&lt;p&gt;Let&#39;s work through the example we saw at the beginning: the weather forecast.
The first step is to make the forecast look good on a small screen.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Screenshot of a weather app at a mobile width&quot; decoding=&quot;async&quot; height=&quot;667&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 400px) 400px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/3KPWtKzDFCwImLyHprRP.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/3KPWtKzDFCwImLyHprRP.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/3KPWtKzDFCwImLyHprRP.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/3KPWtKzDFCwImLyHprRP.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/3KPWtKzDFCwImLyHprRP.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/3KPWtKzDFCwImLyHprRP.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/3KPWtKzDFCwImLyHprRP.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/3KPWtKzDFCwImLyHprRP.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/3KPWtKzDFCwImLyHprRP.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/3KPWtKzDFCwImLyHprRP.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/3KPWtKzDFCwImLyHprRP.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/3KPWtKzDFCwImLyHprRP.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/3KPWtKzDFCwImLyHprRP.png?auto=format&amp;w=800 800w&quot; width=&quot;400&quot; /&gt;
  &lt;figcaption&gt;
    The app at a narrow width.
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Next, resize the browser until there is too much white space between the elements,
and the forecast simply doesn&#39;t look as good.
The decision is somewhat subjective, but above &lt;code&gt;600px&lt;/code&gt; is certainly too wide.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Screenshot of a weather app with wide gaps between items&quot; decoding=&quot;async&quot; height=&quot;240&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 400px) 400px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/sh1P84rvjvviENlVFED4.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/sh1P84rvjvviENlVFED4.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/sh1P84rvjvviENlVFED4.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/sh1P84rvjvviENlVFED4.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/sh1P84rvjvviENlVFED4.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/sh1P84rvjvviENlVFED4.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/sh1P84rvjvviENlVFED4.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/sh1P84rvjvviENlVFED4.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/sh1P84rvjvviENlVFED4.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/sh1P84rvjvviENlVFED4.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/sh1P84rvjvviENlVFED4.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/sh1P84rvjvviENlVFED4.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/sh1P84rvjvviENlVFED4.png?auto=format&amp;w=800 800w&quot; width=&quot;400&quot; /&gt;
  &lt;figcaption&gt;
    The app at a point where we feel we should tweak the design.
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;To insert a breakpoint at &lt;code&gt;600px&lt;/code&gt;, create two media queries at the end of your CSS for the component,
one to use when the browser is &lt;code&gt;600px&lt;/code&gt; and below, and one for when it is wider than &lt;code&gt;600px&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 600px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 601px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Finally, refactor the CSS. Inside the media query for a &lt;code&gt;max-width&lt;/code&gt; of &lt;code&gt;600px&lt;/code&gt;,
add the CSS which is only for small screens. Inside the media query for a
&lt;code&gt;min-width&lt;/code&gt; of &lt;code&gt;601px&lt;/code&gt; add CSS for larger screens.&lt;/p&gt;
&lt;h4 id=&quot;pick-minor-breakpoints-when-necessary&quot;&gt;Pick minor breakpoints when necessary &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/responsive-web-design-basics/#pick-minor-breakpoints-when-necessary&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;In addition to choosing major breakpoints when layout changes significantly,
it is also helpful to adjust for minor changes.
For example, between major breakpoints it may be helpful to adjust the margins or padding on an element,
or increase the font size to make it feel more natural in the layout.&lt;/p&gt;
&lt;p&gt;Let&#39;s start by optimizing the small screen layout.
In this case, let&#39;s boost the font when the viewport width is greater than &lt;code&gt;360px&lt;/code&gt;.
Second, when there is enough space,
we can separate the high and low temperatures so that they&#39;re on the same line
instead of on top of each other.
And let&#39;s also make the weather icons a bit larger.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 360px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1.0em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 500px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;.seven-day-fc .temp-low,&lt;br /&gt;  .seven-day-fc .temp-high&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inline-block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 45%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;.seven-day-fc .seven-day-temp&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;margin-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;.seven-day-fc .icon&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 64px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 64px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Similarly, for the large screens it&#39;s best to limit to maximum width of the forecast panel
so it doesn&#39;t consume the whole screen width.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 700px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;.weather-forecast&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 700px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/responsive-forecast?attributionHidden=true&amp;sidebarCollapsed=true&amp;path=style.css&amp;previewSize=100&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;responsive-forecast on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h3 id=&quot;optimize-text-for-reading&quot;&gt;Optimize text for reading &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/responsive-web-design-basics/#optimize-text-for-reading&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Classic readability theory suggests that an ideal column should contain 70 to 80 characters per line
(about 8 to 10 words in English).
Thus, each time the width of a text block grows past about 10 words,
consider adding a breakpoint.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Screenshot of a a page of text on a mobile device&quot; decoding=&quot;async&quot; height=&quot;488&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 400px) 400px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/C4IGJw9hbPXKnTSovEXS.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/C4IGJw9hbPXKnTSovEXS.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/C4IGJw9hbPXKnTSovEXS.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/C4IGJw9hbPXKnTSovEXS.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/C4IGJw9hbPXKnTSovEXS.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/C4IGJw9hbPXKnTSovEXS.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/C4IGJw9hbPXKnTSovEXS.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/C4IGJw9hbPXKnTSovEXS.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/C4IGJw9hbPXKnTSovEXS.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/C4IGJw9hbPXKnTSovEXS.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/C4IGJw9hbPXKnTSovEXS.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/C4IGJw9hbPXKnTSovEXS.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/C4IGJw9hbPXKnTSovEXS.jpg?auto=format&amp;w=800 800w&quot; width=&quot;400&quot; /&gt;
  &lt;figcaption&gt;
    The text as read on a mobile device.
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Screenshot of a a page of text on a desktop browser&quot; decoding=&quot;async&quot; height=&quot;377&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/rmsa1EB5FpvWV0vFIpTF.jpg?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/rmsa1EB5FpvWV0vFIpTF.jpg?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/rmsa1EB5FpvWV0vFIpTF.jpg?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/rmsa1EB5FpvWV0vFIpTF.jpg?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/rmsa1EB5FpvWV0vFIpTF.jpg?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/rmsa1EB5FpvWV0vFIpTF.jpg?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/rmsa1EB5FpvWV0vFIpTF.jpg?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/rmsa1EB5FpvWV0vFIpTF.jpg?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/rmsa1EB5FpvWV0vFIpTF.jpg?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/rmsa1EB5FpvWV0vFIpTF.jpg?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/rmsa1EB5FpvWV0vFIpTF.jpg?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/rmsa1EB5FpvWV0vFIpTF.jpg?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/rmsa1EB5FpvWV0vFIpTF.jpg?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/rmsa1EB5FpvWV0vFIpTF.jpg?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/rmsa1EB5FpvWV0vFIpTF.jpg?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/rmsa1EB5FpvWV0vFIpTF.jpg?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/rmsa1EB5FpvWV0vFIpTF.jpg?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/admin/rmsa1EB5FpvWV0vFIpTF.jpg?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;
    The text as read on a desktop browser with a breakpoint added to constrain the line length.
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Let&#39;s take a deeper look at the above blog post example.
On smaller screens, the Roboto font at &lt;code&gt;1em&lt;/code&gt; works perfectly giving 10 words per line,
but larger screens require a breakpoint.
In this case, if the browser width is greater than &lt;code&gt;575px&lt;/code&gt;, the ideal content width is &lt;code&gt;550px&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 575px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token selector&quot;&gt;article&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 550px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;margin-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token property&quot;&gt;margin-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/rwd-reading?attributionHidden=true&amp;sidebarCollapsed=true&amp;path=index.html&amp;previewSize=100&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;rwd-reading on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h3 id=&quot;avoid-simply-hiding-content&quot;&gt;Avoid simply hiding content &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/responsive-web-design-basics/#avoid-simply-hiding-content&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Be careful when choosing what content to hide or show depending on screen size.
Don&#39;t simply hide content just because you can&#39;t fit it on the screen.
Screen size is not a definitive indication of what a user may want.
For example, eliminating the pollen count from the weather forecast
could be a serious issue for spring-time allergy sufferers who need the information
to determine if they can go outside or not.&lt;/p&gt;
&lt;h2 id=&quot;devtools&quot;&gt;View media query breakpoints in Chrome DevTools &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/responsive-web-design-basics/#devtools&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Once you&#39;ve got your media query breakpoints set up,
you&#39;ll want to see how your site looks with them.
You could resize your browser window to trigger the breakpoints,
but Chrome DevTools has a built-in feature that makes it easy to see how a page looks
under different breakpoints.&lt;/p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Screenshot of DevTools with our weather app open and a width of 822 pixels selected.&quot; decoding=&quot;async&quot; height=&quot;522&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/DhaeCbVo5AmzZ0CyLtVp.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/DhaeCbVo5AmzZ0CyLtVp.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/DhaeCbVo5AmzZ0CyLtVp.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/DhaeCbVo5AmzZ0CyLtVp.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/DhaeCbVo5AmzZ0CyLtVp.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/DhaeCbVo5AmzZ0CyLtVp.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/DhaeCbVo5AmzZ0CyLtVp.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/DhaeCbVo5AmzZ0CyLtVp.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/DhaeCbVo5AmzZ0CyLtVp.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/DhaeCbVo5AmzZ0CyLtVp.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/DhaeCbVo5AmzZ0CyLtVp.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/DhaeCbVo5AmzZ0CyLtVp.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/DhaeCbVo5AmzZ0CyLtVp.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/DhaeCbVo5AmzZ0CyLtVp.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/DhaeCbVo5AmzZ0CyLtVp.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/DhaeCbVo5AmzZ0CyLtVp.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/DhaeCbVo5AmzZ0CyLtVp.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/admin/DhaeCbVo5AmzZ0CyLtVp.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;
    DevTools showing the weather app as it looks at a wider viewport size.
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Screenshot of DevTools with our weather app open and a width of 436 pixels selected.&quot; decoding=&quot;async&quot; height=&quot;521&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, calc(100vw - 48px)&quot; src=&quot;https://web-dev.imgix.net/image/admin/35IEQnhGox93PHvbeglM.png?auto=format&quot; srcset=&quot;https://web-dev.imgix.net/image/admin/35IEQnhGox93PHvbeglM.png?auto=format&amp;w=200 200w, https://web-dev.imgix.net/image/admin/35IEQnhGox93PHvbeglM.png?auto=format&amp;w=228 228w, https://web-dev.imgix.net/image/admin/35IEQnhGox93PHvbeglM.png?auto=format&amp;w=260 260w, https://web-dev.imgix.net/image/admin/35IEQnhGox93PHvbeglM.png?auto=format&amp;w=296 296w, https://web-dev.imgix.net/image/admin/35IEQnhGox93PHvbeglM.png?auto=format&amp;w=338 338w, https://web-dev.imgix.net/image/admin/35IEQnhGox93PHvbeglM.png?auto=format&amp;w=385 385w, https://web-dev.imgix.net/image/admin/35IEQnhGox93PHvbeglM.png?auto=format&amp;w=439 439w, https://web-dev.imgix.net/image/admin/35IEQnhGox93PHvbeglM.png?auto=format&amp;w=500 500w, https://web-dev.imgix.net/image/admin/35IEQnhGox93PHvbeglM.png?auto=format&amp;w=571 571w, https://web-dev.imgix.net/image/admin/35IEQnhGox93PHvbeglM.png?auto=format&amp;w=650 650w, https://web-dev.imgix.net/image/admin/35IEQnhGox93PHvbeglM.png?auto=format&amp;w=741 741w, https://web-dev.imgix.net/image/admin/35IEQnhGox93PHvbeglM.png?auto=format&amp;w=845 845w, https://web-dev.imgix.net/image/admin/35IEQnhGox93PHvbeglM.png?auto=format&amp;w=964 964w, https://web-dev.imgix.net/image/admin/35IEQnhGox93PHvbeglM.png?auto=format&amp;w=1098 1098w, https://web-dev.imgix.net/image/admin/35IEQnhGox93PHvbeglM.png?auto=format&amp;w=1252 1252w, https://web-dev.imgix.net/image/admin/35IEQnhGox93PHvbeglM.png?auto=format&amp;w=1428 1428w, https://web-dev.imgix.net/image/admin/35IEQnhGox93PHvbeglM.png?auto=format&amp;w=1600 1600w&quot; width=&quot;800&quot; /&gt;
  &lt;figcaption&gt;
    DevTools showing the weather app as it looks at a narrower viewport size.
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;To view your page under different breakpoints:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.chrome.com/docs/devtools/open/&quot; rel=&quot;noopener&quot;&gt;Open DevTools&lt;/a&gt;
and then turn on &lt;a href=&quot;https://developer.chrome.com/docs/devtools/device-mode/#toggle&quot; rel=&quot;noopener&quot;&gt;Device Mode&lt;/a&gt;.
This opens in &lt;a href=&quot;https://developer.chrome.com/docs/devtools/device-mode/#responsive&quot; rel=&quot;noopener&quot;&gt;responsive mode&lt;/a&gt; by default.&lt;/p&gt;
&lt;p&gt;To see your media queries, open the Device Mode menu and select
&lt;a href=&quot;https://developer.chrome.com/docs/devtools/device-mode/#queries&quot; rel=&quot;noopener&quot;&gt;Show media queries&lt;/a&gt;
to display your breakpoints as colored bars above your page.&lt;/p&gt;
&lt;p&gt;Click on one of the bars to view your page while that media query is active.
Right-click on a bar to jump to the media query&#39;s definition.&lt;/p&gt;
</content>
    <author>
      <name>Pete LePage</name>
    </author><author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
  
  <entry>
    <title>Using the HTML5 Drag and Drop API</title>
    <link href="https://web.dev/drag-and-drop/"/>
    <updated>2010-09-30T00:00:00Z</updated>
    <id>https://web.dev/drag-and-drop/</id>
    <content type="html" mode="escaped">&lt;p&gt;The HTML5 Drag and Drop API means that we can make almost any element on our page draggable.
In this post we&#39;ll explain the basics of drag and drop.&lt;/p&gt;
&lt;h2 id=&quot;creating-draggable-content&quot;&gt;Creating draggable content &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/drag-and-drop/#creating-draggable-content&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It&#39;s worth noting that in most browsers, text selections, images, and links are
draggable by default. For example, if you drag a link on a web page you will see
a small box with a title and URL. You can drop this box on the address bar or
the desktop to create a shortcut or to navigate to the link. To make other types
of content draggable you need to use the HTML5 Drag and Drop APIs.&lt;/p&gt;
&lt;p&gt;To make an object draggable set &lt;code&gt;draggable=true&lt;/code&gt; on that element. Just about anything can be
drag-enabled: images, files, links, files, or any markup on your page.&lt;/p&gt;
&lt;p&gt;Our example creates an interface to rearrange columns that have been laid out with
CSS Grid. The basic markup for the columns looks like this, with each column having the &lt;code&gt;draggable&lt;/code&gt;
attribute set to &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;container&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;draggable&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;box&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;A&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;draggable&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;box&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;B&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;draggable&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;box&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;C&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Here&#39;s the CSS for the container and box elements. Note that the only CSS related to drag and drop
functionality is the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/cursor&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cursor: move&lt;/code&gt;&lt;/a&gt; property.
The rest of the code just controls the layout and styling of the container and box elements.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;grid-template-columns&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;repeat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;5&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 1fr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;gap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.box&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 3px solid #666&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #ddd&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;border-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; .5em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;  &lt;span class=&quot;token property&quot;&gt;cursor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; move&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;At this point you will find that you can drag the items, however nothing else will happen. To add
the drag and drop functionality we need to use the JavaScript API.&lt;/p&gt;
&lt;h2 id=&quot;listening-for-dragging-events&quot;&gt;Listening for dragging events &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/drag-and-drop/#listening-for-dragging-events&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There are a number of different events to attach to for monitoring the entire drag and drop process.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/Document/dragstart_event&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;dragstart&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/Document/drag_event&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;drag&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/Document/dragenter_event&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;dragenter&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/Document/dragleave_event&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;dragleave&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/Document/dragover_event&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;dragover&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/Document/drop_event&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;drop&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/Document/dragend_event&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;dragend&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To handle the drag and drop flow, you need some kind of source element (where the drag originates), the data
payload (what you&#39;re trying to drop), and a target (an area to catch the drop). The source element
can be an image, list, link, file object, block of HTML, etc. The target is the drop zone (or set of
drop zones) that accepts the data the user is trying to drop. Keep in mind that not all elements can
be targets, for example an image can&#39;t be a target.&lt;/p&gt;
&lt;h2 id=&quot;starting-and-ending-a-drag-and-drop-sequence&quot;&gt;Starting and ending a drag and drop sequence &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/drag-and-drop/#starting-and-ending-a-drag-and-drop-sequence&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Once you have &lt;code&gt;draggable=&amp;quot;true&amp;quot;&lt;/code&gt; attributes defined on your content, attach a &lt;code&gt;dragstart&lt;/code&gt; event
handler to kick off the drag and drop sequence for each column.&lt;/p&gt;
&lt;p&gt;This code will set the column&#39;s opacity to 40% when the user begins dragging it, then return it to
100% when the dragging event ends.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handleDragStart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;opacity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;0.4&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handleDragEnd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;opacity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;1&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; items &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.container .box&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;items&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;dragstart&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; handleDragStart&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;dragend&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; handleDragEnd&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;The result can be seen in the Glitch demo below. Drag an item and it becomes opaque. As the
&lt;code&gt;dragstart&lt;/code&gt; event&#39;s target is the source element, setting &lt;code&gt;this.style.opacity&lt;/code&gt; to 40% gives the user
visual feedback that the element is the current selection being moved. Once you drop the item,
although the drop functionality is not in place, the source element returns to 100% opacity.&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/simple-drag-and-drop-1?attributionHidden=true&amp;sidebarCollapsed=true&amp;path=style.css&amp;previewSize=100&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;simple-drag-and-drop-1 on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id=&quot;add-additional-visual-cues-with-dragenter,-dragover,-and-dragleave&quot;&gt;Add additional visual cues with &lt;code&gt;dragenter&lt;/code&gt;, &lt;code&gt;dragover&lt;/code&gt;, and &lt;code&gt;dragleave&lt;/code&gt; &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/drag-and-drop/#add-additional-visual-cues-with-dragenter,-dragover,-and-dragleave&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To help the user understand how to interact with your interface, use the &lt;code&gt;dragenter&lt;/code&gt;, &lt;code&gt;dragover&lt;/code&gt; and
&lt;code&gt;dragleave&lt;/code&gt; event handlers. In this example the columns are drop targets in addition to being
draggable. Help the user to understand this by making the border dashed as they hold a dragged item
over a column. For example, in your CSS you might create an &lt;code&gt;over&lt;/code&gt; class to represent elements that
are drop targets:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.box.over&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token property&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 3px dotted #666&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Then, in your JavaScript set up the event handlers, add the &lt;code&gt;over&lt;/code&gt; class when the column is dragged
over, and remove it when we leave. In the &lt;code&gt;dragend&lt;/code&gt; handler we also make sure to remove the classes
at the end of the drag.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;DOMContentLoaded&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handleDragStart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;opacity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;0.4&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handleDragEnd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;opacity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;1&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;    items&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;      item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;remove&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;over&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handleDragOver&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;    e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;preventDefault&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handleDragEnter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;over&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handleDragLeave&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;remove&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;over&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; items &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.container .box&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;  items&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;    item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;dragstart&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; handleDragStart&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;    item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;dragover&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; handleDragOver&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;    item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;dragenter&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; handleDragEnter&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;    item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;dragleave&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; handleDragLeave&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;    item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;dragend&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; handleDragEnd&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;    item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;drop&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; handleDrop&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/mark&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/simple-drag-drop2?attributionHidden=true&amp;sidebarCollapsed=true&amp;path=dnd.js&amp;previewSize=100&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;simple-drag-drop2 on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;There are a couple of points worth covering in this code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/Document/dragover_event#browser_compatibility&quot; rel=&quot;noopener&quot;&gt;default
action&lt;/a&gt;
for &lt;code&gt;dragover&lt;/code&gt; event is to set the &lt;code&gt;dataTransfer.dropEffect&lt;/code&gt; property to
&lt;code&gt;&amp;quot;none&amp;quot;&lt;/code&gt;. The &lt;code&gt;dropEffect&lt;/code&gt; property is covered later in this article. For now,
just know that it prevents the &lt;code&gt;drop&lt;/code&gt; event from being fired. To override this
behavior, call &lt;code&gt;e.preventDefault()&lt;/code&gt;. Another good practice is to return
&lt;code&gt;false&lt;/code&gt; in that same handler.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;dragenter&lt;/code&gt; event handler is used to toggle the &lt;code&gt;over&lt;/code&gt; class instead of &lt;code&gt;dragover&lt;/code&gt;. If you use
&lt;code&gt;dragover&lt;/code&gt;, the CSS class would be toggled many times as the event &lt;code&gt;dragover&lt;/code&gt; continued to fire on
a column hover. Ultimately, that would cause the browser&#39;s renderer to do a large amount of
unnecessary work. Keeping redraws to a minimum is always a good idea. If you need to use the
&lt;code&gt;dragover&lt;/code&gt; event for something, consider
&lt;a href=&quot;https://css-tricks.com/debouncing-throttling-explained-examples/&quot; rel=&quot;noopener&quot;&gt;throttling or debouncing your event listener&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;completing-the-drop&quot;&gt;Completing the drop &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/drag-and-drop/#completing-the-drop&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To process the actual drop, add an event listener for the &lt;code&gt;drop&lt;/code&gt; event. In the &lt;code&gt;drop&lt;/code&gt; handler,
you&#39;ll need to prevent the browser&#39;s default behavior for drops, which is typically some sort of
annoying redirect. You can prevent the event from bubbling up the DOM by calling
&lt;code&gt;e.stopPropagation()&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handleDrop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stopPropagation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// stops the browser from redirecting.&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Be sure to register the new handler in amongst the other handlers:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; items &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.container .box&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  items&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;    item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;dragstart&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; handleDragStart&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;    item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;dragover&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; handleDragOver&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;    item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;dragenter&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; handleDragEnter&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;    item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;dragleave&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; handleDragLeave&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;    item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;dragend&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; handleDragEnd&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;    item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;drop&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; handleDrop&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;If you run the code at this point, the item will not drop to the new location. To achieve this you
need to use the &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/DataTransfer&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;DataTransfer&lt;/code&gt;&lt;/a&gt; object.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;dataTransfer&lt;/code&gt; property is where all the drag and drop magic happens. It holds the piece of data sent in a
drag action. &lt;code&gt;dataTransfer&lt;/code&gt; is set in the &lt;code&gt;dragstart&lt;/code&gt; event and read/handled in the drop event.
Calling &lt;code&gt;e.dataTransfer.setData(mimeType, dataPayload)&lt;/code&gt; lets you set the object&#39;s MIME type and data
payload.&lt;/p&gt;
&lt;p&gt;In this example, we&#39;re going to allow users to rearrange the order of the columns. To do that, first
you need to store the source element&#39;s HTML when the drag starts:&lt;/p&gt;
  &lt;figure&gt;
    &lt;video controls=&quot;&quot; autoplay=&quot;&quot; loop=&quot;&quot; muted=&quot;&quot;&gt;
      &lt;source src=&quot;https://storage.googleapis.com/web-dev-assets/drag-and-drop/webdev-dnd.mp4&quot; type=&quot;video/mp4&quot; /&gt;
    &lt;/video&gt;
  &lt;/figure&gt;
&lt;div&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handleDragStart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;opacity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;0.4&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;  dragSrcEl &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;  e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dataTransfer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;effectAllowed &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;move&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;  e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dataTransfer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;text/html&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerHTML&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;In the &lt;code&gt;drop&lt;/code&gt; event you process the column drop, setting the source column&#39;s HTML to the HTML of the
target column that you dropped on, first checking that the user is not dropping back onto the same
column they dragged from.&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handleDrop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stopPropagation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dragSrcEl &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;    dragSrcEl&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerHTML &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerHTML&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;    &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerHTML &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dataTransfer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;text/html&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;&lt;/mark&gt;&lt;br /&gt;&lt;mark class=&quot;highlight-line highlight-line-active&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/mark&gt;&lt;br /&gt;&lt;span class=&quot;highlight-line&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;You can see the result in the following demo. For this to work, you&#39;ll need a
desktop browser. The Drag and Drop API isn&#39;t supported on mobile. Drag and
release the A column on top of the B column and notice how they change places:&lt;/p&gt;
&lt;div class=&quot;glitch-embed-wrap&quot; style=&quot;height: 420px; width: 100%;&quot;&gt;
  &lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi&quot; loading=&quot;lazy&quot; src=&quot;https://glitch.com/embed/#!/embed/simple-drag-drop?attributionHidden=true&amp;sidebarCollapsed=true&amp;path=dnd.js&amp;previewSize=100&quot; style=&quot;height: 100%; width: 100%; border: 0;&quot; title=&quot;simple-drag-drop on Glitch&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id=&quot;more-dragging-properties&quot;&gt;More dragging properties &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/drag-and-drop/#more-dragging-properties&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;dataTransfer&lt;/code&gt; object exposes properties to provide visual feedback to the user during the drag
process. These properties can also be used to control how each drop target responds to a particular
data type.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/DataTransfer/effectAllowed&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;dataTransfer.effectAllowed&lt;/code&gt;&lt;/a&gt;
restricts what &#39;type of drag&#39; the user can perform on the element. It is used in the drag-and-drop
processing model to initialize the &lt;code&gt;dropEffect&lt;/code&gt; during the &lt;code&gt;dragenter&lt;/code&gt; and &lt;code&gt;dragover&lt;/code&gt; events. The
property can be set to the following values: &lt;code&gt;none&lt;/code&gt;, &lt;code&gt;copy&lt;/code&gt;, &lt;code&gt;copyLink&lt;/code&gt;, &lt;code&gt;copyMove&lt;/code&gt;, &lt;code&gt;link&lt;/code&gt;,
&lt;code&gt;linkMove&lt;/code&gt;, &lt;code&gt;move&lt;/code&gt;, &lt;code&gt;all&lt;/code&gt;, and &lt;code&gt;uninitialized&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/DataTransfer/dropEffect&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;dataTransfer.dropEffect&lt;/code&gt;&lt;/a&gt;
controls the feedback that the user is given during the &lt;code&gt;dragenter&lt;/code&gt; and &lt;code&gt;dragover&lt;/code&gt; events. When
the user hovers over a target element, the browser&#39;s cursor indicates what type of operation
is going to take place (e.g. a copy, a move, etc.). The effect can take one of the following
values: &lt;code&gt;none&lt;/code&gt;, &lt;code&gt;copy&lt;/code&gt;, &lt;code&gt;link&lt;/code&gt;, &lt;code&gt;move&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/DataTransfer/setDragImage&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;e.dataTransfer.setDragImage(imgElement, x, y)&lt;/code&gt;&lt;/a&gt;
means that instead of using the browser&#39;s default &#39;ghost image&#39; feedback, you can optionally set a
drag icon.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;file-upload-with-drag-and-drop&quot;&gt;File upload with drag and drop &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/drag-and-drop/#file-upload-with-drag-and-drop&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This simple example uses a column as both the drag source and drag target. This might be seen in a
UI where the user is asked to rearrange the items. In some situations the drag target and source may
be different, such as an interface where the user needs to select one image to be the main image for
a product by dragging the selected image onto a target.&lt;/p&gt;
&lt;p&gt;Drag and Drop is frequently used to allow users to drag items from their desktop into an
application. The main difference is in your &lt;code&gt;drop&lt;/code&gt; handler. Instead of using
&lt;code&gt;dataTransfer.getData()&lt;/code&gt; to access the files, their data will be contained in the
&lt;code&gt;dataTransfer.files&lt;/code&gt; property:&lt;/p&gt;
&lt;div&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handleDrop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stopPropagation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Stops some browsers from redirecting.&lt;/span&gt;&lt;br /&gt;  e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;preventDefault&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; files &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dataTransfer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;files&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; f&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;f &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; files&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token comment&quot;&gt;// Read the File objects in this FileList.&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;You can find more information about this in &lt;a href=&quot;https://web.dev/read-files/#select-dnd&quot;&gt;Custom drag-and-drop&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;more-resources&quot;&gt;More resources &lt;a class=&quot;headline-link&quot; href=&quot;https://web.dev/drag-and-drop/#more-resources&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://html.spec.whatwg.org/multipage/dnd.html#dnd&quot; rel=&quot;noopener&quot;&gt;The Drag and Drop Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/HTML_Drag_and_Drop_API&quot; rel=&quot;noopener&quot;&gt;MDN HTML Drag and Drop API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2018/01/drag-drop-file-uploader-vanilla-js/&quot; rel=&quot;noopener&quot;&gt;How To Make A Drag-and-Drop File Uploader With Vanilla JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/creating-a-parking-game-with-the-html-drag-and-drop-api/&quot; rel=&quot;noopener&quot;&gt;Creating a Parking Game With the HTML Drag and Drop API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2020/02/html-drag-drop-api-react/&quot; rel=&quot;noopener&quot;&gt;How To Use The HTML Drag-and-Drop API In React&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    <author>
      <name>Eric Bidelman</name>
    </author><author>
      <name>Rachel Andrew</name>
    </author>
  </entry>
</feed>
