HTML рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕
рдареЛрд╕ HTML рд╣рд░ рд╢рд╛рдирджрд╛рд░ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреА рдиреАрдВрд╡ рд╣реИред рдпреЗ рдЯрд┐рдкреНрд╕ рдЖрдкрдХреЛ рд╕рд┐рдореЗрдВрдЯрд┐рдХ, рдордЬрдмреВрдд рдФрд░ рднрд╡рд┐рд╖реНрдп-рдкреНрд░реВрдл рдорд╛рд░реНрдХрдЕрдк рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдФрд░ рд╕реНрдХреНрд░реАрди рд░реАрдбрд░ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред
рдЗрдореЗрдЬ рдкрд░ рд╕реНрдкрд╖реНрдЯ width рдФрд░ height рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЗрдореЗрдЬ рд▓реЛрдб рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рд╣реА рдЬрдЧрд╣ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░ рд▓реЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреНрдпреВрдореБрд▓реЗрдЯрд┐рд╡ рд▓реЗрдЖрдЙрдЯ рд╢рд┐рдлреНрдЯ (CLS) тАФ Google рдХреЗ Core Web Vitals рдореЗрдВ рд╕реЗ рдПрдХ тАФ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИред
<!-- тЭМ рдЦрд░рд╛рдм: рдЗрдореЗрдЬ рд▓реЛрдб рд╣реЛрдиреЗ рддрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ --> <img src="hero.jpg" alt="рд╣реАрд░реЛ рдЗрдореЗрдЬ"> <!-- тЬЕ рдЕрдЪреНрдЫрд╛: рд╕реНрдерд╛рди рддреБрд░рдВрдд рдЖрд░рдХреНрд╖рд┐рдд --> <img src="hero.jpg" alt="рд╣реАрд░реЛ рдЗрдореЗрдЬ" width="1200" height="630" loading="lazy">
aspect-ratio: auto рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░реЗрдВ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ CSS рджреНрд╡рд╛рд░рд╛ рдЗрдореЗрдЬ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдкрд░ рднреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣реА рдЕрдиреБрдкрд╛рдд рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛редрдареАрдХ рд╕реЗ рдиреЗрд╕реНрдЯреЗрдб рд╣реЗрдбрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд░реВрдкрд░реЗрдЦрд╛ рд╕рд░реНрдЪ рдЗрдВрдЬрдиреЛрдВ рдХреЛ рдЖрдкрдХреА рд╕рд╛рдордЧреНрд░реА рдкрджрд╛рдиреБрдХреНрд░рдо рд╕рдордЭрдиреЗ рдФрд░ рд╕реНрдХреНрд░реАрди рд░реАрдбрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреЗрдЬ рдХреЛ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
<h1>рдкреЗрдЬ рдХрд╛ рд╢реАрд░реНрд╖рдХ (рдкреНрд░рддрд┐ рдкреЗрдЬ рдПрдХ)</h1> <h2>рдореБрдЦреНрдп рдЕрдиреБрднрд╛рдЧ</h2> <h3>рдЙрдк-рдЕрдиреБрднрд╛рдЧ</h3> <h3>рджреВрд╕рд░рд╛ рдЙрдк-рдЕрдиреБрднрд╛рдЧ</h3> <h2>рджреВрд╕рд░рд╛ рдореБрдЦреНрдп рдЕрдиреБрднрд╛рдЧ</h2>
target="_blank" рдХреЗ рд╕рд╛рде рдирдП рдЯреИрдм рдореЗрдВ рд▓рд┐рдВрдХ рдЦреЛрд▓рддреЗ рд╕рдордп, рдЦреЛрд▓рд╛ рдЧрдпрд╛ рдкреЗрдЬ window.opener рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдкрдХреЗ рдкреЗрдЬ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддрд╛ рд╣реИред rel="noopener noreferrer" рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдпрд╣ рд╕реБрд░рдХреНрд╖рд╛ рднреЗрджреНрдпрддрд╛ рд░реБрдХ рдЬрд╛рддреА рд╣реИ рдФрд░ рд░реЗрдлрд╝рд░рд░ рдЬрд╛рдирдХрд╛рд░реА рднреЗрдЬрдирд╛ рднреА рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
<!-- тЭМ рднреЗрджреНрдп --> <a href="https://example.com" target="_blank">рд╡рд┐рдЬрд╝рд┐рдЯ рдХрд░реЗрдВ</a> <!-- тЬЕ рд╕реБрд░рдХреНрд╖рд┐рдд --> <a href="https://example.com" target="_blank" rel="noopener noreferrer">рд╡рд┐рдЬрд╝рд┐рдЯ рдХрд░реЗрдВ</a>
autocomplete рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдореИрдиреЗрдЬрд░ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдлрд╝реЙрд░реНрдо рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдХреИрд╕реЗ рднрд░рдирд╛ рд╣реИред рдпрд╣ рдореЛрдмрд╛рдЗрд▓ рдлрд╝реЙрд░реНрдо рдкреВрд░реНрдгрддрд╛ рджрд░ рдореЗрдВ рдирд╛рдЯрдХреАрдп рд░реВрдк рд╕реЗ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИред
<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">
Open Graph рдореЗрдЯрд╛ рдЯреИрдЧ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ Facebook, LinkedIn рдФрд░ Twitter/X рдЬреИрд╕реЗ рд╕реЛрд╢рд▓ рдореАрдбрд┐рдпрд╛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдЖрдкрдХрд╛ рдкреЗрдЬ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдЗрдирдХреЗ рдмрд┐рдирд╛, рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдЪреБрдирддреЗ рд╣реИрдВред
<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">
CSS рдЯрд┐рдкреНрд╕ рдФрд░ рдЯреНрд░рд┐рдХреНрд╕
рдЖрдзреБрдирд┐рдХ CSS рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИред рдпреЗ рдЯрд┐рдкреНрд╕ рд▓реЗрдЖрдЙрдЯ, рдХрд╕реНрдЯрдо рдкреНрд░реЙрдкрд░реНрдЯреАрдЬ рдФрд░ рдкреИрдЯрд░реНрди рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХрд╛ рд╕рдордп рдмрдЪрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреА рд╕реНрдЯрд╛рдЗрд▓рд╢реАрдЯ рдХреЛ рд╕рд╛рдл рд░рдЦрддреЗ рд╣реИрдВред
рдкреЛрдЬреАрд╢рдирд┐рдВрдЧ рд╣реИрдХ рд╕реЗ рд▓рдбрд╝рдирд╛ рдмрдВрдж рдХрд░реЗрдВред CSS Grid рдХрд╛ place-items рд╢реЙрд░реНрдЯрд╣реИрдВрдб рджреЛ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХреНрд╖реИрддрд┐рдЬ рдФрд░ рд▓рдВрдмрд╡рдд рджреЛрдиреЛрдВ рддрд░рд╣ рд╕реЗ рд╕реЗрдВрдЯрд░ рдХрд░рддрд╛ рд╣реИ тАФ рдХреЛрдИ calc рдирд╣реАрдВ, рдХреЛрдИ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдирд╣реАрдВред
.center-everything { display: grid; place-items: center; } /* рдлрд╝реБрд▓-рдкреЗрдЬ рд╕реЗрдВрдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ */ body { display: grid; place-items: center; min-height: 100vh; }
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); }
clamp(min, preferred, max) рдлрд╝реЙрдиреНрдЯ рдЖрдХрд╛рд░реЛрдВ рдХреЛ рд╡реНрдпреВрдкреЛрд░реНрдЯ рдЪреМрдбрд╝рд╛рдИ рдХреЗ рд╕рд╛рде рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ тАФ рдХреЛрдИ рдореАрдбрд┐рдпрд╛ рдХреНрд╡реЗрд░реАрдЬрд╝ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВред рдордзреНрдп рдорд╛рди рдЖрдорддреМрд░ рдкрд░ рдПрдХ vw рдЗрдХрд╛рдИ рд╣реЛрддрд╛ рд╣реИред
/* 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; /* рдЗрд╖реНрдЯрддрдо рдкрдарди рдЪреМрдбрд╝рд╛рдИ */ }
рд╡реИрд╢реНрд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдореВрде рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдВрдХрд░ рдЯрд╛рд░рдЧреЗрдЯ рдкрд░ scroll-margin-top рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдХрд┐ рд╕реНрдЯрд┐рдХреА рд╣реЗрдбрд░ рд╕реНрдХреНрд░реЙрд▓ рдХреА рдЬрд╛ рд░рд╣реА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдУрд╡рд░рд▓реИрдк рди рдХрд░реЗрдВред
@media (prefers-reduced-motion: no-preference) { html { scroll-behavior: smooth; } } /* рд╕реНрдЯрд┐рдХреА рд╣реЗрдбрд░ рдХреЗ рд▓рд┐рдП рдСрдлрд╝рд╕реЗрдЯ (рдЬреИрд╕реЗ 70px рд▓рдВрдмрд╛) */ [id] { scroll-margin-top: 90px; }
scroll-behavior: smooth рдХреЛ prefers-reduced-motion: no-preference рдореАрдбрд┐рдпрд╛ рдХреНрд╡реЗрд░реА рдореЗрдВ рд░реИрдк рдХрд░реЗрдВ тАФ рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдирд┐рдореЗрдЯреЗрдб рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рд╕реЗ рдореЛрд╢рди рд╕рд┐рдХрдиреЗрд╕ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░рддреЗ рд╣реИрдВредauto-fill + minmax() рдкреИрдЯрд░реНрди рдПрдХ рдРрд╕рд╛ рдЧреНрд░рд┐рдб рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдЙрдкрд▓рдмреНрдз рд╕реНрдерд╛рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЙрд▓рдо рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ тАФ рдХреЛрдИ рдореАрдбрд┐рдпрд╛ рдХреНрд╡реЗрд░реАрдЬрд╝ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВред
.card-grid { display: grid; grid-template-columns: repeat( auto-fill, minmax(280px, 1fr) ); gap: 24px; } /* рдореЛрдмрд╛рдЗрд▓ рдкрд░ 1 рдХреЙрд▓рдо тЖТ 2 тЖТ 3 тЖТ 4 рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ */
рд╡реИрд╢реНрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдХрднреА рднреА outline: none рди рдХрд░реЗрдВ тАФ рдпрд╣ рдХреАрдмреЛрд░реНрдб рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдХреАрдмреЛрд░реНрдб рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдлрд╝реЛрдХрд╕ рд░рд┐рдВрдЧ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП :focus-visible рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬрд┐рд╕рд╕реЗ рдорд╛рдЙрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рд╕рд╛рдл рд░рд╣реЗред
/* тЭМ рдРрд╕рд╛ рдХрднреА рди рдХрд░реЗрдВ */ * { outline: none; } /* тЬЕ рдорд╛рдЙрд╕ рдХреЗ рд▓рд┐рдП рдЫреБрдкрд╛рдПрдБ, рдХреАрдмреЛрд░реНрдб рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рдПрдБ */ :focus:not(:focus-visible) { outline: none; } :focus-visible { outline: 2px solid #6366f1; outline-offset: 3px; border-radius: 4px; }
JavaScript рдЯрд┐рдкреНрд╕
рдЗрди рдЖрдзреБрдирд┐рдХ рдкреИрдЯрд░реНрди рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ API рдХреЗ рд╕рд╛рде рдХреНрд▓реАрдирд░, рдЕрдзрд┐рдХ рдкрд░рдлрд╝реЙрд░реНрдореЗрдВрдЯ JavaScript рд▓рд┐рдЦреЗрдВред
scroll рдЗрд╡реЗрдВрдЯ (рдЬреЛ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рд╕реИрдХрдбрд╝реЛрдВ рдмрд╛рд░ рдлрд╝рд╛рдпрд░ рд╣реЛрддрд╛ рд╣реИ) рд╕реБрдирдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдХреЗрд╡рд▓ рддрднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП IntersectionObserver API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрдм рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ рд╡реНрдпреВрдкреЛрд░реНрдЯ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВред
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));
resize рдФрд░ input рдЬреИрд╕реЗ рдЗрд╡реЗрдВрдЯреНрд╕ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдлрд╝рд╛рдпрд░ рд╣реЛрддреЗ рд╣реИрдВред рдбреАрдмрд╛рдЙрдВрд╕рд┐рдВрдЧ рддрдм рддрдХ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рджреЗрд░реА рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рдирд╛ рдмрдВрдж рдирд╣реАрдВ рдХрд░ рджреЗрддрд╛, рдЬрд┐рд╕рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рд░реБрдХ рдЬрд╛рддрд╛ рд╣реИред
function debounce(fn, delay = 300) { let timer; return (...args) => { clearTimeout(timer); timer = setTimeout(() => fn(...args), delay); }; } // рдЙрдкрдпреЛрдЧ window.addEventListener('resize', debounce(() => { recalculateLayout(); }, 200) );
рдЖрдзреБрдирд┐рдХ navigator.clipboard API рдкреНрд░реЙрдорд┐рд╕-рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдкреБрд░рд╛рдиреЗ document.execCommand('copy') рд╣реИрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХреНрд▓реАрдирд░ рд╣реИред
async function copyToClipboard(text) { try { await navigator.clipboard.writeText(text); showToast('рдХреЙрдкреА рд╣реЛ рдЧрдпрд╛!'); } catch (err) { console.error('рдХреЙрдкреА рд╡рд┐рдлрд▓:', err); } } // рдЙрдкрдпреЛрдЧ document.querySelector('.copy-btn') .addEventListener('click', () => copyToClipboard('рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрдХреНрд╕реНрдЯ') );
localStorage рдкреНрд░рд╛рдЗрд╡реЗрдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рдореЛрдб рдореЗрдВ рдпрд╛ рд╕реНрдЯреЛрд░реЗрдЬ рднрд░ рдЬрд╛рдиреЗ рдкрд░ рдереНрд░реЛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ try/catch рд╣реЗрд▓реНрдкрд░ рдореЗрдВ рд░реИрдк рдХрд░реЗрдВред
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');
JavaScript-рдЪрд╛рд▓рд┐рдд рдПрдирд┐рдореЗрд╢рди (рдЬреИрд╕реЗ рдХреИрдирд╡рд╕, GSAP) рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА prefers-reduced-motion рд╕реЗрдЯрд┐рдВрдЧ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдПрдирд┐рдореЗрд╢рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдПрдБ рдпрд╛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВред
const prefersReduced = window .matchMedia('(prefers-reduced-motion: reduce)') .matches; if (!prefersReduced) { startAnimations(); } else { showStaticFallback(); }
рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ рдЯрд┐рдкреНрд╕
рддреЗрдЬрд╝ рд╡реЗрдмрд╕рд╛рдЗрдЯреЗрдВ рдЙрдЪреНрдЪ рд░реИрдВрдХ рдХрд░рддреА рд╣реИрдВ, рдмреЗрд╣рддрд░ рд░реВрдкрд╛рдВрддрд░рд┐рдд рд╣реЛрддреА рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЦреБрд╢ рд░рдЦрддреА рд╣реИрдВред рдпреЗ рдЯрд┐рдкреНрд╕ рд╡реЗрдм рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЬреАрдд рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВред
font-display: swap рдХреЗ рдмрд┐рдирд╛, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╕реНрдЯрдо рдлрд╝реЙрдиреНрдЯ рд▓реЛрдб рд╣реЛрдиреЗ рддрдХ рдЯреЗрдХреНрд╕реНрдЯ рдЫреБрдкрд╛рддреЗ рд╣реИрдВ (FOIT)ред рдЗрд╕рдХреЗ рд╕рд╛рде, рд╕рд┐рд╕реНрдЯрдо рдлрд╝реЙрдиреНрдЯ рддреБрд░рдВрдд рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рд╕реНрд╡реИрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ тАФ рдЬрд┐рд╕рд╕реЗ Largest Contentful Paint (LCP) рдореЗрдВ рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИред
<!-- рдЪрд░рдг 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">
WebP рдФрд░ AVIF рдЗрдореЗрдЬ рд╕рдорд╛рди рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ JPEG рдФрд░ PNG рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рдЫреЛрдЯреА рд╣реЛрддреА рд╣реИрдВред рдкреБрд░рд╛рдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд▓рд┐рдП JPEG рдлрд╝реЙрд▓рдмреИрдХ рдХреЗ рд╕рд╛рде рдЖрдзреБрдирд┐рдХ рдлрд╝реЙрд░реНрдореЗрдЯ рд╕рд░реНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП <picture> рдПрд▓рд┐рдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
<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>
рдирд┐рдпрдорд┐рдд <script> рдЯреИрдЧ HTML рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддреЗ рд╣реИрдВред defer рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдкреВрд░реНрдг рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рддрд╛ рд╣реИ (рдХреНрд░рдо рдореЗрдВ)ред async рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбрд╛рдЙрдирд▓реЛрдб рд╣реЛрддреЗ рд╣реА рдЪрд▓рд╛рддрд╛ рд╣реИ (рдХреНрд░рдо рдЧрд╛рд░рдВрдЯреАрдб рдирд╣реАрдВ)ред
<!-- рд░реЗрдВрдбрд░рд┐рдВрдЧ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИ тЭМ --> <script src="app.js"></script> <!-- DOM рдХреЗ рдмрд╛рдж рдХреНрд░рдо рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ тЬЕ (рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ) --> <script src="app.js" defer></script> <!-- рддреИрдпрд╛рд░ рд╣реЛрддреЗ рд╣реА рддреБрд░рдВрдд рдЪрд▓рддрд╛ рд╣реИ тЬЕ (рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕, рд╡рд┐рдЬреНрдЮрд╛рдкрди) --> <script src="analytics.js" async></script>
transform рдФрд░ opacity рдХреЛ рдПрдирд┐рдореЗрдЯ рдХрд░рдиреЗ рдкрд░ рдЯрд┐рдХреЗ рд░рд╣реЗрдВ тАФ рд╡реЗ рдмрд┐рдирд╛ рд▓реЗрдЖрдЙрдЯ рдпрд╛ рдкреЗрдВрдЯ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдП GPU рдХрдВрдкреЛрдЬрд┐рдЯрд░ рдереНрд░реЗрдб рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред will-change рдХреЗрд╡рд▓ рддрднреА рдЬреЛрдбрд╝реЗрдВ рдЬрдм рдЖрдк рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХрд░реЗрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рд╛рдн рджреЗрдЦреЗрдВред
/* тЭМ рд▓реЗрдЖрдЙрдЯ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ (рдорд╣рдВрдЧрд╛) */ .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; } /* рдмрд╛рдж рдореЗрдВ рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ */
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ CSS рдпрд╛ JS рдореЗрдВ рдЦреЛрдЬреЗ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреНрд░рд┐рдЯрд┐рдХрд▓ рд░рд┐рд╕реЛрд░реНрд╕реЗрдЬ рдХреЛ рдЬрд▓реНрджреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП <link rel="preload"> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╣реАрд░реЛ рдЗрдореЗрдЬ, рдХреНрд░рд┐рдЯрд┐рдХрд▓ рдлрд╝реЙрдиреНрдЯреНрд╕ рдФрд░ рдореБрдЦреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ред
<!-- рд╣реАрд░реЛ рдЗрдореЗрдЬ рдкреНрд░реАрд▓реЛрдб рдХрд░реЗрдВ (LCP рдПрд▓рд┐рдореЗрдВрдЯ) --> <link rel="preload" as="image" href="hero.webp" fetchpriority="high"> <!-- рдХреНрд░рд┐рдЯрд┐рдХрд▓ рдлрд╝реЙрдиреНрдЯ рдкреНрд░реАрд▓реЛрдб рдХрд░реЗрдВ --> <link rel="preload" as="font" href="font.woff2" type="font/woff2" crossorigin>
рдПрдХреНрд╕реЗрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдЯрд┐рдкреНрд╕
рдПрдХреНрд╕реЗрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдПрдХ рдЪреЗрдХрд▓рд┐рд╕реНрдЯ рдирд╣реАрдВ рд╣реИ тАФ рдпрд╣ рдЕрдЪреНрдЫрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рд╣реИред рдпреЗ рдЯрд┐рдкреНрд╕ рдЖрдкрдХреА рд╕рд╛рдЗрдЯреЛрдВ рдХреЛ рд╕реНрдХреНрд░реАрди рд░реАрдбрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдФрд░ рдХреАрдмреЛрд░реНрдб рдиреЗрд╡рд┐рдЧреЗрдЯрд░реНрд╕ рд╕рд╣рд┐рдд рд╕рднреА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред
рдЬрд┐рди рдмрдЯрдиреЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЖрдЗрдХрди рд╣реЛрддрд╛ рд╣реИ, рдЙрдирдореЗрдВ рд╕реНрдХреНрд░реАрди рд░реАрдбрд░ рдХреЗ рд▓рд┐рдП рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рджреГрд╢реНрдпрдорд╛рди рдЯреЗрдХреНрд╕реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ред рд╡рд░реНрдгрдирд╛рддреНрдордХ рд▓реЗрдмрд▓ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП aria-label рдЬреЛрдбрд╝реЗрдВред
<!-- тЭМ рд╕реНрдХреНрд░реАрди рд░реАрдбрд░ рдХрд╣рддрд╛ рд╣реИ "рдмрдЯрди" --> <button><i class="fa-solid fa-times"></i></button> <!-- тЬЕ рд╕реНрдХреНрд░реАрди рд░реАрдбрд░ рдХрд╣рддрд╛ рд╣реИ "рдбрд╛рдпрд▓реЙрдЧ рдмрдВрдж рдХрд░реЗрдВ" --> <button aria-label="рдбрд╛рдпрд▓реЙрдЧ рдмрдВрдж рдХрд░реЗрдВ"> <i class="fa-solid fa-times" aria-hidden="true"></i> </button>
lang рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рд╕реНрдХреНрд░реАрди рд░реАрдбрд░ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, CSS рдореЗрдВ рд╕рд╣реА рд╣рд╛рдЗрдлрд╝рдиреЗрд╢рди рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЕрдиреБрд╡рд╛рдж рдЯреВрд▓ рдХреЛ рд╕рд╛рдордЧреНрд░реА рднрд╛рд╖рд╛ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред RTL рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП, dir="rtl" рднреА рдЬреЛрдбрд╝реЗрдВред
<!-- рдЕрдВрдЧреНрд░реЗрдЬрд╝реА --> <html lang="en"> <!-- рдЕрд░рдмреА (RTL) --> <html lang="ar" dir="rtl"> <!-- рдлрд╝реНрд░реЗрдВрдЪ --> <html lang="fr">
WCAG 2.1 AA рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рд╛рдорд╛рдиреНрдп рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо 4.5:1 рдХрдВрдЯреНрд░рд╛рд╕реНрдЯ рдЕрдиреБрдкрд╛рдд рдФрд░ рдмрдбрд╝реЗ рдЯреЗрдХреНрд╕реНрдЯ (18px+ рдмреЛрд▓реНрдб рдпрд╛ 24px+ рдирд┐рдпрдорд┐рдд) рдХреЗ рд▓рд┐рдП 3:1 рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╢рд┐рдкрд┐рдВрдЧ рд╕реЗ рдкрд╣рд▓реЗ рдХрдВрдЯреНрд░рд╛рд╕реНрдЯ рдЪреЗрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
/* тЭМ #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; }
рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдРрд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕реЗ рдХреЗрд╡рд▓ рд╕реНрдХреНрд░реАрди рд░реАрдбрд░ рд╣реА рд╕реБрди рд╕рдХреЗрдВ тАФ рдЬреИрд╕реЗ рд╕реНрдХрд┐рдк-рдЯреВ-рдХрдВрдЯреЗрдВрдЯ рд▓рд┐рдВрдХ рдпрд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓ рдПрд▓рд┐рдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд▓реЗрдмрд▓ред .sr-only рдпреВрдЯрд┐рд▓рд┐рдЯреА рдХреНрд▓рд╛рд╕ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕рд┐рдмрд▓ рд░рдЦрддреЗ рд╣реБрдП рджреГрд╖реНрдЯрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЫреБрдкрд╛ рджреЗрддреА рд╣реИред
.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>
рдЬрдм рдХреЛрдИ рдореЛрдбрд▓ рдЦреБрд▓рд╛ рд╣реЛ, рддреЛ рдХреАрдмреЛрд░реНрдб рдлрд╝реЛрдХрд╕ рдЙрд╕реА рдХреЗ рднреАрддрд░ рд╕реАрдорд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдпрдерд╛ Tab рдУрд╡рд░рд▓реЗ рдХреЗ рдкреАрдЫреЗ рдХреЗ рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ рдкрд░ рдлрд╝реЛрдХрд╕ рдХрд░реЗрдЧрд╛ тАФ рдЬрд┐рд╕рд╕реЗ рдореЛрдбрд▓ рдХреАрдмреЛрд░реНрдб рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкрдпреЛрдЧреА рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
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(); }
рд░рд┐рд╕реНрдкреЙрдиреНрд╕рд┐рд╡ рдФрд░ рдореЛрдмрд╛рдЗрд▓ рдЯрд┐рдкреНрд╕
рдореЛрдмрд╛рдЗрд▓ рдЯреНрд░реИрдлрд╝рд┐рдХ рдкреНрд░рдореБрдЦ рд╣реИред рдпреЗ рдЯрд┐рдкреНрд╕ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рд╣рд░ рд╕реНрдХреНрд░реАрди рд╕рд╛рдЗрдЬрд╝ рдкрд░ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ тАФ 320px рдлрд╝реЛрди рд╕реЗ рд▓реЗрдХрд░ 4K рдореЙрдирд┐рдЯрд░ рддрдХред
рд╡реНрдпреВрдкреЛрд░реНрдЯ рдореЗрдЯрд╛ рдЯреИрдЧ рдХреЗ рдмрд┐рдирд╛, рдореЛрдмрд╛рдЗрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░ ~980px рдбреЗрд╕реНрдХрдЯреЙрдк рдЪреМрдбрд╝рд╛рдИ рдкрд░ рд░реЗрдВрдбрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЬрд╝реВрдо рдЖрдЙрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ тАФ рдЗрд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рдПрдХ рдмрдбрд╝реА рдПрдХреНрд╕реЗрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдмрд╛рдзрд╛ рд╣реИ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЬрд╝реВрдо рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред
<!-- тЭМ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬрд╝реВрдо рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ (рдПрдХреНрд╕реЗрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдЙрд▓реНрд▓рдВрдШрди) --> <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">
Apple рдХреЗ рд╣реНрдпреВрдорди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рдФрд░ WCAG 2.5.5 рдиреНрдпреВрдирддрдо 44├Ч44 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; }
CSS рд▓реЙрдЬрд┐рдХрд▓ рдкреНрд░реЙрдкрд░реНрдЯреАрдЬ рдЬреИрд╕реЗ margin-inline-start рдмрдЬрд╛рдп margin-left рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд▓реЗрдЦрди рдореЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рджрд┐рд╢рд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлрд╝реНрд▓рд┐рдк рдХрд░рддреА рд╣реИрдВ тАФ рдЬрд┐рд╕рд╕реЗ RTL рд╕рдорд░реНрдерди рд▓рдЧрднрдЧ рд╕рд╣рдЬ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
/* рднреМрддрд┐рдХ (RTL рдХреЗ рд▓рд┐рдП рдлрд╝реНрд▓рд┐рдк рдирд╣реАрдВ рд╣реЛрддрд╛) */ .icon { margin-right: 8px; } /* рд▓реЙрдЬрд┐рдХрд▓ (RTL рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлрд╝реНрд▓рд┐рдк рд╣реЛрддрд╛ рд╣реИ) */ .icon { margin-inline-end: 8px; } /* рдЕрдзрд┐рдХ рд▓реЙрдЬрд┐рдХрд▓ рдкреНрд░реЙрдкрд░реНрдЯреА рдЙрджрд╛рд╣рд░рдг */ .card { padding-inline: 16px; /* рдмрд╛рдПрдБ + рджрд╛рдПрдБ */ padding-block: 12px; /* рдКрдкрд░ + рдиреАрдЪреЗ */ border-start-start-radius: 12px; /* LTR рдореЗрдВ рдКрдкрд░-рдмрд╛рдПрдБ */ }
рдореЛрдмрд╛рдЗрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ 100vh рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреНрд░реЛрдо (рдПрдбреНрд░реЗрд╕ рдмрд╛рд░) рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдмрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдкрд░ рдУрд╡рд░рдлрд╝реНрд▓реЛ рд╣реЛрддрд╛ рд╣реИред рдирдИ dvh (рдбрд╛рдпрдирд╛рдорд┐рдХ рд╡реНрдпреВрдкреЛрд░реНрдЯ рд╣рд╛рдЗрдЯ) рдЗрдХрд╛рдИ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреНрд░реЛрдо рджрд┐рдЦрд╛рдиреЗ рдпрд╛ рдЫрд┐рдкрд╛рдиреЗ рдкрд░ рд╕рдорд╛рдпреЛрдЬрд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИред
/* тЭМ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреНрд░реЛрдо рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдкрд░ рдореЛрдмрд╛рдЗрд▓ рдкрд░ рдУрд╡рд░рдлрд╝реНрд▓реЛ рд╣реЛрддрд╛ рд╣реИ */ .hero { height: 100vh; } /* тЬЕ рдкреБрд░рд╛рдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╝реЙрд▓рдмреИрдХ рдХреЗ рд╕рд╛рде */ .hero { height: 100vh; /* рдлрд╝реЙрд▓рдмреИрдХ */ height: 100dvh; /* рдбрд╛рдпрдирд╛рдорд┐рдХ рд╡реНрдпреВрдкреЛрд░реНрдЯ рд╣рд╛рдЗрдЯ */ }
svh (рдЫреЛрдЯрд╛ рд╡реНрдпреВрдкреЛрд░реНрдЯ, рд╣рдореЗрд╢рд╛ рдХреНрд░реЛрдо рдХреЛ рдмрд╛рд╣рд░ рд░рдЦрддрд╛ рд╣реИ) рдФрд░ lvh (рдмрдбрд╝рд╛ рд╡реНрдпреВрдкреЛрд░реНрдЯ, рд╣рдореЗрд╢рд╛ рдХреНрд░реЛрдо рд╕реНрдерд╛рди рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИ)редResponsiveCheckTool рд╕реЗ рдФрд░ рдЕрдзрд┐рдХ
рдЗрди рдЯрд┐рдкреНрд╕ рдХреЛ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рд▓рд╛рдПрдБ
рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЗ рд░рд┐рд╕реНрдкреЙрдиреНрд╕рд┐рд╡ рдкрд░рд┐рд╡рд░реНрддрди рдореЛрдмрд╛рдЗрд▓, рдЯреИрдмрд▓реЗрдЯ рдФрд░ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рдХреИрд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВ тАФ рддреБрд░рдВрдд, рдореБрдлрд╝реНрдд рдореЗрдВ, рдХреЛрдИ рд╕рд╛рдЗрди-рдЕрдк рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВред
рдЕрднреА рдЕрдкрдиреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ