Що означає "каскадування" в CSS?


90

Яке точне значення терміну "каскадне" в CSS? Я отримую різні погляди, тому я запитую тут. Приклад може допомогти.


15
Якщо ви щось подібне до мене, під "каскадом" розуміється час, який ви витратите, регулюючи ширину div з кроком у два пікселі, щоб речі виглядали "як слід", а не зосереджуючись на своїй фундаментальній бізнес-логіці. (Я, мабуть, отримаю кілька негативів за цю відповідь, але це просто так)
JohnMetta

Відповіді:


115

"Каскадування" в цьому контексті означає, що оскільки більше ніж одне оголошення таблиці стилів могло б застосовуватися до певної частини HTML, повинен бути відомий спосіб визначення, яке саме правило таблиці стилів застосовується до якої частини HTML.

Правило, яке використовується, вибирається каскадом від більш загальних декларацій до конкретного необхідного правила. Вибирається найбільш конкретна декларація.


коли входить клас / посвідчення особи та порядок?
Даніель Спрінгер

2
Ідентифікатори @AllDani є більш конкретними, ніж класи. Отже, я думаю, ви можете сказати, що правило класу каскадується на більш конкретному правилі ідентифікатора. Якщо 2 правила мають однаковий пріоритет (наприклад, 2 класи з суперечливими правилами для одного елемента), тоді останнє, вказане у вашому файлі css, має пріоритет.
метатрон

Отже, якщо ідентифікатор говорить "A", а клас говорить "B", то навіть якщо клас буде пізніше на аркуші, ID (A) виграє? IE Order вступає в дію лише в тому випадку, якщо два стилі мають однакову точну специфіку?
Даніель Спрінгер

2
@DaniSpringer Так, це правильно. Селектор id - це навіть один із найбільш конкретних селекторів у CSS. Для демонстрації це навіть "переможе" проти таких селекторів, як "div.blubb: hover". Лише вбудовані стилі та! Важливе правило мають більшу конкретність.
marvhock

54

Коли я викладаю CSS, я завжди кажу студентам, що "каскадні таблиці стилів" означають щось на зразок " таблиці стилів боротьби ".

Одне правило говорить, що ваш тег H3 має бути червоним, інше правило - зеленим - правила суперечать одне одному, хто переможе !? Таблиця стилів Deathmatch!

Добре, можливо, це невелике перебільшення, але це набагато більше піддається некодовим, непрограмованим людям, які тільки починають, ніж будь-яке поняття про каскад або спадщину.

Я, звичайно, обов’язково повідомляю їм, що для таблиць стилів не проблема боротися між собою, саме так була розроблена мова.


5
Не впевнений, чому це було проголосовано проти Виглядає як просте пояснення для нових учнів.
Пурус,

18
Можливо, тому, що не пояснює, хто переможе, і чому.
Андреас

16
Ви, здається, розгублені в питанні. Справа не в тому, "що конкретність / успадкування", або в тому, які правила застосовуються і т. Д. Це "що означає КАСКАД?".
AmbroseChapel

5
Я знаю, що це стара публікація, але все ж: я думаю, що приклад таблиць стилів та / або правил CSS "боротьба" є поганим. Набагато більш повчальним для нових учнів (на моєму власному досвіді викладання) є пояснення ієрархії правила, яке перевершує попереднє. Скажімо, працівник зафарбовує тег H3 в червоний колір (1-е правило), а потім передає його своєму менеджеру з контролю якості, який відмінює його і вирішує пофарбувати в зелений колір (2-е правило). Жодного матчу смерті, лише корпоративна ієрархія. Правила CSS не "борються з цим", вони проходять (каскадно) через суворо визначену ієрархічну систему наступних рішень, що скасовують попередні.
Франк ван Венсвен

це дійсно хороша відповідь, будь ласка, поясніть далі! Хто переможе, подаючи простий приклад! @AmbroseChapel
eirenaios

23

Håkon Wium Lie (співавтор CSS) визначає "каскад" у своїй дисертації на тему CSS як "Процес об'єднання декількох таблиць стилів та вирішення конфліктів між ними" https://www.wiumlie.no/2006/phd/


1
Кращий на сьогоднішній день.
Wael Assaf,

я здогадуюсь що це, ви все це підбили.
Сафват Фатті


4

Ви повинні думати про це ззовні. Якщо у вас є правило, яке є на тезі body, воно буде "каскадувати" через кожен дочірній тег. Якщо ви накладете правило на будь-який тег усередині тіла, він прийме це правило тощо. Отже, правило каскадує весь вміст, якщо правило не перервано вбудованим тегом.


Це не означає, що має перевагу. Неоднозначний?
Даніель Спрінгер

2

Ви можете розглядати обробку CSS, оскільки водоспад містить кілька каскадів. Ось ці каскади зверху вниз по порядку: (нижній може замінити те саме властивість у верхньому.)

  1. декларації агента користувача
  2. звичайні декларації користувача
  3. автор звичайних декларацій
  4. автор важливих декларацій
  5. важливі для користувача декларації

Дивіться більше в специфікації

Каскадних повинен вибрати правильне значення з декількох походження. Але це відрізняється від сортування . Тільки щось не в порядку нам потрібно сортувати. Але в CSS ці походження мають пріоритет. І отже, псевдокод може виглядати наступним чином:

  1. ініціалізувати масив значень;
  2. застосовувати значення з 1-го походження;
  3. застосувати значення з 2-го походження, замінити, якщо значення існує;
  4. ...
  5. застосувати значення з N-го походження, замінити, якщо значення існують;

З псевдокоду видно, що він цілком схожий на водоспад із кількох каскадів.


2

Одне уточнення, яке може допомогти. Якщо ви включаєте дві таблиці стилів і в кожному є правило з однаковою специфікою, одна включає останні перемоги. Тобто останній у каскаді має найбільший вплив.

(Це лише варіація наявності двох правил на одному аркуші - останнє перемагає, якщо всі інші речі рівні.)

Наприклад, дано

body {
    background:blue;
}

body {
    background:green;
}

тоді фон буде зеленим.


1

Ця відповідь для абсолютних початківців. Якщо ви хочете оглянути цю відповідь, прочитайте мою другу відповідь.

Каскадування - це процес комбінування різних таблиць стилів та вирішення конфліктів між різними правилами та оголошеннями CSS, коли до певного елемента застосовується більше ніж одне правило . Оскільки, напевно, ви вже знаєте, декларація для певної властивості стилю, як розмір шрифту, може з’являтися в декількох таблицях стилів, а також кілька разів всередині однієї таблиці стилів.

Щоб зрозуміти каскадування, потрібно почати з фази синтаксичного аналізу CSS, оскільки на фазі синтаксичного аналізу першим кроком є ​​вирішення суперечливих декларацій CSS, а другим кроком є ​​обробка кінцевих значень CSS.

Тепер CSS також може надходити з різних джерел. Найпоширеніший - CSS, який ми розробники пишемо. Ці декларації, які ми поміщаємо в наші таблиці стилів, називаються авторськими деклараціями. Іншим джерелом можуть бути декларації користувача, тобто CSS, що надходить від користувача. Наприклад, коли користувач змінює розмір шрифту за замовчуванням у браузері, це CSS користувача, і, нарешті, є декларації браузера за замовчуванням.

Наприклад, якщо ми вкладемо в наш HTML тег прив'язки для посилання, а потім взагалі не стилізуємо його, він зазвичай відображається синім текстом і підкреслюється, правильно. Це називається CSS агента користувача, оскільки він встановлюється браузером. Отже, каскад поєднує декларації CSS, що надходять з усіх цих різних джерел, але як каскад насправді вирішує конфлікти, коли застосовується більше одного правила?

Що ж, це дивиться на важливість, на специфічність селектора та порядок джерел суперечливих оголошень, щоб визначити, який з них має перевагу, і ось як це працює. Спочатку каскад починається з надання суперечливих заяв різної важливості залежно від того, де вони оголошені у своєму джерелі. Найважливіші декларації - це декларації користувачів, позначені важливим ключовим словом.

Другою за значимістю декларацією є авторські декларації, позначені важливими. По-третє, звичайні авторські декларації, потім звичайні декларації користувачів і, нарешті, найменш важливими є декларації браузера за замовчуванням, що насправді має багато сенсу, що ми можемо легко перезаписати ці декларації, що надходять за замовчуванням з браузера.

введіть тут опис зображення

Зараз багато разів у наших таблицях авторських стилів буде просто купа суперечливих правил без жодного важливого ключового слова. Це насправді найпоширеніший сценарій, і в цьому випадку всі декларації мають абсолютно однакову важливість. Що ж відбувається в цьому випадку? У цьому випадку каскад робить обчислення та порівняння особливостей селекторів оголошень, і ось як це працює.

введіть тут опис зображення

Вбудовані стилі мають найвищу специфічність, за якими слідують ідентифікатори, потім класи, псевдокласи та селектори атрибутів і, нарешті, найменш конкретний елемент та селектор псевдоелементів. Отже, коли ми маємо суперечливі декларації з такою ж важливістю, як ми бачили на минулому слайді, ми обчислюємо їх специфічність селектора на основі пріоритетів, які я щойно показав вам, але давайте подивимось, як насправді ми обчислюємо специфіки на маленькому прикладі, це завжди найкраще, правильно.

введіть тут опис зображення

З наведеного вище прикладу всі ці декларації мають однакову важливість, оскільки всі вони є авторськими деклараціями. Тож давайте обчислимо їх специфіку селектора, щоб з’ясувати, чи буде колір фону синім, зеленим, фіолетовим чи жовтим, і ось як ми це робимо. Специфіка - це насправді не просто одне число, а одне число для кожної з чотирьох категорій, які я вам показав раніше. Вбудовані стилі, ідентифікатори, класи, псевдоелементи та атрибути і, нарешті, елементи, і для кожного з них ми підраховуємо кількість випадків у селекторі.

Отже, тут, у селекторі один, у нас, звичайно, немає вбудованих стилів, оскільки вбудований стиль повинен бути написаний в HTML, що тут не так, тому це нуль. У нас також немає ідентифікаторів, тому це знову нуль, але у нас є один клас, клас button. Отже, для категорії класів у нас є один, і, нарешті, тут немає селектора елементів, такого нуля для цього, і все. Специфічність селектора - нуль, нуль, одиниця, нуль.

А тепер давайте порівняємо це з іншими. Наступний також не є вбудованим стилем, тому для першого нуль. Зараз у нас насправді є селектор ідентифікатора для навігаційного ідентифікатора, так, це один для ідентифікатора. У нас також є два класи, які можна натиснути вправо та кнопку, тому це два для категорії класів, і нарешті, тут також є два селектори елементів. Елемент nav та елемент div, що означає, що це також два для категорії елементів. Отже, нарешті, специфічність селектора дорівнює нулю, одному, двом, двом, що насправді є дуже специфічним селектором.

Селектор номер три дуже простий. Це просто селектор елементів, тому специфічність дорівнює нулю, нулю, нулю, одиниці.

Тепер останній, селектор номер чотири. По-перше, у нас є навігаційний ідентифікатор, тому це один для ідентифікатора. Далі ми маємо клас, клас button, а також псевдо-клас, який наводить курсор, що в цілому робить його двома для категорії класів. Оскільки є також один селектор елементів, кінцева специфіка дорівнює нулю, одному, двом, одному.

Тепер давайте знати, як ми насправді використовуємо ці цифри, щоб з’ясувати, хто з селекторів застосовується. Ми починаємо розглядати цифри зліва направо, починаючи з найбільш конкретної категорії, вбудованих стилів. Якщо є селектор з одним для вбудованих стилів, він виграє проти всіх інших селекторів, оскільки це найбільш конкретна категорія. Ну, тут справа не в цьому, тому давайте перейдемо до посвідчень. Ми бачимо, що тут селектори два та чотири мають одиницю, тоді як інші мають нуль, тому ті, що мають нуль, виходять з гри, оскільки вони менш конкретні, ніж селектори два та чотири з ідентифікаторами.

Тепер, оскільки обидва селектори мають один у категорії Ідентифікатори, ми маємо рухатися далі та перевіряти класи. У обох у цій категорії все ще є два, і, нарешті, у категорії елементів, у селектора два є два, тоді як у селектора чотири є лише один, і тому ми маємо тут переможця. Селектор номер два є найбільш конкретним селектором з усіх, і тому він додасть нашій кнопці зелений фон.34 Значення виграшної декларації називається каскадним значенням, оскільки це результат каскаду.

Отже, ми починаємо з групи оголошених значень, у цьому випадку синій, зелений, фіолетовий та жовтий один із них виграє і стає каскадним значенням, яке в нашому прикладі є зеленим.

А тепер уявіть, що сектор чотири також мав два елементи, тоді обидва селектори два і чотири мали б однакову специфіку, вірно. Отже, що трапиться в цьому випадку, і я обіцяю вам, що це майже закінчилося зараз добре. Ну, якщо на цьому етапі все ще є зв’язок, тоді застосовуватиметься остання декларація CSS, написана в коді. Отже, якщо все рівно, якщо всі селектори оголошень мають однакову специфіку, тоді це просто остання декларація, яка буде використана для стилізації обраного елемента.


0

Це процес, який використовується для вирішення конфліктів у специфікації таблиці стилів.

Це головним чином процес вирішення конфліктів, здійснений відповідно до згаданого пріоритету в CSS.


0

CSS розшифровується як Каскадна таблиця стилів. За своїми природними стилями далі каскадна таблиця стилів замінює еквівалентні стилі вище (якщо стилі вище не є більш конкретними). Тому ми можемо встановити базові стилі на початку таблиці стилів, застосовних до всіх версій нашого дизайну, а потім замінити відповідні розділи медіа-запитами далі в документі.


0

Каскадне означає виливання кроками або додавання кроками. Таблиці стилів містять коди для стилізації елемента html. А спосіб написання кодів у таблиці стилів є каскадним. Або просто, зворотні коди по шарах для кожного елемента html сторінки HTML у таблиці стилів роблять каскадну таблицю стилів.


0

Каскадування - це алгоритм, який призначає вагу кожному правилу стилю. Коли застосовується кілька правил, перевагу має те, що має найбільшу вагу.


0

Коли один або кілька стилів застосовуються до одного і того ж елементу. CSS виконує набір правил, який називається каскадним, який оцінює силу Специфічності двох застосованих стилів і визначає переможця, тобто правило стилю, яке має більшу вагу, виграє. Якщо обидва правила мають такої ж ваги, ніж правило, яке застосовувалось до останніх перемог.


0

Каскад і специфіка, що потрібно знати:

  1. Декларація CSS, позначена!!, Має найвищий пріоритет.

  2. Але лише використання! Важливого як останнього ресурсу. Краще використовувати правильні особливості - більш ремонтопридатний код!

  3. Вбудовані стилі завжди матимуть пріоритет над стилями у зовнішніх таблицях стилів.

  4. Селектор, що містить 1 ідентифікатор, є більш конкретним, ніж той, що містить 1000 класів.

  5. Селектор, що містить 1 клас, є більш конкретним, ніж той, що містить 1000 елементів.

  6. Універсальний селектор * не має значення специфічності (0,0,0)

  7. Покладайтеся більше на конкретність, ніж на порядок селекторів.

  8. Але покладайтесь на порядок при використанні таблиць стилів сторонніх розробників - завжди ставіть свою таблицю стилів автора останньою.


0

Вибираючи, які стилі CSS застосовувати до елемента HTML, специфічність замінює загальність відповідно до каскадного набору правил, що врегульовує конфлікти між стилями:

  1. Без CSS HTML відображатиметься відповідно до стандартних стилів браузера.
  2. Тег CSSСелектори (що відповідають тегу HTML) замінюють за замовчуванням браузер.
  3. Клас CSSСелектори (з.) Замінюють посилання на теги.
  4. Селектори CSS ID (з #) замінюють посилання на класи.
  5. В лінію CSS, закодований у тег HTML, замінює ідентифікатор, клас і тег CSS.
  6. Додавання ! Важливого значення до стилю CSS замінює все інше.
  7. Якщо селектори CSS однакові, браузер поєднує їх властивості. Якщо результуючі властивості CSS конфліктують, браузер вибирає значення властивості, яке з’явилося пізніше або зовсім недавно в коді.

Пріоритет матиме селектор CSS, який відповідає більш конкретній комбінації тегів, класів та / або ідентифікаторів. З наступних прикладів перший матиме перевагу над другим, незалежно від порядку їх появи в CSS:

ol#identity li.firstname { color: red; }
#identity .firstname { color: blue; }

-2
CSS doc    
p{font-size: 12pt;}
p{font-size: 14pt;}

<p>My Headline<p>

відображатиме шрифт p на 14pt, оскільки він "ближче" до фактичного елемента (завантаження зовнішніх таблиць стилів зверху файлу до кінця файлу). Якщо ви використовуєте зв’язану таблицю стилів, а потім включаєте деякий CSS в заголовок вашого документа після зв’язку із зовнішнім документом CSS, оголошення «in head» виграє, оскільки воно ще ближче до визначеного елемента. Це стосується лише рівновагових селекторів. Перегляньте http://www.stuffandnonsense.co.uk/archives/css_specificity_wars.html, щоб отримати хороший опис ваги даного селектора.

З усього сказаного, ви можете розглянути «успадкування» також як частину каскаду - з усіх практичних цілей. Речі "каскадують" від містять елементи.


Це означає, що стилі ставляться між матерією, навіть якщо вони не спрямовані на даний елемент. Це неправильно, якщо я слідую.
Даніель Спрінгер

Здається, це було відредаговано. У будь-якому випадку, я не розумію, як це відповідає на питання.
Даніель Спрінгер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.