рд░рд┐рд╕реНрдкреЙрдиреНрд╕рд┐рд╡ рдЯреЗрд╕реНрдЯ рдЯреВрд▓
рдпрд╣рд╛рдБ рд╡рд┐рдЬреНрдЮрд╛рдкрди рджреЗрдВ
RTT рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЧреНрд░рд╣рд┐рдд

рд░рд┐рд╕реНрдкреЙрдиреНрд╕рд┐рд╡ рдбрд┐рдЬрд╝рд╛рдЗрди рдФрд░ рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░ рдЯрд┐рдкреНрд╕

рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ, рдХреЙрдкреА-рдкреЗрд╕реНрдЯ-рддреИрдпрд╛рд░ HTML, CSS, JavaScript, рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ рдФрд░ рдПрдХреНрд╕реЗрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдЯрд┐рдкреНрд╕ред рдЪрд╛рд╣реЗ рдЖрдк рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдореБрдлрд╝реНрдд рд╡реНрдпреВрдкреЛрд░реНрдЯ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ, CSS рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдСрдирд▓рд╛рдЗрди рдЪреЗрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ, рдпрд╛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд░рд╣реЗ рд╣реЛрдВ рдХрд┐ рдЖрдкрдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдЯреИрдмрд▓реЗрдЯ рдкрд░ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИ тАФ рдпреЗ рдЯрд┐рдкреНрд╕ рдЖрдкрдХреЗ рд░рд┐рд╕реНрдкреЙрдиреНрд╕рд┐рд╡ рдЯреЗрд╕реНрдЯ рдЯреВрд▓ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдЯрд┐рдк рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЖрддреА рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

30+ рдЯрд┐рдкреНрд╕
6 рд╢реНрд░реЗрдгрд┐рдпрд╛рдБ
рдЕрдкрдбреЗрдЯреЗрдб: рдЕрдкреНрд░реИрд▓ 2026
рдореЛрдмрд╛рдЗрд▓-рдХреЗрдВрджреНрд░рд┐рдд
рдлрд╝рд┐рд▓реНрдЯрд░:
рд╢реНрд░реЗрдгреА 01

HTML рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕

5 рдЯрд┐рдкреНрд╕

рдареЛрд╕ HTML рд╣рд░ рд╢рд╛рдирджрд╛рд░ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреА рдиреАрдВрд╡ рд╣реИред рдпреЗ рдЯрд┐рдкреНрд╕ рдЖрдкрдХреЛ рд╕рд┐рдореЗрдВрдЯрд┐рдХ, рдордЬрдмреВрдд рдФрд░ рднрд╡рд┐рд╖реНрдп-рдкреНрд░реВрдл рдорд╛рд░реНрдХрдЕрдк рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдФрд░ рд╕реНрдХреНрд░реАрди рд░реАрдбрд░ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред

HTML ┬╖ рдЗрдореЗрдЬ
рд▓реЗрдЖрдЙрдЯ рд╢рд┐рдлреНрдЯ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП <img> рдкрд░ рд╣рдореЗрд╢рд╛ width рдФрд░ height рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
HTMLPerf

рдЗрдореЗрдЬ рдкрд░ рд╕реНрдкрд╖реНрдЯ width рдФрд░ height рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЗрдореЗрдЬ рд▓реЛрдб рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рд╣реА рдЬрдЧрд╣ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░ рд▓реЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреНрдпреВрдореБрд▓реЗрдЯрд┐рд╡ рд▓реЗрдЖрдЙрдЯ рд╢рд┐рдлреНрдЯ (CLS) тАФ Google рдХреЗ Core Web Vitals рдореЗрдВ рд╕реЗ рдПрдХ тАФ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИред

HTML
<!-- тЭМ рдЦрд░рд╛рдм: рдЗрдореЗрдЬ рд▓реЛрдб рд╣реЛрдиреЗ рддрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ -->
<img src="hero.jpg" alt="рд╣реАрд░реЛ рдЗрдореЗрдЬ">

<!-- тЬЕ рдЕрдЪреНрдЫрд╛: рд╕реНрдерд╛рди рддреБрд░рдВрдд рдЖрд░рдХреНрд╖рд┐рдд -->
<img src="hero.jpg"
     alt="рд╣реАрд░реЛ рдЗрдореЗрдЬ"
     width="1200"
     height="630"
     loading="lazy">
CSS рдореЗрдВ aspect-ratio: auto рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░реЗрдВ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ CSS рджреНрд╡рд╛рд░рд╛ рдЗрдореЗрдЬ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдкрд░ рднреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣реА рдЕрдиреБрдкрд╛рдд рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛ред
HTML ┬╖ рд╕рд┐рдореЗрдВрдЯрд┐рдХреНрд╕
рдкреНрд░рддрд┐ рдкреЗрдЬ рдПрдХ <h1> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рд╣реЗрдбрд┐рдВрдЧ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рддрд╛рд░реНрдХрд┐рдХ рд░рдЦреЗрдВ
HTMLA11y

рдареАрдХ рд╕реЗ рдиреЗрд╕реНрдЯреЗрдб рд╣реЗрдбрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд░реВрдкрд░реЗрдЦрд╛ рд╕рд░реНрдЪ рдЗрдВрдЬрдиреЛрдВ рдХреЛ рдЖрдкрдХреА рд╕рд╛рдордЧреНрд░реА рдкрджрд╛рдиреБрдХреНрд░рдо рд╕рдордЭрдиреЗ рдФрд░ рд╕реНрдХреНрд░реАрди рд░реАрдбрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреЗрдЬ рдХреЛ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

HTML
<h1>рдкреЗрдЬ рдХрд╛ рд╢реАрд░реНрд╖рдХ (рдкреНрд░рддрд┐ рдкреЗрдЬ рдПрдХ)</h1>
  <h2>рдореБрдЦреНрдп рдЕрдиреБрднрд╛рдЧ</h2>
    <h3>рдЙрдк-рдЕрдиреБрднрд╛рдЧ</h3>
    <h3>рджреВрд╕рд░рд╛ рдЙрдк-рдЕрдиреБрднрд╛рдЧ</h3>
  <h2>рджреВрд╕рд░рд╛ рдореБрдЦреНрдп рдЕрдиреБрднрд╛рдЧ</h2>
HTML ┬╖ рд▓рд┐рдВрдХ
рдмрд╛рд╣рд░реА рд▓рд┐рдВрдХ рдореЗрдВ rel="noopener noreferrer" рдЬреЛрдбрд╝реЗрдВ
HTML

target="_blank" рдХреЗ рд╕рд╛рде рдирдП рдЯреИрдм рдореЗрдВ рд▓рд┐рдВрдХ рдЦреЛрд▓рддреЗ рд╕рдордп, рдЦреЛрд▓рд╛ рдЧрдпрд╛ рдкреЗрдЬ window.opener рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдкрдХреЗ рдкреЗрдЬ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддрд╛ рд╣реИред rel="noopener noreferrer" рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдпрд╣ рд╕реБрд░рдХреНрд╖рд╛ рднреЗрджреНрдпрддрд╛ рд░реБрдХ рдЬрд╛рддреА рд╣реИ рдФрд░ рд░реЗрдлрд╝рд░рд░ рдЬрд╛рдирдХрд╛рд░реА рднреЗрдЬрдирд╛ рднреА рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

HTML
<!-- тЭМ рднреЗрджреНрдп -->
<a href="https://example.com" target="_blank">рд╡рд┐рдЬрд╝рд┐рдЯ рдХрд░реЗрдВ</a>

<!-- тЬЕ рд╕реБрд░рдХреНрд╖рд┐рдд -->
<a href="https://example.com"
   target="_blank"
   rel="noopener noreferrer">рд╡рд┐рдЬрд╝рд┐рдЯ рдХрд░реЗрдВ</a>
HTML ┬╖ рдлрд╝реЙрд░реНрдо
рдореЛрдмрд╛рдЗрд▓ рдкрд░ рдлрд╝реЙрд░реНрдо UX рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП autocomplete рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
HTMLMobile

autocomplete рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдореИрдиреЗрдЬрд░ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдлрд╝реЙрд░реНрдо рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдХреИрд╕реЗ рднрд░рдирд╛ рд╣реИред рдпрд╣ рдореЛрдмрд╛рдЗрд▓ рдлрд╝реЙрд░реНрдо рдкреВрд░реНрдгрддрд╛ рджрд░ рдореЗрдВ рдирд╛рдЯрдХреАрдп рд░реВрдк рд╕реЗ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИред

HTML
<input type="text"    autocomplete="given-name">
<input type="email"   autocomplete="email">
<input type="tel"     autocomplete="tel">
<input type="password" autocomplete="current-password">
<input type="text"    autocomplete="postal-code">
HTML ┬╖ рдореЗрдЯрд╛
рдмреЗрд╣рддрд░ рд╕реЛрд╢рд▓ рдореАрдбрд┐рдпрд╛ рд╢реЗрдпрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП Open Graph рдЯреИрдЧ рдЬреЛрдбрд╝реЗрдВ
HTML

Open Graph рдореЗрдЯрд╛ рдЯреИрдЧ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ Facebook, LinkedIn рдФрд░ Twitter/X рдЬреИрд╕реЗ рд╕реЛрд╢рд▓ рдореАрдбрд┐рдпрд╛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдЖрдкрдХрд╛ рдкреЗрдЬ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдЗрдирдХреЗ рдмрд┐рдирд╛, рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдЪреБрдирддреЗ рд╣реИрдВред

HTML тАФ <head>
<meta property="og:title"       content="рдкреЗрдЬ рдХрд╛ рд╢реАрд░реНрд╖рдХ">
<meta property="og:description"  content="рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг">
<meta property="og:image"       content="https://yourdomain.com/og.jpg">
<meta property="og:url"         content="https://yourdomain.com/page">
<meta property="og:type"        content="website">
<!-- Twitter/X -->
<meta name="twitter:card"      content="summary_large_image">
рд╢реНрд░реЗрдгреА 02

CSS рдЯрд┐рдкреНрд╕ рдФрд░ рдЯреНрд░рд┐рдХреНрд╕

6 рдЯрд┐рдкреНрд╕

рдЖрдзреБрдирд┐рдХ CSS рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИред рдпреЗ рдЯрд┐рдкреНрд╕ рд▓реЗрдЖрдЙрдЯ, рдХрд╕реНрдЯрдо рдкреНрд░реЙрдкрд░реНрдЯреАрдЬ рдФрд░ рдкреИрдЯрд░реНрди рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХрд╛ рд╕рдордп рдмрдЪрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреА рд╕реНрдЯрд╛рдЗрд▓рд╢реАрдЯ рдХреЛ рд╕рд╛рдл рд░рдЦрддреЗ рд╣реИрдВред

CSS ┬╖ рд▓реЗрдЖрдЙрдЯ
CSS Grid рд╕реЗ 2 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдХреБрдЫ рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗрдВрдЯрд░ рдХрд░реЗрдВ
CSS

рдкреЛрдЬреАрд╢рдирд┐рдВрдЧ рд╣реИрдХ рд╕реЗ рд▓рдбрд╝рдирд╛ рдмрдВрдж рдХрд░реЗрдВред CSS Grid рдХрд╛ place-items рд╢реЙрд░реНрдЯрд╣реИрдВрдб рджреЛ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХреНрд╖реИрддрд┐рдЬ рдФрд░ рд▓рдВрдмрд╡рдд рджреЛрдиреЛрдВ рддрд░рд╣ рд╕реЗ рд╕реЗрдВрдЯрд░ рдХрд░рддрд╛ рд╣реИ тАФ рдХреЛрдИ calc рдирд╣реАрдВ, рдХреЛрдИ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдирд╣реАрдВред

CSS
.center-everything {
  display: grid;
  place-items: center;
}

/* рдлрд╝реБрд▓-рдкреЗрдЬ рд╕реЗрдВрдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ */
body {
  display: grid;
  place-items: center;
  min-height: 100vh;
}
CSS ┬╖ рдХрд╕реНрдЯрдо рдкреНрд░реЙрдкрд░реНрдЯреАрдЬ
рдмрдирд╛рдП рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рдбрд┐рдЬрд╝рд╛рдЗрди рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП CSS рдХрд╕реНрдЯрдо рдкреНрд░реЙрдкрд░реНрдЯреАрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
CSS

CSS рдХрд╕реНрдЯрдо рдкреНрд░реЙрдкрд░реНрдЯреАрдЬ (рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕) рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдЯреЛрдХрди рдХреЛ рдПрдХ рдмрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╣рд░ рдЬрдЧрд╣ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рджреЗрддреА рд╣реИрдВред рд╡реЗ рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рдореЗрдВ рдЕрдкрдбреЗрдЯ рднреА рд╣реЛрддреА рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдбрд╛рд░реНрдХ рдореЛрдб рдФрд░ рдереАрдорд┐рдВрдЧ рддреБрдЪреНрдЫ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

CSS
:root {
  --color-primary: #6366f1;
  --color-bg: #ffffff;
  --radius-md: 12px;
  --spacing-md: 16px;
}

@media (prefers-color-scheme: dark) {
  :root {
    --color-bg: #0d1117;
  }
}

.btn {
  background: var(--color-primary);
  border-radius: var(--radius-md);
  padding: var(--spacing-md);
}
CSS ┬╖ рдЯрд╛рдЗрдкреЛрдЧреНрд░рд╛рдлрд╝реА
рдлрд╝реНрд▓реВрдб, рд░рд┐рд╕реНрдкреЙрдиреНрд╕рд┐рд╡ рдЯрд╛рдЗрдкреЛрдЧреНрд░рд╛рдлрд╝реА рдХреЗ рд▓рд┐рдП clamp() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
CSSResponsive

clamp(min, preferred, max) рдлрд╝реЙрдиреНрдЯ рдЖрдХрд╛рд░реЛрдВ рдХреЛ рд╡реНрдпреВрдкреЛрд░реНрдЯ рдЪреМрдбрд╝рд╛рдИ рдХреЗ рд╕рд╛рде рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ тАФ рдХреЛрдИ рдореАрдбрд┐рдпрд╛ рдХреНрд╡реЗрд░реАрдЬрд╝ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВред рдордзреНрдп рдорд╛рди рдЖрдорддреМрд░ рдкрд░ рдПрдХ vw рдЗрдХрд╛рдИ рд╣реЛрддрд╛ рд╣реИред

CSS
/* clamp(рдиреНрдпреВрдирддрдо, рдкрд╕рдВрджреАрджрд╛, рдЕрдзрд┐рдХрддрдо) */
h1 {
  font-size: clamp(1.8rem, 5vw, 3.5rem);
}

p {
  font-size: clamp(0.9rem, 2vw, 1.1rem);
  line-height: 1.7;
  max-width: 65ch; /* рдЗрд╖реНрдЯрддрдо рдкрдарди рдЪреМрдбрд╝рд╛рдИ */
}
CSS ┬╖ рд╕реНрдХреНрд░реЙрд▓
рдПрдВрдХрд░ рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рд╕реНрдореВрде рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдФрд░ scroll-margin
CSSUX

рд╡реИрд╢реНрд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдореВрде рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдВрдХрд░ рдЯрд╛рд░рдЧреЗрдЯ рдкрд░ scroll-margin-top рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдХрд┐ рд╕реНрдЯрд┐рдХреА рд╣реЗрдбрд░ рд╕реНрдХреНрд░реЙрд▓ рдХреА рдЬрд╛ рд░рд╣реА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдУрд╡рд░рд▓реИрдк рди рдХрд░реЗрдВред

CSS
@media (prefers-reduced-motion: no-preference) {
  html {
    scroll-behavior: smooth;
  }
}

/* рд╕реНрдЯрд┐рдХреА рд╣реЗрдбрд░ рдХреЗ рд▓рд┐рдП рдСрдлрд╝рд╕реЗрдЯ (рдЬреИрд╕реЗ 70px рд▓рдВрдмрд╛) */
[id] {
  scroll-margin-top: 90px;
}
рд╣рдореЗрд╢рд╛ scroll-behavior: smooth рдХреЛ prefers-reduced-motion: no-preference рдореАрдбрд┐рдпрд╛ рдХреНрд╡реЗрд░реА рдореЗрдВ рд░реИрдк рдХрд░реЗрдВ тАФ рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдирд┐рдореЗрдЯреЗрдб рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рд╕реЗ рдореЛрд╢рди рд╕рд┐рдХрдиреЗрд╕ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░рддреЗ рд╣реИрдВред
CSS ┬╖ рд▓реЗрдЖрдЙрдЯ
рд╕реЗрд▓реНрдл-рд╣реАрд▓рд┐рдВрдЧ рдХрд╛рд░реНрдб рд▓реЗрдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП CSS Grid auto-fill рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
CSSResponsive

auto-fill + minmax() рдкреИрдЯрд░реНрди рдПрдХ рдРрд╕рд╛ рдЧреНрд░рд┐рдб рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдЙрдкрд▓рдмреНрдз рд╕реНрдерд╛рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЙрд▓рдо рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ тАФ рдХреЛрдИ рдореАрдбрд┐рдпрд╛ рдХреНрд╡реЗрд░реАрдЬрд╝ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВред

CSS
.card-grid {
  display: grid;
  grid-template-columns: repeat(
    auto-fill,
    minmax(280px, 1fr)
  );
  gap: 24px;
}
/* рдореЛрдмрд╛рдЗрд▓ рдкрд░ 1 рдХреЙрд▓рдо тЖТ 2 тЖТ 3 тЖТ 4 рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ */
CSS ┬╖ рд╡рд┐рдЬрд╝рд┐рдмрд┐рд▓рд┐рдЯреА
outline рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп :focus-visible рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
CSSA11y

рд╡реИрд╢реНрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдХрднреА рднреА outline: none рди рдХрд░реЗрдВ тАФ рдпрд╣ рдХреАрдмреЛрд░реНрдб рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдХреАрдмреЛрд░реНрдб рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдлрд╝реЛрдХрд╕ рд░рд┐рдВрдЧ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП :focus-visible рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬрд┐рд╕рд╕реЗ рдорд╛рдЙрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рд╕рд╛рдл рд░рд╣реЗред

CSS
/* тЭМ рдРрд╕рд╛ рдХрднреА рди рдХрд░реЗрдВ */
* { outline: none; }

/* тЬЕ рдорд╛рдЙрд╕ рдХреЗ рд▓рд┐рдП рдЫреБрдкрд╛рдПрдБ, рдХреАрдмреЛрд░реНрдб рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рдПрдБ */
:focus:not(:focus-visible) {
  outline: none;
}
:focus-visible {
  outline: 2px solid #6366f1;
  outline-offset: 3px;
  border-radius: 4px;
}
рд╢реНрд░реЗрдгреА 03

JavaScript рдЯрд┐рдкреНрд╕

5 рдЯрд┐рдкреНрд╕

рдЗрди рдЖрдзреБрдирд┐рдХ рдкреИрдЯрд░реНрди рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ API рдХреЗ рд╕рд╛рде рдХреНрд▓реАрдирд░, рдЕрдзрд┐рдХ рдкрд░рдлрд╝реЙрд░реНрдореЗрдВрдЯ JavaScript рд▓рд┐рдЦреЗрдВред

JS ┬╖ API
рд▓реЗрдЬрд╝реА рд▓реЛрдбрд┐рдВрдЧ рдФрд░ рд╕реНрдХреНрд░реЙрд▓ рдЗрдлрд╝реЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП IntersectionObserver рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
JSPerf

scroll рдЗрд╡реЗрдВрдЯ (рдЬреЛ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рд╕реИрдХрдбрд╝реЛрдВ рдмрд╛рд░ рдлрд╝рд╛рдпрд░ рд╣реЛрддрд╛ рд╣реИ) рд╕реБрдирдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдХреЗрд╡рд▓ рддрднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП IntersectionObserver API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрдм рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ рд╡реНрдпреВрдкреЛрд░реНрдЯ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВред

JavaScript
const observer = new IntersectionObserver(
  (entries) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        entry.target.classList.add('visible');
        observer.unobserve(entry.target); // рджреЗрдЦрдирд╛ рдмрдВрдж рдХрд░реЗрдВ
      }
    });
  },
  { rootMargin: '0px 0px -50px 0px' }
);

document.querySelectorAll('.animate-on-scroll')
  .forEach(el => observer.observe(el));
JS ┬╖ рдкрд░рдлреЙрд░реНрдореЗрдВрд╕
рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ рд╣рд┐рдЯ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП resize рдФрд░ input рдЗрд╡реЗрдВрдЯреНрд╕ рдХреЛ рдбреАрдмрд╛рдЙрдВрд╕ рдХрд░реЗрдВ
JSPerf

resize рдФрд░ input рдЬреИрд╕реЗ рдЗрд╡реЗрдВрдЯреНрд╕ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдлрд╝рд╛рдпрд░ рд╣реЛрддреЗ рд╣реИрдВред рдбреАрдмрд╛рдЙрдВрд╕рд┐рдВрдЧ рддрдм рддрдХ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рджреЗрд░реА рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рдирд╛ рдмрдВрдж рдирд╣реАрдВ рдХрд░ рджреЗрддрд╛, рдЬрд┐рд╕рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рд░реБрдХ рдЬрд╛рддрд╛ рд╣реИред

JavaScript
function debounce(fn, delay = 300) {
  let timer;
  return (...args) => {
    clearTimeout(timer);
    timer = setTimeout(() => fn(...args), delay);
  };
}

// рдЙрдкрдпреЛрдЧ
window.addEventListener('resize',
  debounce(() => {
    recalculateLayout();
  }, 200)
);
JS ┬╖ API
рдХреЙрдкреА-рдЯреВ-рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдмрдЯрди рдХреЗ рд▓рд┐рдП Clipboard API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
JSUX

рдЖрдзреБрдирд┐рдХ navigator.clipboard API рдкреНрд░реЙрдорд┐рд╕-рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдкреБрд░рд╛рдиреЗ document.execCommand('copy') рд╣реИрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХреНрд▓реАрдирд░ рд╣реИред

JavaScript
async function copyToClipboard(text) {
  try {
    await navigator.clipboard.writeText(text);
    showToast('рдХреЙрдкреА рд╣реЛ рдЧрдпрд╛!');
  } catch (err) {
    console.error('рдХреЙрдкреА рд╡рд┐рдлрд▓:', err);
  }
}

// рдЙрдкрдпреЛрдЧ
document.querySelector('.copy-btn')
  .addEventListener('click', () =>
    copyToClipboard('рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрдХреНрд╕реНрдЯ')
  );
JS ┬╖ рд╕реНрдЯреЛрд░реЗрдЬ
рдПрд░рд░ рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реЗрд▓реНрдкрд░ рдХреЗ рд╕рд╛рде localStorage рдХрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
JS

localStorage рдкреНрд░рд╛рдЗрд╡реЗрдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рдореЛрдб рдореЗрдВ рдпрд╛ рд╕реНрдЯреЛрд░реЗрдЬ рднрд░ рдЬрд╛рдиреЗ рдкрд░ рдереНрд░реЛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ try/catch рд╣реЗрд▓реНрдкрд░ рдореЗрдВ рд░реИрдк рдХрд░реЗрдВред

JavaScript
const storage = {
  get(key, fallback = null) {
    try {
      const item = localStorage.getItem(key);
      return item ? JSON.parse(item) : fallback;
    } catch { return fallback; }
  },
  set(key, value) {
    try {
      localStorage.setItem(key, JSON.stringify(value));
      return true;
    } catch { return false; }
  }
};

storage.set('theme', 'dark');
const theme = storage.get('theme', 'light');
JS ┬╖ рдореАрдбрд┐рдпрд╛
JavaScript рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА reduced-motion рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдБ
JSA11y

JavaScript-рдЪрд╛рд▓рд┐рдд рдПрдирд┐рдореЗрд╢рди (рдЬреИрд╕реЗ рдХреИрдирд╡рд╕, GSAP) рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА prefers-reduced-motion рд╕реЗрдЯрд┐рдВрдЧ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдПрдирд┐рдореЗрд╢рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдПрдБ рдпрд╛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВред

JavaScript
const prefersReduced = window
  .matchMedia('(prefers-reduced-motion: reduce)')
  .matches;

if (!prefersReduced) {
  startAnimations();
} else {
  showStaticFallback();
}
рд╢реНрд░реЗрдгреА 04

рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ рдЯрд┐рдкреНрд╕

5 рдЯрд┐рдкреНрд╕

рддреЗрдЬрд╝ рд╡реЗрдмрд╕рд╛рдЗрдЯреЗрдВ рдЙрдЪреНрдЪ рд░реИрдВрдХ рдХрд░рддреА рд╣реИрдВ, рдмреЗрд╣рддрд░ рд░реВрдкрд╛рдВрддрд░рд┐рдд рд╣реЛрддреА рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЦреБрд╢ рд░рдЦрддреА рд╣реИрдВред рдпреЗ рдЯрд┐рдкреНрд╕ рд╡реЗрдм рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЬреАрдд рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВред

рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ ┬╖ рдлрд╝реЙрдиреНрдЯреНрд╕
Google Fonts рдХреЗ рд▓рд┐рдП font-display: swap рдФрд░ preconnect рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
Perf

font-display: swap рдХреЗ рдмрд┐рдирд╛, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╕реНрдЯрдо рдлрд╝реЙрдиреНрдЯ рд▓реЛрдб рд╣реЛрдиреЗ рддрдХ рдЯреЗрдХреНрд╕реНрдЯ рдЫреБрдкрд╛рддреЗ рд╣реИрдВ (FOIT)ред рдЗрд╕рдХреЗ рд╕рд╛рде, рд╕рд┐рд╕реНрдЯрдо рдлрд╝реЙрдиреНрдЯ рддреБрд░рдВрдд рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рд╕реНрд╡реИрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ тАФ рдЬрд┐рд╕рд╕реЗ Largest Contentful Paint (LCP) рдореЗрдВ рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИред

HTML тАФ <head>
<!-- рдЪрд░рдг 1: preconnect -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>

<!-- рдЪрд░рдг 2: URL рдореЗрдВ &display=swap рдЬреЛрдбрд╝реЗрдВ -->
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;700&display=swap"
      rel="stylesheet">
рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ ┬╖ рдЗрдореЗрдЬ
<picture> рдлрд╝реЙрд▓рдмреИрдХ рдХреЗ рд╕рд╛рде рдЖрдзреБрдирд┐рдХ рдЗрдореЗрдЬ рдлрд╝реЙрд░реНрдореЗрдЯ рд╕рд░реНрд╡ рдХрд░реЗрдВ
PerfHTML

WebP рдФрд░ AVIF рдЗрдореЗрдЬ рд╕рдорд╛рди рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ JPEG рдФрд░ PNG рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рдЫреЛрдЯреА рд╣реЛрддреА рд╣реИрдВред рдкреБрд░рд╛рдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд▓рд┐рдП JPEG рдлрд╝реЙрд▓рдмреИрдХ рдХреЗ рд╕рд╛рде рдЖрдзреБрдирд┐рдХ рдлрд╝реЙрд░реНрдореЗрдЯ рд╕рд░реНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП <picture> рдПрд▓рд┐рдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

HTML
<picture>
  <source srcset="hero.avif" type="image/avif">
  <source srcset="hero.webp" type="image/webp">
  <img src="hero.jpg"
       alt="рд╣реАрд░реЛ рдЗрдореЗрдЬ"
       width="1200" height="630"
       loading="lazy">
</picture>
рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ ┬╖ рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕
рдЧреИрд░-рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдХреЛ defer рдпрд╛ async рдХреЗ рд╕рд╛рде рд▓реЛрдб рдХрд░реЗрдВ
PerfHTML

рдирд┐рдпрдорд┐рдд <script> рдЯреИрдЧ HTML рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддреЗ рд╣реИрдВред defer рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдкреВрд░реНрдг рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рддрд╛ рд╣реИ (рдХреНрд░рдо рдореЗрдВ)ред async рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбрд╛рдЙрдирд▓реЛрдб рд╣реЛрддреЗ рд╣реА рдЪрд▓рд╛рддрд╛ рд╣реИ (рдХреНрд░рдо рдЧрд╛рд░рдВрдЯреАрдб рдирд╣реАрдВ)ред

HTML
<!-- рд░реЗрдВрдбрд░рд┐рдВрдЧ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИ тЭМ -->
<script src="app.js"></script>

<!-- DOM рдХреЗ рдмрд╛рдж рдХреНрд░рдо рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ тЬЕ (рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ) -->
<script src="app.js" defer></script>

<!-- рддреИрдпрд╛рд░ рд╣реЛрддреЗ рд╣реА рддреБрд░рдВрдд рдЪрд▓рддрд╛ рд╣реИ тЬЕ (рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕, рд╡рд┐рдЬреНрдЮрд╛рдкрди) -->
<script src="analytics.js" async></script>
рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ ┬╖ CSS
GPU-рддреНрд╡рд░рд┐рдд рдПрдирд┐рдореЗрд╢рди рдХреЗ рд▓рд┐рдП will-change рдХрд╛ рд╕рдВрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
PerfCSS

transform рдФрд░ opacity рдХреЛ рдПрдирд┐рдореЗрдЯ рдХрд░рдиреЗ рдкрд░ рдЯрд┐рдХреЗ рд░рд╣реЗрдВ тАФ рд╡реЗ рдмрд┐рдирд╛ рд▓реЗрдЖрдЙрдЯ рдпрд╛ рдкреЗрдВрдЯ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдП GPU рдХрдВрдкреЛрдЬрд┐рдЯрд░ рдереНрд░реЗрдб рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред will-change рдХреЗрд╡рд▓ рддрднреА рдЬреЛрдбрд╝реЗрдВ рдЬрдм рдЖрдк рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХрд░реЗрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рд╛рдн рджреЗрдЦреЗрдВред

CSS
/* тЭМ рд▓реЗрдЖрдЙрдЯ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ (рдорд╣рдВрдЧрд╛) */
.bad { transition: width 0.3s, top 0.3s; }

/* тЬЕ GPU-рдХрдВрдкреЛрдЬрд┐рдЯреЗрдб (рд╕рд╕реНрддрд╛) */
.good { transition: transform 0.3s, opacity 0.3s; }

/* рд╕рдВрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдХреЗрд╡рд▓ рдЬрдЯрд┐рд▓ рдПрдирд┐рдореЗрд╢рди рд╕реЗ рдкрд╣рд▓реЗ */
.modal-enter { will-change: transform; }
.modal-entered { will-change: auto; } /* рдмрд╛рдж рдореЗрдВ рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ */
рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ ┬╖ рд░рд┐рд╕реЛрд░реНрд╕реЗрдЬ
рдлрд╝реЛрд▓реНрдб рдХреЗ рдКрдкрд░ рдХреНрд░рд┐рдЯрд┐рдХрд▓ рдПрд╕реЗрдЯреНрд╕ рдХреЛ рдкреНрд░реАрд▓реЛрдб рдХрд░реЗрдВ
PerfHTML

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ CSS рдпрд╛ JS рдореЗрдВ рдЦреЛрдЬреЗ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреНрд░рд┐рдЯрд┐рдХрд▓ рд░рд┐рд╕реЛрд░реНрд╕реЗрдЬ рдХреЛ рдЬрд▓реНрджреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП <link rel="preload"> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╣реАрд░реЛ рдЗрдореЗрдЬ, рдХреНрд░рд┐рдЯрд┐рдХрд▓ рдлрд╝реЙрдиреНрдЯреНрд╕ рдФрд░ рдореБрдЦреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ред

HTML тАФ <head>
<!-- рд╣реАрд░реЛ рдЗрдореЗрдЬ рдкреНрд░реАрд▓реЛрдб рдХрд░реЗрдВ (LCP рдПрд▓рд┐рдореЗрдВрдЯ) -->
<link rel="preload" as="image"
      href="hero.webp" fetchpriority="high">

<!-- рдХреНрд░рд┐рдЯрд┐рдХрд▓ рдлрд╝реЙрдиреНрдЯ рдкреНрд░реАрд▓реЛрдб рдХрд░реЗрдВ -->
<link rel="preload" as="font"
      href="font.woff2" type="font/woff2"
      crossorigin>
рд╢реНрд░реЗрдгреА 05

рдПрдХреНрд╕реЗрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдЯрд┐рдкреНрд╕

5 рдЯрд┐рдкреНрд╕

рдПрдХреНрд╕реЗрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдПрдХ рдЪреЗрдХрд▓рд┐рд╕реНрдЯ рдирд╣реАрдВ рд╣реИ тАФ рдпрд╣ рдЕрдЪреНрдЫрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рд╣реИред рдпреЗ рдЯрд┐рдкреНрд╕ рдЖрдкрдХреА рд╕рд╛рдЗрдЯреЛрдВ рдХреЛ рд╕реНрдХреНрд░реАрди рд░реАрдбрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдФрд░ рдХреАрдмреЛрд░реНрдб рдиреЗрд╡рд┐рдЧреЗрдЯрд░реНрд╕ рд╕рд╣рд┐рдд рд╕рднреА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред

A11y ┬╖ ARIA
рдХреЗрд╡рд▓-рдЖрдЗрдХрди рдмрдЯрдиреЛрдВ рдХреЗ рд▓рд┐рдП aria-label рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
A11yHTML

рдЬрд┐рди рдмрдЯрдиреЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЖрдЗрдХрди рд╣реЛрддрд╛ рд╣реИ, рдЙрдирдореЗрдВ рд╕реНрдХреНрд░реАрди рд░реАрдбрд░ рдХреЗ рд▓рд┐рдП рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рджреГрд╢реНрдпрдорд╛рди рдЯреЗрдХреНрд╕реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ред рд╡рд░реНрдгрдирд╛рддреНрдордХ рд▓реЗрдмрд▓ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП aria-label рдЬреЛрдбрд╝реЗрдВред

HTML
<!-- тЭМ рд╕реНрдХреНрд░реАрди рд░реАрдбрд░ рдХрд╣рддрд╛ рд╣реИ "рдмрдЯрди" -->
<button><i class="fa-solid fa-times"></i></button>

<!-- тЬЕ рд╕реНрдХреНрд░реАрди рд░реАрдбрд░ рдХрд╣рддрд╛ рд╣реИ "рдбрд╛рдпрд▓реЙрдЧ рдмрдВрдж рдХрд░реЗрдВ" -->
<button aria-label="рдбрд╛рдпрд▓реЙрдЧ рдмрдВрдж рдХрд░реЗрдВ">
  <i class="fa-solid fa-times" aria-hidden="true"></i>
</button>
A11y ┬╖ рднрд╛рд╖рд╛
рд╣рдореЗрд╢рд╛ <html> рдкрд░ lang рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ
A11yHTML

lang рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рд╕реНрдХреНрд░реАрди рд░реАрдбрд░ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, CSS рдореЗрдВ рд╕рд╣реА рд╣рд╛рдЗрдлрд╝рдиреЗрд╢рди рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЕрдиреБрд╡рд╛рдж рдЯреВрд▓ рдХреЛ рд╕рд╛рдордЧреНрд░реА рднрд╛рд╖рд╛ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред RTL рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП, dir="rtl" рднреА рдЬреЛрдбрд╝реЗрдВред

HTML
<!-- рдЕрдВрдЧреНрд░реЗрдЬрд╝реА -->
<html lang="en">

<!-- рдЕрд░рдмреА (RTL) -->
<html lang="ar" dir="rtl">

<!-- рдлрд╝реНрд░реЗрдВрдЪ -->
<html lang="fr">
A11y ┬╖ рд░рдВрдЧ
рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо 4.5:1 рдХрдВрдЯреНрд░рд╛рд╕реНрдЯ рдЕрдиреБрдкрд╛рдд рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ
A11yCSS

WCAG 2.1 AA рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рд╛рдорд╛рдиреНрдп рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо 4.5:1 рдХрдВрдЯреНрд░рд╛рд╕реНрдЯ рдЕрдиреБрдкрд╛рдд рдФрд░ рдмрдбрд╝реЗ рдЯреЗрдХреНрд╕реНрдЯ (18px+ рдмреЛрд▓реНрдб рдпрд╛ 24px+ рдирд┐рдпрдорд┐рдд) рдХреЗ рд▓рд┐рдП 3:1 рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╢рд┐рдкрд┐рдВрдЧ рд╕реЗ рдкрд╣рд▓реЗ рдХрдВрдЯреНрд░рд╛рд╕реНрдЯ рдЪреЗрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдмреЗрд╣рддрд░реАрди рдореБрдлрд╝реНрдд рдЯреВрд▓: WebAIM рдХрдВрдЯреНрд░рд╛рд╕реНрдЯ рдЪреЗрдХрд░ webaim.org/resources/contrastchecker/ рдкрд░ рдпрд╛ Colour Contrast Analyser рдбреЗрд╕реНрдХрдЯреЙрдк рдРрдк рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВред Chrome DevTools рдХрд▓рд░ рдкрд┐рдХрд░ рдореЗрдВ рдХрдВрдЯреНрд░рд╛рд╕реНрдЯ рдЕрдиреБрдкрд╛рдд рднреА рджрд┐рдЦрд╛рддрд╛ рд╣реИред
CSS тАФ рдЙрджрд╛рд╣рд░рдг
/* тЭМ #6b7280 on #fff = 4.48:1 (рдЫреЛрдЯреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд▓рд┐рдП AA рд╡рд┐рдлрд▓) */
.muted { color: #6b7280; background: #fff; }

/* тЬЕ #4b5563 on #fff = 7.0:1 (AA рдФрд░ AAA рдкрд╛рд╕) */
.muted { color: #4b5563; background: #fff; }
A11y ┬╖ рд╕реНрдХреНрд░реАрди рд░реАрдбрд░
рджреГрд╖реНрдЯрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЫрд┐рдкреЗ рд▓реЗрдХрд┐рди рдПрдХреНрд╕реЗрд╕рд┐рдмрд▓ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд▓рд┐рдП .sr-only рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
A11yCSS

рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдРрд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕реЗ рдХреЗрд╡рд▓ рд╕реНрдХреНрд░реАрди рд░реАрдбрд░ рд╣реА рд╕реБрди рд╕рдХреЗрдВ тАФ рдЬреИрд╕реЗ рд╕реНрдХрд┐рдк-рдЯреВ-рдХрдВрдЯреЗрдВрдЯ рд▓рд┐рдВрдХ рдпрд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓ рдПрд▓рд┐рдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд▓реЗрдмрд▓ред .sr-only рдпреВрдЯрд┐рд▓рд┐рдЯреА рдХреНрд▓рд╛рд╕ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕рд┐рдмрд▓ рд░рдЦрддреЗ рд╣реБрдП рджреГрд╖реНрдЯрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЫреБрдкрд╛ рджреЗрддреА рд╣реИред

CSS + HTML
.sr-only {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0,0,0,0);
  white-space: nowrap;
  border: 0;
}

<!-- рд╕реНрдХрд┐рдк рд▓рд┐рдВрдХ рдЙрджрд╛рд╣рд░рдг -->
<a href="#main" class="sr-only">рд╕рд╛рдордЧреНрд░реА рдкрд░ рдЬрд╛рдПрдБ</a>
A11y ┬╖ рдХреАрдмреЛрд░реНрдб
рдореЛрдбрд▓ рдФрд░ рдбрд╛рдпрд▓реЙрдЧ рдХреЗ рдЕрдВрджрд░ рдлрд╝реЛрдХрд╕ рдЯреНрд░реИрдк рдХрд░реЗрдВ
A11yJS

рдЬрдм рдХреЛрдИ рдореЛрдбрд▓ рдЦреБрд▓рд╛ рд╣реЛ, рддреЛ рдХреАрдмреЛрд░реНрдб рдлрд╝реЛрдХрд╕ рдЙрд╕реА рдХреЗ рднреАрддрд░ рд╕реАрдорд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдпрдерд╛ Tab рдУрд╡рд░рд▓реЗ рдХреЗ рдкреАрдЫреЗ рдХреЗ рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ рдкрд░ рдлрд╝реЛрдХрд╕ рдХрд░реЗрдЧрд╛ тАФ рдЬрд┐рд╕рд╕реЗ рдореЛрдбрд▓ рдХреАрдмреЛрд░реНрдб рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкрдпреЛрдЧреА рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

JavaScript
function trapFocus(modal) {
  const focusable = modal.querySelectorAll(
    'a, button, input, select, textarea, [tabindex]:not([tabindex="-1"])'
  );
  const first = focusable[0];
  const last = focusable[focusable.length - 1];

  modal.addEventListener('keydown', e => {
    if (e.key !== 'Tab') return;
    if (e.shiftKey ? document.activeElement === first
                   : document.activeElement === last) {
      e.preventDefault();
      (e.shiftKey ? last : first).focus();
    }
  });
  first.focus();
}
рд╢реНрд░реЗрдгреА 06

рд░рд┐рд╕реНрдкреЙрдиреНрд╕рд┐рд╡ рдФрд░ рдореЛрдмрд╛рдЗрд▓ рдЯрд┐рдкреНрд╕

4 рдЯрд┐рдкреНрд╕

рдореЛрдмрд╛рдЗрд▓ рдЯреНрд░реИрдлрд╝рд┐рдХ рдкреНрд░рдореБрдЦ рд╣реИред рдпреЗ рдЯрд┐рдкреНрд╕ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рд╣рд░ рд╕реНрдХреНрд░реАрди рд╕рд╛рдЗрдЬрд╝ рдкрд░ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ тАФ 320px рдлрд╝реЛрди рд╕реЗ рд▓реЗрдХрд░ 4K рдореЙрдирд┐рдЯрд░ рддрдХред

рд░рд┐рд╕реНрдкреЙрдиреНрд╕рд┐рд╡ ┬╖ рдореЗрдЯрд╛
рд╕рд╣реА рд╡реНрдпреВрдкреЛрд░реНрдЯ рдореЗрдЯрд╛ рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
MobileHTML

рд╡реНрдпреВрдкреЛрд░реНрдЯ рдореЗрдЯрд╛ рдЯреИрдЧ рдХреЗ рдмрд┐рдирд╛, рдореЛрдмрд╛рдЗрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░ ~980px рдбреЗрд╕реНрдХрдЯреЙрдк рдЪреМрдбрд╝рд╛рдИ рдкрд░ рд░реЗрдВрдбрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЬрд╝реВрдо рдЖрдЙрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ тАФ рдЗрд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рдПрдХ рдмрдбрд╝реА рдПрдХреНрд╕реЗрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдмрд╛рдзрд╛ рд╣реИ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЬрд╝реВрдо рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред

HTML тАФ <head>
<!-- тЭМ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬрд╝реВрдо рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ (рдПрдХреНрд╕реЗрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдЙрд▓реНрд▓рдВрдШрди) -->
<meta name="viewport"
      content="width=device-width, initial-scale=1, user-scalable=no">

<!-- тЬЕ рд╕рд╣реА: 5├Ч рддрдХ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ -->
<meta name="viewport"
      content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=5">
рд░рд┐рд╕реНрдкреЙрдиреНрд╕рд┐рд╡ ┬╖ рдЯрдЪ
рдореЛрдмрд╛рдЗрд▓ рдкрд░ рдЯреИрдк рдЯрд╛рд░рдЧреЗрдЯ рдХрдо рд╕реЗ рдХрдо 44├Ч44px рдмрдирд╛рдПрдБ
MobileCSSA11y

Apple рдХреЗ рд╣реНрдпреВрдорди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рдФрд░ WCAG 2.5.5 рдиреНрдпреВрдирддрдо 44├Ч44 CSS рдкрд┐рдХреНрд╕реЗрд▓ рдЯреИрдк рдЯрд╛рд░рдЧреЗрдЯ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВред рдЫреЛрдЯреЗ рдЯрд╛рд░рдЧреЗрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдирд┐рд░рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЧрд▓рдд рдЯреИрдк рдХрд╛ рдХрд╛рд░рдг рдмрдирддреЗ рд╣реИрдВред рдЖрдк рдкреИрдбрд┐рдВрдЧ рдпрд╛ рдЫрджреНрдо-рддрддреНрд╡реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреГрд╢реНрдп рдЖрдХрд╛рд░ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреНрд╖реЗрддреНрд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

CSS
/* рджреГрд╢реНрдп рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд┐рдирд╛ рдЯреИрдк рдХреНрд╖реЗрддреНрд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ */
.icon-btn {
  position: relative;
  width: 24px; height: 24px;
}
.icon-btn::before {
  content: '';
  position: absolute;
  top: 50%; left: 50%;
  transform: translate(-50%, -50%);
  min-width: 44px; min-height: 44px;
}
рд░рд┐рд╕реНрдкреЙрдиреНрд╕рд┐рд╡ ┬╖ RTL
RTL рднрд╛рд╖рд╛ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рд▓реЙрдЬрд┐рдХрд▓ CSS рдкреНрд░реЙрдкрд░реНрдЯреАрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
RTLCSS

CSS рд▓реЙрдЬрд┐рдХрд▓ рдкреНрд░реЙрдкрд░реНрдЯреАрдЬ рдЬреИрд╕реЗ margin-inline-start рдмрдЬрд╛рдп margin-left рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд▓реЗрдЦрди рдореЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рджрд┐рд╢рд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлрд╝реНрд▓рд┐рдк рдХрд░рддреА рд╣реИрдВ тАФ рдЬрд┐рд╕рд╕реЗ RTL рд╕рдорд░реНрдерди рд▓рдЧрднрдЧ рд╕рд╣рдЬ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

CSS
/* рднреМрддрд┐рдХ (RTL рдХреЗ рд▓рд┐рдП рдлрд╝реНрд▓рд┐рдк рдирд╣реАрдВ рд╣реЛрддрд╛) */
.icon { margin-right: 8px; }

/* рд▓реЙрдЬрд┐рдХрд▓ (RTL рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлрд╝реНрд▓рд┐рдк рд╣реЛрддрд╛ рд╣реИ) */
.icon { margin-inline-end: 8px; }

/* рдЕрдзрд┐рдХ рд▓реЙрдЬрд┐рдХрд▓ рдкреНрд░реЙрдкрд░реНрдЯреА рдЙрджрд╛рд╣рд░рдг */
.card {
  padding-inline: 16px;      /* рдмрд╛рдПрдБ + рджрд╛рдПрдБ */
  padding-block: 12px;       /* рдКрдкрд░ + рдиреАрдЪреЗ */
  border-start-start-radius: 12px; /* LTR рдореЗрдВ рдКрдкрд░-рдмрд╛рдПрдБ */
}
рд░рд┐рд╕реНрдкреЙрдиреНрд╕рд┐рд╡ ┬╖ рдпреВрдирд┐рдЯреНрд╕
рдореЛрдмрд╛рдЗрд▓ рдлрд╝реБрд▓-рд╕реНрдХреНрд░реАрди рд▓реЗрдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП vh рдХреЗ рдмрдЬрд╛рдп dvh рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
MobileCSS

рдореЛрдмрд╛рдЗрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ 100vh рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреНрд░реЛрдо (рдПрдбреНрд░реЗрд╕ рдмрд╛рд░) рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдмрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдкрд░ рдУрд╡рд░рдлрд╝реНрд▓реЛ рд╣реЛрддрд╛ рд╣реИред рдирдИ dvh (рдбрд╛рдпрдирд╛рдорд┐рдХ рд╡реНрдпреВрдкреЛрд░реНрдЯ рд╣рд╛рдЗрдЯ) рдЗрдХрд╛рдИ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреНрд░реЛрдо рджрд┐рдЦрд╛рдиреЗ рдпрд╛ рдЫрд┐рдкрд╛рдиреЗ рдкрд░ рд╕рдорд╛рдпреЛрдЬрд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИред

CSS
/* тЭМ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреНрд░реЛрдо рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдкрд░ рдореЛрдмрд╛рдЗрд▓ рдкрд░ рдУрд╡рд░рдлрд╝реНрд▓реЛ рд╣реЛрддрд╛ рд╣реИ */
.hero { height: 100vh; }

/* тЬЕ рдкреБрд░рд╛рдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╝реЙрд▓рдмреИрдХ рдХреЗ рд╕рд╛рде */
.hero {
  height: 100vh;          /* рдлрд╝реЙрд▓рдмреИрдХ */
  height: 100dvh;         /* рдбрд╛рдпрдирд╛рдорд┐рдХ рд╡реНрдпреВрдкреЛрд░реНрдЯ рд╣рд╛рдЗрдЯ */
}
2023 рд╕реЗ рд╕рднреА рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рд╕рдорд░реНрдерд┐рддред рдпрд╣ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ: svh (рдЫреЛрдЯрд╛ рд╡реНрдпреВрдкреЛрд░реНрдЯ, рд╣рдореЗрд╢рд╛ рдХреНрд░реЛрдо рдХреЛ рдмрд╛рд╣рд░ рд░рдЦрддрд╛ рд╣реИ) рдФрд░ lvh (рдмрдбрд╝рд╛ рд╡реНрдпреВрдкреЛрд░реНрдЯ, рд╣рдореЗрд╢рд╛ рдХреНрд░реЛрдо рд╕реНрдерд╛рди рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИ)ред

ResponsiveCheckTool рд╕реЗ рдФрд░ рдЕрдзрд┐рдХ

рд░рд┐рд╕реНрдкреЙрдиреНрд╕рд┐рд╡ рдЯреЗрд╕реНрдЯрд░ рд╣рдорд╛рд░реЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдВ рдЧреЛрдкрдиреАрдпрддрд╛ рдиреАрддрд┐
ЁЯЦея╕П

рдЗрди рдЯрд┐рдкреНрд╕ рдХреЛ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рд▓рд╛рдПрдБ

рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЗ рд░рд┐рд╕реНрдкреЙрдиреНрд╕рд┐рд╡ рдкрд░рд┐рд╡рд░реНрддрди рдореЛрдмрд╛рдЗрд▓, рдЯреИрдмрд▓реЗрдЯ рдФрд░ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рдХреИрд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВ тАФ рддреБрд░рдВрдд, рдореБрдлрд╝реНрдд рдореЗрдВ, рдХреЛрдИ рд╕рд╛рдЗрди-рдЕрдк рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВред

рдЕрднреА рдЕрдкрдиреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ