diff --git a/files/uk/web/css/cascade/index.md b/files/uk/web/css/cascade/index.md new file mode 100644 index 000000000..5008d60d4 --- /dev/null +++ b/files/uk/web/css/cascade/index.md @@ -0,0 +1,428 @@ +--- +title: Знайомство з Каскадом CSS +slug: Web/CSS/Cascade +page-type: guide +spec-urls: https://drafts.csswg.org/css-cascade/ +--- + +{{CSSRef}} + +**Каскад** – це алгоритм, який визначає те, як користувацькі агенти поєднують значення властивостей, що походять з різних джерел. Він визначає походження та шар, які мають пріоритет, коли значення однієї властивості одного елемента задаються декількома [походженнями](#typy-pokhodzhen), [каскадними шарами](/uk/docs/Web/CSS/@layer) чи блоками {{CSSxRef("@scope")}}. + +Каскад лежить в основі CSS, як це підкреслює назва – **Каскадні** списки стилів. Коли [селектор](/uk/docs/Web/CSS/CSS_selectors) дає збіг з елементом, то застосовується значення властивості з походження, що має найвищий пріоритет, навіть якщо селектор з походження або шару з нижчим пріоритетом має більшу [специфічність](/uk/docs/Web/CSS/Specificity). + +Ця стаття пояснює те, чим є каскад, і порядок, в якому [оголошення](/uk/docs/Web/API/CSSStyleDeclaration) {{Glossary("CSS")}} каскадуються, охоплюючи каскадні шари та типи походжень. Розуміння пріоритету походжень є ключовим для розуміння каскаду. + +## Типи походжень + +Справа каскадного алгоритму CSS – вибирати оголошення CSS, аби визначати коректні значення властивостей CSS. Оголошення CSS надходять з походжень різних типів: **[Списків стилів користувацького агента](#spysky-styliv-korystuvatskoho-ahenta)**, **[Авторських списків стилів](#avtorski-spysky-styliv)** і **[Користувацьких списків стилів](#korystuvatski-spysky-styliv)**. + +Попри те, що списки стилів надходять з різних походжень, і в кожному з них можуть належати до різних [шарів](/uk/docs/Web/CSS/@layer), вони перекриваються щодо свого усталеного контексту; щоб це працювало, каскадний алгоритм визначає те, як вони взаємодіють. Перед тим, як розглядати ці взаємодії, у кількох наступних розділах будуть визначені деякі ключові терміни. + +### Списки стилів користувацького агента + +Користувацькі агенти, тобто браузери, мають базові списки стилів, які дають усталені стилі для будь-якого документа. Ці списки стилів називаються **списками стилів користувацького агента**. Більшість браузерів використовують для цього справжні списки стилів, тоді як інші імітують їх у своєму коді. Результат однаковий. + +Частина браузерів дозволяє користувачам змінювати список стилів користувацького агента, але це рідкісне явище, яке не можна контролювати. + +Попри те, що частина обмежень, накладених на списки стилів користувацького агента, задана специфікацією HTML, браузери мають багато свободи: це означає, що між браузерами існують деякі відмінності. Щоб спростити процес розробки, веброзробники можуть використовувати список стилів для скидання CSS, наприклад, [normalize.css](https://github.com/necolas/normalize.css), який приводить значення поширених властивостей до відомого стану для всіх браузерів, перш ніж починати вносити зміни, щоб задовольнити свої конкретні потреби. + +Якщо після властивості в списку стилів користувацького агента немає [`!important`](/uk/docs/Web/CSS/Specificity#vyniatok-important), що робило б таке оголошення "важливим", то стилі, оголошені авторськими стилями, в тому числі список стилів для скидання, мають пріоритет над стилями користувацького агента, незалежно від специфічності пов'язаного з ними селектора. + +### Авторські списки стилів + +**Авторські списки стилів** – це найпоширеніший тип списків стилів; це стилі, написані веброзробниками. Вони можуть скидати стилі користувацького агента, як згадувалося вище, і оголошувати стилі для дизайну даної вебсторінки чи застосунку. Автор, тобто веброзробник, визначає стилі для документа, використовуючи один або декілька під'єднаних або імпортованих списків стилів, блоків {{HTMLElement('style')}} і вбудованих стилів, оголошених за допомогою атрибута [`style`](/uk/docs/Web/HTML/Global_attributes/style). Ці авторські стилі визначають вигляд і враження від вебсайту – його тему. + +### Користувацькі списки стилів + +У більшості браузерів користувач (тобто читач) вебсайту може вирішити перевизначити стилі за допомогою **користувацького списку стилів**, розробленого для підігнання досвіду використання під побажання користувача. Залежно від користувацького агента, [користувацькі стилі можуть бути налаштовані](https://www.thoughtco.com/user-style-sheet-3469931) безпосередньо або додані за допомогою розширень браузера. + +### Каскадні шари + +Каскадний порядок заснований на типах походжень. Каскад у межах кожного типу походжень заснований на порядку оголошення [каскадних шарів](/uk/docs/Web/CSS/@layer) в межах відповідного типу. Для всіх походжень – користувацького агента, авторських або користувацьких – стилі можуть бути оголошені всередині або зовні названих або безіменних шарів. Коли вони оголошуються за допомогою [`layer`, `layer()`](/uk/docs/Web/CSS/@import) або [`@layer`](/uk/docs/Web/CSS/@layer), стилі поміщаються в зазначений названий шар, або в безіменний шар, якщо назва не вказана. Стилі, оголошені поза шаром, розглядаються як частина безіменного останнього оголошеного шару. + +Погляньмо на типи каскадних походжень, перш ніж зануритися в каскадні шари всередині кожного типу походжень. + +## Порядок каскадування + +Алгоритм каскадування визначає те, як шукати значення, що буде застосовано для кожної властивості для кожного елемента в документі. Для алгоритму каскадування застосовуються наступні кроки: + +1. **Відповідність**: Спочатку фільтруються всі правила з різних джерел, щоб зібрати лише ті правила, що застосовуються до даного елемента. Це означає правила, чий селектор дає збіг з даним елементом і які є частиною відповідної директиви `media`. + +2. **Походження та вага**: Потім ці правила сортуються згідно зі своєю вагою, тобто тим, чи стоїть після них `!important`, а також їх походженням. Коли поки що ігнорувати шари, то каскадний порядок – наступний: + + | Порядок пріоритету (за зростанням) | Походження | Вага | + | ---------------------------------- | ------------------------------ | ------------ | + | 1 | користувацький агент (браузер) | нормальна | + | 2 | користувач | нормальна | + | 3 | автор (розробник) | нормальна | + | 4 | анімації @keyframe CSS | | + | 5 | автор (розробник) | `!important` | + | 6 | користувач | `!important` | + | 7 | користувацький агент (браузер) | `!important` | + | 8 | переходи CSS | | + +3. **Специфічність:** У випадку рівності за походженням, для вибору серед варіантів певного значення враховується [специфічність](/uk/docs/Web/CSS/Specificity) правила. Порівнюються специфічності селекторів, і перемагає оголошення з найвищою специфічністю. +4. **Контекстна наближеність:** Коли два селектори в одному шарі походження з пріоритетом мають однакову специфічність, то перемагає значення властивості, що має найменшу кількість стрибків по ієрархії DOM до контекстного кореня. Дивіться докладніше та приклад у [Як розв'язуються конфлікти `@scope`](/uk/docs/Web/CSS/@scope#yak-rozviazuiutsia-konflikty-scope). +5. **Порядок появи:** У походженні з пріоритетом, якщо є конкурентні значення однієї властивості, що знаходяться в блоках стилів, що відповідають селекторам з однаковою специфічністю та контекстною наближеністю, то застосовується останнє оголошення в порядку стилів. + +Каскад має порядок зростання, тобто: + +- Анімації мають пріоритет над звичайними значеннями, незалежно від того, чи оголошені вони в стилях користувача, розробника чи користувацького агента. +- Важливі значення мають пріоритет над анімаціями, незалежно від того, чи оголошені вони в стилях користувача, розробника чи користувацького агента. +- Переходи мають пріоритет над важливими значеннями. + +> [!NOTE] +> +> **Переходи та анімації** +> +> Значення властивостей, задані {{cssxref('@keyframes')}} анімацій, мають більшу вагу, ніж усі звичайні стилі (ті стилі, на яких не задано [`!important`](/uk/docs/Web/CSS/Specificity#vyniatok-important)). +> +> Значення властивостей, задані в {{cssxref('transition', 'переході')}}, мають пріоритет над усіма іншими значеннями, навіть над тими, на яких задано `!important`. + +Каскадний алгоритм застосовується _до_ алгоритму специфічності, а отже, якщо `:root p { color: red;}` оголошено в користувацькому списку стилів (ряд 2) і менш специфічний стиль `p {color: blue;}` оголошено в авторському списку стилів (ряд 3), то абзаци будуть синіми. + +## Базовий приклад + +Перш ніж заглиблюватися в те, як каскадні шари впливають на каскад, розгляньмо приклад, що включає декілька джерел CSS з різними походженнями, і пройдімося по кроках каскадного алгоритму: + +Тут є список стилів користувацького агента, два авторські списки стилів і один користувацький, а в HTML вбудованих стилів немає: + +**CSS користувацького агента:** + +```css +li { + margin-left: 10px; +} +``` + +**Авторський CSS 1:** + +```css +li { + margin-left: 0; +} /* Це скидання */ +``` + +**Авторський CSS 2:** + +```css +@media screen { + li { + margin-left: 3px; + } +} + +@media print { + li { + margin-left: 1px; + } +} + +@layer namedLayer { + li { + margin-left: 5px; + } +} +``` + +**Користувацький CSS:** + +```css +.specific { + margin-left: 1em; +} +``` + +**HTML:** + +```html + +``` + +У цьому випадку повинні застосовуватися оголошення всередині правил `li` та `.specific`. + +Знову таки, каскадний алгоритм має п'ять кроків, в такому порядку: + +1. Відповідність +2. Походження та вага +3. Специфічність +4. Контекстна наближеність +5. Порядок появи + +Значення `1px` – для друку. Через відсутність _відповідності_ на основі його типу носія, це значення вилучається з розгляду. + +Жодне оголошення не позначено як `!important`, тому порядок пріоритету – авторські списки стилів понад користувацькими списками стилів понад списками стилів користувацького агента. Згідно з _походженням і вагою_, `1em` з користувацького списку стилів і `10px` зі списку стилів користувацького агента вилучаються з розгляду. + +Зверніть увагу на те, що навіть якщо користувацький стиль на `.specific` з `1em` має більшу специфічність, то це звичайне оголошення в користувацькому списку стилів. Таким чином, воно має менший пріоритет, ніж будь-які авторські стилі, і вилучається з розгляду на кроці алгоритму _походження та вага_, ще до того, як специфічність узагалі вступає в дію. + +У авторських списків стилів є три оголошення: + +```css +li { + margin-left: 0; +} /* з авторського css 1 */ +``` + +```css +@media screen { + li { + margin-left: 3px; + } +} +``` + +```css +@layer namedLayer { + li { + margin-left: 5px; + } +} +``` + +Останнє з них, `5px`, є частиною каскадного шару. Звичайні оголошення в шарах мають менший пріоритет, ніж звичайні стилі, що не належать до шару в межах того ж типу походження. Це оголошення також вилучається 2 кроком алгоритму – _походження та вага_. + +Тоді залишаються значення `0` і `3px`, які мають однаковий селектор, а отже, однакову _специфічність_. Жодне з них не знаходиться всередині блоку `@scope`, тому контекстна наближеність також не впливає на цей приклад. + +Тоді дивимося на _порядок появи_. Друге оголошення, останній з двох нешарових авторських стилів, перемагає. + +```css +margin-left: 3px; +``` + +> [!NOTE] +> Оголошення, визначене в користувацькому CSS, хоч і може мати більшу специфічність, не обирається, оскільки _походження та вага_ каскадного алгоритму застосовуються до алгоритму _специфічності_. Оголошення, визначене в каскадному шарі, хоч і може з'явитися пізніше в коді, також не матиме пріоритету, оскільки звичайні стилі в каскадних шарах мають менший пріоритет, ніж звичайні нешарові стилі. _Порядок появи_ має значення лише тоді, коли як походження, так і вага, і специфічність рівні. + +## Авторські стилі: вбудовані стилі, шари та пріоритет + +[Таблиця в Порядку каскадування](#poriadok-kaskaduvannia) містить загальний огляд порядку пріоритету. У ній підсумовано стилі типи походження – користувацького агента, користувацькі та авторські – кожен у двох рядках: "тип походження – звичайна" і "тип походження – !important". Пріоритет всередині кожного типу походження має більше нюансів. Всередині відповідного типу походження стилі можуть міститися в шарах, а для авторських стилів також є проблема того, де в порядок каскадування впадають вбудовані стилі. + +Порядок оголошення шарів є важливим для визначення пріоритету. Звичайні стилі в шарі мають пріоритет над стилями, оголошеними в попередніх шарах; звичайні стилі, оголошені поза будь-яким шаром, мають пріоритет над звичайними стилями в шарах, незалежно від специфічності. + +У цьому прикладі автор скористався директивою CSS {{CSSXref('@import')}} для імпорту п'яти зовнішніх списків стилів усередину інформаційного елемента {{HTMLElement('style')}}. + +```html + +``` + +а потім у тілі документа маємо вбудовані стилі: + +```html +

Привіт

+``` + +У блоку коду CSS вище один за одним створені три каскадні шари з назвами "A", "B" і "C". Три списки стилів імпортовано безпосередньо в шари, а ще два – без створення або призначення шару. +Рядок "Усі нешарові стилі" в списку нижче (пріоритет звичайних авторських стилів – порядок 4) включає стилі з цих двох списків стилів і додаткових нешарових блоків стилів CSS. Крім того, є два вбудовані стилі: звичайне оголошення `line-height` і важливе оголошення `text-decoration`: + +| Порядок пріоритету (за зростанням) | Авторський стиль | Вага | +| ---------------------------------- | ------------------ | ------------ | +| 1 | A – перший шар | звичайна | +| 2 | B – другий шар | звичайна | +| 3 | C – останній шар | звичайна | +| 4 | Усі нешарові стилі | звичайна | +| 5 | вбудований `style` | звичайна | +| 6 | анімації | | +| 7 | Усі нешарові стилі | `!important` | +| 8 | C – останній шар | `!important` | +| 9 | B – другий шар | `!important` | +| 10 | A – перший шар | `!important` | +| 11 | вбудований `style` | `!important` | +| 12 | переходи | | + +У всіх типах походжень звичайні стилі, вміщені в шарах, мають найменший пріоритет. У нашому прикладі звичайні стилі, пов'язані з першим оголошеним шаром (A), мають менший пріоритет, ніж звичайні стилі в другому оголошеному шарі (B), які мають менший пріоритет, ніж звичайні стилі в третьому оголошеному шарі (C). Ці шарові стилі мають менший пріоритет, ніж усі звичайні нешарові стилі, до яких належать звичайні стилі з `unlayeredStyles.css`, `moreUnlayeredStyles.css` і `color` елемента `p` в самому `