94
CSS-селекторы Арсений Форштретер разработчик интерфейсов 24 сентября, ШРИ, Екатеринбург

Арсений Форштретер: CSS-селекторы

  • Upload
    yandex

  • View
    3.202

  • Download
    4

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Арсений Форштретер: CSS-селекторы

CSS-селекторыАрсений Форштретер

разработчик интерфейсов

24 сентября, ШРИ, Екатеринбург

Page 2: Арсений Форштретер: CSS-селекторы

Селектор тега<div>Я див</div>

< p >А я абзац</p>

p { color: red; }

Я див

А я абзац

01.

02.

2

Page 3: Арсений Форштретер: CSS-селекторы

Универсальный селектор<div>Я див</div>

<p>А я абзац</p>

* { color: red; }

Я див

А я абзац

01.

02.

3

Page 4: Арсений Форштретер: CSS-селекторы

Важно!Используйте универсальный селектор с осторожностью!

4

Page 5: Арсений Форштретер: CSS-селекторы

Атрибуты<div id ="..." class ="...">...</div>

5

Page 6: Арсений Форштретер: CSS-селекторы

id<header id=" site-header ">Шапка сайта</header>

• id - строка, не содержащая пробельных символов.

• id должен быть уникальным.

6

Page 7: Арсений Форштретер: CSS-селекторы

Селектор идентификатора<header id=" site-header ">Шапка сайта</div>

#site-header {

background: green;

}

Шапка сайта

01.

02.

03.

7

Page 8: Арсений Форштретер: CSS-селекторы
Page 9: Арсений Форштретер: CSS-селекторы

Class<div class=" red ">Я — красный див</div>

• В отличие от id, не должен быть уникальным.

• У одного элемента может быть несколько классов!

<div class=" red bold ">А я — жирный красный див!</div>

9

Page 10: Арсений Форштретер: CSS-селекторы

Селектор класса<div class=" red ">Я — красный див</div>

<div class=" red bold ">А я — жирный красный див!</div>

.red { color: red; }

.bold { font-weight: bold; }

Я — красный див

А я — жирный красный див!

01.

02.

01.

02.

10

Page 11: Арсений Форштретер: CSS-селекторы

Давайте элементам осмысленныеимена идентификаторов и классов!

Page 12: Арсений Форштретер: CSS-селекторы

Сложные селекторы

12

Page 13: Арсений Форштретер: CSS-селекторы
Page 14: Арсений Форштретер: CSS-селекторы
Page 15: Арсений Форштретер: CSS-селекторы

Множественный селекторh1 { font-weight: bold; }

h2 { font-weight: bold; }

.heading { font-weight: bold; }

h1, h2, .heading {

font-weight: bold;

}

01.

02.

03.

01.

02.

03.

15

Page 16: Арсений Форштретер: CSS-селекторы

Селектор потомковol li { border-bottom: 2px solid green; }

<ol>

<li>Хлеб</li>

<li>Соль</li>

</ol>

01.

02.

03.

04.

16

Page 17: Арсений Форштретер: CSS-селекторы

Селектор потомковol li { border-bottom: 2px solid green; }

1. Хлеб

2. Соль

17

Page 18: Арсений Форштретер: CSS-селекторы

Комбинированные селекторы<div class="message">Сообщение</div>

<div class="message error">Ошибка</div>

.message { border: 2px solid blue; }

.message.error { border-color: red; }

Сообщение

Ошибка

01.

02.

01.

02.

18

Page 19: Арсений Форштретер: CSS-селекторы

Есть ли разница?.message.error { border-color: red; }

.error.message { border-color: red; }

01.

02.

19

Page 20: Арсений Форштретер: CSS-селекторы

НетПорядок простых селекторов в составе комбинированного ни на что

не влияет.

Как и порядок классов в атрибуте class.

20

Page 21: Арсений Форштретер: CSS-селекторы

Но!Селектор тега всегда первый:

p.foo { ... }

Ибо:

.foop { ... }

21

Page 22: Арсений Форштретер: CSS-селекторы
Page 23: Арсений Форштретер: CSS-селекторы

Комбинированные селекторы*.class == .class

23

Page 24: Арсений Форштретер: CSS-селекторы

Комбинированные селекторы*.class == .class

24

Page 25: Арсений Форштретер: CSS-селекторы

Какого цвета будет див?<div id="red" class="blue">;

Я таинственный див

</div>

#red { color: red; font-style: italic; }

.blue { color: blue; }

Я таинственный див

01.

02.

03.

01.

02.

25

Page 26: Арсений Форштретер: CSS-селекторы

А так?<div class="blue red">;

Я oчень таинственный див

</div>

.red { color: red; font-style: italic; }

.blue { color: blue; }

Я очень таинственный див

01.

02.

03.

01.

02.

26

Page 27: Арсений Форштретер: CSS-селекторы
Page 28: Арсений Форштретер: CSS-селекторы

Специфичность

0 1 2 1tag, ::pseudo-element

.class, :pseudo-class, [attr]#id

style="..."

28

Page 29: Арсений Форштретер: CSS-селекторы
Page 30: Арсений Форштретер: CSS-селекторы

Теперь понятно#red { color: red; } /* 0100 */

.blue { color: blue; } /* 0010 */

01.

02.

30

Page 31: Арсений Форштретер: CSS-селекторы

Теперь понятно.red { color: red; } /* 0010 */

.blue { color: blue; } /* 0010 */

01.

02.

31

Page 32: Арсений Форштретер: CSS-селекторы

Посчитаемp.note /* 0011 */

ul ol li /* 0003 */

#content p.note span /* 0112 */

#main #content .column /* 0210 */

<b style="..."></b> <!-- 1000 -->

01.

02.

03.

04.

05.

32

Page 33: Арсений Форштретер: CSS-селекторы
Page 34: Арсений Форштретер: CSS-селекторы

!importanta {

color: blue !important ;

font-weight: bold;

}

a.green { color: green; }

<a class="green" href="/">Зеленая ссылка</a>

01.

02.

03.

04.

34

Page 35: Арсений Форштретер: CSS-селекторы

!importanta {

color: blue !important ;

font-weight: bold;

}

a.green { color: green; }

Зеленая ссылка

01.

02.

03.

04.

35

Page 36: Арсений Форштретер: CSS-селекторы

ВажноИспользуйте !important с осторожностью!

36

Page 37: Арсений Форштретер: CSS-селекторы

Наследование<div class="grey">

Я — серый див, а внутри <i>курсив</i>

</div>

.grey { color: #666 }

Я — серый див, а внутри курсив

01.

02.

03.

37

Page 38: Арсений Форштретер: CSS-селекторы

Наследуемые свойства• Шрифты (font-*, line-height)

• Текст (text-*, letter-spacing)

• Цвет (color)

38

Page 39: Арсений Форштретер: CSS-селекторы

Но:<div class="grey">

Я — серый див, а внутри

<a href="http://yandex.ru">ссылка</a>

</div>

.grey { color: #666 }

Я серый див, а внутри ссылка

01.

02.

03.

04.

39

Page 40: Арсений Форштретер: CSS-селекторы

Где-то в недрах браузера:a { color: blue; }

40

Page 41: Арсений Форштретер: CSS-селекторы

Встроенные таблицы стилей1. Стили браузера

2. Стили пользователя

И стили автора.

41

Page 42: Арсений Форштретер: CSS-селекторы

Каскад1. Обходим дерево, берем конкретный элемент

2. Применяем унаследованные стили

3. Находим все правила, применимые к этому конкретному элементу

4. Разбиваем на 2 группы: с !important и без

42

Page 43: Арсений Форштретер: CSS-селекторы

Без !important• Сортируем правила по источнику:

1. Стили браузера

2. Стили пользователя

3. Стили автора

• Сортируем по специфичности

• Если специфичность одинаковая, то в порядке следования в таблицах

стилей

• Последовательно применяем

43

Page 44: Арсений Форштретер: CSS-селекторы

С !important• Опять сортируем по источнику (но уже в другом порядке!):

1. Стили автора c !important

2. Стили пользователя с !important

• Сортировка и применение правил аналогично предыдущему слайду

44

Page 45: Арсений Форштретер: CSS-селекторы

Пример<p>Абзац</p>

45

Page 46: Арсений Форштретер: CSS-селекторы

Примерp { color: black; } /* Браузер */

p { /* Пользователь */

color: yellow;

background: black !important;

}

p { /* Автор */

color: red;

background: blue !important;

}

01.

02.

03.

04.

05.

06.

07.

08.

09.

46

Page 47: Арсений Форштретер: CSS-селекторы

Результатp { color: black; } /* Браузер */

p { color: yellow; } /* Пользователь */

p { color: red; } /* Автор */

p { background: blue !important } /* Aвтор */

p { background: black !important; } /* Пользователь */

01.

02.

03.

04.

05.

47

Page 48: Арсений Форштретер: CSS-селекторы

Результатp { color: black; } /* Браузер */

p { color: yellow; } /* Пользователь */

p { color: red; } /* Автор */

p { background: blue !important } /* Aвтор */

p { background: black !important; } /* Пользователь */

Абзац

01.

02.

03.

04.

05.

48

Page 49: Арсений Форштретер: CSS-селекторы

Еще селекторы!

Page 50: Арсений Форштретер: CSS-селекторы

Атрибутные селекторыimg[alt] { ... }

<img src="" alt ="...">

50

Page 51: Арсений Форштретер: CSS-селекторы

Атрибутные селекторыinput[type=text] { ... }

<input type="text">

51

Page 52: Арсений Форштретер: CSS-селекторы

Атрибутные селекторы[attr^=value] - начинается с value

[attr$=value] - заканчивается value

[attr*=value] - содержит value

[attr~=value] - содержит value, отделенное пробелами

[attr|=value] - содержит value, отделенное знаком "-"

01.

02.

03.

04.

05.

52

Page 53: Арсений Форштретер: CSS-селекторы

Селектор детей<ol>

<li>Хлеб

<ul>

<li>Чёрный</li>

<li>Батон</li>

</ul>

</li>

<li>Соль</li>

</ol>

01.

02.

03.

04.

05.

06.

07.

08.

09.

53

Page 54: Арсений Форштретер: CSS-селекторы

Селектор детейol li { border-bottom: 2px solid green; }

1. Хлеб

• Чёрный

• Батон

2. Соль

54

Page 55: Арсений Форштретер: CSS-селекторы

Селектор детейol > li { border-bottom: 2px solid green; }

1. Хлеб

• Чёрный

• Батон

2. Соль

55

Page 56: Арсений Форштретер: CSS-селекторы

Селекторы соседей (Siblings selectors)• + - ближайший сосед

• ~ - последующие соседи

56

Page 57: Арсений Форштретер: CSS-селекторы

Ближайший сосед (Adjacent sibling)h1 + p { font-size: 1.5em; }

<h1>Заголовок</h1>

<p>Вводная часть</p>

<p>Текст</p>

01.

02.

03.

57

Page 58: Арсений Форштретер: CSS-селекторы

Ближайший сосед (Adjacent sibling)h1 + p { font-size: 1.5em; }

Заголовок

Вводная частьТекст

58

Page 59: Арсений Форштретер: CSS-селекторы

Последующие соседи (General siblings)h3 ~ p { font-size: 0.5em }

<p>Текст</p>

<h3>Заголовок третьего уровня</h3>

<p>Неважное дополнение</p>

<p>Совсем неважное дополнение</p>

01.

02.

03.

04.

59

Page 60: Арсений Форштретер: CSS-селекторы

Последующие соседи (General siblings)h3 ~ p { font-size: 0.5em }

Текст

Заголовок третьего уровняНеважное дополнение

Совсем неважное дополнение

60

Page 61: Арсений Форштретер: CSS-селекторы

Псевдоклассы• Состояние, вызванное действиями пользователя (:hover, :active, ...)

• Динамическое значение атрибутов (:disabled, :required, ...)

• Порядок на одном уровне вложенности (:first-child, ...)

• Другие особенности (:lang(), :not(), ...)

61

Page 62: Арсений Форштретер: CSS-селекторы

:hovera:hover { color: red; }

62

Page 63: Арсений Форштретер: CSS-селекторы

Состояние, вызванное действиямипользователя:active — активная ссылка или кнопка

:visited — посещенная ссылка

:focus — поле ввода или ссылка в фокусе

:target — id элемента совпадает с хэшем в урле

...

01.

02.

03.

04.

05.

63

Page 64: Арсений Форштретер: CSS-селекторы

Динамическое значение атрибутов:link — ссылка, имеющая атрибут href

:disabled — неактивный инпут

:checked — выбранный чекбокс или радиокнопка

:required — обязательное поле

...

01.

02.

03.

04.

05.

64

Page 65: Арсений Форштретер: CSS-селекторы

Важно:checked != [checked]

65

Page 66: Арсений Форштретер: CSS-селекторы

Позиция на одном уровне вложенности

66

Page 67: Арсений Форштретер: CSS-селекторы

:first-childp:first-child { text-indent: 2em; }

<div>

<p>Раз</p>

<p>Два</p>

<p>Три</p>

</div>

01.

02.

03.

04.

05.

67

Page 68: Арсений Форштретер: CSS-селекторы

РезультатРаз

Два

Три

68

Page 69: Арсений Форштретер: CSS-селекторы

А что если ?<div>

<hr/>

<p>Раз</p>

<p>Два</p>

<p>Три</p>

</div>

01.

02.

03.

04.

05.

06.

69

Page 70: Арсений Форштретер: CSS-селекторы

Результат

Раз

Два

Три

70

Page 71: Арсений Форштретер: CSS-селекторы

:first-of-typep:first-of-type { text-indent: 2em; }

<div>

<hr/>

<p>Раз</p>

<p>Два</p>

<p>Три</p>

</div>

01.

02.

03.

04.

05.

06.

71

Page 72: Арсений Форштретер: CSS-селекторы

Результат

Раз

Два

Три

72

Page 73: Арсений Форштретер: CSS-селекторы

Ключевая разницаp:first-child сначала берет первый дочерний элемент, затем

проверяет, является ли он параграфом

p:first-of-type сначала берет все параграфы, затем берет

первый из них

73

Page 74: Арсений Форштретер: CSS-селекторы

А такжеp:last-child

p:last-of-type

p:only-child

p:only-of-type

01.

02.

03.

04.

74

Page 75: Арсений Форштретер: CSS-селекторы

Но и это еще не всё!p:nth-child(...)

p:nth-of-type(...)

01.

02.

75

Page 76: Арсений Форштретер: CSS-селекторы

:nth-child(), :nth-of-type()p:nth-child(2)

76

Page 77: Арсений Форштретер: CSS-селекторы

:nth-child(), :nth-of-type()li:nth-child(odd) — нечётные

li:nth-child(even) — чётные

01.

02.

77

Page 78: Арсений Форштретер: CSS-селекторы

:nth-child(), :nth-of-type()li:nth-child(odd) { background: #ccc }

<ol>

<li>Хлеб</li>

<li>Соль</li>

<li>Молоко</li>

<li>Сосиски</li>

</ol>

01.

02.

03.

04.

05.

06.

78

Page 79: Арсений Форштретер: CSS-селекторы

Результатli:nth-child(odd) { background: #ccc }

1. Хлеб

2. Соль

3. Молоко

4. Сосиски

79

Page 80: Арсений Форштретер: CSS-селекторы

:nth-child(), :nth-of-type()li:nth-child( 2n+1 ) { background: #ccc }

1. Хлеб

2. Соль

3. Молоко

4. Сосиски

80

Page 81: Арсений Форштретер: CSS-селекторы

:nth-child(), :nth-of-type()div:nth-child(2n+1) { background: #ccc; }

div:nth-of-type(2n+1) { color: red; }

<div>Див</div>

<span>Спан</span>

<div>Див</div>

<div>Див</div>

<div>Див</div>

01.

02.

01.

02.

03.

04.

05.

81

Page 82: Арсений Форштретер: CSS-селекторы

Результатdiv:nth-child(2n+1) { background: #ccc; }

div:nth-of-type(2n+1) { color: red; }

Див

Спан

Див

Див

Див

01.

02.

82

Page 83: Арсений Форштретер: CSS-селекторы

:not()img:not([alt])

83

Page 84: Арсений Форштретер: CSS-селекторы

Псевдоэлементы• Часть содержимого (::first-letter, ::first-line)

• Составные части полей ввода (::placeholder, ...)

• Generated content (::before, ::after)

84

Page 85: Арсений Форштретер: CSS-селекторы

Синтаксис псевдоэлементовСогласно последней спецификации, псевдоэлементы начинаются

с ::

В старой спецификации они начинаются с : , как и псевдоклассы

85

Page 86: Арсений Форштретер: CSS-селекторы
Page 87: Арсений Форштретер: CSS-селекторы

:first-letter<div class="ya">Яндекс</div>

.ya:first-letter { color: red }

Яндекс

87

Page 88: Арсений Форштретер: CSS-селекторы

:first-lineПрименимы следующие группы свойств:

• font-*, line-height

• text-*, word-spacing

• background-*

В зависимости от браузера список может варьироваться

88

Page 89: Арсений Форштретер: CSS-селекторы

::placeholder<input type="password" placeholder="Пароль" />

input::placeholder { color: green }

89

Page 90: Арсений Форштретер: CSS-селекторы

Generated contentПсевдоэлементы :before и :after

90

Page 91: Арсений Форштретер: CSS-селекторы

Generated content<div class="error">Ошибка! Не удалось загрузить данные</div>

Удобнее было бы так:

<div class="error">Не удалось загрузить данные</div>

91

Page 92: Арсений Форштретер: CSS-селекторы

Generated content<div class="error">Не удалось загрузить данные</div>

.error :before {

content: 'Ошибка! ';

color: red;

}

Ошибка! Не удалось загрузить данные

01.

02.

03.

04.

92

Page 93: Арсений Форштретер: CSS-селекторы

Полезные ссылки• bit.ly/15oqICU, bit.ly/1gVqV5H — W3C

• bit.ly/1b8EYYi — W3Schools

• caniuse.com

• bit.ly/1gVqlVH — CSS-Tricks Almanac

• bit.ly/1fxb8MB — Статья про специфичность на Smashing Magazine

• bit.ly/16Wi9mn — CSS Specifity Wars

93

Page 94: Арсений Форштретер: CSS-селекторы

Спасибо!