CINXE.COM
web.dev
<!doctype html> <html lang="en" dir="ltr"> <head> <meta name="google-signin-client-id" content="157101835696-ooapojlodmuabs2do2vuhhnf90bccmoi.apps.googleusercontent.com"> <meta name="google-signin-scope" content="profile email https://www.googleapis.com/auth/developerprofiles https://www.googleapis.com/auth/developerprofiles.award"> <meta property="og:site_name" content="web.dev"> <meta property="og:type" content="website"><meta name="theme-color" content="#3740ff"><meta charset="utf-8"> <meta content="IE=Edge" http-equiv="X-UA-Compatible"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="manifest" href="/_pwa/web/manifest.json" crossorigin="use-credentials"> <link rel="preconnect" href="//www.gstatic.com" crossorigin> <link rel="preconnect" href="//fonts.gstatic.com" crossorigin> <link rel="preconnect" href="//fonts.googleapis.com" crossorigin> <link rel="preconnect" href="//apis.google.com" crossorigin> <link rel="preconnect" href="//www.google-analytics.com" crossorigin><link rel="stylesheet" href="//fonts.googleapis.com/css?family=Google+Sans:400,500|Roboto:400,400italic,500,500italic,700,700italic|Roboto+Mono:400,500,700&display=swap"> <link rel="stylesheet" href="//fonts.googleapis.com/css2?family=Material+Icons&family=Material+Symbols+Outlined&display=block"><link rel="stylesheet" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/web/css/app.css"> <link rel="stylesheet" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/web/css/dark-theme.css" disabled> <link rel="shortcut icon" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/web/images/favicon.png"> <link rel="apple-touch-icon" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/web/images/touchicon-180.png"><link rel="canonical" href="https://web.dev/"><link rel="search" type="application/opensearchdescription+xml" title="web.dev" href="https://web.dev/s/opensearch.xml"> <link rel="alternate" hreflang="en" href="https://web.dev/" /><link rel="alternate" hreflang="x-default" href="https://web.dev/" /><link rel="alternate" hreflang="ar" href="https://web.dev/?hl=ar" /><link rel="alternate" hreflang="bn" href="https://web.dev/?hl=bn" /><link rel="alternate" hreflang="zh-Hans" href="https://web.dev/?hl=zh-cn" /><link rel="alternate" hreflang="zh-Hant" href="https://web.dev/?hl=zh-tw" /><link rel="alternate" hreflang="fa" href="https://web.dev/?hl=fa" /><link rel="alternate" hreflang="fr" href="https://web.dev/?hl=fr" /><link rel="alternate" hreflang="de" href="https://web.dev/?hl=de" /><link rel="alternate" hreflang="he" href="https://web.dev/?hl=he" /><link rel="alternate" hreflang="hi" href="https://web.dev/?hl=hi" /><link rel="alternate" hreflang="id" href="https://web.dev/?hl=id" /><link rel="alternate" hreflang="it" href="https://web.dev/?hl=it" /><link rel="alternate" hreflang="ja" href="https://web.dev/?hl=ja" /><link rel="alternate" hreflang="ko" href="https://web.dev/?hl=ko" /><link rel="alternate" hreflang="pl" href="https://web.dev/?hl=pl" /><link rel="alternate" hreflang="pt-BR" href="https://web.dev/?hl=pt-br" /><link rel="alternate" hreflang="ru" href="https://web.dev/?hl=ru" /><link rel="alternate" hreflang="es-419" href="https://web.dev/?hl=es-419" /><link rel="alternate" hreflang="th" href="https://web.dev/?hl=th" /><link rel="alternate" hreflang="tr" href="https://web.dev/?hl=tr" /><link rel="alternate" hreflang="vi" href="https://web.dev/?hl=vi" /><link rel="alternate" hreflang="en-cn" href="https://web.developers.google.cn/" /><link rel="alternate" hreflang="x-default" href="https://web.developers.google.cn/" /><link rel="alternate" hreflang="ar-cn" href="https://web.developers.google.cn/?hl=ar" /><link rel="alternate" hreflang="bn-cn" href="https://web.developers.google.cn/?hl=bn" /><link rel="alternate" hreflang="zh-Hans-cn" href="https://web.developers.google.cn/?hl=zh-cn" /><link rel="alternate" hreflang="zh-Hant-cn" href="https://web.developers.google.cn/?hl=zh-tw" /><link rel="alternate" hreflang="fa-cn" href="https://web.developers.google.cn/?hl=fa" /><link rel="alternate" hreflang="fr-cn" href="https://web.developers.google.cn/?hl=fr" /><link rel="alternate" hreflang="de-cn" href="https://web.developers.google.cn/?hl=de" /><link rel="alternate" hreflang="he-cn" href="https://web.developers.google.cn/?hl=he" /><link rel="alternate" hreflang="hi-cn" href="https://web.developers.google.cn/?hl=hi" /><link rel="alternate" hreflang="id-cn" href="https://web.developers.google.cn/?hl=id" /><link rel="alternate" hreflang="it-cn" href="https://web.developers.google.cn/?hl=it" /><link rel="alternate" hreflang="ja-cn" href="https://web.developers.google.cn/?hl=ja" /><link rel="alternate" hreflang="ko-cn" href="https://web.developers.google.cn/?hl=ko" /><link rel="alternate" hreflang="pl-cn" href="https://web.developers.google.cn/?hl=pl" /><link rel="alternate" hreflang="pt-BR-cn" href="https://web.developers.google.cn/?hl=pt-br" /><link rel="alternate" hreflang="ru-cn" href="https://web.developers.google.cn/?hl=ru" /><link rel="alternate" hreflang="es-419-cn" href="https://web.developers.google.cn/?hl=es-419" /><link rel="alternate" hreflang="th-cn" href="https://web.developers.google.cn/?hl=th" /><link rel="alternate" hreflang="tr-cn" href="https://web.developers.google.cn/?hl=tr" /><link rel="alternate" hreflang="vi-cn" href="https://web.developers.google.cn/?hl=vi" /><title>web.dev</title> <meta property="og:title" content="web.dev"><meta name="description" content="Guidance to build modern web experiences that work on any browser."> <meta property="og:description" content="Guidance to build modern web experiences that work on any browser."><meta name="description" content="Guidance to build modern web experiences that work in every browser. "><meta property="og:description" content="Guidance to build modern web experiences that work in every browser. "><meta property="og:url" content="https://web.dev/"><meta property="og:image" content="https://web.dev/images/social-wide.jpg"> <meta property="og:image:width" content="1200"> <meta property="og:image:height" content="675"><meta property="og:locale" content="en"><meta name="twitter:card" content="summary"><meta name="twitter:image" content="https://web.dev/static/images/social-wide.jpg"><meta name="twitter:site" content="@ChromiumDev"><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Article", "headline": "" } </script><script type="application/ld+json"> { "@context": "http://schema.org/", "@type": "Organization", "name": "web.dev", "logo": "https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/web/images/touchicon-180.png", "url": "https://web.dev/" } </script> <script type="application/ld+json"> { "@context": "http://schema.org", "@type": "WebSite", "name": "web.dev", "url": "https://web.dev/", "potentialAction": { "@type": "SearchAction", "target": "https://web.dev/s/results?q={search_term_string}", "query-input": "required name=search_term_string" } } </script> <link rel="stylesheet" href="/extras.css"></head> <body class="webdev-home" template="landing" theme="web-theme" type="article" appearance layout="full" pending> <devsite-progress type="indeterminate" id="app-progress"></devsite-progress> <section class="devsite-wrapper"> <devsite-cookie-notification-bar></devsite-cookie-notification-bar><devsite-header role="banner"> <div class="devsite-header--inner nocontent"> <div class="devsite-top-logo-row-wrapper-wrapper"> <div class="devsite-top-logo-row-wrapper"> <div class="devsite-top-logo-row"> <button type="button" id="devsite-hamburger-menu" class="devsite-header-icon-button button-flat material-icons gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Navigation menu button" visually-hidden aria-label="Open menu"> </button> <div class="devsite-product-name-wrapper"> <a href="/" class="devsite-site-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Site logo" track-type="globalNav" track-name="webDev" track-metadata-position="nav" track-metadata-eventDetail="nav"> <picture> <source srcset="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/web/images/lockup-dark-theme.svg" media="(prefers-color-scheme: dark)" class="devsite-dark-theme" alt="web.dev"> <img src="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/web/images/lockup.svg" class="devsite-site-logo" alt="web.dev"> </picture> </a> <span class="devsite-product-name"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item "> </li> </ul> </span> </div> <div class="devsite-top-logo-row-middle"> <div class="devsite-header-upper-tabs"> <devsite-tabs class="upper-tabs"> <nav class="devsite-tabs-wrapper" aria-label="Upper tabs"> <tab > <a href="https://web.dev/about" track-metadata-eventdetail="https://web.dev/about" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - about" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: About" track-name="about" > About </a> </tab> <tab > <a href="https://web.dev/html" track-metadata-eventdetail="https://web.dev/html" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - html" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: HTML" track-name="html" > HTML </a> </tab> <tab > <a href="https://web.dev/css" track-metadata-eventdetail="https://web.dev/css" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - css" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: CSS" track-name="css" > CSS </a> </tab> <tab > <a href="https://web.dev/javascript" track-metadata-eventdetail="https://web.dev/javascript" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - javascript" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: JavaScript" track-name="javascript" > JavaScript </a> </tab> <tab > <a href="https://web.dev/blog" track-metadata-eventdetail="https://web.dev/blog" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - blog" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Blog" track-name="blog" > Blog </a> </tab> <tab > <a href="https://web.dev/learn" track-metadata-eventdetail="https://web.dev/learn" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - learn" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Learn" track-name="learn" > Learn </a> </tab> <tab > <a href="https://web.dev/explore" track-metadata-eventdetail="https://web.dev/explore" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - explore" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Explore" track-name="explore" > Explore </a> </tab> <tab > <a href="https://web.dev/patterns" track-metadata-eventdetail="https://web.dev/patterns" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - patterns" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Patterns" track-name="patterns" > Patterns </a> </tab> <tab > <a href="https://web.dev/case-studies" track-metadata-eventdetail="https://web.dev/case-studies" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - case studies" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Case studies" track-name="case studies" > Case studies </a> </tab> </nav> </devsite-tabs> </div> <devsite-search enable-signin enable-search enable-suggestions enable-query-completion project-name="web.dev" tenant-name="web.dev" > <form class="devsite-search-form" action="https://web.dev/s/results" method="GET"> <div class="devsite-search-container"> <button type="button" search-open class="devsite-search-button devsite-header-icon-button button-flat material-icons" aria-label="Open search"></button> <div class="devsite-searchbox"> <input aria-activedescendant="" aria-autocomplete="list" aria-label="Search" aria-expanded="false" aria-haspopup="listbox" autocomplete="off" class="devsite-search-field devsite-search-query" name="q" placeholder="Search" role="combobox" type="text" value="" > <div class="devsite-search-image material-icons" aria-hidden="true"> </div> <div class="devsite-search-shortcut-icon-container" aria-hidden="true"> <kbd class="devsite-search-shortcut-icon">/</kbd> </div> </div> </div> </form> <button type="button" search-close class="devsite-search-button devsite-header-icon-button button-flat material-icons" aria-label="Close search"></button> </devsite-search> </div> <devsite-appearance-selector></devsite-appearance-selector> <devsite-language-selector> <ul role="presentation"> <li role="presentation"> <a role="menuitem" lang="en" >English</a> </li> <li role="presentation"> <a role="menuitem" lang="de" >Deutsch</a> </li> <li role="presentation"> <a role="menuitem" lang="es_419" >Español – América Latina</a> </li> <li role="presentation"> <a role="menuitem" lang="fr" >Français</a> </li> <li role="presentation"> <a role="menuitem" lang="id" >Indonesia</a> </li> <li role="presentation"> <a role="menuitem" lang="it" >Italiano</a> </li> <li role="presentation"> <a role="menuitem" lang="pl" >Polski</a> </li> <li role="presentation"> <a role="menuitem" lang="pt_br" >Português – Brasil</a> </li> <li role="presentation"> <a role="menuitem" lang="vi" >Tiếng Việt</a> </li> <li role="presentation"> <a role="menuitem" lang="tr" >Türkçe</a> </li> <li role="presentation"> <a role="menuitem" lang="ru" >Русский</a> </li> <li role="presentation"> <a role="menuitem" lang="he" >עברית</a> </li> <li role="presentation"> <a role="menuitem" lang="ar" >العربيّة</a> </li> <li role="presentation"> <a role="menuitem" lang="fa" >فارسی</a> </li> <li role="presentation"> <a role="menuitem" lang="hi" >हिंदी</a> </li> <li role="presentation"> <a role="menuitem" lang="bn" >বাংলা</a> </li> <li role="presentation"> <a role="menuitem" lang="th" >ภาษาไทย</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_cn" >中文 – 简体</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_tw" >中文 – 繁體</a> </li> <li role="presentation"> <a role="menuitem" lang="ja" >日本語</a> </li> <li role="presentation"> <a role="menuitem" lang="ko" >한국어</a> </li> </ul> </devsite-language-selector> <devsite-user enable-profiles id="devsite-user"> <span class="button devsite-top-button" aria-hidden="true" visually-hidden>Sign in</span> </devsite-user> </div> </div> </div> <div class="devsite-collapsible-section devsite-header-no-lower-tabs "> <div class="devsite-header-background"> <div class="devsite-product-id-row" > <div class="devsite-product-description-row"> <div class="devsite-product-description"> Guidance to build modern web experiences that work on any browser. </div> </div> </div> </div> </div> </div> </devsite-header> <devsite-book-nav scrollbars hidden> <div class="devsite-book-nav-filter" hidden> <span class="filter-list-icon material-icons" aria-hidden="true"></span> <input type="text" placeholder="Filter" aria-label="Type to filter" role="searchbox"> <span class="filter-clear-button hidden" data-title="Clear filter" aria-label="Clear filter" role="button" tabindex="0"></span> </div> <nav class="devsite-book-nav devsite-nav nocontent" aria-label="Side menu"> <div class="devsite-mobile-header"> <button type="button" id="devsite-close-nav" class="devsite-header-icon-button button-flat material-icons gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Close navigation" aria-label="Close navigation"> </button> <div class="devsite-product-name-wrapper"> <a href="/" class="devsite-site-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Site logo" track-type="globalNav" track-name="webDev" track-metadata-position="nav" track-metadata-eventDetail="nav"> <picture> <source srcset="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/web/images/lockup-dark-theme.svg" media="(prefers-color-scheme: dark)" class="devsite-dark-theme" alt="web.dev"> <img src="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/web/images/lockup.svg" class="devsite-site-logo" alt="web.dev"> </picture> </a> <span class="devsite-product-name"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item "> </li> </ul> </span> </div> </div> <div class="devsite-book-nav-wrapper"> <div class="devsite-mobile-nav-top"> <ul class="devsite-nav-list"> <li class="devsite-nav-item"> <a href="/about" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: About" track-name="about" data-category="Site-Wide Custom Events" data-label="Responsive Tab: About" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > About </span> </a> </li> <li class="devsite-nav-item"> <a href="/html" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: HTML" track-name="html" data-category="Site-Wide Custom Events" data-label="Responsive Tab: HTML" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > HTML </span> </a> </li> <li class="devsite-nav-item"> <a href="/css" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: CSS" track-name="css" data-category="Site-Wide Custom Events" data-label="Responsive Tab: CSS" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > CSS </span> </a> </li> <li class="devsite-nav-item"> <a href="/javascript" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: JavaScript" track-name="javascript" data-category="Site-Wide Custom Events" data-label="Responsive Tab: JavaScript" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > JavaScript </span> </a> </li> <li class="devsite-nav-item"> <a href="/blog" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Blog" track-name="blog" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Blog" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Blog </span> </a> </li> <li class="devsite-nav-item"> <a href="/learn" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Learn" track-name="learn" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Learn" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Learn </span> </a> </li> <li class="devsite-nav-item"> <a href="/explore" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Explore" track-name="explore" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Explore" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Explore </span> </a> </li> <li class="devsite-nav-item"> <a href="/patterns" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Patterns" track-name="patterns" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Patterns" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Patterns </span> </a> </li> <li class="devsite-nav-item"> <a href="/case-studies" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Case studies" track-name="case studies" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Case studies" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Case studies </span> </a> </li> </ul> </div> </div> </nav> </devsite-book-nav> <section id="gc-wrapper"> <main role="main" class="devsite-main-content" > <div class="devsite-sidebar"> <div class="devsite-sidebar-content"> <devsite-toc class="devsite-nav" role="navigation" aria-label="On this page" depth="2" scrollbars disabled></devsite-toc> <devsite-recommendations-sidebar class="nocontent devsite-nav"> </devsite-recommendations-sidebar> </div> </div> <devsite-content> <article class="devsite-article"><style> /* Styles inlined from /explore/patch.css */ [theme=web-theme] .devsite-landing-row-3-up.wd-explore-3up .devsite-landing-row-item { text-align: left; } [theme=web-theme] .wd-explore-3up .devsite-landing-row-item-list-item-description h4 { padding: 0; } .wd-explore-3up .devsite-landing-row-item-list-item-description a:hover{ text-decoration: underline; } [theme=web-theme] .devsite-landing-row-3-up .devsite-landing-row-item.wd-3col-icons-list { text-align: left; } [theme=web-theme] .wd-explore-2up .devsite-landing-row-item-list-item-description a:hover{ text-decoration: underline; } [theme=web-theme] .wd-explore-2up .devsite-landing-row-item-list-item-description h4 { padding: 0; } [theme=web-theme] .devsite-landing-row-item-buttons.left { justify-self: flex-start; } [theme=web-theme] .devsite-landing-row-3-up.devsite-landing-row-cards img { max-height: 200px; object-fit: cover; } </style> <div class="devsite-article-meta nocontent" role="navigation"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item "> <a href="https://web.dev/" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="web.dev" > web.dev </a> </li> </ul> </div> <devsite-feature-tooltip ack-key="AckCollectionsBookmarkTooltipDismiss" analytics-category="Site-Wide Custom Events" analytics-action-show="Callout Profile displayed" analytics-action-close="Callout Profile dismissed" analytics-label="Create Collection Callout" class="devsite-page-bookmark-tooltip nocontent" dismiss-button="true" id="devsite-collections-dropdown" dismiss-button-text="Dismiss" close-button-text="Got it"> <devsite-bookmark></devsite-bookmark> <span slot="popout-heading"> Stay organized with collections </span> <span slot="popout-contents"> Save and categorize content based on your preferences. </span> </devsite-feature-tooltip> <devsite-toc class="devsite-nav" depth="2" devsite-toc-embedded disabled> </devsite-toc> <div class="devsite-article-body clearfix devsite-no-page-title"> <section class="devsite-landing-row devsite-landing-row-1-up devsite-landing-row-50 devsite-landing-row-hero devsite-landing-row-no-image-background wd-about-hero" background="white" header-position="top" > <div class="devsite-landing-row-inner"> <div class="devsite-landing-row-group"> <div class="devsite-landing-row-item" description-position="bottom" > <div class="devsite-landing-row-item-media "> <figure class="devsite-landing-row-item-image"> <a href="https://web.dev/about"> <picture> <img alt="" src="https://web.dev/static/images/home-blue.png" srcset="https://web.dev/static/images/home-blue_36.png 36w,https://web.dev/static/images/home-blue_48.png 48w,https://web.dev/static/images/home-blue_72.png 72w,https://web.dev/static/images/home-blue_96.png 96w,https://web.dev/static/images/home-blue_480.png 480w,https://web.dev/static/images/home-blue_720.png 720w,https://web.dev/static/images/home-blue_856.png 856w,https://web.dev/static/images/home-blue_960.png 960w,https://web.dev/static/images/home-blue_1440.png 1440w,https://web.dev/static/images/home-blue_1920.png 1920w,https://web.dev/static/images/home-blue_2880.png 2880w" sizes="(max-width: 600px) 100vw, (max-width: 840px) 50vw, 708px" fetchpriority="high"> </picture> </a> </figure> </div> <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="building-a-better-web-together" data-text="Building a better web, together" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/about"> Building a better web, together </a> </h3> <div class="devsite-landing-row-item-description-content"> We want to help you build beautiful, accessible, fast, and secure websites that work cross-browser, and for all of your users. This site is our home for content to help you on that journey, written by members of the Chrome team, and external experts. </div> <div class="devsite-landing-row-item-buttons"> <a href="https://web.dev/about" class="button button-primary " >About web.dev</a> </div> </div> </div> </div> </div> </div> </section> <section class="devsite-landing-row devsite-landing-row-3-up devsite-landing-row-cards" background="grey" header-position="top" > <div class="devsite-landing-row-inner"> <div class="devsite-landing-row-group"> <div class="devsite-landing-row-item" description-position="bottom" > <div class="devsite-landing-row-item-media "> <figure class="devsite-landing-row-item-image"> <a href="https://web.dev/explore/ai"> <picture> <img alt="" src="https://web.dev/static/images/ai-feature.png" srcset="https://web.dev/static/images/ai-feature_36.png 36w,https://web.dev/static/images/ai-feature_48.png 48w,https://web.dev/static/images/ai-feature_72.png 72w,https://web.dev/static/images/ai-feature_96.png 96w,https://web.dev/static/images/ai-feature_480.png 480w,https://web.dev/static/images/ai-feature_720.png 720w,https://web.dev/static/images/ai-feature_856.png 856w,https://web.dev/static/images/ai-feature_960.png 960w,https://web.dev/static/images/ai-feature_1440.png 1440w,https://web.dev/static/images/ai-feature_1920.png 1920w,https://web.dev/static/images/ai-feature_2880.png 2880w" sizes="(max-width: 840px) 50vw, 464px" loading="lazy" > </picture> </a> </figure> </div> <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="ai-and-the-web" data-text="AI and the web" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/explore/ai"> AI and the web </a> </h3> <div class="devsite-landing-row-item-description-content"> Discover resources created to help you understand and build performant, web-first experiences with AI. </div> <div class="devsite-landing-row-item-buttons"> <a href="https://web.dev/explore/ai" class="button button-primary " >Learn more</a> </div> </div> </div> </div> <div class="devsite-landing-row-item" description-position="bottom" > <div class="devsite-landing-row-item-media "> <figure class="devsite-landing-row-item-image"> <a href="https://web.dev/baseline"> <picture> <img alt="" src="https://web.dev/static/images/baseline-feature.png" srcset="https://web.dev/static/images/baseline-feature_36.png 36w,https://web.dev/static/images/baseline-feature_48.png 48w,https://web.dev/static/images/baseline-feature_72.png 72w,https://web.dev/static/images/baseline-feature_96.png 96w,https://web.dev/static/images/baseline-feature_480.png 480w,https://web.dev/static/images/baseline-feature_720.png 720w,https://web.dev/static/images/baseline-feature_856.png 856w,https://web.dev/static/images/baseline-feature_960.png 960w,https://web.dev/static/images/baseline-feature_1440.png 1440w,https://web.dev/static/images/baseline-feature_1920.png 1920w,https://web.dev/static/images/baseline-feature_2880.png 2880w" sizes="(max-width: 840px) 50vw, 464px" loading="lazy" > </picture> </a> </figure> </div> <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="baseline" data-text="Baseline" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/baseline"> Baseline </a> </h3> <div class="devsite-landing-row-item-description-content"> Baseline helps you to understand which web platform features are ready to use in your projects today. </div> <div class="devsite-landing-row-item-buttons"> <a href="https://web.dev/baseline" class="button button-primary " >Learn more</a> </div> </div> </div> </div> <div class="devsite-landing-row-item" description-position="bottom" > <div class="devsite-landing-row-item-media "> <figure class="devsite-landing-row-item-image"> <a href="https://web.dev/explore/how-to-optimize-inp?utm_source=web.dev&utm_medium=cards&utm_campaign=inp-cwv"> <picture> <img alt="" src="https://web.dev/static/images/inp-cwv.png" srcset="https://web.dev/static/images/inp-cwv_36.png 36w,https://web.dev/static/images/inp-cwv_48.png 48w,https://web.dev/static/images/inp-cwv_72.png 72w,https://web.dev/static/images/inp-cwv_96.png 96w,https://web.dev/static/images/inp-cwv_480.png 480w,https://web.dev/static/images/inp-cwv_720.png 720w,https://web.dev/static/images/inp-cwv_856.png 856w,https://web.dev/static/images/inp-cwv_960.png 960w,https://web.dev/static/images/inp-cwv_1440.png 1440w,https://web.dev/static/images/inp-cwv_1920.png 1920w,https://web.dev/static/images/inp-cwv_2880.png 2880w" sizes="(max-width: 840px) 50vw, 464px" loading="lazy" > </picture> </a> </figure> </div> <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="measure-interaction-responsiveness" data-text="Measure interaction responsiveness" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/explore/how-to-optimize-inp?utm_source=web.dev&utm_medium=cards&utm_campaign=inp-cwv"> Measure interaction responsiveness </a> </h3> <div class="devsite-landing-row-item-description-content"> Start measuring and optimizing your site's Interaction to Next Paint (INP) performance. It officially became a Core Web Vital metric on March 12. </div> <div class="devsite-landing-row-item-buttons"> <a href="https://web.dev/explore/how-to-optimize-inp?utm_source=web.dev&utm_medium=cards&utm_campaign=inp-cwv" class="button button-primary " >Learn more</a> </div> </div> </div> </div> </div> </div> </section> <section class="devsite-landing-row devsite-landing-row-3-up devsite-landing-row-padding-large wd-top-stroke" header-position="top" > <div class="devsite-landing-row-inner"> <header class="devsite-landing-row-header" > <div class="devsite-landing-row-header-text"> <h2 id="whats-new" data-text="What's new?" tabindex="0"> What's new? </h2> </div> </header> <div class="devsite-landing-row-group"> <div class="devsite-landing-row-item" description-position="bottom" > <div class="devsite-landing-row-item-media "> <figure class="devsite-landing-row-item-image"> <a href="https://web.dev/series/baseline-newly-available"> <picture> <img alt="" src="https://web.dev/static/images/baseline-newly-available.png" srcset="https://web.dev/static/images/baseline-newly-available_36.png 36w,https://web.dev/static/images/baseline-newly-available_48.png 48w,https://web.dev/static/images/baseline-newly-available_72.png 72w,https://web.dev/static/images/baseline-newly-available_96.png 96w,https://web.dev/static/images/baseline-newly-available_480.png 480w,https://web.dev/static/images/baseline-newly-available_720.png 720w,https://web.dev/static/images/baseline-newly-available_856.png 856w,https://web.dev/static/images/baseline-newly-available_960.png 960w,https://web.dev/static/images/baseline-newly-available_1440.png 1440w,https://web.dev/static/images/baseline-newly-available_1920.png 1920w,https://web.dev/static/images/baseline-newly-available_2880.png 2880w" sizes="(max-width: 840px) 50vw, 464px" loading="lazy" > </picture> </a> </figure> </div> <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="baseline-newly-available" data-text="Baseline Newly available" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/series/baseline-newly-available"> Baseline Newly available </a> </h3> <div class="devsite-landing-row-item-description-content"> Learn about the features that are newly available in Baseline. </div> <div class="devsite-landing-row-item-buttons"> <a href="https://web.dev/series/baseline-newly-available" class="button button-primary " >Discover new features</a> </div> </div> </div> </div> <div class="devsite-landing-row-item" description-position="bottom" > <div class="devsite-landing-row-item-media "> <figure class="devsite-landing-row-item-image"> <a href="https://web.dev/series/new-to-the-web"> <picture> <img alt="" src="https://web.dev/static/images/new-to-the-web.jpg" srcset="https://web.dev/static/images/new-to-the-web_36.jpg 36w,https://web.dev/static/images/new-to-the-web_48.jpg 48w,https://web.dev/static/images/new-to-the-web_72.jpg 72w,https://web.dev/static/images/new-to-the-web_96.jpg 96w,https://web.dev/static/images/new-to-the-web_480.jpg 480w,https://web.dev/static/images/new-to-the-web_720.jpg 720w,https://web.dev/static/images/new-to-the-web_856.jpg 856w,https://web.dev/static/images/new-to-the-web_960.jpg 960w,https://web.dev/static/images/new-to-the-web_1440.jpg 1440w,https://web.dev/static/images/new-to-the-web_1920.jpg 1920w,https://web.dev/static/images/new-to-the-web_2880.jpg 2880w" sizes="(max-width: 840px) 50vw, 464px" loading="lazy" > </picture> </a> </figure> </div> <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="new-to-the-web-platform" data-text="New to the web platform" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/series/new-to-the-web"> New to the web platform </a> </h3> <div class="devsite-landing-row-item-description-content"> Discover some of the interesting features that landed in stable and beta web browsers. </div> <div class="devsite-landing-row-item-buttons"> <a href="https://web.dev/series/new-to-the-web" class="button button-primary " >Discover what's new</a> </div> </div> </div> </div> <div class="devsite-landing-row-item" description-position="bottom" > <div class="devsite-landing-row-item-media "> <figure class="devsite-landing-row-item-image"> <a href="https://pod.link/thecsspodcast/"> <picture> <img alt="" src="https://web.dev/static/images/css-podcast.png" srcset="https://web.dev/static/images/css-podcast_36.png 36w,https://web.dev/static/images/css-podcast_48.png 48w,https://web.dev/static/images/css-podcast_72.png 72w,https://web.dev/static/images/css-podcast_96.png 96w,https://web.dev/static/images/css-podcast_480.png 480w,https://web.dev/static/images/css-podcast_720.png 720w,https://web.dev/static/images/css-podcast_856.png 856w,https://web.dev/static/images/css-podcast_960.png 960w,https://web.dev/static/images/css-podcast_1440.png 1440w,https://web.dev/static/images/css-podcast_1920.png 1920w,https://web.dev/static/images/css-podcast_2880.png 2880w" sizes="(max-width: 840px) 50vw, 464px" loading="lazy" > </picture> </a> </figure> </div> <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="the-css-podcast" data-text="The CSS Podcast" class="hide-from-toc no-link" tabindex="0"> <a href="https://pod.link/thecsspodcast/"> The CSS Podcast </a> </h3> <div class="devsite-landing-row-item-description-content"> Follow Una Kravets and Adam Argyle, developer advocates from Google, who gleefully break down complex aspects from CSS into disgestible episodes of this podcast. </div> <div class="devsite-landing-row-item-buttons"> <a href="https://pod.link/thecsspodcast/" class="button button-primary " >Listen now</a> </div> </div> </div> </div> </div> </div> </section> <section class="devsite-landing-row devsite-landing-row-4-up devsite-landing-row-padding-medium wd-top-stroke" background="grey" header-position="left" > <div class="devsite-landing-row-inner"> <header class="devsite-landing-row-header" > <div class="devsite-landing-row-header-text"> <h2 id="css-and-ui-design" data-text="CSS and UI design" tabindex="0"> CSS and UI design </h2> <div class="devsite-landing-row-description"> Learn the latest tips and techniques to use in your work, right now. </div> </div> <div class="devsite-landing-row-header-buttons"> <a href="https://web.dev/css" class="button button-primary " >Explore CSS</a> </div> </header> <div class="devsite-landing-row-group"> <div class="devsite-landing-row-item devsite-landing-row-item-no-media" description-position="bottom" > <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="adapting-typography-to-user-preference-using-css" data-text="Adapting typography to user preference using CSS" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/articles/adapting-typography-to-user-preferences-with-css"> Adapting typography to user preference using CSS </a> </h3> <div class="devsite-landing-row-item-description-content"> Adapt a font to your users' preferences, so they're maximally comfortable reading your content. </div> </div> </div> </div> <div class="devsite-landing-row-item devsite-landing-row-item-no-media" description-position="bottom" > <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="new-css-color-spaces-and-functions-in-all-major-engines" data-text="New CSS color spaces and functions in all major engines" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/blog/color-spaces-and-functions"> New CSS color spaces and functions in all major engines </a> </h3> <div class="devsite-landing-row-item-description-content"> All major engines now support the new CSS color spaces and functions. Find out how they can bring vibrancy to your designs. </div> </div> </div> </div> <div class="devsite-landing-row-item devsite-landing-row-item-no-media" description-position="bottom" > <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="what-are-source-maps" data-text="What are source maps?" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/articles/source-maps"> What are source maps? </a> </h3> <div class="devsite-landing-row-item-description-content"> Improve web debugging experience with source maps. </div> </div> </div> </div> <div class="devsite-landing-row-item devsite-landing-row-item-no-media" description-position="bottom" > <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="css-subgrid" data-text="CSS subgrid" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/articles/css-subgrid"> CSS subgrid </a> </h3> <div class="devsite-landing-row-item-description-content"> Subgrid is now interoperable across all three major engines. Find out how to use it. </div> </div> </div> </div> </div> </div> </section> <section class="devsite-landing-row devsite-landing-row-4-up devsite-landing-row-padding-medium wd-top-stroke" header-position="left" > <div class="devsite-landing-row-inner"> <header class="devsite-landing-row-header" > <div class="devsite-landing-row-header-text"> <h2 id="core-web-vitals" data-text="Core Web Vitals" tabindex="0"> Core Web Vitals </h2> <div class="devsite-landing-row-description"> Build faster websites and apps by understanding Core Web Vitals and other metrics. </div> </div> <div class="devsite-landing-row-header-buttons"> <a href="https://web.dev/performance" class="button button-primary " >Explore Core Web Vitals</a> </div> </header> <div class="devsite-landing-row-group"> <div class="devsite-landing-row-item devsite-landing-row-item-no-media" description-position="bottom" > <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="interaction-to-next-paint-becomes-a-core-web-vital-on-march-12" data-text="Interaction to Next Paint becomes a Core Web Vital on March 12" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/blog/inp-cwv-march-12"> Interaction to Next Paint becomes a Core Web Vital on March 12 </a> </h3> <div class="devsite-landing-row-item-description-content"> Interaction to Next Paint will officially become a Core Web Vital and will replace First Input Delay on March 12. </div> </div> </div> </div> <div class="devsite-landing-row-item devsite-landing-row-item-no-media" description-position="bottom" > <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="how-to-optimize-inp" data-text="How to optimize INP" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/explore/how-to-optimize-inp"> How to optimize INP </a> </h3> <div class="devsite-landing-row-item-description-content"> Learn how to optimize for the Interaction to Next Paint metric. </div> </div> </div> </div> <div class="devsite-landing-row-item devsite-landing-row-item-no-media" description-position="bottom" > <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="our-top-core-web-vitals-recommendations" data-text="Our top Core Web Vitals recommendations" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/articles/top-cwv"> Our top Core Web Vitals recommendations </a> </h3> <div class="devsite-landing-row-item-description-content"> A collection of best practices for optimizing websites' Core Web Vitals performance based on the state of the web </div> </div> </div> </div> <div class="devsite-landing-row-item devsite-landing-row-item-no-media" description-position="bottom" > <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="common-misconceptions-about-how-to-optimize-lcp" data-text="Common misconceptions about how to optimize LCP" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/blog/common-misconceptions-lcp"> Common misconceptions about how to optimize LCP </a> </h3> <div class="devsite-landing-row-item-description-content"> Explore common misconceptions about optimizing Largest Contentful Paint (LCP) by looking beyond image optimization and considering factors like Time to First Byte (TTFB) and resource load delay. </div> </div> </div> </div> </div> </div> </section> <section class="devsite-landing-row devsite-landing-row-4-up devsite-landing-row-padding-medium wd-top-stroke" background="grey" header-position="left" > <div class="devsite-landing-row-inner"> <header class="devsite-landing-row-header" > <div class="devsite-landing-row-header-text"> <h2 id="progressive-web-apps" data-text="Progressive Web Apps" tabindex="0"> Progressive Web Apps </h2> <div class="devsite-landing-row-description"> Create capable web experiences. </div> </div> <div class="devsite-landing-row-header-buttons"> <a href="https://web.dev/explore/progressive-web-apps" class="button button-primary " >More on PWA</a> </div> </header> <div class="devsite-landing-row-group"> <div class="devsite-landing-row-item devsite-landing-row-item-no-media" description-position="bottom" > <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="learn-pwa" data-text="Learn PWA" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/learn/pwa"> Learn PWA </a> </h3> <div class="devsite-landing-row-item-description-content"> A course that breaks down every aspect of modern progressive web app development. </div> </div> </div> </div> <div class="devsite-landing-row-item devsite-landing-row-item-no-media" description-position="bottom" > <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="transformstream-is-now-supported-cross-browser" data-text="TransformStream is now supported cross browser." class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/blog/transformstream"> TransformStream is now supported cross browser. </a> </h3> <div class="devsite-landing-row-item-description-content"> Now that transform streams are supported in Safari, Firefox, and Chrome they are finally ready for prime time. </div> </div> </div> </div> <div class="devsite-landing-row-item devsite-landing-row-item-no-media" description-position="bottom" > <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="new-patterns-for-amazing-apps" data-text="New patterns for amazing apps" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/blog/new-patterns-for-amazing-apps"> New patterns for amazing apps </a> </h3> <div class="devsite-landing-row-item-description-content"> Dive into a fantastic collection of new patterns for amazing apps, including clipboard patterns, file patterns, and advanced app patterns. </div> </div> </div> </div> <div class="devsite-landing-row-item devsite-landing-row-item-no-media" description-position="bottom" > <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="project-fugu-api-showcase" data-text="Project Fugu API showcase" class="hide-from-toc no-link" tabindex="0"> <a href="https://developer.chrome.com/fugu-showcase/"> Project Fugu API showcase </a> </h3> <div class="devsite-landing-row-item-description-content"> On the Chrome Developers site, explore capabilities APIs. </div> </div> </div> </div> </div> </div> </section> <section class="devsite-landing-row devsite-landing-row-4-up devsite-landing-row-padding-medium wd-top-stroke" header-position="left" > <div class="devsite-landing-row-inner"> <header class="devsite-landing-row-header" > <div class="devsite-landing-row-header-text"> <h2 id="accessible-for-all" data-text="Accessible for all" tabindex="0"> Accessible for all </h2> <div class="devsite-landing-row-description"> Learn how to make your sites more accessible for people with disabilities, whether permanent, temporary, or situational. </div> </div> <div class="devsite-landing-row-header-buttons"> <a href="https://web.dev/accessibility" class="button button-primary " >More on accessibility</a> </div> </header> <div class="devsite-landing-row-group"> <div class="devsite-landing-row-item devsite-landing-row-item-no-media" description-position="bottom" > <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="learn-accessibility" data-text="Learn Accessibility" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/learn/accessibility"> Learn Accessibility </a> </h3> <div class="devsite-landing-row-item-description-content"> Our new course is a great entry point and reference for accessibility topics. </div> </div> </div> </div> <div class="devsite-landing-row-item devsite-landing-row-item-no-media" description-position="bottom" > <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="testing-web-design-color-contrast" data-text="Testing web design color contrast" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/testing-web-design-color-contrast"> Testing web design color contrast </a> </h3> <div class="devsite-landing-row-item-description-content"> An overview of three tools and techniques for testing and verifying accessible color contrast of your design. </div> </div> </div> </div> <div class="devsite-landing-row-item devsite-landing-row-item-no-media" description-position="bottom" > <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="building-the-main-navigation-for-a-website" data-text="Building the main navigation for a website" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/articles/website-navigation"> Building the main navigation for a website </a> </h3> <div class="devsite-landing-row-item-description-content"> This tutorial describes how to build an accessible main navigation of a website. You learn about semantic HTML, accessibility, and how using ARIA attributes can sometimes do more harm than good. </div> </div> </div> </div> <div class="devsite-landing-row-item devsite-landing-row-item-no-media" description-position="bottom" > <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="community-highlight-melanie-sumner" data-text="Community highlight: Melanie Sumner" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/blog/community-highlights/melanie"> Community highlight: Melanie Sumner </a> </h3> <div class="devsite-landing-row-item-description-content"> Read our interview with Melanie, a software engineer who specializes in digital accessibility. </div> </div> </div> </div> </div> </div> </section> <section class="devsite-landing-row devsite-landing-row-4-up wd-top-stroke" background="grey" header-position="left" > <div class="devsite-landing-row-inner"> <header class="devsite-landing-row-header" > <div class="devsite-landing-row-header-text"> <h2 id="payments-and-identity" data-text="Payments and identity" tabindex="0"> Payments and identity </h2> <div class="devsite-landing-row-description"> Find the latest techniques and best practices for payments and helping users safely log into your sites and apps. </div> </div> <div class="devsite-landing-row-header-buttons"> <a href="https://web.dev/identity" class="button button-primary " >More on identity</a> </div> </header> <div class="devsite-landing-row-group"> <div class="devsite-landing-row-item devsite-landing-row-item-no-media" description-position="bottom" > <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="create-a-passkey-for-passwordless-logins" data-text="Create a passkey for passwordless logins" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/articles/passkey-registration"> Create a passkey for passwordless logins </a> </h3> <div class="devsite-landing-row-item-description-content"> Passkeys make user accounts safer, simpler, easier to use. </div> </div> </div> </div> <div class="devsite-landing-row-item devsite-landing-row-item-no-media" description-position="bottom" > <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="sign-in-with-a-passkey" data-text="Sign in with a passkey" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/articles/passkey-form-autofill"> Sign in with a passkey </a> </h3> <div class="devsite-landing-row-item-description-content"> Create a sign in experience that uses passkeys while still accommodating existing password users. </div> </div> </div> </div> <div class="devsite-landing-row-item devsite-landing-row-item-no-media" description-position="bottom" > <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="web-payments-overview" data-text="Web payments overview" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/articles/web-payments-overview"> Web payments overview </a> </h3> <div class="devsite-landing-row-item-description-content"> Learn more about Web Payments and how they work. </div> </div> </div> </div> <div class="devsite-landing-row-item devsite-landing-row-item-no-media" description-position="bottom" > <div class="devsite-landing-row-item-description" > <div class="devsite-landing-row-item-body"> <h3 id="payment-and-address-form-best-practices" data-text="Payment and address form best practices" class="hide-from-toc no-link" tabindex="0"> <a href="https://web.dev/articles/payment-and-address-form-best-practices"> Payment and address form best practices </a> </h3> <div class="devsite-landing-row-item-description-content"> Maximize conversions by helping your users complete address and payment forms as quickly and easily as possible. </div> </div> </div> </div> </div> </div> </section> <section class="devsite-landing-row devsite-landing-row-1-up devsite-landing-row-header-centered devsite-landing-row-100 devsite-landing-row-padding-medium wd-top-stroke" header-position="top" > <div class="devsite-landing-row-inner"> <header class="devsite-landing-row-header" > <div class="devsite-landing-row-header-text"> <h2 id="developer-newsletter" data-text="Developer Newsletter" tabindex="0"> Developer Newsletter </h2> <div class="devsite-landing-row-description"> Get the latest news, techniques and updates straight to your inbox. </div> </div> </header> <div class="devsite-landing-row-group"> <div class="devsite-landing-row-item" description-position="bottom" > <devsite-iframe><iframe src="https://web.dev/frame/root_7655af8daa56f7e5a86f8fb6279cb70189185c07c29ec1f04c33d4b7ec927b54.frame" class="framebox inherit-locale " allow="clipboard-write https://web-dot-devsite-v2-prod-3p.appspot.com" allowfullscreen is-upgraded></iframe></devsite-iframe> </div> </div> </div> </section> </div> <div class="devsite-floating-action-buttons"> </div> </article> <devsite-notification > </devsite-notification> <div class="devsite-content-data"> <template class="devsite-content-data-template"> [[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],[],[],[]] </template> </div> </devsite-content> </main> <devsite-footer-promos class="devsite-footer"> </devsite-footer-promos> <devsite-footer-linkboxes class="devsite-footer"> <nav class="devsite-footer-linkboxes nocontent" aria-label="Footer links"> <ul class="devsite-footer-linkboxes-list"> <li class="devsite-footer-linkbox wd-footer-promo"> <h3 class="devsite-footer-linkbox-heading no-link">web.dev</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <h3 class="devsite-footer-linkbox-heading no-link"> web.dev </h3> <div class="devsite-footer-linkbox-description">We want to help you build beautiful, accessible, fast, and secure websites that work cross-browser, and for all of your users. This site is our home for content to help you on that journey, written by members of the Chrome team, and external experts.</div> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Contribute</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="https://issuetracker.google.com/issues/new?component=1400680&template=1857359" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > File a bug </a> </li> <li class="devsite-footer-linkbox-item"> <a href="https://issuetracker.google.com/issues?q=status:open%20componentid:1400680&s=created_time:desc" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > See open issues </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Related Content</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="https://developer.chrome.com/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Chrome for Developers </a> </li> <li class="devsite-footer-linkbox-item"> <a href="https://blog.chromium.org/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Chromium updates </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/case-studies" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Case studies </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/shows" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Podcasts & shows </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Follow</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="https://twitter.com/ChromiumDev" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > @ChromiumDev on X </a> </li> <li class="devsite-footer-linkbox-item"> <a href="https://www.youtube.com/user/ChromeDevelopers" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > YouTube </a> </li> <li class="devsite-footer-linkbox-item"> <a href="https://www.linkedin.com/showcase/chrome-for-developers" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Chrome for Developers on LinkedIn </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/static/blog/feed.xml" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > RSS </a> </li> </ul> </li> </ul> </nav> </devsite-footer-linkboxes> <devsite-footer-utility class="devsite-footer"> <div class="devsite-footer-utility nocontent"> <nav class="devsite-footer-utility-links" aria-label="Utility links"> <ul class="devsite-footer-utility-list"> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="//policies.google.com/terms" data-category="Site-Wide Custom Events" data-label="Footer Terms link" > Terms </a> </li> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="//policies.google.com/privacy" data-category="Site-Wide Custom Events" data-label="Footer Privacy link" > Privacy </a> </li> <li class="devsite-footer-utility-item glue-cookie-notification-bar-control"> <a class="devsite-footer-utility-link gc-analytics-event" href="#" data-category="Site-Wide Custom Events" data-label="Footer Manage cookies link" aria-hidden="true" > Manage cookies </a> </li> </ul> <devsite-language-selector> <ul role="presentation"> <li role="presentation"> <a role="menuitem" lang="en" >English</a> </li> <li role="presentation"> <a role="menuitem" lang="de" >Deutsch</a> </li> <li role="presentation"> <a role="menuitem" lang="es_419" >Español – América Latina</a> </li> <li role="presentation"> <a role="menuitem" lang="fr" >Français</a> </li> <li role="presentation"> <a role="menuitem" lang="id" >Indonesia</a> </li> <li role="presentation"> <a role="menuitem" lang="it" >Italiano</a> </li> <li role="presentation"> <a role="menuitem" lang="pl" >Polski</a> </li> <li role="presentation"> <a role="menuitem" lang="pt_br" >Português – Brasil</a> </li> <li role="presentation"> <a role="menuitem" lang="vi" >Tiếng Việt</a> </li> <li role="presentation"> <a role="menuitem" lang="tr" >Türkçe</a> </li> <li role="presentation"> <a role="menuitem" lang="ru" >Русский</a> </li> <li role="presentation"> <a role="menuitem" lang="he" >עברית</a> </li> <li role="presentation"> <a role="menuitem" lang="ar" >العربيّة</a> </li> <li role="presentation"> <a role="menuitem" lang="fa" >فارسی</a> </li> <li role="presentation"> <a role="menuitem" lang="hi" >हिंदी</a> </li> <li role="presentation"> <a role="menuitem" lang="bn" >বাংলা</a> </li> <li role="presentation"> <a role="menuitem" lang="th" >ภาษาไทย</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_cn" >中文 – 简体</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_tw" >中文 – 繁體</a> </li> <li role="presentation"> <a role="menuitem" lang="ja" >日本語</a> </li> <li role="presentation"> <a role="menuitem" lang="ko" >한국어</a> </li> </ul> </devsite-language-selector> </nav> </div> </devsite-footer-utility> <devsite-panel></devsite-panel> </section></section> <devsite-sitemask></devsite-sitemask> <devsite-snackbar></devsite-snackbar> <devsite-tooltip ></devsite-tooltip> <devsite-heading-link></devsite-heading-link> <devsite-analytics> <script type="application/json" analytics>[]</script> <script type="application/json" tag-management>{"at": "True", "ga4": [], "ga4p": [], "gtm": [{"id": "GTM-MZWCJPP", "purpose": 0}], "parameters": {"internalUser": "False", "language": {"machineTranslated": "False", "requested": "en", "served": "en"}, "pageType": "article", "projectName": "web.dev", "signedIn": "False", "tenant": "web", "recommendations": {"sourcePage": "", "sourceType": 0, "sourceRank": 0, "sourceIdenticalDescriptions": 0, "sourceTitleWords": 0, "sourceDescriptionWords": 0, "experiment": ""}, "experiment": {"ids": ""}}}</script> </devsite-analytics> <devsite-badger></devsite-badger> <script nonce="FKgnAw3rKkMKAuMiH5vC8T8CUYXNDO"> (function(d,e,v,s,i,t,E){d['GoogleDevelopersObject']=i; t=e.createElement(v);t.async=1;t.src=s;E=e.getElementsByTagName(v)[0]; E.parentNode.insertBefore(t,E);})(window, document, 'script', 'https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/web/js/app_loader.js', '[27,"en",null,"/js/devsite_app_module.js","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/web","https://web-dot-devsite-v2-prod-3p.appspot.com",1,null,["/_pwa/web/manifest.json","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/images/video-placeholder.svg","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/web/images/favicon.png","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/web/images/lockup.svg","https://fonts.googleapis.com/css?family=Google+Sans:400,500|Roboto:400,400italic,500,500italic,700,700italic|Roboto+Mono:400,500,700&display=swap"],1,null,[1,6,8,12,14,17,21,25,50,52,63,70,75,76,80,87,91,92,93,97,98,100,101,102,103,104,105,107,108,109,110,112,113,117,118,120,122,124,125,126,127,129,130,131,132,133,134,135,136,138,140,141,147,148,149,151,152,156,157,158,159,161,163,164,168,169,170,179,180,182,183,186,191,193,196],"AIzaSyCNm9YxQumEXwGJgTDjxoxXK6m1F-9720Q","AIzaSyCc76DZePGtoyUjqKrLdsMGk_ry7sljLbY","web.dev","AIzaSyB9bqgQ2t11WJsOX8qNsCQ6U-w91mmqF-I","AIzaSyAdYnStPdzjcJJtQ0mvIaeaMKj7_t6J_Fg",null,null,null,["Search__enable_ai_eligibility_checks","MiscFeatureFlags__developers_footer_image","MiscFeatureFlags__enable_project_variables","MiscFeatureFlags__enable_variable_operator","Cloud__enable_free_trial_server_call","Profiles__enable_developer_profiles_callout","DevPro__enable_cloud_innovators_plus","Experiments__reqs_query_experiments","Cloud__enable_cloud_facet_chat","Search__enable_dynamic_content_confidential_banner","Profiles__enable_page_saving","OnSwitch__enable","CloudShell__cloud_code_overflow_menu","Profiles__enable_public_developer_profiles","Concierge__enable_pushui","BookNav__enable_tenant_cache_key","Profiles__enable_release_notes_notifications","TpcFeatures__enable_mirror_tenant_redirects","MiscFeatureFlags__developers_footer_dark_image","Profiles__enable_awarding_url","Search__enable_page_map","EngEduTelemetry__enable_engedu_telemetry","Analytics__enable_clearcut_logging","Profiles__enable_dashboard_curated_recommendations","MiscFeatureFlags__enable_firebase_utm","Cloud__enable_llm_concierge_chat","Cloud__enable_cloud_shell","Profiles__enable_completecodelab_endpoint","Profiles__enable_profile_collections","MiscFeatureFlags__enable_view_transitions","Cloud__enable_cloudx_ping","Search__enable_suggestions_from_borg","MiscFeatureFlags__emergency_css","DevPro__enable_developer_subscriptions","Cloud__enable_cloud_dlp_service","MiscFeatureFlags__enable_explain_this_code","TpcFeatures__enable_required_headers","Cloud__enable_cloud_shell_fte_user_flow","Profiles__enable_recognition_badges","Cloud__enable_cloudx_experiment_ids","Profiles__require_profile_eligibility_for_signin","Profiles__enable_complete_playlist_endpoint","Cloud__enable_legacy_calculator_redirect","CloudShell__cloud_shell_button"],null,null,"AIzaSyA58TaKli1DculwmAmbpzLVGuWc8eCQgQc","https://developerscontentserving-pa.googleapis.com","AIzaSyDWBU60w0P9hEkr29kkksYs8Z7gvZ8u_wc","https://developerscontentsearch-pa.googleapis.com",2,4,null,"https://developerprofiles-pa.googleapis.com",[27,"web","web.dev","web.dev",null,"web-dot-devsite-v2-prod-3p.appspot.com",null,null,[null,null,null,null,null,null,null,null,null,null,null,[1],null,null,null,null,null,null,[1],null,null,null,null,[1,null,1],[1,1,null,1,1]],null,[38,null,null,null,null,null,"/images/lockup.svg","/images/touchicon-180.png",null,null,null,1,1,null,null,null,null,null,null,null,null,2,null,null,null,"/images/lockup-dark-theme.svg",[]],[],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[],[1,1]],[[null,null,null,null,null,["GTM-MZWCJPP"],null,null,null,null,null,[["GTM-MZWCJPP",1]],1]],null,4]]') </script> <devsite-a11y-announce></devsite-a11y-announce> </body> </html>