<div>Transformed element</div>
WEB. Справочная информация
HTML и CSS
.max-width
/* <length> value */
max-width: 3.5em;/* <percentage> value */
max-width: 75%;/* Keyword values */
max-width: none;
max-width: max-content;
max-width: min-content;
max-width: fit-content;
max-width: fit-content(20em);/* Global values */
max-width: inherit;
max-width: initial;
max-width: revert;
max-width: revert-layer;
max-width: unset;30 CSS-селекторов, которые нужно запомнить
1. *
* { margin: 0; padding: 0; }
Начнем с самого простого, а потом уже перейдем к более продвинутым вещам.
Этот CSS-селектор выделяет каждый элемент на странице. Многие разработчики используют его для того, чтобы скинуть у всех элементов значения margin и padding. На первый взгляд это удобно, но все-таки в рабочем коде так лучше не делать. Этот CSS-селектор слишком сильно грузит броузер.
* также можно использовать для выделения дочерних элементов.
#container * { border: 1px solid black; }
В данном случае выделятся все дочерние элементы #container. Опять же, старайтесь не злоупотреблять им.
2. #X
container { width: 960px; margin: auto; }
Знак решетки перед CSS-селектором Х выделит нам элемент с id = Х. Это очень просто, но будьте аккуратны при использовании id.
Спросите себя: мне абсолютно необходимо выделение по id?
id жестко привязывают стиль к элементу и не дает возможности повторного использования. Более предпочтительным будет использование классов, названий тэгов или даже псевдо-классов.
3 .Х
error { color: red; }
Это CSS-селектор класса Х. Разница между id и классом заключается в том, что одному классу может принадлежать несколько элементов на странице. Используйте классы, когда вы хотите применить стиль к нескольким однотипным элементам. При использовании id вам придется писать стиль для каждого отдельного элемента.
4. Х Y
li a { text-decoration: none; }
CSS-селектор дочерних элементов встречается чаще всего. Если вам надо выделить элементы определенного типа из множества дочерних элементов, используете этот селектор. Например, вам надо выделить все ссылки, которые находятся в элементе li. В этом случае используйте этот селектор.
Не следует делать CSS-селекторы вида Х Y Z A B.error. Всегда спрашивайте себя, а обязательно ли для выделения данного элемента писать такой громоздкий CSS-селектор.
5. X
a { color: red; }
ul { margin-left: 0; }
Что делать, если вы хотите, чтобы охватить все элементы данного типа на странице? Будьте проще, используйте CSS-селектор типа. Если вы должны выделить все неупорядоченные списки, используйте ul {} .
6. X:visited and X:link
a:link { color: red; }
a:visted { color: purple; }
7. Х+Y
ul + p { color: red; }
Выделяет последующий элемент. Он будет выбирать только элемент типа Y, который идет сразу после элемента Х. В примере текст первого абзаца после каждого ul будет красного цвета.
8. Х>Y
div#container > ul { border: 1px solid black; }
Разница между стандартными Х Y и X > Y состоит в том, что рассматриваемый CSS-селектор будет выбирать только непосредственные дочерние элементы. Например, рассмотрим следующий код.
<div id="container">
<ul>
<li> Элемент списка
<ul>
<li> Дочерний элемент</li>
</ul>
</li>
<li> Элемент списка </li>
<li> Элемент списка </li>
<li> Элемент списка </li>
</ul>
</div>
CSS-селектор #container > ul выберет только ul-ы, которые являются непосредственными дочерними элементами div с id =container . Он не выберет, например, ul-ы, являющиеся дочерними элементами первых li .
Поэтому можно получить выигрыш в производительности используя данный CSS-селектор. В самом деле, это особенно рекомендуется при работе с jQuery или другими библиотеками, выбирающими элементы на основе правил CSS -селекторов.
9. Х ~ Y
ul ~ p { color: red; }
Этот CSS-селектор очень похож на X + Y, однако, является менее строгим. При использовании ul + p будет выбрать только первый элемент, идущий за Х. В данном случае будут выбраны все элементы p, идущие за ul.
10. X[title]
a[title] { color: green; }
В CSS-селекторах также можно использовать атрибуты. Например в данном примере мы выделили все ссылки, имеющие атрибут титле. Остальные ссылки останутся не затронутыми.
11. X [href="Foo"]
a[href="http://everstudent .ru"] { color: #ffde00; }
Все ссылки, которые ссылаются на everstudent.ru будут золотыми. Все остальные ссылки останутся неизменными неизменным.
Обратите внимание, что на кавычки. Не забудьте так же делать в jQuery и других JavaScript библиотеках, в которых элементы выбираются по CSS-селекторам. По возможности, всегда используйте CSS3 CSS-селекторы.
Хорошее правило, но слишком строгое. Что же делать, если ссылка ведет не непосредственно на everstudent.ru, а например на http://everstudent.ru/portfolio ? В этих случаях мы можем использовать регулярные выражения.
12. X [HREF *= "everstudent.ru"]
a[href*="everstudent"] { color: # 1f6053; }
Вот то, что нам нужно. Звезда обозначает, что искомое значение должно появляться где-нибудь в атрибуте. Таким образом, CSS-селектор охватывает everstudent.ru, http://everstudent.ru/portfolio и т.д.
Но что делать, если ссылка ведет на какой-то сторонних и не связанный ресурс, в адресе которого присутствует everstudent? Тогда нужно использовать "^"или "&", для ссылки на начало и конец строки соответственно.
13. X[href^="http"]
a[href^="http"] {
background: url(path/to/external/icon.png) no-repeat;
padding-left: 10px;
}
Вы никогда не задумывались, как некоторые веб-сайты могут отображать маленький значок рядом с внешними ссылками? Я уверен, что вы видели их прежде, они хорошо запоминаются.
"^" - наиболее часто используемый в регулярных выражениях символ. Он используется для обозначения начала строки. Если мы хотим охватить все тэги, у которых href начинается с http, нам надо использовать CSS-селектор, приведенных выше.
Обратите внимание, что мы не ищем "http://". Это не правильно, поскольку не учитываются адреса, начинающиеся с https://
А если мы хотим задать стиль только для ссылок, ведущих на фотографию? Нужно искатьконец строки.
14. X [href$=". JPG"]
a[href$=".jpg"] { color: red; }
Опять же, мы используем символ регулярного выражения "$" для обозначения конца строки. В данном мы ищем ссылки, которые ссылаются на jpg-файлы, или url-ы, в конце у которых стоит ".jpg".
15. X[data-*="foo"]
a[data-filetype="image"]{ color: red; }
Как же нам теперь написать CSS-селектор, который бы выделял ссылки на все виды изображений? Например, мы могли бы написать так:
a[href$=".JPG"],
a[href$=". JPEG"],
a[href$=".PNG"],
a[href$=".GIF"] {
color: red;
}
Но это геморрой и неэффективно. Другим возможным решением является применение пользовательских атрибутов. Почему бы нам не добавить наш собственный атрибут data-filetype в каждую ссылку?
<a href="path/to/image.jpg" data-filetype="image"> Ссылка на изображение </a>
Теперь мы можем выделить такие ссылки при помощи данного CSS-селектора:
a[data-filetype="image"] { color: red; }
16. X[foo~="bar"]
a[data-info~="external"] { color: red; }
a[data-info~="image"] { border: 1px solid black; }
А вот кое-что особенное. Не все знают об этом CSS-селекторе. Тильда (~) позволяет выделить определенный атрибут из списка атрибутов, разделенных запятой.
Например, мы можем задать наш собственный атрибут data-info, в котором указывать несколько ключевых слов через пробел. Так, мы можем указать, что ссылка является внешней и что она ссылается на изображение.
<a href="path/to/image.jpg" data-info="external image"> Click Me </a>
Вот, Html-код на месте, теперь напишем стили.
/ * Выбираем ссылки с атрибутом data-info, содержащий значение "external" * /
a[data-info~="external"] { color: red; }
/ * И которые содержат значения "image" * /
a[data-info~="image"] { border: 1px solid black; }
Неплохо, да?
17. X:checked
input[type=radio]:checked { border:1px solid black; }
Этот псевдокласс выделяет только элементы пользовательского интерфейса, такие как переключатель или флажок. Причем те, которые отмечены/выбраны. Очень просто.
18. X:after
Псевдоклассы :before и :after очень крутые. Создается впечатление, что каждый день появляются новые способы их эффективного использования. Они просто генерируют контент вокруг выбранного элемента.
Многие познакомились с этими псевдоклассами при работе с clear-fix hack.
.clearfix:after {
content: "";
display: block;
clear: both;
visibility: hidden;
font-size: 0;
height: 0;
}
.clearfix {
*display: inline-block;
_height: 1%;
}
Этот хак использует :after чтобы добавить пробел после элемента, и запретить его обтекание.
Согласно спецификации CSS3, вы должны использовать два двоеточия (::). Однако, можно использовать и одно двоеточие для совместимости.
19. X:hover
div:hover { background: #e3e3e3; }
Хотите применить стиль к элементу, когда наводите на него мышкой? Тогда этот CSS-селектор для вас.
Имейте в виду, что старые версии Internet Explorer применяют :hover только к ссылкам.
Этот CSS-селектор часто используют для того, чтобы поставить border-bottom на ссылки, когда на них наводят мышкой.
a:hover { border-bottom: 1px solid black; }
border-bottom: 1px solid black; выглядит лучше, чемtext-decoration: underline;
20. X:not(selector)
div:not(#container) { color: blue; }
Или, если бы я хотел выбрать все элементы, за исключением p.
*:not(p) { color: green; }
21. X::псевдо элемент
p::first-line {
font-weight: bold;
font-size: 1.2em;
}
Мы можем использовать псевдо элементы, чтобы оформлять фрагменты элементов, такие как первая строка, или первая буква. Имейте в виду, что они должны быть применены к элементам уровня блока для того, чтобы вступили в силу.
Псевдо-элемент задается двумя двоеточиями: ::
Выбираем первую букву в параграфе
p::first-letter {
float: left;
font-size: 2em;
font-weight: bold;
font-family: cursive;
padding-right:2px;
}
Этот код выберет все параграфы, и в них в свою очередь выберет первые буквы и применит к ним этот стиль.
Выбираем первую строку в абзаце
p::first-line {
font-weight: bold;
font-size: 1.2em;
}
Аналогичным образом благодаря ::first-line мы задаем стиль первой строки в абзаце.
"Для совместимости с существующими таблицами стилей, браузер должен понимать прежнее обозначения псевдо элементов с одним двоеточием, введенные в CSS 1, 2 (:first-line, :first-letter, :before and :after). Эта совместимость не допускается для новых псевдо-элементов, введенных в этой спецификации" Источник
22. X:nth-child(n)
li:nth-child(3) { color: red; }
Раньше мы не могли выделить, например, третий дочерний элемент? nth-child решает это!
Обратите внимание, что nth-child принимает целое число в качестве параметра, однако отсчет ведется не с 0. Если вы хотите выбрать второй пункт списка, используйте li:nth-child(2) .
Мы даже можем выбрать каждый четвертый элемент списка, просто написав {0}li:nth-child(4n){/0}.
23. X:nth-last-child(n)
li:nth-last-child(2) { color: red; }
Что делать, если у вас огромный список элементов в ul , а нем нужно выбрать третий элемент с конца? Вместо того, чтобы писать li:nth-child(397), можно использовать nth-last-child.
Этот метод почти идентичен приведенному выше, однако отсчет ведется с конца.
24. X:nth-of-type(n)
ul:nth-of-type(3) { border: 1px solid black; }
Бывает, что надо выбрать не дочерний элемент, а элемент определенного типа.
Представьте себе, что на странице пять неупорядоченных списков. . Если вы хотите применить стиль только к третьему ul, не имеющему уникального id, нужно использовать nth-of-type.
25. X:nth-last-of-type(n)
ul:nth-last-of-type(3) { border: 1px solid black; }
Мы можем также использовать nth-last-of-type, отсчитывая элементы с конца.
26. X:first-child
ul li:first-child { border-top: none; }
Этот псевдокласс выбирает первый дочерний элемент. Часто используется чтобы убрать border в первом и последнем элементе списка.
27. X:last-child
ul > li:last-child { color: green; }
В противоположность :first-child :last-child выбирает последний дочерний элемент.
28. X:only-child
div p:only-child { color: red; }
Вы не часто встретите этот псевдокласс, тем не менее он существует.
Он позволяет вам выбрать элементы, которые являются единственными дочерними. Например, применим приведенный выше стиль к этому html-коду:
<div>
<p> Один параграф.</p>
</div>
<div>
<p> Два параграфа </p>
<p> Два параграфа </p>
</div>
Будет выбран p только первого div`a, потому что он единственный дочерний элемент.29. X:only-of-type
li:only-of-type { font-weight: bold; }
Очень интересный псевдокласс. Он затрагивает элементы, не имеющие соседей в пределах родительского элемента. В качестве примера выберем ul только с одним элементом в списке.
Единственное решение заключается в использовании only-of-type .
ul > li:only-of-type { font-weight: bold; }
30. X:first-of-type
first-of-type выбирает первый элемент заданного типа.
<div>
<p> Параграф </p>
<ul>
<li> Пункт 1 </li>
<li> Пункт 2 </li>
</ul>
<ul>
<li> Пункт 3 </li>
<li> Пункт 4 </li>
</ul>
<div>
А теперь попытайтесь понять как выделить пункт 2.Решение 1
ul:first-of-type > li:nth-child(2) { font-weight: bold; }
Решение 2
p + ul li:last-child { font-weight: bold; }
Решение 3
ul:first-of-type li:nth-last-child(1) { font-weight: bold; }
@-webkit-keyframes
Синтаксис
@-webkit-keyframes <имя анимации> {
<селектор кадра 1> {
<свойство 1>:<значение 1>;
<свойство 2>:<значение 1>;
}
<селектор кадра 2> {
<свойство 1>:<значение 2>;
<свойство 2>:<значение 2>;
}
.....................
<селектор кадра n> {
<свойство 1>:<значение n>;
<свойство 2>:<значение n>;
}
}
-
<имя анимации> — задает имя анимации в виде строки в одинарных кавычках (это имя потом используется при вызове анимации в качестве значения свойства -webkit-animation-name)
-
<селектор кадра> — задает селекторы которые определяют ключевые кадры. Они могут принимать значения:
-
from — внутри этого селектора описывается значения анимированных свойств в начальный момент анимации (также можно описать начальный кадр анимации, используя эквивалентный селектор 0%)
-
to — внутри этого селектора описывается значения анимированных свойств в конечный момент анимации (также можно описать конечный кадр анимации, используя эквивалентный селектор 100%)
-
<процент> — описывает значения анимированных свойств в данный момент времени (момент времени отсчитывается в процентном отношении от значения свойства -webkit-animation-duration)
-
<свойство> — анимируемое CSS свойство
-
<значение> — значения анимированного свойств в момент, описываемый селектором кадра
Пример кода
div {
top:50px;
left:0px;
-webkit-animation-name:'movement';
-webkit-animation-duration:10s;
}
@-webkit-keyframes 'movement' {
from {
top:50px;
left:0px;
}
50% {
top:150px;
left:100px;
}
to {
top:400px;
left:300px;
}
}
CSS Grid Layout
.grid {
display: grid;
grid-template-columns: 200px 200px 200px; // задаём количество и ширину столбцов в px
grid-template-columns: 1fr 1fr 1fr; // задаём количество и ширину столбцов в fr
grid-column-gap: 10px; // задаём интервалы между столбцами
grid-template-rows: 50px 1fr 30px; // задаём количество и размеры строк
grid-row-gap: 1em; // задаём интервалы между строками
grid-gap: 3%; // задаём интервалы между строками и столбцами
}
Что такое Grid?
Grid представляет собой пересекающийся набор горизонтальных и вертикальных линий - один набор определяет столбцы, а другой строки. Элементы могут быть помещены в сетку, соответственно строкам и столбцам. Grid имеет следующие функции:
Фиксированные и гибкие размеры полос
Вы можете создать сетку с фиксированными размерами полос — например, используя пиксели. Вы также можете создать сетку с гибкими размерами, используя проценты или новую единицу измерения - fr, предназначенную для этой цели.
Расположение элемента
Вы можете размещать элементы в заданном месте Grid, используя номера строк, имена или путём привязки к области Grid. Grid также содержит алгоритм управления размещением элементов, не имеющих явной позиции в Grid.
Создание дополнительных полос для хранения контента
Вы можете определить явную сетку с макетом сетки, но спецификация также касается контента, добавленного за пределами объявленной сетки, при необходимости добавляя дополнительные строки и столбцы. Включены такие функции, как добавление «столько столбцов, сколько будет помещено в контейнер».
Управление выравниванием
Grid содержит функции выравнивания, чтобы мы могли контролировать, как элементы выравниваются после размещения в области сетки, и как выравнивается весь Grid.
Управление перекрывающимся контентом
В ячейку сетки может быть помещено более одного элемента, или области могут частично перекрывать друг друга. Затем это расслоение можно контролировать с помощью z-index.
Grid контейнер
Мы создаёмgrid контейнер, объявляяdisplay: grid или display: inline-grid на элементе. Как только мы это сделаем, все прямые детиэтого элемента станут элементами сетки.
<div class="wrapper">
<div>One</div>
<div>Two</div>
<div>Three</div>
<div>Four</div>
<div>Five</div>
</div>
Сделаем wrapper grid контейнером
.wrapper {
display: grid;
}
Все прямые потомки теперь являются grid элементами. В веб-браузере вы не увидите никакой разницы в отображении элементов, поскольку Grid создал единую сетку столбцов для элементов. На данный момент вам может оказаться удобным работать в Firefox Developer Edition, в котором есть Grid Inspector, доступный как часть инструментов разработчика. Если вы просмотрите этот пример в Firefox и проверите Grid, вы увидите маленький значок рядом с display: grid. Нажмите этот значок, и сетка на этом элементе будет наложена в окне браузера.

По мере вашего обучения и последующей работы с CSS Grid Layout этот инструмент даст вам лучшее визуальное представление о том, что происходит с вашей сеткой.
Если мы хотим, чтобы это стало более похожим на сетку, нам нужно добавить полосы.
Grid Tracks
Мы определяем ряды и столбцы в нашей сетке при помощи свойств grid-template-columnsи grid-template-rows. Это определяет полосы сетки. Полоса сетки — это место между любыми двумя линиями сетки. На изображении ниже вы можете увидеть подсветку полосы — первого трека ряда в нашей сетке.

<div class="wrapper">
<div>One</div>
<div>Two</div>
<div>Three</div>
<div>Four</div>
<div>Five</div>
</div>
.wrapper {
display: grid;
grid-template-columns: 200px 200px 200px;
}
Единица измерения fr
Размер треков (полос) может быть задан с помощью любой единицы длины. Спецификация также вводит дополнительную единицу длины, позволяющую создавать эластичные (flexible) грид-треки. Новая единица длины fr представляет собой долю (fraction) доступного пространства в грид-контейнере. Определение грида в коде ниже создаст три трека равной длины, которые будут увеличиваться и уменьшаться в размерах в соответствии с доступным пространством.
<div class="wrapper">
<div>One</div>
<div>Two</div>
<div>Three</div>
<div>Four</div>
<div>Five</div>
</div>
.wrapper {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
}
.wrapper {
display: grid;
grid-template-columns: 2fr 1fr 1fr;
}
.wrapper {
display: grid;
grid-template-columns: 500px 1fr 2fr;
}
.wrapper {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
}
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
```
.wrapper {
display: grid;
grid-template-columns: 20px repeat(6, 1fr) 20px;
}
.wrapper {
display: grid;
grid-template-columns: repeat(5, 1fr 2fr);
}
Явный и неявный грид
<div class="wrapper">
<div>One</div>
<div>Two</div>
<div>Three</div>
<div>Four</div>
<div>Five</div>
</div>
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 200px;
}
Масштабирование треков и minmax()
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: minmax(100px, auto);
}
<div class="wrapper">
<div>One</div>
<div>Two
<p>I have some more content in.</p>
<p>This makes me taller than 100 pixels.</p>
</div>
<div>Three</div>
<div>Four</div>
<div>Five</div>
</div>
Grid-линии
Нужно заметить, что когда мы определяем грид, мы определяем грид-треки, а не грид-линии. После этого грид обеспечивает нас пронумерованными линиями, номера которых можно использовать для размещения элементов. Например, в гриде с тремя колонками и двумя рядами у нас - четыре колоночные линии.

Линии нумеруются в соответствии с режимом написания (writing mode) документа. В языках с написанием слева-направо, линия 1 - самая левая линия в гриде. В языках с написанием справа-налево, линия 1 - самая правая линия в гриде. Линиям также можно давать имена, и - не переключайтесь, дальше мы узнаем, как это делать.
Размещение элементов по линиям
В дальнейшем мы детально рассмотрим размещение элементов с помощью линий, а пока остановимся на простом способе. При размещении элемента мы ссылаемся именно на линию, а не на трек.
В следующем примере мы размещаем первые два элемента в нашем гриде из трёх колоночных треков с помощью свойств grid-column-start(en-US), grid-column-end(en-US), grid-row-startи grid-row-end(en-US). Поскольку режим написания слева направо, первый элемент размещается, начиная с колоночной линии 1, и занимает пространство до колоночной линии 4, которая в нашем случае - самая правая линия грида. Наш элемент начинается со строчной линии 1 и заканчивается на строчной линии 3, таким образом занимая два строчных трека.
Второй элемент начинается с колоночной линии 1 и занимает один трек. Это поведение по умолчанию, поэтому не нужно задавать конечную линию. Элемент также занимает два строчных трека - со строчной линии 3 до строчной линии 5. Остальные элементы самостоятельно размещаются в пустых пространствах грида.
<div class="wrapper">
<div class="box1">One</div>
<div class="box2">Two</div>
<div class="box3">Three</div>
<div class="box4">Four</div>
<div class="box5">Five</div>
</div>
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 100px;
}
.box1 {
grid-column-start: 1;
grid-column-end: 4;
grid-row-start: 1;
grid-row-end: 3;
}
.box2 {
grid-column-start: 1;
grid-row-start: 3;
grid-row-end: 5;
}
Grid-ячейки

Grid-области

grid-template-areasСвойство CSS определяет именованные области сетки, устанавливая ячейки в сетке и присваивая им имена.
/* Keyword value */
grid-template-areas: none; /* <string> values */
grid-template-areas: "a b";
grid-template-areas:
"a b b"
"a c d"; /* Global values */
grid-template-areas: inherit;
grid-template-areas: initial;
grid-template-areas: revert;
grid-template-areas: revert-layer;
grid-template-areas: unset;
```
Пример
<section id="page">
<header>Header</header>
<nav>Navigation</nav>
<main>Main area</main>
<footer>Footer</footer>
</section>
```
CSS
#page {
display: grid;
width: 100%;
height: 250px;
grid-template-areas:
"head head"
"nav main"
"nav foot";
grid-template-rows: 50px 1fr 30px;
grid-template-columns: 150px 1fr;
}
#page > header {
grid-area: head;
background-color: #8ca0ff;
}
#page > nav {
grid-area: nav;
background-color: #ffa08c;
}
#page > main {
grid-area: main;
background-color: #ffff64;
}
#page > footer {
grid-area: foot;
background-color: #8cffa0;
}
```
Зазоры (Gutters)
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-column-gap: 10px;
grid-row-gap: 1em;
}
<div class="wrapper">
<div>One</div>
<div>Two</div>
<div>Three</div>
<div>Four</div>
<div>Five</div>
</div>
Вложенные гриды
<div class="wrapper">
<div class="box box1">
<div class="nested">a</div>
<div class="nested">b</div>
<div class="nested">c</div>
</div>
<div class="box box2">Two</div>
<div class="box box3">Three</div>
<div class="box box4">Four</div>
<div class="box box5">Five</div>
</div>

.box1 {
grid-column-start: 1;
grid-column-end: 4;
grid-row-start: 1;
grid-row-end: 3;
display: grid;
grid-template-columns: repeat(3, 1fr);
}
Подгрид (Subgrid)
.box1 {
grid-column-start: 1;
grid-column-end: 4;
grid-row-start: 1;
grid-row-end: 3;
display: grid;
grid-template-columns: subgrid;
}
Размещение элементов с помощью z-index
<div class="wrapper">
<div class="box box1">One</div>
<div class="box box2">Two</div>
<div class="box box3">Three</div>
<div class="box box4">Four</div>
<div class="box box5">Five</div>
</div> Copy to Clipboard
```
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 100px;
}
.box1 {
grid-column-start: 1;
grid-column-end: 4;
grid-row-start: 1;
grid-row-end: 3;
}
.box2 {
grid-column-start: 1;
grid-row-start: 2;
grid-row-end: 4;
}
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 100px;
}
.box1 {
grid-column-start: 1;
grid-column-end: 4;
grid-row-start: 1;
grid-row-end: 3;
z-index: 2;
}
.box2 {
grid-column-start: 1;
grid-row-start: 2;
grid-row-end: 4;
z-index: 1;
}
CSS3-трансформации
Модель визуального форматирования CSS описывает систему координат внутри каждого позиционированного элемента. Система координат является точкой отсчета для свойств смещения. Положение и размеры в этом координатном пространстве можно рассматривать как заданные в пикселях, относительно точки отсчета, с положительными значениями, идущими вправо и вниз. Это координатное пространство можно изменить с помощью свойства transform.
CSS3-трансформации позволяют сдвигать, поворачивать и масштабировать элементы. Трансформации преобразовывают элемент, не затрагивая остальные элементы веб-страницы, т.е. другие элементы не сдвигаются относительно него.
В HTML трансформируемый элемент это: элемент с display: block; и display: inline-block;, а также элементы, значение свойства displayкоторых вычисляется как table-row, table-row-group, table-header-group, table-footer-group, table-cell или table-caption.
Трансформированным считается элемент с любым установленным значением свойства transform, отличным от none.
В SVG трансформируемый элемент — это элемент, который имеет атрибуты transform, patternTransform или gradientTransform.
Существуют два вида CSS3-трансформаций – 2Dи 3D. 2D-трансформации преобразовывают элементы в двумерном пространстве c помощью 2D-матрицы преобразований. Эта матрица применяется для вычисления новых координат объекта, на основе значений свойств transformи transform-origin. Преобразования влияют только на визуальный рендеринг. В отношении макета страницы они могут отразиться на переполнении содержимого блока. По умолчанию точка трансформации находится в центре элемента.
2D-трансформации элементов
1. Функции 2D-трансформации: свойство transform
Свойство transform задаёт вид преобразования элемента. Свойство описывается с помощью функций трансформации, которые смещают элемент относительно его текущего положения на странице или изменяют его первоначальные размеры и форму.
Свойство не наследуется.
|
Функция |
Описание |
|---|---|
|
none |
Значение по умолчанию, означает отсутствие трансформации. Также отменяет трансформацию для элемента из группы трансформируемых элементов. |
|
matrix(a, c, b, d, x, y) |
Смещает элементы и задает способ их трансформации, позволяя объединить несколько функций 2D-трансформаций в одной. В качестве трансформации допустимы поворот, масштабирование, наклон и изменение положения. Значение aизменяет масштаб по горизонтали. Значение от 0 до 1 уменьшает элемент, больше 1 — увеличивает. Значение cдеформирует (сдвигает) стороны элемента по оси Y, положительное значение — вверх, отрицательное — вниз. Значение bдеформирует (сдвигает) стороны элемента по оси X, положительное значение — влево, отрицательное — вправо. Значение dизменяет масштаб по вертикали. Значение меньше 1 уменьшает элемент, больше 1 — увеличивает. Значение xсмещает элемент по оси X, положительное — вправо, отрицательное — влево. Значение yсмещает элемент по оси Y, положительное значение — вниз, отрицательное — вверх. |
|
translate(x,y) |
Сдвигает элемент на новое место, перемещая относительно обычного положения вправо и вниз, используя координаты X и Y, не затрагивая при этом соседние элементы. Если нужно сдвинуть элемент влево или вверх, то нужно использовать отрицательные значения. |
|
translateX(n) |
Сдвигает элемент относительно его обычного положения по оси X. |
|
translateY(n) |
Сдвигает элемент относительно его обычного положения по оси Y. |
|
scale(x,y) |
Масштабирует элементы, делая их больше или меньше. Значения от 0 до 1 уменьшают элемент. Первое значение масштабирует элемент по ширине, второе — по высоте. Отрицательные значения отображают элемент зеркально. |
|
scaleX(n) |
Функция масштабирует элемент по ширине, делая его шире или уже. Если значение больше единицы, элемент становится шире, если значение находится между единицей и нулем, элемент становится уже. Отрицательные значения отображают элемент зеркально по горизонтали. |
|
scaleY(n) |
Функция масштабирует элемент по высоте, делая его выше или ниже. Если значение больше единицы, элемент становится выше, если значение находится между единицей и нулем — ниже. Отрицательные значения отображают элемент зеркально по вертикали. |
|
rotate(угол) |
Поворачивает элементы на заданное количество градусов, отрицательные значения от -1degдо -360degповорачивают элемент против часовой стрелки, положительные — по часовой стрелке. Значение rotate(720deg)поворачивает элемент на два полных оборота. |
|
skew(x-угол,y-угол) |
Используется для деформирования (искажения) сторон элемента относительно координатных осей. Если указано одно значение, второе будет определено браузером автоматически. |
|
skewX(угол) |
Деформирует стороны элемента относительно оси X. |
|
skewY(угол) |
Деформирует стороны элемента относительно оси Y. |
|
initial |
Устанавливает значение свойства в значение по умолчанию. |
|
inherit |
Наследует значение свойства от родительского элемента. |
Допустимые значения:
matrix()— любое число
translate(), translateX(), translateY()— единицы длины (положительные и отрицательные), %
scale(), scaleX(), scaleY()— любое число
rotate()— угол (deg, grad, radили turn)
skew(), skewX(), skewY()— угол (deg, grad, rad)
Можно объединить несколько трансформаций одного элемента, перечислив их через пробел в порядке проявления.
Синтаксис
transform: none;
transform: matrix(1.0, 2.0, 3.0, 4.0, 5.0, 6.0);
transform: rotate(45deg);
transform: translate(12px, 50%);
transform: translateX(2em);
transform: translateY(3in);
transform: scale(2, 0.5);
transform: scaleX(2);
transform: scaleY(0.5);
transform: skew(30deg, 20deg);
transform: skewX(30deg);
transform: skewY(1.07rad);
transform: translateX(10px) rotate(10deg) translateY(5px);
transform: inherit;
transform: initial;
2. Точка трансформации: свойство transform-origin
Свойство transform-origin позволяет сместить центр трансформации, относительно которого происходит изменение положения/размера/формы элемента. Значение по умолчанию — center, или 50% 50%. Задаётся только для трансформированных элементов.
Свойство не наследуется.
transform-origin
Значения:
ось Х(left, center, right, длина, %)
ось Y(top, center, bottom, длина, %)
Пара значений, заданная с помощью ключевых слов, единиц длины или процентов определяет, относительно какой части элемента будет происходить трансформация. Значения больше 100% увеличивают область трансформации элемента.
initial
Устанавливает значение свойства в значение по умолчанию.
inherit
Наследует значение свойства от родительского элемента.
Синтаксис
transform-origin: 2px;
transform-origin: bottom;
transform-origin: 3cm 2px;
transform-origin: left 2px;
transform-origin: right top;
transform-origin: inherit;
transform-origin: initial;
3. Область преобразования: свойство transform-box
Все преобразования, определяемые свойством transform и transform-origin, относятся к положению и размерам опорного блока элемента. Опорный блок элемента это виртуальный прямоугольник вокруг элемента, который формирует систему координат для отрисовки.
В некоторых браузерах опорный блок принимает центр SVG-холста в качестве точки преобразования. Чтобы решить эту проблему, можно задать для элемента transform-box.
Опорный блок добавляет дополнительное смещение к исходной точке, заданной свойством transform-origin.
Свойство не наследуется.
transform-box
Значения:
content-box
В качестве опорного блока выступает область содержимого элемента. Для элемента <table>эта область включает также заголовок таблицы и рамку.
border-box
В качестве опорного блока выступает область рамки элемента. Для элемента <table>эта область включает также заголовок таблицы и рамку.
fill-box
В качестве опорного блока выступает ограничивающая рамка, содержащая только геометрическую форму элемента.
stroke-box
В качестве опорного блока выступает ограничивающая рамка, содержащая геометрическую форму и обводку элемента.
view-box
В качестве опорного блока используется область просмотра на SVG-холсте, которая определяет прямоугольную область, в которую отображается содержимое SVG.
initial
Устанавливает значение свойства в значение по умолчанию.
inherit
Наследует значение свойства от родительского элемента.
Синтаксис
transform-box: content-box;
transform-box: border-box;
transform-box: fill-box;
transform-box: stroke-box;
transform-box: view-box;
transform-box: inherit;
transform-box: initial;HTML теги, упорядоченые по алфавиту
Тег |
Описание |
|---|---|
|
<!--...-->
|
Определяет комментарий
|
|
<!DOCTYPE>
|
Определяет тип документа
|
|
<a>
|
Определяет гиперссылку
|
|
<abbr>
|
Определяет аббревиатуру или акроним
|
|
<acronym>
|
Определяет акроним
|
|
<address>
|
Определяет контактные данные автора/владельца документа
|
|
<applet>
|
Определяет встроенный апплет
|
|
<area>
|
Определяет область внутри изображения-карты
|
|
<article>
|
Определяет статью
|
|
<aside>
|
Определяет содержание в стороне от содержимого страницы
|
|
<audio>
|
Определяет звуковое содержимое
|
|
<b>
|
Определяет полужирный текст
|
|
<base>
|
Указывает базовый URL-адрес/цель для всех относительных URL-адресов в документе
|
|
<basefont>
|
Не поддерживается в HTML5. Вместо этого используйте CSS.
Задает цвет, размер и шрифт по умолчанию для всего текста в документе
|
|
<bdi>
|
Изолирует часть текста, которая может быть отформатирована в другом направлении от другого текста за его пределами
|
|
<bdo>
|
Переопределяет текущее направление текста
|
|
<big>
|
Не поддерживается в HTML5. Вместо этого используйте CSS.
Определяет большой текст
|
|
<blockquote>
|
Определяет раздел, который цитируется из другого источника
|
|
<body>
|
Определяет тело документа
|
|
<br>
|
Определяет один разрыв строки
|
|
<button>
|
Определяет нажатую кнопку
|
|
<canvas>
|
Используется для рисования графики, на лету, с помощью сценариев (обычно JavaScript)
|
|
<caption>
|
Определяет заголовок таблицы
|
|
<center>
|
Не поддерживается в HTML5. Вместо этого используйте CSS.
Определяет центрированный текст
|
|
<cite>
|
Определяет название работы
|
|
<code>
|
Определяет часть кода компьютера
|
|
<col>
|
Задает свойства столбца для каждого столбца в <colgroup> element
|
|
<colgroup>
|
Задает группу из одного или нескольких столбцов в таблице для форматирования
|
|
<data>
|
Связывает данное содержимое с машинно-читаемым переводом
|
|
<datalist>
|
Задает список предварительно заданных параметров для элементов управления вводом
|
|
<dd>
|
Определяет описание/значение термина в списке описания
|
|
<del>
|
Определяет текст, который был удален из документа
|
|
<details>
|
Определяет дополнительные сведения, которые пользователь может просматривать или скрывать
|
|
<dfn>
|
Представляет определяющий экземпляр термина
|
|
<dialog>
|
Определяет диалоговое окно или окно
|
|
<dir>
|
Не поддерживается в HTML5. Использовать <ul> Вместо.
Определяет список каталогов
|
|
<div>
|
Определяет раздел в документе
|
|
<dl>
|
Определяет список описания
|
|
<dt>
|
Определяет термин/имя в списке описания
|
|
<em>
|
Определяет подчеркнутый текст
|
|
<embed>
|
Определяет контейнер для внешнего (не HTML) приложения
|
|
<fieldset>
|
Группирует связанные элементы в форме
|
|
<figcaption>
|
Определяет заголовок для <figure> Элемент
|
|
<figure>
|
Указывает автономное содержимое
|
|
<font>
|
Не поддерживается в HTML5. Вместо этого используйте CSS.
Определяет шрифт, цвет и размер текста
|
|
<footer>
|
Определяет нижний колонтитул для документа или раздела
|
|
<form>
|
Определяет HTML-форму для ввода данных пользователем
|
|
<frame>
|
Не поддерживается в HTML5.
Определяет окно (фрейм) в фрейме
|
|
<frameset>
|
Не поддерживается в HTML5.
Определяет набор фреймов
|
|
<h1> to <h6>
|
Определяет заголовки HTML
|
|
<head>
|
Определяет сведения о документе
|
|
<header>
|
Определяет заголовок документа или раздела
|
|
<hr>
|
Определяет тематическое изменение содержания
|
|
<html>
|
Определяет корень HTML-документа
|
|
<i>
|
Определяет часть текста в альтернативный голос или настроение
|
|
<iframe>
|
Определяет встроенный фрейм
|
|
<img>
|
Определяет изображение
|
|
<input>
|
Определяет элемент управления вводом
|
|
<ins>
|
Определяет текст, вставленный в документ
|
|
<kbd>
|
Определяет ввод с клавиатуры
|
|
<label>
|
Определяет метку для <input> Элемент
|
|
<legend>
|
Определяет заголовок для <fieldset> Элемент
|
|
<li>
|
Определяет элемент списка
|
|
<link>
|
Определяет связь между документом и внешним ресурсом (наиболее используемым для связывания с таблицами стилей)
|
|
<main>
|
Указывает основное содержимое документа
|
|
<map>
|
Определяет изображение на стороне клиента-Map
|
|
<mark>
|
Определяет выделенный/выделенный текст
|
|
<menu>
|
Определяет список/меню команд
|
|
<menuitem>
|
Определяет команду/пункт меню, который пользователь может вызвать из всплывающего меню
|
|
<meta>
|
Определяет метаданные HTML-документа
|
|
<meter>
|
Определяет скалярное измерение в пределах известного диапазона (датчика)
|
|
<nav>
|
Определяет навигационные ссылки
|
|
<noframes>
|
Не поддерживается в HTML5.
Определяет альтернативное содержимое для пользователей, которые не поддерживают кадры
|
|
<noscript>
|
Определяет альтернативное содержимое для пользователей, которые не поддерживают сценарии на стороне клиента
|
|
<object>
|
Определяет внедренный объект
|
|
<ol>
|
Определяет упорядоченный список
|
|
<optgroup>
|
Определяет группу связанных параметров в раскрывающемся списке
|
|
<option>
|
Определяет параметр в раскрывающемся списке
|
|
<output>
|
Определяет результат вычисления
|
|
<p>
|
Определяет абзац
|
|
<param>
|
Определяет параметр для объекта
|
|
<picture>
|
Определяет контейнер для нескольких ресурсов изображения
|
|
<pre>
|
Определяет предварительно отформатированный текст
|
|
<progress>
|
Представляет ход выполнения задачи
|
|
<q>
|
Определяет краткое предложение
|
|
<rp>
|
Определяет, что отображать в обозревателях, не поддерживающих аннотации Ruby
|
|
<rt>
|
Определяет объяснение/произношение символов (для восточно-азиатских типографии)
|
|
<ruby>
|
Определяет аннотацию Ruby (для восточно-азиатских типографий)
|
|
<s>
|
Определяет текст, который больше не является правильным
|
|
<samp>
|
Определяет выборку выходных данных из компьютерной программы
|
|
<script>
|
Определяет сценарий на стороне клиента
|
|
<section>
|
Определяет раздел в документе
|
|
<select>
|
Определяет раскрывающийся список
|
|
<small>
|
Определяет меньший текст
|
|
<source>
|
Определяет несколько мультимедийных ресурсов для элементов мультимедиа (<video> И <audio>)
|
|
<span>
|
Определяет раздел в документе
|
|
<strike>
|
Не поддерживается в HTML5. Использовать <del> или <s> Вместо.
Определяет текст зачеркивания
|
|
<strong>
|
Определяет важный текст
|
|
<style>
|
Определяет сведения о стиле для документа
|
|
<sub>
|
Определяет текст с подстрочным текстом
|
|
<summary>
|
Определяет видимый заголовок для <details> Элемента
|
|
<sup>
|
Определяет текст с надписью
|
|
<svg>
|
Определяет контейнер для графики SVG
|
|
<table>
|
Определяет таблицу
|
|
<tbody>
|
Группирует содержимое тела в таблице
|
|
<td>
|
Определяет ячейку в таблице
|
|
<template>
|
Определяет шаблон
|
|
<textarea>
|
Определяет многострочный элемент управления вводом (область текста)
|
|
<tfoot>
|
Группирует содержимое нижнего колонтитула в таблице
|
|
<th>
|
Определяет ячейку заголовка в таблице
|
|
<thead>
|
Группирует содержимое заголовка в таблице
|
|
<time>
|
Определяет дату и время
|
|
<title>
|
Определяет заголовок документа
|
|
<tr>
|
Определяет строку в таблице
|
|
<track>
|
Определяет текстовые дорожки для элементов мультимедиа (<video> И <audio>)
|
|
<tt>
|
Не поддерживается в HTML5. Вместо этого используйте CSS.
Определяет телетайп текст
|
|
<u>
|
Определяет текст, который должен быть стилистически отличается от обычного текста
|
|
<ul>
|
Определяет неупорядоченный список
|
|
<var>
|
Определяет переменную
|
|
<video>
|
Определяет видео или фильм
|
|
<wbr>
|
Определяет возможный разрыв строки
|
Input type number
|
Атрибут
|
Описание
|
|---|---|
|
step
|
Шаг изменения значения
|
|
max
|
Максимальное значение
|
|
min
|
Минимальное значение
|
|
placeholder
|
Подсказка
|
|
readonly
|
Только для чтения
|
|
disabled
|
Заблокирован
|
|
list
|
Связка со списком опций datalist по id
|
|
required
|
Обязательный для заполнения
|
1 Шаг изменения
<input type="number" step="1" placeholder="step = 1"> <input type="number" step="10" placeholder="step = 10"> <input type="number" step="0.1" placeholder="step = 0.1">
2 Минимальное значение
<input type="number" step="10" min="0" placeholder="min = 0"> <input type="number" step="10" min="-100" placeholder="min = -100"> <input type="number" step="0.1"min="-0.1" placeholder="min = -0.1">
3 Максимальное значение
<input type="number" step="1" max="10" placeholder="max = 10"> <input type="number" step="10" max="100" placeholder="max = 100"> <input type="number" step="0.1" max="1.5" placeholder="max = 1.5">
4 Опции по умолчанию
<input type="number" list="input-list"> <datalist id="input-list"> <option value="111"> <option value="222"> <option value="333"> <option value="444"> <option value="555"> </datalist>
5 Валидация
<form> <input type="number" step="10" min="0" max="100" required> <input type="submit" value="Отправить"> </form>
Также доступны CSS псевдо свойства :invalid и :valid, с помощью них можно применить стили к неправильно заполненному полю.
<form> <div class="row"> <input type="number" step="10" min="0" max="100" required> <span></span> </div> <div class="row"> <input type="number" step="10" min="0" max="100" required> <span></span> </div> </form>
HTML
input[type="number"]:invalid+span:after { content: '✖'; padding-left: 5px; color: red; } input[type="number"]:valid+span:after { content: '✓'; padding-left: 5px; color: green; }
6 Стилизация
input[type="number"] { background-color: #eee; vertical-align: top; outline: none; padding: 0; height: 40px; line-height: 40px; text-indent: 10px; display: inline-block; width: 100%; box-sizing: border-box; border: 1px solid #ddd; font-size: 14px; border-radius: 3px; } input[type="number"]:focus { outline: 2px solid blue; }
7 Убрать стрелки
input[type="number"] { -moz-appearance: textfield; -webkit-appearance: textfield; appearance: textfield; } input[type="number"]::-webkit-outer-spin-button, input[type="number"]::-webkit-inner-spin-button { display: none; }
8 Как стилизовать стрелки
HTML
<div class="number"> <button class="number-minus" type="button" onclick="this.nextElementSibling.stepDown(); this.nextElementSibling.onchange();">-</button> <input type="number" min="0" value="1" readonly> <button class="number-plus" type="button" onclick="this.previousElementSibling.stepUp(); this.previousElementSibling.onchange();">+</button> </div>
CSS
.number { display: inline-block; position: relative; width: 100px; }
.number input[type="number"] { display: block; height: 32px; line-height: 32px; width: 100%; padding: 0; margin: 0; box-sizing: border-box; text-align: center; -moz-appearance: textfield; -webkit-appearance: textfield; appearance: textfield; }
.number input[type="number"]::-webkit-outer-spin-button, .number input[type="number"]::-webkit-inner-spin-button { display: none; }
.number-minus { position: absolute; top: 1px; left: 1px; bottom: 1px; width: 20px; padding: 0; display: block; text-align: center; border: none; border-right: 1px solid #ddd; font-size: 16px; font-weight: 600; }
.number-plus { position: absolute; top: 1px; right: 1px; bottom: 1px; width: 20px; padding: 0; display: block; text-align: center; border: none; border-left: 1px solid #ddd; font-size: 16px; font-weight: 600; }Pixel Glass
Pixel Glass — маленькая библиотека на JavaScript, которая поможет вам проверить насколько разметка страницы соответствует макету, без необходимости запускать графический редактор или уходить со страницы всякий раз, когда вам нужно свериться с макетом.
Она будет полезна, если вы верстаете адаптивный дизайн и у вас есть несколько макетов для разных разрешений экрана.
Как это работает?
Pixel Glass просто управляет прозрачностью элемента <body> . Когда <body> становится полупрозрачным, через него становятся видны макеты, заданные фоном для <html>.
Как использовать Pixel Glass в своём проекте?
1. Установите пакет в папку с проектом через npm:
npm i pixel-glass --save-dev
2. Поместите макеты страниц в ваш проект в папку image (или в другую, какая вам нравится).
3. Добавьте этот код на вашу страницу в элемент <head>
<!-- Pixel Glass -->
<style>
HTML {
background-repeat: no-repeat;
background-position: 50% 0;
/* По умолчанию показывается мобильный макет */
background-image: url( "img/320.png" );
}
/* Планшет */
@media ( min-width: 760px ) {
HTML {
/* Планшетный макет */
background-image: url( "img/760.png" );
}
}
/* Десктоп */
@media ( min-width: 960px ) {
HTML {
/* Десктопный макет */
background-image: url( "img/960.png" );
}
}
</style>
<link href="../node_modules/pixel-glass/styles.css" rel="stylesheet">
<script src="../node_modules/pixel-glass/script.js"></script>
<!-- // Pixel Glass -->
Отредактируйте код под ваш проект: настройте медиавыражения, поменяйте адреса картинок на рабочие.
4. Сохраните файл, обновите страницу и пользуйтесь!
Атрибут sizes()
sizes="100vw"
sizes="(min-width: 40em) 100vw"
sizes="(max-width: 30em) 100vw, (max-width: 50em) 50vw, calc(33vw - 100px)")
Синтаксис
Значение по умолчанию
Пример
<!DOCTYPE html><html>
<head>
<meta charset="utf-8">
<title>sizes</title>
</head>
<body>
<img
src="image/mushroom.jpg"
srcset="image/mushroom_portrait.jpg 350w, image/mushroom_landscape.jpg 650w"
sizes="(max-width: 600px) 300px, (min-width: 600px) 600px"
alt="">
</body></html>
Всё о <input type="checkbox"/> <input type="radio"/>
Атрибут checked="checked"
Делает чекбокс [type="checkbox"] или радиокнопку [type="radio"] активной. Активных чекбоксов может быть несколько. В группе с одним name должна быть активной только одна радиокнопка.
<input type="checkbox" checked/> <input type="checkbox" checked/> <input type="checkbox"/>
<input type="radio" checked name="raz"/> <input type="radio" name="raz"/> <input type="radio" name="raz"/>
Атрибут checked="checked" можно вызывать с помощью label
Если нажать на содержимое label, то сработает input (будет активным или нет).
описание
<label><input type="checkbox"/> описание</label>
описание1 описание2
<label><input type="radio" checked name="dva"/> описание1</label> <label><input type="radio" name="dva"/> описание2</label>
input не обязательно должен располагаться внутри label.
описание
<input type="checkbox" id="raz"/><label for="raz">описание</label>
описание1 описание2
<input type="radio" checked name="dva" id="dva1"/><label for="dva1">описание1</label> <input type="radio" name="dva" id="dva2"/><label for="dva2">описание2</label>
Атрибут checked="checked" можно вызывать с помощью нескольких label
Кнопка будет срабатывать вне зависимости от того, на какой label я нажму и вне зависимости от расстояния между тегами label и input.описание2описание1
<label for="tri">описание2</label><input type="checkbox" id="tri"/><label for="tri">описание1</label>
описание11 описание21 описание12 описание22
<input type="radio" checked="checked" name="tri" id="tri1"/><input type="radio" name="tri" id="tri2"/>
<label for="tri1">описание11</label> <label for="tri2">описание21</label> <label for="tri1">описание12</label> <label for="tri2">описание22</label>
Псевдокласс :checked
С помощью CSS можно прописать что будет происходить с другими нижестоящими элементами, когда кнопка нажата. Когда кнопка отжата, элементы будут возвращаться к исходному состоянию. Чтобы всё без проволочек было, нужно хорошо разбираться в селекторах.
<style>
.Green {
background: green;
width: 130px;
height: 130px;
transition: .5s;
}
#chetyre:checked ~ .Green {
background: yellow;
}
</style>
<input type="checkbox" id="chetyre"/>
<div class="Green"></div>
<style>
.Green1 {
background: green;
width: 130px;
height: 130px;
transition: .5s;
}
#chetyre2:checked ~ .Green1 {
background: yellow;
}
#chetyre3:checked ~ .Green1 {
background: red;
}
</style>
<input type="radio" checked="checked" name="chetyre"/> <input type="radio" name="chetyre" id="chetyre2"/> <input type="radio" name="chetyre" id="chetyre3"/>
<div class="Green1"></div>
<style>
#link {
position: relative;
}
#link a {
pointer-events: none;
}
#link:hover:before {
display: block;
content: "Подтвердите своё согласие с условиями договора";
position: absolute;
top: 0; left: 50%;
transform: translate(-50%, calc(-100% - 10px));
border-radius: 3px;
padding: 10px;
background: #f7f7f7;
box-shadow: 0 0 2px;
}
#link:hover:after {
display: block;
content: "";
position: absolute;
top: 0; left: 50%;
transform: translate(-50%, -50%);
border-style: solid;
border-width: 10px;
border-color: #f7f7f7 transparent transparent transparent;
}
#linkDa:checked ~ #link a {
pointer-events: auto;
}
#linkDa:checked ~ #link:after, #linkDa:checked ~ #link:before {
content: none;
}
</style>
<input type="checkbox" id="linkDa"/><label for="linkDa">Я ознакомлен и принимаю условия договора</label><br>
<span id="link"><a href="#">ссылка</a></span>
:checked и селекторы в Google Chrome
Не работает
<style>
#vosem:checked + label button {
color: red;
}
</style>
<input type="checkbox" id="vosem"/><label for="vosem"><button>описание</button></label>
Работает
<style>
#sem + label {
position: relative;
z-index: 1;
}
#sem + label button {
position: relative;
z-index: -1;
}
#sem:checked + label button {
color: green;
}
</style>
<input type="checkbox" id="sem"/><label for="sem"><button>описание</button></label>
Красивые чекбоксы-переключатели «ВЫКЛ ВКЛ». Как задать свой стиль checkbox
Я предпочитаю стандартный вид input, но к этому, этому и этому не осталась равнодушна и приложила свою руку к оформлению и стилизации checkbox. Можно убирать саму кнопку и задать свой стиль :before у label.
ON Проверка чекбокса на включение/отключение
Большинство вещей не решить только CSS. Нужно подключать JavaScript.
<input type="checkbox" id="shest0">
<script>
var c = document.querySelector('#shest0');
c.onclick = function() {
if (c.checked) {
alert( 'чекбокс включён' );
} else {
alert( 'чекбокс выключён' );
}
}
</script>
Иногда нужно так
<input type="checkbox" id="shest001">
<script>
var c = document.querySelector('#shest001');
c.onclick = function() {
alert( 'чекбокс выключён' );
if (c.checked) {
alert( 'чекбокс включён' );
}
}
</script>
Если группа
<input type="checkbox" name="shest01">
<input type="checkbox" name="shest01">
<script>
var gr = document.getElementsByName('shest01');
window.onclick = function() {
for(var i=0; i<gr.length; i++)
if (gr[i].checked) {
alert( 'чекбокс включён' );
} else {
alert( 'чекбокс отключён' );
}
}
</script>
Или так
<input type="checkbox" name="shest02">
<input type="checkbox" name="shest02">
<script>
var matches; // matchesSelector на момент написания статьи поддерживается только с префиксами
(function(doc) {
matches =
doc.matchesSelector ||
doc.webkitMatchesSelector ||
doc.mozMatchesSelector ||
doc.oMatchesSelector ||
doc.msMatchesSelector;
})(document.documentElement);
document.addEventListener('click', function(e) {
if ( matches.call( e.target, '[name="shest02"]:checked' ) ) {
alert( 'чекбокс включён' );
}
}, false);
</script>
Или так . alert появляется по нарастающей. Если одна галочка, то одно сообщение, если три галочки, то три сообщения.
<input type="checkbox" name="shest03" onclick="klik();">
<input type="checkbox" name="shest03" onclick="klik();">
<input type="checkbox" name="shest03" onclick="klik();">
<script>
function klik() {
var c = [].filter.call(document.querySelectorAll('[name="shest03"]'), function(e) {return e.checked == true;});
c.forEach(function(eC) {
alert('чекбокс включён');
});
}
</script>
Проверить все ли чекбоксы помечены
<input type="checkbox" onclick="klik1();" name="shest04">
<input type="checkbox" onclick="klik1();" name="shest04">
<input type="checkbox" onclick="klik1();" name="shest04">
<script>
var vse = document.getElementsByName('shest04');
function klik1() {
if (Array.prototype.every.call(vse, function(e) {return e.checked == true;})) {
alert( 'все чекбоксы включёны' );
} else {
alert( 'нажмите все флажки' );
}
}
</script>
Второй вариант можно увидеть в примере ниже.
Установить checked в checkbox
<input type="checkbox" id="shest10">
<script>
function RAZ911() {
var c = document.querySelector('#shest10');
if (!c.checked) c.checked = true; // поставить checked, если он не установлен
}
RAZ911();
</script>
Установить checked в radio
<input type="radio" name="shest10"> <input type="radio" name="shest10">
<script>
function RAZ911() {
var c = document.getElementsByName('shest10');
if (!c[1].checked) c[1].checked = true; // поставить checked на второй input, если он не установлен
}
RAZ911();
</script>
Выделить все checkbox одним нажатием кнопки
Задача:
если отметить все checkbox, то будет отмечен и главный,
если снять checked хотя бы с одного checkbox группы, то будет снят checked и с общего чекбокса,
если будет поставлена/убрана галочка с основного чекбокса, то автоматом будут убраны/установлены все флажки второстепенных checkbox.
Check all
<fieldset id="shest">
<legend><input type="checkbox"> Check all</legend>
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
</fieldset>
<script>
var main = document.querySelector('#shest legend [type="checkbox"]'),
all = document.querySelectorAll('#shest > [type="checkbox"]');
for(var i=0; i<all.length; i++) { // 1 и 2 пункт задачи
all[i].onclick = function() {
var allChecked = document.querySelectorAll('#shest > [type="checkbox"]:checked').length;
main.checked = allChecked == all.length;
main.indeterminate = allChecked > 0 && allChecked < all.length;
}
}
main.onclick = function() { // 3
for(var i=0; i<all.length; i++) {
all[i].checked = this.checked;
}
}
</script>
Ограничить область действия функции JavaScript. Функция исполняется только внутри конкретного тега
Если нужно несколько fieldset, то узнаём его порядковый номер при наведении на него курсора мышки и исполняем функции, если он имеет класс shest1.
Первая форма: Check all Check all Вторая форма: Check all Check all
Первая форма:
<form>
<fieldset class="shest1">
<legend><input type="checkbox"> Check all</legend>
<label><input type="checkbox"></label>
<label><input type="checkbox"></label>
<label><input type="checkbox"></label>
</fieldset>
<fieldset class="shest1">
<legend><input type="checkbox"> Check all</legend>
<label><input type="checkbox"></label>
<label><input type="checkbox"></label>
<label><input type="checkbox"></label>
</fieldset>
</form>
Вторая форма:
<form>
<fieldset class="shest1">
<legend><input type="checkbox"> Check all</legend>
<label><input type="checkbox"></label>
<label><input type="checkbox"></label>
<label><input type="checkbox"></label>
</fieldset>
<fieldset class="shest1">
<legend><input type="checkbox"> Check all</legend>
<label><input type="checkbox"></label>
<label><input type="checkbox"></label>
<label><input type="checkbox"></label>
</fieldset>
</form>
<script>
for (var u = document.getElementsByTagName("form"), i = 0; i < u.length; i++)
u[i].onmouseover = function (b) {
l = u[i].getElementsByTagName("fieldset");
for (var k = 0; k < l.length; k++)
if (l[k].className == "shest1") l[k].onmouseover = function (a) {
var main1 = document.querySelector('form:nth-of-type('+(b+1)+') fieldset:nth-of-type('+(a+1)+') legend [type="checkbox"]'),
all1 = document.querySelectorAll('form:nth-of-type('+(b+1)+') fieldset:nth-of-type('+(a+1)+') label [type="checkbox"]');
for(var j=0; j<all1.length; j++)
all1[j].onclick = function() {
var allChecked1 = document.querySelectorAll('form:nth-of-type('+(b+1)+') fieldset:nth-of-type('+(a+1)+') label [type="checkbox"]:checked').length;
main1.checked = allChecked1 == all1.length;
main1.indeterminate = allChecked1 > 0 && allChecked1 < all1.length;
}
main1.onchange = function() {
for(var j=0; j<all1.length; j++)
all1[j].checked = this.checked;
}
}(k)
}(i)
</script>
Но лучше с помощью nextElementSibling, previousElementSibling, parentNode. См. код дерева.
Дерево из checkbox
Задача:
если хотя бы один чекбокс прямого потомка выделен, то родитель помечен :indeterminate,
если все чекбоксы прямого потомка выделены, то родитель помечен галочкой :checked,
родитель отвечает за снятие/установку галочек всех дочерних чекбоксов,
семантический код,
у дерева может быть неограниченное число уровней, но скрипт и CSS при этом не увеличиваются.
Что не удалось:
если кликнуть по 2, а потом снять галку с 2.1.1, то у 2 и 2.1 будет :indeterminate. Всё верно. Но, если затем нажать на 2, то у 2.1 :indeterminate должно поменяться на :checked, а этого не происходит.
1 2 2.1 2.1.1 2.1.1.1 2.1.1.2 2.1.1.3 2.1.2 2.1.3 2.2 2.3 2.4 3 3.1 3.2 3.3
<style>
[name="Tree"] fieldset {border: none;}
[name="Tree"] label:after {content: '\A'; white-space: pre;} /* после label идёт как бы br */
/* если нужно скрыть дочерние чекбоксы, если на родителе не стоит флажок или :indeterminate*//*
[name="Tree"] fieldset fieldset {padding-left: 20px; display: none;}
[name="Tree"] [type="checkbox"]:checked + label + fieldset,
[name="Tree"] [type="checkbox"]:indeterminate + label + fieldset {display: block;}
*/
</style>
<form name="Tree">
<fieldset>
<label><input type="checkbox"> 1</label>
<label><input type="checkbox"> 2</label>
<fieldset>
<label><input type="checkbox"> 2.1</label>
<fieldset>
<label><input type="checkbox"> 2.1.1</label>
<fieldset><label><input type="checkbox"> 2.1.1.1</label>
<label><input type="checkbox"> 2.1.1.2</label>
<label><input type="checkbox"> 2.1.1.3</label>
</fieldset>
<label><input type="checkbox"> 2.1.2</label>
<label><input type="checkbox"> 2.1.3</label>
</fieldset>
<label><input type="checkbox"> 2.2</label>
<label><input type="checkbox"> 2.3</label>
<label><input type="checkbox"> 2.4</label>
</fieldset>
<label><input type="checkbox"> 3</label>
<fieldset>
<label><input type="checkbox"> 3.1</label>
<label><input type="checkbox"> 3.2</label>
<label><input type="checkbox"> 3.3</label>
</fieldset>
</fieldset>
</form>
<script>
var t = document.forms.Tree;
var fieldset = [].filter.call(t.querySelectorAll('fieldset'), function(element) {return element;});
fieldset.forEach(function(eFieldset) {
var main = [].filter.call(t.querySelectorAll('[type="checkbox"]'), function(element) {return element.parentNode.nextElementSibling == eFieldset;});
main.forEach(function(eMain) {
var all = eFieldset.querySelectorAll('[type="checkbox"]');
eFieldset.onchange = function() {
var allChecked = eFieldset.querySelectorAll('[type="checkbox"]:checked').length;
eMain.checked = allChecked == all.length;
eMain.indeterminate = allChecked > 0 && allChecked < all.length;
}
eMain.onclick = function() {
for(var i=0; i<all.length; i++)
all[i].checked = this.checked;
}
});
});
</script>
Вот до такой удачной реализации (мало кода для столь объёмного элемента) я дошла путём проб и ошибок. Именно поэтому здесь выложено больше, чем нужно. Это варианты, которые я прорабатывала.
Как сделать полноценное дерево из checkbox
Если дерево большое, то вложенные пункты лучше прятать. В стилях предыдущей реализации в комментариях к коду CSS показано как. Минус того метода: нажмёшь 2, а потом убираешь галочки с 2.2, 2.3, 2.4 чтобы осталась галка только на 2.1. Поэтому рядом нужно поставить плюс/минус. Здесь совсем не заметен недостаток, озвученный выше.
плюсик и минус работают только если ни один из потомков не выделен,
если убрать выделение со всех пунктов, то список скроется, у родителя не будет checked,
если поставить флажок на родителя, то будут выделены все потомки, но показаны только дочерние.
если убрать флажок с родителя, то и потомки не будут выделены, кроме того они будут скрыты.
доработав код, можно чтобы при переходе по разным ссылкам, расположенных, скажем, на разных страницах, на страницу дерева с чекбоксами, раскрывалось дерево на нужном уровне, помечались требуемые чебоксы галочками.
<style>
.treeHTML { /* вся форма */
line-height: normal;
}
.treeHTML label { /* пункты и соединяющие их линии */
position: relative;
display: block;
padding: 0 0 0 1.2em;
}
.treeHTML label:not(:nth-last-of-type(1)) {
border-left: 1px solid #94a5bd;
}
.treeHTML label:before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 1.1em;
height: .5em;
border-bottom: 1px solid #94a5bd;
}
.treeHTML label:nth-last-of-type(1):before {
border-left: 1px solid #94a5bd;
}
.treeHTML fieldset,
.treeHTML fieldset[class=""] .razvernut { /* списки */
position: absolute;
visibility: hidden;
margin: 0;
padding: 0 0 0 2em;
border: none;
}
.treeHTML fieldset:not(:last-child) {
border-left: 1px solid #94a5bd;
}
.treeHTML .razvernut {
position: relative;
visibility: visible;
}
.treeHTML > fieldset > legend,
.treeHTML .razvernut > fieldset > legend { /* плюс */
position: absolute;
left: -5px;
top: 0;
height: 7px;
width: 7px;
margin-top: -1em;
padding: 0;
border: 1px solid #94a5bd;
border-radius: 2px;
background-repeat: no-repeat;
background-position: 50% 50%;
background-color: #fff;
background-image: linear-gradient(to left, #1b4964, #1b4964), linear-gradient(#1b4964, #1b4964), linear-gradient(315deg, #a0b6d8, #e8f3ff 60%, #fff 60%);
background-size: 1px 5px, 5px 1px, 100% 100%;
visibility: visible;
cursor: pointer;
}
.treeHTML fieldset[class=""] .razvernut fieldset legend {
visibility: hidden;
}
.treeHTML .razvernut > legend { /* минус */
background-image: linear-gradient(#1b4964, #1b4964) !important;
background-size: 5px 1px !important;
}
</style>
<form name="Tree1" class="treeHTML" class="razvernut">
<label><input type="checkbox"> 1</label>
<label><input type="checkbox"> 2</label>
<fieldset><legend></legend>
<label><input type="checkbox"> 2.1</label>
<fieldset><legend></legend>
<label><input type="checkbox"> 2.1.1</label>
<fieldset><legend></legend>
<label><input type="checkbox"> 2.1.1.1</label>
<label><input type="checkbox"> 2.1.1.2</label>
<label><input type="checkbox"> 2.1.1.3</label>
</fieldset>
<label><input type="checkbox"> 2.1.2</label>
<label><input type="checkbox"> 2.1.3</label>
</fieldset>
<label><input type="checkbox"> 2.2</label>
<label><input type="checkbox"> 2.3</label>
<label><input type="checkbox"> 2.4</label>
</fieldset>
<label><input type="checkbox"> 3</label>
<fieldset><legend></legend>
<label><input type="checkbox"> 3.1</label>
<label><input type="checkbox"> 3.2</label>
<label><input type="checkbox"> 3.3</label>
</fieldset>
</form>
<script>
var t = document.forms.Tree1;
[].forEach.call(t.querySelectorAll('fieldset'), function(eFieldset) {
var main = [].filter.call(t.querySelectorAll('[type="checkbox"]'), function(element) {return element.parentNode.nextElementSibling == eFieldset;});
main.forEach(function(eMain) {
var l = [].filter.call(eFieldset.querySelectorAll('legend'), function(e) {return e.parentNode == eFieldset;});
l.forEach(function(eL) {
var all = eFieldset.querySelectorAll('[type="checkbox"]');
eL.onclick = Razvernut;
eFieldset.onchange = Razvernut;
function Razvernut() {
var allChecked = eFieldset.querySelectorAll('[type="checkbox"]:checked').length;
eMain.checked = allChecked == all.length;
eMain.indeterminate = allChecked > 0 && allChecked < all.length;
if (eMain.indeterminate || eMain.checked || ((eFieldset.className == '') && (allChecked == "0"))) {
eFieldset.className = 'razvernut';
} else {
eFieldset.className = '';
}
}
eMain.onclick = function() {
for(var i=0; i<all.length; i++)
all[i].checked = this.checked;
if (this.checked) {
eFieldset.className = 'razvernut';
} else {
eFieldset.className = '';
}
}
});
});
});
</script>
Деактивировать все флажки, кроме нескольких отмеченных
Как задать максимально возможное число чекбоксов, на которые можно установить галки? То есть дать выбрать только 3 любых чекбокса из 5 возможных. Свой выбор можно менять.
<form name="Form">
<input type="checkbox"/>
<input type="checkbox"/>
<input type="checkbox"/>
<input type="checkbox"/>
<input type="checkbox"/>
</form>
<script>
var f = document.forms.Form;
f.onchange = function() {
var n = f.querySelectorAll('[type="checkbox"]'),
l = f.querySelectorAll('[type="checkbox"]:checked');
for(var j=0; j<n.length; j++)
if (l.length >= 3) { // если отметить три и более галочки
n[j].disabled = true; // все чекбоксы становятся disabled
for(var i=0; i<l.length; i++)
l[i].disabled = false; // но disabled убирается с помеченных галочками чекбоксов
} else {
n[j].disabled = false; // если выделить менее трёх галочек, то disabled снимается со всех чекбоксов
}
}
</script>
Я, конечно, понимаю, что запись странновата, только вот .querySelectorAll('[type="checkbox"]:not([checked])') работает только для изначально установленных флажков.
Как посчитать сумму значений value у выбранных чекбоксов
Дальнейшие примеры при создании калькулятора или формы заказа на JavaScript
Сумма: 0
<form name="Sum">
<input type="checkbox" value="1"/>
<input type="checkbox" value="2"/>
<input type="checkbox"/>
<input type="checkbox" value=""/>
<input type="checkbox" value="3"/>
<input type="checkbox" value="4"/>
<input type="checkbox" value="5"/>
<output id="rezultat">Сумма: 0</output>
</form>
<script>
var s = document.forms.Sum,
d = s.querySelectorAll('input[type="checkbox"]:not([value]), input[type="checkbox"][value=""]');
for (var i = 0; i < d.length; i++) // чтобы не было написано NaN, убираем в disabled пункты, где не прописаны значения
d[i].disabled = true;
s.onchange = function() { // начало работы функции сложения
var n = s.querySelectorAll('[type="checkbox"]'),
itog = 0;
for(var j=0; j<n.length; j++)
n[j].checked ? itog += parseFloat(n[j].value) : itog;
document.getElementById('rezultat').innerHTML = 'Сумма: ' + itog;
}
</script>
Перемещения и трансформации в CSS3
Система координат
Чтобы легче понять то, как устроено перемещение объекта, мы будем работать в системе координат.

Однако наша система координат имеет одну особенность: ось Y направлена в противоположную сторону, чем обычно. Почему? Дело в том, что HTML и CSS (наравне, например, с ActionScript) используют обратную систему координат, так как веб-страница начинается с левого верхнего угла и идет вниз.
Заметка: Мы будем полагать, что вы уже знакомы со структурой HTML и CSS. Я пропущу объяснения того, как настроить файл CSS, как разместить картинки и т.д. Мы сфокусируемся на анимировании изображений. Если вы не уверены в том, что ваши навыки на высоком уровне, то советуем взглянуть на курс уроков «HTML и CSS за 30 дней» (бесплатно и на английском языке), чтобы выучить все необходимое.
Заметка: Мы будем полагать, что вы уже знакомы со структурой HTML и CSS. Я пропущу объяснения того, как настроить файл CSS, как разместить картинки и т.д. Мы сфокусируемся на анимировании изображений. Если вы не уверены в том, что ваши навыки на высоком уровне, то советуем взглянуть на курс уроков «HTML и CSS за 30 дней» (бесплатно и на английском языке), чтобы выучить все необходимое.
1: Горизонтальное перемещение
Первое перемещение, которое мы продемонстрируем — горизонтальное. Мы будем двигать объекты слева направо и справа налево.
Двигаемся вправо
Чтобы переместить объект мы будем использовать transform: translate(x,y), где X — положительное число, а Y=0.

HTML
Откройте ваш любимый редактор кода и введите следующее:
<div id="axis" class="one">
<img class="object van move-right" src="images/van-to-right.png" alt="" />
</div>
Мы определили три класса к картинке:
object: Установление главных правил нашего объекта.
van: Мы будем использовать различные объекты для демонстрации каждого вида анимации.
move-right: Используя этот класс, мы будем двигать наш объект.
CSS
Во-первых, мы разместим наш объект (картинку грузовика) по центру.
.object {
position: absolute;
}
.van {
top: 45%;
left: 44%;
}
В этом примере мы подвинем объект на 350px вправо. Использован синтаксис transform: translate(350px,0);. Кроме того объект будет двигаться только при наведении на него курсора: #axis:hover .move-right.
#axis:hover .move-right{
transform: translate(350px,0);
-webkit-transform: translate(350px,0); /** Chrome & Safari **/
-o-transform: translate(350px,0); /** Opera **/
-moz-transform: translate(350px,0); /** Firefox **/
}
Параметр transform всего лишь переместит объект из одной точки в другую, но не создаст анимацию данного перемещения. Чтобы исправить это, нужно добавить параметр перемещения в классе .object.
.object {
position: absolute;
transition: all 2s ease-in-out;
-webkit-transition: all 2s ease-in-out; /** Chrome & Safari **/
-moz-transition: all 2s ease-in-out; /** Firefox **/
-o-transition: all 2s ease-in-out; /** Opera **/
}
Это правило перемещение скажет браузеру анимировать все параметры объекта на 2 секунды (без задержки) с помощью функции ease-in-out.
Мы можем использовать 6 различных функций хронометража перемещений:
linear: перемещение происходит постоянной скоростью от начала и до конца.
ease: перемещение начинается медленно и затем набирает скорость.
ease-in: перемещение начинается медленно.
ease-out: перемещение заканчивается медленно.
ease-in-out: перемещение начинается и заканчивается медленно.
cubic-bezier: ручное определение значения перемещения.
Двигаемся влево
Чтобы переместить объект влево, нужно просто поставить отрицательное значение к оси ОХ, в то время как Y остается неизменным. В нашем случае мы переместим объект на -350px влево.
HTML
Создайте новый документ html и вставьте следующий код:
<div id="axis" class="two">
<img class="object van move-left" src="images/van-to-left.png"/></div>
На этот раз мы используем класс move-left, чтобы переметить объект влево.
CSS
Теперь введем -350px для оси OX. transform: translate(-350px,0); — переместим объект влево.
#axis:hover .move-left {
transform: translate(-350px,0);
-webkit-transform: translate(-350px,0); /** Safari & Chrome **/
-o-transform: translate(-350px,0); /** Opera **/
-moz-transform: translate(-350px,0); /** Firefox **/
}
Так как ранее мы уже определяли правила перемещения, нам не нужно делать это снова.
2: Вертикальное перемещение
Перемещение объекта по вертикали не составит особого труда, ведь оно идентично горизонтальному. Единственная разница заключается в том, что мы будем иcпользовать значение -Y для перемещения вверх и значение y для перемещения вниз.
Двигаемся вверх

HTML
Шаблон HTML идентичен предыдущим примерам. Однако, мы заменим наш объект ракетой (для наглядности) и назначим класс move-up.
<div id="axis">
<img class="object rocket move-up" src="images/rocket.png"/></div>
CSS
Так же как и грузовик, мы разместим ракету по центру:
.rocket {
top: 43%;
left: 44%;
}
Как мы отметили ранее, координата Y должна быть отрицательной. В нашем случае мы подвинем объект на 350px вверх.
#axis:hover .move-up {
transform: translate(0,-350px);
-webkit-transform: translate(0,-350px);
-o-transform: translate(0,-350px);
-moz-transform: translate(0,-350px);
}
Двигаемся вниз

Как вы догадались, чтобы переместить объект вниз, координата Y должна быть положительной, а X равняться 0. Синтаксис: translate(0,y);
HTML
<div id="axis" class="four">
<img class="object coin move-down" src="images/coin.png"/>
</div>
CSS
#axis:hover .move-down {
transform: translate(0,350px);
-webkit-transform: translate(0,350px);
-o-transform: translate(0,350px);
-moz-transform: translate(0,350px);
}
3: Диагональное перемещение
Чтобы переместить объект по диагонали, мы совместим параметры x и y. Синтаксис будет следующим: transform: translate(x,y). В зависимости от направления, значение x и y может быть как положительным, так и отрицательным.
HTML
<div id="axis" class="five">
<img class="object plane move-ne" src="images/paper-plane.png"/>
</div>
CSS
#axis:hover .move-ne {
transform: translate(350px,-350px);
-webkit-transform: translate(350px,-350px);
-o-transform: translate(350px,-350px);
-moz-transform: translate(350px,-350px);
}
4: Вращение
Вращение в CSS3 регулируется градусными координатами (от 0° до 360°). Чтобы повернуть объект, примените следущие параметры: transform: rotate(ndeg); где n — градусы.
Вращение по часовой стрелке
Для того чтобы повернуть объект по часовой стрелке, применим положительное значение для rotate(ndeg).
HTML
<div id="axis" class="six">
<img class="object pencil rotate360cw" src="images/pencil.png"/>
</div>
CSS
#axis:hover .rotate360cw {
transform: rotate(360deg);
-webkit-transform: rotate(360deg);
-o-transform: rotate(360deg);
-moz-transform: rotate(360deg);
}
Вращение против часовой стрелки
Для того чтобы повернуть объект против часовой стрелки, применим отрицательное значение для rotate(ndeg).
HTML
<div id="axis" class="seven">
<img class="object pencil rotate360ccw" src="images/pencil.png"/>
</div>
CSS
#axis:hover .rotate360ccw {
transform: rotate(-360deg);
-webkit-transform: rotate(-360deg);
-o-transform: rotate(-360deg);
-moz-transform: rotate(-360deg);
}
5: Масштабирование
Масштабирование — это интересная особенность CSS3. Используя параметр scale(n) или параметр scale(x,y), мы можем либо увеличивать, либо уменьшать объект непосредственно в рамках HTML. Объект будет менять размер в зависимости от значения n/x,y, где ось X — ширина, а Y — высота.
Давайте посмотрим на следующий пример.
HTML
<div id="axis" class="eight">
<img class="object car larger" src="images/car.png"/>
</div>
CSS
#axis:hover .larger{
transform: scale(2);
-webkit-transform: scale(2);
-o-transform: scale(2);
-moz-transform: scale(2);
}
6: Множественные движения
После того как мы рассмотрели основные движения и трансформации, мы можем попробовать комбинировать их.

HTML
<div id="axis" class="ten">
<img class="object boomerang multiple-move" src="images/pencil.png"/>
</div>
CSS
План таков: нужно переместить бумеранг в правый верхний угол и одновременно вращать его. Для этого нужно просто перечислить команды через пробел.
#axis:hover .multiple {
transform: translate(350px, -350px) rotate(360deg);
-webkit-transform: translate(350px, -350px) rotate(360deg);
-o-transform: translate(350px, -350px) rotate(360deg);
-moz-transform: translate(350px, -350px) rotate(360deg);
}
Перенос слов
Стили CSS для организации переноса строки по словам или буквам, когда она не вмещается в заданные границы
overflow-wrap: break-word;
word-wrap: break-word;
white-space: nowrap / white-space: normal: nowrap;
word-break: keep-all / word-break: break-all;
line-break: loose / normal / strict;
hyphens: none / auto;
Синтаксис
white-space: normal | nowrap | pre | pre-line | pre-wrap | inherit
Значения
normal
Текст в окне браузера выводится как обычно, переносы строк устанавливаются автоматически.
nowrap
Пробелы не учитываются, переносы строк в коде HTML игнорируются, весь текст отображается одной строкой; вместе с тем, добавление тега <br> переносит текст на новую строку.
pre
Текст показывается с учетом всех пробелов и переносов, как они были добавлены разработчиком в коде HTML. Если строка получается слишком длинной и не помещается в окне браузера, то будет добавлена горизонтальная полоса прокрутки.
pre-line
В тексте пробелы не учитываются, текст автоматически переносится на следующую строку, если он не помещается в заданную область.
pre-wrap
В тексте сохраняются все пробелы и переносы, однако если строка по ширине не помещается в заданную область, то текст автоматически будет перенесен на следующую строку.
Наследует значение родителя.
Пример 1. Использование тега <wbr>
.word {
width: 160px;
background: #f0f0f0;
border: 1px solid #333;
padding: 10px;
font-size: 18px;
}
<p class="word">Один<wbr>надцатиклас<wbr>сница Анжелика после окончания школы выбрала профессию дело<wbr>произ<wbr>водитель<wbr>ницы.</p>
Пример 2. Мягкий перенос
.word {
width: 160px;
background: #f0f0f0;
border: 1px solid #333;
padding: 10px;
font-size: 18px;
}
<p class="word">Один­надцатиклас­сница Анжелика после окончания школы выбрала профессию дело­произ­водитель­ницы.</p>
Пример 3. Свойство word-break
.word {
width: 160px;
background: #f0f0f0;
border: 1px solid #333;
padding: 10px;
font-size: 18px;
word-break: break-all;
}
<p class="word">Одиннадцатиклассница Анжелика после окончания школы выбрала профессию делопроизводительницы.</p>
Пример 4. Использование hyphens
.word {
width: 160px;
background: #f0f0f0;
border: 1px solid #333;
padding: 10px;
font-size: 18px;
-moz-hyphens: auto;
-webkit-hyphens: auto;
-ms-hyphens: auto;
}
Пример 5. Запрет переносов
.word {
width: 160px;
background: #f0f0f0;
border: 1px solid #333;
padding: 10px;
font-size: 18px;
}
<p class="word">Озеро по координатам 70° 58′ 19″ с. ш.97° 24′ 5″ в. д. расположено в Таймырском Долгано-Ненецком районе Красноярского края России.</p>Правило @view-transition в CSS3
Правило @view-transition в CSS3 — это инструмент для создания плавных анимаций при переходе между разными HTML-страницами (в многостраничных приложениях, MPA). Оно работает в связке с View Transitions API — встроенным браузерным механизмом, который делает снимки DOM «до» и «после» обновления и анимирует переход между ними.
Как это работает
При навигации браузер фиксирует текущее состояние страницы, выполняет обновление DOM, затем фиксирует новое состояние и запускает CSS-анимацию, интерполируя между ними.
Ключевое условие для кросс-документных переходов: обе страницы (исходная и целевая) должны находиться на одном origin (совпадать по протоколу, домену и порту). Иначе переход не сработает.
Базовый синтаксис:
@view-transition {
navigation: auto;
}
navigation: auto;
— разрешает переход при навигации. Браузер по умолчанию применяет кроссфейд (затухание) между старой и новой страницей.
navigation: none;
— отключает плавные переходы (значение по умолчанию).
Важный нюанс: чтобы переход сработал, правило @view-transition
нужно добавить на обе страницы. Если правило есть только на одной, переход не произойдёт.
Кастомизация анимации
По умолчанию браузер сам решает, как анимировать переход (часто это кроссфейд). Но вы можете полностью переопределить анимацию, используя специальные псевдоэлементы и @keyframes
::view-transition-old(root)
— стили для элементов старой страницы (состояние «до» обновления).
::view-transition-new(root)
— стили для элементов новой страницы (состояние «после» обновления).
Пример:
/* Анимация, когда старая страница уходит */
::view-transition-old(root) {
animation: slideOut 0.3s ease-in-out both;
}
/* Анимация, когда появляется новая страница */
::view-transition-new(root) {
animation: slideIn 0.3s ease-in-out both;
}
/* Определение самих анимаций */
@keyframes slideOut {
to { transform: translateX(-100%); }
}
@keyframes slideIn {
from { transform: translateX(100%); }
}
Ещё один приём: можно дать общее имя перехода элементам, которые должны плавно перемещаться между страницами (например, общему изображению в карточке товара и на детальной странице). Для этого используется свойство view-transition-name
Поддержка браузерами
Правило @view-transition относится к CSS View Transitions Module Level 2, который поддерживает:
- Chrome 126+
- Edge 126+
- Safari 18.2+
В Firefox поддержка Level 2 пока в разработке.
Важное замечание: если браузер не поддерживает эту функцию, сайт продолжит работать в обычном режиме — @view-transition работает как прогрессивное улучшение.
Дополнительные возможности
Ограниченные переходы (Scoped Transitions). В Chrome 148+ появилась возможность ограничивать переход конкретным поддеревом DOM, а не всей страницей.
Учёт prefers-reduced-motion. Для доступности можно ограничить анимации для пользователей, которые предпочитают их отключать:
@media (prefers-reduced-motion: reduce) {
@view-transition {
navigation: none;
}
}
Вывод
@view-transition — мощный инструмент для создания плавных и выразительных переходов между страницами без необходимости писать много JavaScript. Главное — не забыть добавить это правило на обе стороны навигации и продумать анимации для общих элементов.
Стили CSS . Полностью рабочий пример
@media (prefers-reduced-motion: no-preference) {
@view-transition {
navigation: auto;
types: pixelate-dissolve;
}
}
html:active-view-transition-type(pixelate-dissolve)::view-transition-old(root) {
animation: pixelate-out 1.4s ease forwards;
}
html:active-view-transition-type(pixelate-dissolve)::view-transition-new(root) {
animation: pixelate-in 1.4s ease forwards;
}
@keyframes pixelate-out {
0% {
filter: blur(0px);
opacity: 1;
}
100% {
filter: blur(40px);
opacity: 0;
}
}
@keyframes pixelate-in {
0% {
filter: blur(40px);
opacity: 0;
}
100% {
filter: blur(0px);
opacity: 1;
}
}
Работа с изображениями в веб
Одно из решений, которые приходится принимать фронтенд-разработчику при создании сайта, касается выбора способа включения изображений в состав веб-страниц. Этот способ может заключаться в использовании HTML-тега <img> . Это может быть применение CSS-свойства background или тега <image> элемента <svg> . Выбор правильного подхода к работе с изображениями весьма важен, так как это может очень сильно повлиять на производительность и доступность проекта.
HTML-элемент <img>
Элемент <img> в простейших вариантах его использования содержит лишь необходимый для его правильной работы атрибут src
<img src="cool.jpg" alt="">
Настройка атрибутов width и height
Если не будут настроены ширина и высота изображения, то при загрузке странице с последующей загрузкой изображения макет страницы может понадобиться перестроить. Для того чтобы этого избежать, можно задать атрибуты width и height тега <img> :
<img src="cool.jpg" width="200" height="100" alt="">

Скрытие изображения средствами CSS
img {
display: none;
}
О доступности контента
<img class="food-thumb" width="300" height="200" src="cheescake.jpg">
<img class="food-thumb" width="300" height="200" src="cheescake.jpg" alt="">


Отзывчивые изображения

1. Атрибут srcset
<img src="small.jpg" srcset="medium.jpg 500w, large.jpg 800w" alt="">
2. HTML-элемент picture
<picture>
<source srcset="large.jpg" media="(min-width: 800px)" />
<source srcset="medium.jpg" media="(min-width: 500px)" />
<img src="small.jpg" />
</picture>
Изменение размеров изображений

img {
object-fit: cover;
object-position: 50% 50%;
}
Изображения, задаваемые CSS-свойством background
Как пользоваться CSS-свойством background
<div class="element">Some content</div>
.element {
background: url('cool.jpg');
}
Задание нескольких изображений в свойстве background
.element {
background: url('cool-1.jpg'), url('cool-2.jpg');
}
Скрытие изображения
@media (min-width: 700px) {
.element {
background: url('cool-1.jpg');
}
}
О доступности контента
Сложности с загрузкой background-изображений обычными пользователями
Псевдо-элементы
SVG-изображения
<svg width="200" height="200">
<image href="cheesecake.jpg" height="100%" width="100%" preserveAspectRatio="xMidYMid slice" />
</svg>


О доступности контента
<svg width="200" height="200">
<title>A photo of blueberry Cheescake</title>
<image href="cheesecake.jpg" height="100%" width="100%" preserveAspectRatio="xMidYMid slice" />
</svg>
<svg width="200" height="200">
<title>A photo of blueberry Cheescake</title>
<desc>A meaningful description about the image</desc>
<image href="cheesecake.jpg" height="100%" width="100%" preserveAspectRatio="xMidYMid slice" />
</svg>
Сложности с загрузкой <svg>-изображений обычными пользователями
Сценарии использования разных способов вывода изображений
Раздел страницы, выводимый в её верхней части

-
Изображение должно поддерживать лёгкую динамическую смену при интеграции страницы с бэкенд-CMS.
- Поверх изображения должен быть наложен элемент, упрощающий чтение текста.
- Нужно поддерживать вывод изображения в трёх размерах: в маленьком, среднем и большом. Каждый из них предназначен для собственной области просмотра.
-
Важно ли это изображение с точки зрения пользователя, или он ничего не потеряет в том случае, если оно будет не видно?
-
Нужно ли, чтобы это изображение выводилось в областях просмотра всех размеров?
-
Является ли это изображение статическим, или оно динамически меняется (из CMS, например)?
Первый вариант решения задачи
.hero {
background-image: linear-gradient(rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.4)), var('landscape.jpg');
background-repeat: no-repeat;
background-size: 100%, cover;
}
<section class="hero" style="background: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url('landscape.jpg');">
<!-- Hero content -->
</section>
<section class="hero" style="--bg-url: url('landscape.jpg')">
<!-- Hero content -->
</section>

Анализ
-
Предложенный здесь вариант решения задачи хорош лишь в том случае, если изображение не особенно важно.
-
Он может подойти в том случае, если изображение не планируется менять динамически, средствами CMS, используемой на бэкенде проекта.
Второй вариант решения задачи
<section class="hero">
<h2 class="hero__title">Using Images in CSS</h2>
<p class="hero__desc">An article about which and when to use</p>
<img src="landscape.jpg" alt="">
</section>
.hero {
position: relative;
}
.hero img {
position: absolute;
left: 0;
top: 0;
z-index: -1;
width: 100%;
height: 100%;
object-fit: cover;
}
.hero:after {
content: "";
position: absolute;
left: 0;
top: 0;
z-index: -1;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.4);
}
.hero img {
/* Другие стили */
background: #2962ff;
}

Логотип веб-сайта
-
Элемент <img>, выводящий PNG, JPG или SVG-изображение.
-
Встроенное SVG-изображение.
-
Фоновое изображение.
Логотип с множеством деталей

<a href="#"><img src="logo.svg" alt="Nature Food"></a>
Простой логотип, который нужно анимировать

<a href="#">
<svg class="logo" width="115" height="47" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(-5 -5)" fill="none" fill-rule="evenodd">
<rect fill="#D8D8D8" transform="rotate(45 28.5 28.5)" x="9" y="9" width="39" height="39" rx="11" />
<text font-family="Rubik-Medium, Rubik" font-size="25" font-weight="400" fill="#6F6F6F">
<tspan x="63.923" y="36.923">Rect</tspan>
</text>
</g>
</svg>
</a>
.logo rect,
.logo text {
transition: 0.3s ease-out;
}
.logo:hover rect,
.logo:hover text {
fill: #4a7def;
}
Отзывчивый логотип

<a class="logo" href="/">
<picture>
<source media="(min-width: 1350px)" srcset="sm-logo--full.svg"><img src="sm-logo.svg" alt="Smashing Magazine"></picture>
</a>
.logo {
display: inline-block;
width: 45px;
}
@media (min-width: 1350px) {
.logo {
width: 180px;
}
}
Логотип с градиентом

<svg class="logo" width="115" height="47" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="gradient" x1="0%" y1="100%" x2="0%" y2="0%">
<stop offset="0%" stop-color="#4a7def"></stop>
<stop offset="50%" stop-color="#ab4787"></stop>
</linearGradient>
</defs>
<g transform="translate(-5 -5)" fill="none" fill-rule="evenodd">
<rect fill="#AB4787" transform="rotate(45 28.5 28.5)" x="9" y="9" width="39" height="39" rx="11" />
<text font-family="Rubik-Medium, Rubik" font-size="30" font-weight="400" fill="url(#gradient)">
<tspan x="63.923" y="36.923">Rect</tspan>
</text>
</g>
</svg>
Аватар пользователя



-
С использованием <img>.
-
С использованием <img> и вспомогательного элемента <div>.
-
С использованием <div> и CSS-свойства background.
-
С использованием <image> в <svg>.
Использование <img>
.avatar {
border: 2px solid #f2f2f2;
}

Использование <img> и вспомогательного элемента <div>
<div class="avatar-wrapper">
<img class="avatar" src="shadeed2.jpg" alt="A photo of Ahmad Shadeed">
<div class="avatar-border"></div>
</div>
.avatar-wrapper {
position: relative;
width: 150px;
height: 150px;
}
.avatar-border {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
border-radius: 50%;
border: 2px solid rgba(0, 0, 0, 0.1);
}

Использование <div> и CSS-свойства background

<div class="avatar" style="--img-url: url(shadeed2.jpg)"></div>
.avatar {
background: var(--img-url) center/cover;
width: 150px;
height: 150px;
border-radius: 50%;
box-shadow: inset 0 0 0 2px rgba(#000, 0.1);
}
Использование <image> в <svg>
<svg role="none" style="height: 36px; width: 36px;">
<mask id="avatar">
<circle cx="18" cy="18" fill="white" r="18"></circle>
</mask>
<g mask="url(#avatar)">
<image x="0" y="0" height="100%" preserveAspectRatio="xMidYMid slice" width="100%" xlink:href="avatar.jpg" style="height: 36px; width: 36px;"></image>
<circle cx="18" cy="18" r="18"></circle>
</g>
</svg>
-
Маска, обрезающая изображение в виде круга.
-
Группа, к которой применяется маска.
-
Само изображение с атрибутом preserveAspectRatio=«xMidYMid».
-
Круг, который используется в роли внутренней границы.
circle {
stroke-width: 2;
stroke: rgba(0, 0, 0, 0.1);
fill: none;
}
Поле ввода с иконкой

<p>
<label for="name">Full name</label>
<input type="text" id="name">
</p>
input {
background-color: #fff;
background-image: url('user.svg');
background-size: 20px 20px;
background-position: left 10px center;
background-repeat: no-repeat;
}
CSS-стили для печати
Постарайтесь не включать в страницы, предназначенные для печати, изображения, выводимые с помощью CSS-свойства background

.element {
background: url('cheesecake.png') center/cover no-repeat;
-webkit-print-color-adjust: exact; /* Принудительный вывод фонового изображения в режиме печати */
}
Руководство по Flexbox

Свойства для Родителя (flex контейнер)

display
.container {
display: flex; /* or inline-flex */
}
flex-direction

.container {
flex-direction: row | row-reverse | column | column-reverse;
}
-
row (по умолчанию): слева направо в ltr; справа налево в rtl
-
row-reverse справа налево ltr; слева направо в rtl
-
column: так же, как и rowно сверху вниз
-
column-reverse: то же самое, row-reverseно снизу вверх
flex-wrap

.container{
flex-wrap: nowrap | wrap | wrap-reverse;
}
-
nowrap (по умолчанию): все flex элементы будут в одной строке
-
wrap: flex-элементы будут перенесены на несколько строк сверху вниз.
-
wrap-reverse: flex-элементы будут перенесены на несколько строк снизу вверх.
flex-flow (Применяется к: родительскому элементу flex-контейнера)
flex-flow: <‘flex-direction’> || <‘flex-wrap’>
justify-content

.container {
justify-content: flex-start | flex-end | center | space-between | space-around | space-evenly | start | end | left | right ... + safe | unsafe;
}
-
flex-start (по умолчанию): элементы сдвинуты в начало flex-direction направления.
-
flex-end: элементы сдвинуты ближе к концу flex направления.
-
start: элементы сдвинуты к началу writing-modeнаправления.
-
end: элементы сдвинуты в конце writing-modeнаправления.
-
left: элементы сдвинуты по направлению к левому краю контейнера, если это не имеет смысла flex-direction, тогда он ведет себя как start.
-
right: элементы сдвинуты по направлению к правому краю контейнера, если это не имеет смысла flex-direction, тогда он ведет себя как start.
-
center: элементы центрированы вдоль линии
-
space-between: элементы равномерно распределены по линии; первый элемент находится в начале строки, последний элемент в конце строки
-
space-around: элементы равномерно распределены по линии с одинаковым пространством вокруг них. Обратите внимание, что визуально пространства не равны, так как все элементы имеют одинаковое пространство с обеих сторон. Первый элемент будет иметь одну единицу пространства напротив края контейнера, но две единицы пространства между следующим элементом, потому что у следующего элемента есть свой собственный интервал, который применяется.
-
space-evenly: элементы распределяются таким образом, чтобы расстояние между любыми двумя элементами (и расстояние до краев) было одинаковым.
align-items

.container {
align-items: stretch | flex-start | flex-end | center | baseline | first baseline | last baseline | start | end | self-start | self-end + ... safe | unsafe;
}
-
stretch (по умолчанию): растягивать, чтобы заполнить контейнер (все еще соблюдаются min-width / max-width)
-
flex-start/ start/ self-start: элементы размещаются в начале поперечной оси. Разница между ними невелика и заключается в соблюдении flex-direction правил или writing-mode правил.
-
flex-end/ end/ self-end: элементы располагаются в конце поперечной оси. Разница опять-таки тонкая и заключается в соблюдении flex-direction или writing-mode правил.
-
center: элементы центрированы по поперечной оси
-
baseline: элементы выровнены, по их базовой линии
align-content

.container {
align-content: flex-start | flex-end | center | space-between | space-around | space-evenly | stretch | start | end | baseline | first baseline | last baseline + ... safe | unsafe;
}
-
flex-start/ start: элементы, сдвинуты в начало контейнера. Более поддерживаемый flex-startиспользует, flex-directionв то время как startиспользует writing-modeнаправление.
-
flex-end/ end: элементы, сдвинуты в конец контейнера. Более поддерживаемый flex-endиспользует flex-directionв то время как endиспользует writing-modeнаправление.
-
center: элементы выровнены по центру в контейнере
-
space-between: элементы равномерно распределены; первая строка находится в начале контейнера, а последняя — в конце
-
space-around: элементы равномерно распределены с равным пространством вокруг каждой строки
-
space-evenly: элементы распределены равномерно, вокруг них одинаковое пространство
-
stretch (по умолчанию): линии растягиваются, чтобы занять оставшееся пространство
Свойства для первых дочерних элементов(flex элементы)

order

.item {
order: <integer>; /* default is 0 */
}
flex-grow

.item {
flex-grow: <number>; /* default 0 */
}
flex-shrink
.item {
flex-shrink: <number>; /* default 1 */
}
flex-basis
.item {
flex-basis: <length> | auto; /* default auto */
}

flex
.item {
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
align-self

.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
Примеры
.parent {
display: flex;
height: 300px; /* Или что угодно */
}
.child {
width: 100px; /* Или что угодно */
height: 100px; /* Или что угодно */
margin: auto; /* Магия! */
}
.flex-container {
/* Сначала мы создаем flex контекст */
display: flex;
/* Затем мы определяем flex-direction и разрешаем элементам переходить на новые строки
* Запомните, что это то же самое что и:
* flex-direction: row;
* flex-wrap: wrap;
*/
flex-flow: row wrap;
/* Затем мы определяем, как распределяется оставшееся пространство */
justify-content: space-around;
}


/* Большие экраны */
.navigation {
display: flex;
flex-flow: row wrap;
/* Это выровняет элементы по конечной части линии на главной оси */
justify-content: flex-end;
}
/* Средние экраны */
@media all and (max-width: 800px) {
.navigation {
/* На экранах среднего размера мы центрируем элементы, равномерно распределяя пустое пространство вокруг элементов */
justify-content: space-around;
}
}
/* Маленькие экраны */
@media all and (max-width: 500px) {
.navigation {
/* На маленьких экранах мы больше не используем направление строки, а используем столбец */
flex-direction: column;
}
}
.wrapper {
display: flex;
flex-flow: row wrap;
}
/* Мы говорим, что все элементы имеют ширину 100%, через flex-base */
.wrapper > * {
flex: 1 100%;
}
/* Мы используем исходный порядок для первого мобильно варианта
* 1. header
* 2. article
* 3. aside 1
* 4. aside 2
* 5. footer
*/
/* Средние экраны */
@media all and (min-width: 600px) {
/* Мы говорим обеим боковым панелям встать в одну строку */
.aside { flex: 1 auto; }
}
/* Большие экраны */
@media all and (min-width: 800px) {
/* Мы инвертируем порядок первой боковой панели и основной и говорим главному элементу, чтобы он занимал вдвое большую ширину, чем две другие боковые панели
*/
.main { flex: 2 0px; }
.aside-1 { order: 1; }
.main { order: 2; }
.aside-2 { order: 3; }
.footer { order: 4; }
}



Префикс для Flexbox
@mixin flexbox() {
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
}
@mixin flex($values) {
-webkit-box-flex: $values;
-moz-box-flex: $values;
-webkit-flex: $values;
-ms-flex: $values;
flex: $values;
}
@mixin order($val) {
-webkit-box-ordinal-group: $val;
-moz-box-ordinal-group: $val;
-ms-flex-order: $val;
-webkit-order: $val;
order: $val;
}
.wrapper {
@include flexbox();
}
.item {
@include flex(1 200px);
@include order(2);
}
CSS синтаксис
flex: flex-grow flex-shrink flex-basis | auto | none | initial | inherit;
Возможные значения
|
Значение
|
Описание
|
|---|---|
|
flex-grow
|
Коэффициент растяжения. Коэффициент увеличения ширины флекс-элемента относительно других флекс-элементов.
|
|
flex-shrink
|
Коэффициент сужения. Коэффициент уменьшения ширины флекс-элемента относительно других флекс-элементов.
|
|
flex-basis
|
Базовая ширина флекс-элемента.
|
|
auto
|
Эквивалентно "flex: 1 1 auto;".
|
|
none
|
Эквивалентно "flex: 0 0 auto;".
|
|
inherit
|
Значение наследуется от родительского элемента.
|
|
initial
|
Эквивалентно "flex: 0 1 auto;".
|
Пример использования
#main div {
-webkit-flex: 1; /* Safari 6.1+ */
-ms-flex: 1; /* IE 10 */
flex: 1;
}
Связь Grid позиционирования с другими методами позиционирования
CSS Grid Layout спроектирован таким образом, чтобы работать вместе с другими частями CSS и составлять с ними законченную систему создания макетов страниц. В рамках этого руководства, мы объясним, каким образом сочетать гриды с другими техниками, которыми Вы, возможно, уже пользуетесь в своей работе.
Grid и flexbox
Основное различие между CSS Grid Layout и CSS Flexbox Layout в том, что flexbox предназначен для позиционирования элементов в одном направлении, то есть, либо в строке, либо в колонке. Grid же был разработан для позиционирования элементов в двумерной системе, то есть, для одновременного позиционирования и в строке, и в колонке. Однако, в двух спецификациях есть некоторые общие черты, и если вы уже научились укрощать flexbox, вы увидите сходства, которые помогут вам разобраться и с Grid.
Одномерное vs Двумерное позиционирование
Простой пример поможет нам продемонстрировать разницу между одно- и двумерным позиционированием.
В пером примере мы воспользуемся flexbox для того, чтобы разместить несколько блоков. Предположим, что у нас есть пять дочерних элементов в контейнере, зададим им значения flex-свойств таким образом, чтобы их размер увеличивался и уменьшался, начиная с базового в 200px.
Также установим свойство flex-wrap в значение wrap . Это приведёт к тому, что если свободного пространства в нашем контейнере будет не хватать для размещения элемента в 200px, наши элементы спокойно перейдут на новую строку.
<div class="wrapper">
<div>One</div>
<div>Two</div>
<div>Three</div>
<div>Four</div>
<div>Five</div>
</div>
.wrapper {
display: flex;
flex-wrap: wrap;
}
.wrapper > div {
flex: 1 1 200px;
}
На картинке вы видите, что два элемента перешли на новую строку. Эти элементы поделили свободное пространство между собой, а не выровнялись по элементам над ними. Происходит это потому, что каждая новая строка (или колонка, если мы работаем с колонками) становится новым flex-контейнером. А во flex-контейнере распределение свободного пространства действует в рамках всей строки.
Общий вопрос заключается в том, как заставить наши перебежавшие элементы выровняться по элементам сверху. Как раз в этом случае и нужен метод размещения элементов в двумерной системе: требуется выравнивание и по строке, и по колонке, а для этого на помощь спешит Grid.
Тот же макет, но с CSS гридами
В примере ниже мы создаём тот же самый макет, но используя гриды. На этот раз у нас три трека-колонки шириной в 1fr . И при этом нам не требуется задавать какие-либо свойства дочерним элементам, потому что они самостоятельно занимают по одной ячейке созданного грида. Как видите, наши элементы лежат в жёсткой сетке и выравниваются и по строке, и по колонке. Поскольку у нас пять элементов, в результате мы получаем пустую ячейку в конце второй строки.
<div class="wrapper">
<div>One</div>
<div>Two</div>
<div>Three</div>
<div>Four</div>
<div>Five</div>
</div>
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
Если вы колеблетесь, что выбрать - flexbox или grid, задайте себе простой вопрос:
-
нужно управлять размещением элементов в строке или в колонке - используем flexbox
-
нужно управлять размещением элементов в строке и в колонке – используем grid
Что важнее: контент или макет?
В дополнение к различию между позиционированию в одном направлении и позиционированию в двух направлениях, существует ещё один способ решить, нужен ли вам макет, основанный на flexbox или макет, основанный на гридах. Flexbox работает исходя из размеров контента. Идеальный случай использования flexbox - когда у вас есть набор элементов, а вам нужно распределить их в контейнере равномерно. Вы позволяете размеру содержимого элементов решить, сколько пространства должен забрать каждый элемент. Если элементы переходят на новую строку, они забирают для себя пространство, исходя из своих размеров и того свободного места, которое есть в этой строке .
Грид работает, исходя из макета. Когда вы используете CSS Grid Layout, вы создаёте структуру и затем размещаете элементы именно в этой структуре или же позволяете правилам авто-размещения разместить элементы в грид-ячейках в соответствии с жёстко заданной сеткой. Конечно, существует возможность создавать треки, подстраивающиеся под размер контента, но при этом они также меняют саму структуру.
Поэтому, если вы используете flexbox и вдруг обнаруживаете, что ограничиваете эластичность элементов, возможно, вам нужно посмотреть в сторону CSS Grid Layout. Например, в том случае, если вы процентами подгоняете ширину flex-элемента, чтобы выровнять его по элементам в строке сверху. В такой ситуации гриды кажутся более оптимальным выбором.
Выравнивание блоков
Самой волнующей функциональностью flexbox для многих из нас была возможность впервые управлять выравниванием блоков. С помощью flexbox можно легко отцентрировать блок на странице. Флекс-элементы способны растягиваться на всю длину контейнера - значит, колонки равной высоты из мечты стали реальностью. Существовал целый ряд вещей, которые нам хотелось сделать очень давно, и для воплощения которых приходилось изобретать различные хаки.
Свойства выравнивания из спецификации flexbox были добавлены в новую спецификацию, названную Box Alignment Level 3. А это означает, что они могут использоваться и в других спецификациях, в том числе и в Grid Layout.
Дальше в нашем руководстве мы подробно рассмотрим выравнивание блоков Box Alignment и то, как оно работает в Grid Layout, а здесь давайте рассмотрим два простых примера, и сравним flexbox и гриды.
В первом примере, использующем flexbox, у нас есть контейнер с тремя элементами. Для блока-обёртки wrapper установлено свойство min-height, и оно задаёт высоту flex-контейнера. Мы установили свойство align-items flex-контейнера в значение flex-end , поэтому элементы выравниваются по концу flex-контейнера. Мы также установили значение свойства align-self для box1 таким образом, что оно перезапишет поведение по умолчанию и заставит наш блок растянутся на всю высоту контейнера. Для box2 свойство align-self установлено таким образом, что блок перепрыгнет в начало flex-контейнера.
<div class="wrapper">
<div class="box1">One</div>
<div class="box2">Two</div>
<div class="box3">Three</div>
</div>
.wrapper {
display: flex;
align-items: flex-end;
min-height: 200px;
}
.box1 {
align-self: stretch;
}
.box2 {
align-self: flex-start;
}
Тем временем в параллельной вселенной: выравнивание в CSS Гридах
Второй пример использует грид, чтобы создать тот же самый макет, и на этот раз мы рассмотрим то, как свойства выравнивания блоков применяются к гридам. Вместо flex-start и flex-end мы задаём start и end . В случае с макетом на гридах мы выравниваем grid-row элементы внутри их грид-области, в данном примере - это одна единственная грид-ячейка, но в целом грид-область может состоять из нескольких грид-ячеек.
<div class="wrapper">
<div class="box1">One</div>
<div class="box2">Two</div>
<div class="box3">Three</div>
</div>
.wrapper {
display: grid;
grid-template-columns: repeat(3,1fr);
align-items: end;
grid-auto-rows: 200px;
}.box1 {
align-self: stretch;
}
.box2 {
align-self: start;
}
Единица fr и flex-basis
Мы уже видели, как работает единица fr в случае пропорционального распределения доступного пространства между грид-треками в грид-контейнере. При комбинировании frс функцией minmax() мы получаем поведение, очень похожее на свойство flex в flexbox - и при этом по-прежнему можем создавать макет в двумерной системе.
Если вернуться к примеру, демонстрирующему различия между одно-и двумерным позиционированиями, можно увидеть, что существует также и различие в самом способе того, как две техники работают с отзывчивыми макетами. С макетом на flex, если мы уменьшаем или увеличиваем размер окна, flexbox аккуратно перераспределяет количество элементов в каждой строке в соответствии с доступным пространством. Так, если у нас достаточно места, чтобы разместить все пять наших элементов в одной строке, они и будут размещены в одной строке. Если же контейнер узкий, то в строке у нас будет место только для одного элемента.
В сравнении грид-версия всегда содержит три трека-колонки. Эти треки-колонки будут расширяться и сужаться, но их всегда будет три, раз мы запросили три при задании грида.
Автозаполнение грид-треков
Можно создать эффект, похожий на поведение flexbox, и при этом по-прежнему держать контент в жёсткой сетке из строк и колонок, если задать структуру треков, используя repeat-нотацию и свойства auto-fill и auto-fit.
В примере ниже мы используем ключевое слово auto-fill вместо целого числа в repeat-нотации и задаём структуру треков размером в 200 пикселей. Это значит, что грид создаст столько треков-колонок размером в 200 пикселей, сколько их может разместиться в контейнере.
<div class="wrapper">
<div>One</div>
<div>Two</div>
<div>Three</div>
</div>
.wrapper {
display: grid;
grid-template-columns: repeat(auto-fill, 200px);
}
Переменное количество треков
Давайте вспомним пример с flexbox, когда элементы, размер которых больше 200 пикселей, переходят на новую строку. Тот же самый эффект в гридах мы можем получить комбинируя auto-fill и функцию minmax(). В примере ниже мы создаём автозаполненные треки с помощью minmax. Мы хотим, чтобы треки были как минимум 200 пикселей в ширину, это наше минимальное значение, а для максимального зададим 1fr. В процессе, когда браузер вычисляет, сколько блоков в 200 пикселей может разместиться в контейнере - при этом учитывая грид-зазоры - он расценивает максимум 1fr как инструкцию распределить оставшееся свободное пространство между этими блоками.
<div class="wrapper">
<div>One</div>
<div>Two</div>
<div>Three</div>
</div>
.wrapper {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
}
Собственно, теперь у нас есть возможность создавать гриды с переменным количеством или с переменным размером треков и при этом по-прежнему держать элементы в жёсткой сетке из строк и колонок.
Гриды и абсолютно позиционированные элементы
Грид взаимодействует с абсолютно позиционированными элементами, что отнюдь не бесполезно, если вы хотите разместить элемент внутри грида или грид-области. В спецификации описано поведение грида и тогда, когда грид-контейнер является контейнерным блоком (containing block) и тогда, когда грид-контейнер - родительский элемент для абсолютно позиционированного элемента.
Грид-контейнер как контейнерный блок
Для того, чтобы превратить грид-контейнер в контейнерный блок вам нужно добавить ему свойство position со значением relative. Если после этого задать какому-нибудь грид-элементу position:absolute , грид-контейнер станет контейнерным блоком для данного элемента.
В примере ниже у нас есть блок-обёртка с четырьмя дочерними элементами. Третий элемент абсолютно позиционирован и одновременно размещён в гриде с помощью привязки к грид-линиям. У грид-контейнера position:relative , поэтому он становится контекстом позиционирования для нашего третьего элемента.
<div class="wrapper">
<div class="box1">One</div>
<div class="box2">Two</div>
<div class="box3">
Этот блок абсолютно позиционирован.
В нашем примере грид-контейнер является контейнерным блоком, поэтому значения сдвига абсолютного позиционирования отсчитываются от внешнего края той области, в которой размещён элемент.
</div>
<div class="box4">Four</div>
</div>
.wrapper {
display: grid;
grid-template-columns: repeat(4,1fr);
grid-auto-rows: 200px;
grid-gap: 20px;
position: relative;
}
.box3 {
grid-column-start: 2;
grid-column-end: 4;
grid-row-start: 1;
grid-row-end: 3;
position: absolute;
top: 40px;
left: 40px;
}
Вы видите, что наш элемент занимает область от колоночной грид-линии 2 до колоночной грид-линии 4 и начинается после строчной линии 1. С помощью свойств left и top мы сдвигаем его относительно этой области. В то же время, он изымается из потока так же, как и любой другой элемент с абсолютным позиционированием, поэтому правила авторазмещения теперь помещают другие элементы на его место. Абсолютное позиционирование нашего элемент также не приводит к появлению новой строки.
Попробуйте удалить position:absolute из правил для .box3 , и увидите, как он размещался бы без абсолютного позиционирования.
Грид-контейнер в качестве родительского элемента
Если у абсолютно позиционированного элемента в качестве родительского контейнера выступает грид, не создающий новый контекст позиционирования, наш элемент также вытаскивается из потока, как и в предыдущем примере. Но в этом случае контекстом позиционирования будет любой элемент, который как раз и создаёт этот контекст позиционирования. Словом, если в нашем примере мы уберём position:relative из блока-обёртки, контекстом позиционирования станет область просмотра, что хорошо видно на рисунке ниже.

Ещё раз: наш элемент больше не занимает пространство в грид-макете и не влияет на то, как располагаются другие элементы при авторазмещении.
А что если родительский элемент - это грид-область?
Если абсолютно позиционированный элемент находится в грид-области, вы можете создать контекст позиционирования из этой области. В примере ниже у нас тот же грид-макет, что и раньше, но теперь мы разместили элемент внутри .box3 .
Задаём .box3 свойство position в значении relative и затем перемещаем наш под-элемент с помощью свойств сдвига. В данном случае контекстом позиционирования является грид-область.
<div class="wrapper">
<div class="box1">One</div>
<div class="box2">Two</div>
<div class="box3">Three
<div class="abspos">
Этот блок абсолютно позиционирован. В данном примере контекстом позиционирования является грид-область, поэтому значения сдвига отсчитываются от внешних краёв грид-области.
</div>
</div>
<div class="box4">Four</div>
</div>
.wrapper {
display: grid;
grid-template-columns: repeat(4,1fr);
grid-auto-rows: 200px;
grid-gap: 20px;
}
.box3 {
grid-column-start: 2;
grid-column-end: 4;
grid-row-start: 1;
grid-row-end: 3;
position: relative;
}
.abspos {
position: absolute;
top: 40px;
left: 40px;
background-color: rgba(255,255,255,.5);
border: 1px solid rgba(0,0,0,0.5);
color: #000;
padding: 10px;
}
Грид и display:contents
Последнее, о чем нужно упомянуть, говоря о взаимодействии гридов с другими спецификациями, касающимися позиционирования элементов, - это взаимодействие между CSS Grid Layout и display:contents. Значение contents свойства display - новое свойство CSS, которое описывается в спецификации Display следующим образом:
“Сам элемент не генерирует никаких блоков (боксов), но его дочерние элементы и его псевдо-элементы по-прежнему генерируют блоки, в установленном порядке. Относительно генерации и позиционирования блоков элемент должен восприниматься так, как если бы он полностью замещался своими дочерними элементами и псевдо-элементами в дереве документа.”
Если вы пишете для элемента display:contents , блок (бокс), который он должен создать в дереве документа исчезает, а вот блоки его дочерних элементов и его псевдо-элементов переходят на один уровень вверх. А значит это то, что дочерние элементы грид-элемента могут сами стать грид-элементами. Звучит непонятно? Давайте разберёмся на простом примере. В разметке ниже у нас есть грид. Первый элемент этого грида настроен так, чтобы занимать все три трека-колонки. У него есть три вложенных элемента. Поскольку эти вложенные элементы не являются прямыми потомками грида, они не становятся частью грид-макета и отображаются, как обычные блоки.
<div class="wrapper">
<div class="box box1">
<div class="nested">a</div>
<div class="nested">b</div>
<div class="nested">c</div>
</div>
<div class="box box2">Two</div>
<div class="box box3">Three</div>
<div class="box box4">Four</div>
<div class="box box5">Five</div>
</div>
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: minmax(100px, auto);
}
.box1 {
grid-column-start: 1;
grid-column-end: 4;
}
Если мы теперь добавим правило display:contents для box1, блок этого бокса исчезнет, зато дочерние элементы станут грид-элементами и будут расположены в соответствии с правилами авторазмещения.
<div class="wrapper">
<div class="box box1">
<div class="nested">a</div>
<div class="nested">b</div>
<div class="nested">c</div>
</div>
<div class="box box2">Two</div>
<div class="box box3">Three</div>
<div class="box box4">Four</div>
<div class="box box5">Five</div>
</div>
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: minmax(100px, auto);
}
.box1 {
grid-column-start: 1;
grid-column-end: 4;
display: contents;
}
Таким образом мы можем заставить вложенные элементы вести себя, словно они часть грида (и в некотором смысле имитация того поведения, которое должны будут реализовать подгриды (subgrids), когда руки разработчиков браузеров до них доберутся). Точно так же можно использовать display:contents с flexbox, чтобы вложенные элементы становились flex-элементами.
Селекторы CSS. Виды, группировка и специфичность
Что такое CSS селекторы
селектор {
свойство: значение;
свойство: значение;
...
}
p {
text-align: center;
font-size: 20px;
}
Базовые селекторы
Селектор по элементу (тегу)
/* селектор p выберет все элементы p на странице */
p {
padding-bottom: 15px;
}
Селектор по классу
/* селектор .center выберет все элементы, имеющие класс center */
.center {
text-align: center;
}
Селектор по идентификатору (id)
/* селектор #footer выберет элемент, имеющий идентификатор footer */
#footer {
height: 50px;
margin-top: 20px;
}
Универсальный селектор
/* селектор * выберет все элементы на странице */
* {
margin: 0;
padding: 0;
}
CSS селекторы по атрибуту
[attr]– по имени атрибута;
[attr=value]– по имени и значению атрибута;
[attr^=value]– по имени и значению, с которого оно должно начинаться;
[attr|=value]– по имени атрибута и его значению, которое равно valueили начинается со value-;
[attr$=value]– по имени атрибута и значению, на которое оно должно заканчиваться;
[attr*=value]– по указанному атрибуту и значению, которое должно содержать value;
[attr~=value]– по имени атрибута и значению, которое содержит valueотделённое от других с помощью пробела.
[attr]
/* селектор [target] выберет все элементы на странице, имеющих атрибут target */
[target] {
background-color: red;
}
[attr=value]
/* селектор [rel="nofollow"] выберет все элементы на странице, имеющих атрибут rel со значением nofollow */
[rel="nofollow"] {
background-color: green;
}
[attr^=value]
/* селектор [class^="col"] выберет все элементы на странице, имеющих атрибут class, значение которого начинается с col */
[class^="col"] {
background-color: yellow;
}
[attr|=value]
/* селектор [class|="test"] выберет все элементы на странице, имеющих атрибут class, значение которого равно test или начинается с test- */
[class|="test"] {
background-color: orange;
}
[attr$=value]
/* селектор [class$="color"] выберет все элементы на странице, имеющих атрибут class, значение которого заканчивается на color */
[class$="color"] {
background-color: yellow;
}
[attr*=value]
/* селектор [href*="youtu.be"] выберет все элементы на странице, имеющих атрибут href, значение которого содержит youtu.be */
[href*="youtu.be"] {
background-color: green;
}
[attr~=value]
/* селектор [data-content~="news"] выберет все элементы на странице, имеющих атрибут data-content, значение которого содержит news, отделённое от других с помощью пробела */
[data-content~="news"] {
background-color: brown;
}
Псевдоклассы
Псевдоклассы для выбора элементов в зависимости от их состояния
Псевдокласс :link
/* селектор a.external:link выберет все элементы a с классом external пользователь по которым ещё не переходил */
a.external:link {
color: red;
}
Псевдокласс :visited
/* селектор .side a:visited выберет все элементы a, находящиеся в .aside, пользователь которые уже посетил */
.aside a:visited {
color: #000;
}
Псевдокласс :active
/* селектор a:active выберет все элементы a, находящиеся в активном состоянии */
a:active {
background-color: yellow;
}
Псевдокласс :hover
/* селектор .btn-warning:hover выберет все элементы .btn-warning при поднесении к ним курсора */
.btn-warning:hover {
color: #fff;
background-color: #ff8f00;
}
a:link { ... }
a:visited { ... }
a:hover { ... }
a:active { ... }
Псевдокласс :focus
/* селектор input[type="text"] найдет элемент input с атрибутом type="text" при нахождении его в фокусе */
input[type="text"]:focus {
background-color: #ffe082;
}
По расположению среди соседей
Псевдокласс :first-child
/* селектор li:first-child выберет элементы li, которые являются первыми элементами своего родителя */
li:first-child {
font-weight: bold;
}
Псевдокласс :last-child
/* селектор .alert-warning:last-child выберет элементы .alert-warning которые являются последними элементами своего родителя */
.alert-warning:last-child {
font-weight: bold;
}
Псевдокласс :only-child
h2:only-child {
...
}
Псевдокласс :nth-child (выражение)
/* селектор .li:nth-child(2) выберет элементы li, которые явлются вторыми элементами своего родителя */
.li:nth-child(2) { ... }
/* селектор .li:nth-child(odd) выберет элементы li, которые явлются нечётными элементами (1, 3, 5, ...) своего родителя */
.li:nth-child(odd) { ... }
/* селектор .li:nth-child(even) выберет элементы li, которые явлются чётными элементами (2, 4, 6, ...) своего родителя */
.li:nth-child(even) { ... }
/* селектор .li:nth-child(2n+1) выберет элементы li, которые имеют порядковые номера 1, 3, 5, 7, ... внутри своего родителя */
.li:nth-child(2n+1) { ... }
Псевдокласс :nth-last-child (выражение)
По расположению среди соседей с учётом типа элемента
Псевдокласс :first-of-type
p:first-of-type {
...
}
<section>
<h2>...</h2>
<p>...</p> <!-- будет выбран этот элемент -->
<p>...</p>
</section>
<section>
<h2>...</h2>
<p>...</p> <!-- будет выбран этот элемент -->
<p>...</p>
</section>
Псевдокласс :last-of-type
li:last-of-type {
...
}
Псевдокласс :only-of-type
p:only-of-type {
...
}
Псевдокласс :nth-of-type (выражение)
<section>
<h2>...</h2>
<p>...</p> <!-- Селектор p:nth-child(2) выберет этот элемент -->
<p>...</p> <!-- Селектор p:nth-of-type(2) выберет этот элемент -->
</section>
Псевдокласс :nth-last-of-type (выражение)
Псевдоклассы для элементов форм
Псевдокласс :checked
<div class="form-group">
<input type="checkbox" id="answer-1">
<label for="answer-1">Я знаю что такое :checked</label>
</div>
input:checked + label {
background-color: yellow;
}
Псевдокласс :enabled
input:enabled {
background-color: yellow;
}
Псевдокласс :disabled
input:disabled {
...
}
Остальные псевдоклассы
Псевдокласс :not (селектор)
/* Селектор .aside > div:not(:first-child) выберет все элементы div кроме первого непосредственно расположенные в .aside */
.aside > div:not(:first-child) { ... }
/* такие конструкция работать не будет */
:not(:not(...)) { ... }
div:not(.alert.alert-warning) { ... }
.item:not(::before) { ... }
.slider .slider__item:not(.active img) { ... }
td:not(.row + td) { ... }
/* применим стили ко всем элементам div, расположенных непосредственно в .message, за исключением .alert-warning и .alert-danger */
.message > div:not(.alert-warning):not(.alert-danger) { ... }
// этот селектор выберет все элементы p, которые не содержат класс alert
p:not(.alert) {
...
}
Псевдокласс :empty
div:empty {
...
}
Псевдокласс :root
:root {
--text-info: hotpink;
--text-warning: hotpink;
--aside-padding: 10px 15px;
}
Псевдокласс :target
<h2 id="header-1">...</h2>
<h2 id="header-2">...</h2>
:target {
color: red;
}
Группировка селекторов
/* селектор h3, h4 выберет все элементы на странице, имеющих тег h3 и h4 */
h3, h4 {
font-size: 20px;
margin-top: 15px;
margin-bottom: 10px;
}
Комбинирование селекторов
.modal.open {
...
}
.btn[data-toggle="collapse"]:first-child { ... }
Селекторы отношений
-
родитель– элемент, непосредственно в котором находится рассматриваемый элемент;
-
предок– это элемент, который расположен на одном из уровней иерархии элементов, до которого можно дойти двигаясь от рассматриваемого элемента к его родителю, от его родителя к родителю его родителя и т.д.
-
дети– это элементы, непосредственно расположенные в текущем рассматриваемом элементе;
-
потомки (дочерние элементы)– это любые элементы, которые находятся в текущем элементе вне зависимости от уровня иерархии, в котором они расположены;
-
соседи (сиблинги)– это элементы, расположенные на том же уровне вложенности (иерархии), что и рассматриваемый элемент; или другими словами — это все другие элементы, которые имеют того же родителя что и текущий рассматриваемый элемент.

Селектор X Y (для выбора вложенных или дочерних элементов)
Селектор X > Y
Селектор X + Y
Селектор X ~ Y
Приоритет селекторов
-
универсальный селектор (не добавляет вес) – 0,0,0,0;
-
селекторы по тегу, псевдоэлемент добавляют единичку к четвёртой цифре – 0,0,0,1;
-
селекторы по классу и по атрибуту, псевдоклассы добавляют единичку ко третьей цифре – 0,0,1,0;
-
селектор по идентификатору добавляют единичку ко второй цифре – 0,1,0,0;
*– 0,0,0,0;
li– 0,0,0,1;
li::before– 0,0,0,2;
ul > li– 0,0,0,2;
div input+label– 0,0,0,3;
h1 + div[data-target]– 0,0,1,2;
.btn.show– 0,0,2,0;
ul li a.item– 0,0,1,3;
#aside div.show– 0,1,1,1;
style="..."– 1,0,0,0;
<div class="alert-warning" style="background-color: #ffc107;"> ... </div>
.alert-warning {
background-color: #ffa000 !important;
}
<p id="message" style="font-size: 20px !important;">...</p>
p#message {
font-size: 16px !important;
}
Каких селекторов нет в CSS
Семантические элементы в HTML5
<header> представляет заголовок раздела. Он не вводит новый раздел. Элемент <header> может содержать также навигационную секцию.
<header>
<h1>Website Name</h1>
</header>
<nav> представляет раздел страницы, ссылки на другие страницы или частей в пределах страницы. Элемент nav предназначен для навигации секций.
<!-- Main Navigation -->
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/services">Services</a></li>
<li><a href="/portfolio">Portfolio</a></li>
<li><a href="/about">About</a></li>
</ul>
</nav>
<section> представляет общий раздел документа или приложения. <section> Элемент группы тематическое содержание. Он может быть использован вместе с h1 - h6, чтобы указать структуру документа.
<section>
<h1>Some big title</h1>
<p>Some text about the website</p>
</section>
<main> представляет основное содержание тела документа или приложения, которые непосредственно связаны с центральной темой документа или центральной функциональности приложения.
<article> представляет собой самостоятельную часть содержимого документа, такой как новости статьи, блоге, форуме сообщение или любой другой независимой единицы контента.
<!-- List of articles -->
<main>
<article>
<header>
<h1>Article title</h1>
</header>
<p>First paragraph</p>
<p>Second paragraph</p>
</article>
<article>
<header>
<h1>Article title</h1>
</header>
<p>First paragraph</p>
<p>Second paragraph</p>
</article>
</main>
<aside> представляет собой часть контента и могут быть использованы для тянуть котировки или боковых панелей, для рекламы, для групп навигационных элементов, а для другого контента, который считается отдельным от основного содержания страницы.
<!-- Second Navigation can be in aside tag -->
<aside>
<nav>
<ul>
<li><a href="/sub1"></a>Subcategory 1</li>
<li><a href="/sub2"></a>Subcategory 2</li>
<li><a href="/sub3"></a>Subcategory 3</li>
<li><a href="/sub4"></a>Subcategory 4</li>
</ul>
</nav>
<section>
<h1>Most popular</h1>
<ul>
<li><a href="/popular-1"></a>Popular 1</li>
<li><a href="/popular-2"></a>Popular 2</li>
<li><a href="/popular-3"></a>Popular 3</li>
</ul>
</section>
</aside>
<footer> представляет собой колонтитуле для раздела и может содержать информацию об авторе, информация об авторских правах и т.д.
<footer>
<p>Copyright © 2015</p>
</footer>Слова, часто используемые в CSS-классах
Изображения
image, img, picture, pic
— картинка
icon — иконка
logo — логотип
userpic, avatar — юзерпик, маленькая картинка пользователя
thumbnail, thumb — миниатюра, уменьшенное изображение
Текст
title, subject, heading, headline, caption — заголовок
subtitle — подзаголовок
slogan — слоган
lead, tagline — лид-абзац в тексте
text — текстовый контент
desc — описание, вариант текстового контента
excerpt — отрывок текста, обычно используется перед ссылкой «Читать далее...»
quote, blockquote — цитата
snippet — пример кода
link — ссылка
copyright, copy — копирайт
Списки
list, items — список
item — элемент списка
Блоки
page — корневой элемент страницы
header — шапка (страницы или элемента)
footer — подвал (страницы или элемента)
section — раздел контента (один из нескольких)
main, body — основная часть (страницы или элемента)
content — содержимое элемента
sidebar — боковая колонка (страницы или элемента)
aside — блок с дополнительной информацией
widget — виджет, например, в боковой колонке
Раскладка
wrapper, wrap — обёртка, обычно внешняя
inner — внутренняя обёртка
container, holder, box — контейнер
grid — раскладка (страницы или элемента) в виде сетки (обычно содержит в себе row и col)
row — контейнер в виде строки
col, column — контейнер в виде столбца
Элементы управления
button, btn — кнопка, например, для отправки формы
control — элемент управления, например, стрелки «Вперёд/назад» в фотогалерее, кнопки управления слайдером
dropdown — выпадающий список
Медиавыражения
phone, mobile — мобильные устройства
phablet — телефоны с большим экраном (6-7")
tablet — планшеты
notebook, laptop — ноутбуки
desktop — настольные компьютеры
Размеры
tiny, xs — маленький, крохотный
small, sm — небольшой
medium, base — средний
big, large, lg — большой
huge, xl — огромный
narrow — узкий
wide — широкий
Разное
search — поиск
socials — блок иконок соцсетей
advertisement, adv, commercial, promo — рекламный блок (режутся Адблоком, не рекомендуется использовать такие классы для блоков с внутренней рекламой)
features, benefits — список основных особенностей товара, услуги
slider, carousel — слайдер, интерактивный элемент с прокруткой содержимого
pagination — постраничная навигация
user, author — пользователь, автор записи или комментария
meta — блок с дополнительной информацией, например, блок тегов и даты в посте
cart, basket — корзина
breadcrumbs — навигационная цепочка, «хлебные крошки»
more, all — ссылка на полную информацию
modal — модальное (диалоговое) окно
popup — всплывающее окно
tooltip, tip — всплывающее подсказки
preview — анонс, отрывок, например новости или поста, может состоять из заголовка, описания и картинки. Предполагается ссылка на полную версию
overlay — перекрывающий слой, например, для затемнения изображений или создания модальных окон
Состояния
active, current — активный элемент, например, текущий пункт меню
visible — видимый элемент
hidden — скрытый элемент
error — статус ошибки
warning — статус предупреждения
success — статус успешного выполнения задачи
pending — состояние ожидания, например, перед сменой статуса на error или success
Примеры использования
Простой список
<ul class="list">
<li class="item">Первое</li>
<li class="item">Второе</li>
<li class="item">Третье</li>
</ul>
Картинка пользователя (юзерпик)
<div class="user">
<img class="user__img" src="userpic.png" alt="Дормидонт Петрович">
<a class="user__link" href="#">Дормидонт Петрович</a>
</div>
Галерея
<div class="gallery">
<ul class="gallery__list">
<li class="gallery__item">
<img class="gallery__img" src="flowers.jpg" alt="Цветём как в последний раз">
</li>
<li class="gallery__item">
<img class="gallery__img" src="trees.jpg" alt="Парк «Три сосны»">
</li>
</ul>
</div>
Навигация
<nav class="nav">
<a class="nav__link nav__link--active">Главная</a>
<a class="nav__link" href="#">Второстепенная</a>
<a class="nav__link" href="#">Третья с конца</a>
<a class="nav__link" href="#">Предпоследняя</a>
<a class="nav__link" href="#">Совсем конец</a>
</nav>
<nav class="nav">
<ul class="nav__list">
<li class="nav__item nav__item--current">
<a class="nav__link">Главная</a>
</li>
<li class="nav__item">
<a class="nav__link" href="#">Статьи</a>
</li>
<li class="nav__item">
<a class="nav__link" href="#">Фотогалерея</a>
</li>
<li class="nav__item">
<a class="nav__link" href="#">Контакты</a>
</li>
</ul>
</nav>
Виджет в боковой колонке
<div class="widget">
<h4 class="widget__title">Выращиваем желе</h4>
<div class="widget__content">
<p>Чтобы вырастить общительное дружелюбное желе,
нам потребуется рулон поролона, два килограмма сахара,
три яйца и пол чайной чашки ацетона.</p>
<a class="widget__link" href="#">Не читать дальше...</a>
</div>
</div>
Блок новостей
<div class="news">
<h3 class="news__title">Вчерашние новости</h3>
<ul class="news__list">
<!-- к классу элемента добавляем класс блока,
чтобы создать новое пространство имён -->
<li class="news__item item-news">
<h4 class="item-news__title">Соревнования среди воблы по конькобежному спорту</h4>
<div class="item-news__text">
<p>Победила команда килек из Петрозаводска</p>
<a href="#" class="item-news__link">Читать дальше</a>
</div>
</li>
<li class="news__item item-news">
<h4 class="item-news__title">Учёные уточнили роль напильника в уходе за ногтями</h4>
<div class="item-news__text">
<p>Британские учёные высоко оценили вклад
напильника в отращивание полутораметровых ногтей.</p>
<a href="#" class="item-news__link">Не читать дальше</a>
</div>
</li>
</ul>
</div>
Статья или пост в блоге (простой вариант)
<article class="article">
<h3 class="article__title">Нащупываем чакры у пучка петрушки</h3>
<time class="article__datetime">32 мая, 10:87</time>
<div class="article__author author-article">
<img class="author-article__img" src="userpic.png" alt="Клешня Андреевна">
<a class="author-article__link" href="#">Клешня Андреевна Долгорукая</a>
<div class="author-article__desc">Наш эксперт по чакрам</div>
</div>
<div class="article__content">
Сходите на рынок и купите у старушек пучок петрушки грамм на 100.
Как следует переберите, очистите от жуков и гусениц. Жуков отдайте поиграться
коту, гусениц поселите в горшок с кактусами, пусть одна будет Джоном,
вторая Билли, а у вас в горшке теперь будет Дикий Запад. Вернитесь
к пучку петрушки. Ласково взгляните на него и как следует почешите
за ухом, можно себе или коту. Перевяжите атласной ленточкой,
непременно завяжите бант. Поздравляем! Теперь у вас есть полностью
одомашненный пучок петрушки, который будет весело бегать за вами
по пятам и проращивать свои семена в ваших тапках.
</div>
</article>
Статья или пост в блоге (сложный вариант)
<article class="entry">
<header class="entry__header">
<h3 class="entry__title title-entry">
<a class="title-entry__link" href="#">Резиновые уточки как способ самопознания</a>
</h3>
<time class="entry__datetime">32 мая, 10:87</time>
</header>
<div class="entry__author author-entry">
<img class="author-entry__img" src="userpic.png" alt="Василиса Сергеевич">
<a class="author-entry__link" href="#">Василиса Сергеевич</a>
</div>
<div class="entry__content">
Достаньте с чердака коробку с полусотней резиновых уточек,
оставшихся после празднования нового года. Из уточек
и горящих свечей выложите пентаграмму на полу комнаты.
Сядьте посередине в позу лотоса, в каждую руку возьмите
по немецко-бразильскому словарю, прокашляйтесь, наберите
полную грудь воздуха и громко и уверенно,
с полной самоотдачей скажите "Кря!"
</div>
<div class="entry__tags tags-entry">
<h4 class="tags-entry__title">Метки</h4>
<ul class="tags-entry__list">
<li class="tags-entry__item">
<a class="tags-entry__link" href="#">хоровод своими руками</a>
</li>
<li class="tags-entry__item">
<a class="tags-entry__link" href="#">фарфоровые тапки</a>
</li>
<li class="tags-entry__item">
<a class="tags-entry__link" href="#">гуталин в кулинарии</a>
</li>
</ul>
</div>
<div class="entry__actions actions-entry">
<ul class="actions-entry__list">
<li class="actions-entry__item actions-entry__item--read">
<a class="actions-entry__link" href="#">238 ответов</a>
</li>
<li class="actions-entry__item actions-entry__item--write">
<a class="actions-entry__link" href="#">Написать в спортлото</a>
</li>
<li class="actions-entry__item actions-entry__item--share">
<a class="actions-entry__link" href="#">Поделиться</a>
</li>
</ul>
</div>
</article>
СПЕЦСИМВОЛЫ
|
Result
|
Description
|
Entity Name
|
Entity Number
|
|---|---|---|---|
|
|
non-breaking space
|
|
 
|
|
<
|
less than
|
<
|
<
|
|
>
|
greater than
|
>
|
>
|
|
&
|
ampersand
|
&
|
&
|
|
¢
|
cent
|
¢
|
¢
|
|
£
|
pound
|
£
|
£
|
|
¥
|
yen
|
¥
|
¥
|
|
€
|
euro
|
€
|
€
|
|
§
|
section
|
§
|
§
|
|
©
|
copyright
|
©
|
©
|
|
®
|
registered trademark
|
®
|
®
|
|
™
|
trademark
|
™
|
™
|
|
Вид
|
Символьный код
|
Числовой код
|
Описание
|
Примечание
|
|---|---|---|---|---|
|
↑
|
↑
|
↑
|
стрелка вверх
|
|
|
→
|
→
|
→
|
стрелка вправо
|
|
|
↓
|
↓
|
↓
|
стрелка вниз
|
|
|
←
|
←
|
←
|
стрелка влево
|
|
|
↔
|
↔
|
↔
|
стрелка влево-вправо
|
|
|
↵
|
↵
|
↵
|
стрелка вниз и влево — знак перевода строки
|
может не отображаться
|
|
⇑
|
⇑
|
⇑
|
двойная стрелка вверх
|
может не отображаться
|
|
⇒
|
⇒
|
⇒
|
двойная стрелка вправо
|
может не отображаться
|
|
⇓
|
⇓
|
⇓
|
двойная стрелка вниз
|
может не отображаться
|
|
⇐
|
⇐
|
⇐
|
двойная стрелка влево
|
может не отображаться
|
|
⇔
|
⇔
|
⇔
|
двойная стрелка влево-вправо
|
может не отображаться
|
|
Имя
|
Код
|
Вид
|
Описание
|
|---|---|---|---|
|
|
 
|
|
неразрывный пробел
|
|
£
|
£
|
£
|
фунт стерлингов
|
|
€
|
€
|
€
|
знак евро
|
|
¶
|
¶
|
¶
|
символ параграфа
|
|
§
|
§
|
§
|
параграф
|
|
©
|
©
|
©
|
знак copyright
|
|
®
|
®
|
®
|
знак зарегистрированной торговой марки
|
|
™
|
™
|
™
|
знак торговой марки
|
|
°
|
°
|
°
|
градус
|
|
±
|
±
|
±
|
плюс-минус
|
|
¼
|
¼
|
¼
|
дробь - одна четверть
|
|
½
|
½
|
½
|
дробь - одна вторая
|
|
¾
|
¾
|
¾
|
дробь - три четверти
|
|
×
|
×
|
×
|
знак умножения
|
|
÷
|
÷
|
÷
|
знак деления
|
|
ƒ
|
ƒ
|
ƒ
|
знак функции
|
|
Греческие буквы
|
|||
|
Α
|
Α
|
Α
|
греческая заглавная буква альфа
|
|
Β
|
Β
|
Β
|
греческая заглавная буква бета
|
|
Γ
|
Γ
|
Γ
|
греческая заглавная буква гамма
|
|
Δ
|
Δ
|
Δ
|
греческая заглавная буква дельта
|
|
Ε
|
Ε
|
Ε
|
греческая заглавная буква эпсилон
|
|
Ζ
|
Ζ
|
Ζ
|
греческая заглавная буква дзета
|
|
Η
|
Η
|
Η
|
греческая заглавная буква эта
|
|
Θ
|
Θ
|
Θ
|
греческая заглавная буква тета
|
|
Ι
|
Ι
|
Ι
|
греческая заглавная буква иота
|
|
Κ
|
Κ
|
Κ
|
греческая заглавная буква каппа
|
|
Λ
|
Λ
|
Λ
|
греческая заглавная буква лямбда
|
|
Μ
|
Μ
|
Μ
|
греческая заглавная буква мю
|
|
Ν
|
Ν
|
Ν
|
греческая заглавная буква ню
|
|
Ξ
|
Ξ
|
Ξ
|
греческая заглавная буква кси
|
|
Ο
|
Ο
|
Ο
|
греческая заглавная буква омикрон
|
|
Π
|
Π
|
Π
|
греческая заглавная буква пи
|
|
Ρ
|
Ρ
|
Ρ
|
греческая заглавная буква ро
|
|
Σ
|
Σ
|
Σ
|
греческая заглавная буква сигма
|
|
Τ
|
Τ
|
Τ
|
греческая заглавная буква тау
|
|
Υ
|
Υ
|
Υ
|
греческая заглавная буква ипсилон
|
|
Φ
|
Φ
|
Φ
|
греческая заглавная буква фи
|
|
Χ
|
Χ
|
Χ
|
греческая заглавная буква хи
|
|
Ψ
|
Ψ
|
Ψ
|
греческая заглавная буква пси
|
|
Ω
|
Ω
|
Ω
|
греческая заглавная буква омега
|
|
α
|
α
|
α
|
греческая строчная буква альфа
|
|
β
|
β
|
β
|
греческая строчная буква бета
|
|
γ
|
γ
|
γ
|
греческая строчная буква гамма
|
|
δ
|
δ
|
δ
|
греческая строчная буква дельта
|
|
ε
|
ε
|
ε
|
греческая строчная буква эпсилон
|
|
ζ
|
ζ
|
ζ
|
греческая строчная буква дзета
|
|
η
|
η
|
η
|
греческая строчная буква эта
|
|
θ
|
θ
|
θ
|
греческая строчная буква тета
|
|
ι
|
ι
|
ι
|
греческая строчная буква иота
|
|
κ
|
κ
|
κ
|
греческая строчная буква каппа
|
|
λ
|
λ
|
λ
|
греческая строчная буква лямбда
|
|
μ
|
μ
|
μ
|
греческая строчная буква мю
|
|
ν
|
ν
|
ν
|
греческая строчная буква ню
|
|
ξ
|
ξ
|
ξ
|
греческая строчная буква кси
|
|
ο
|
ο
|
ο
|
греческая строчная буква омикрон
|
|
π
|
π
|
π
|
греческая строчная буква пи
|
|
ρ
|
ρ
|
ρ
|
греческая строчная буква ро
|
|
ς
|
ς
|
ς
|
греческая строчная буква сигма
|
|
σ
|
σ
|
σ
|
греческая строчная буква сигма
|
|
τ
|
τ
|
τ
|
греческая строчная буква тау
|
|
υ
|
υ
|
υ
|
греческая строчная буква ипсилон
|
|
φ
|
φ
|
φ
|
греческая строчная буква фи
|
|
χ
|
χ
|
χ
|
греческая строчная буква хи
|
|
ψ
|
ψ
|
ψ
|
греческая строчная буква пси
|
|
ω
|
ω
|
ω
|
греческая строчная буква омега
|
|
Стрелки
|
|||
|
←
|
←
|
←
|
стрелка влево
|
|
↑
|
↑
|
↑
|
стрелка вверх
|
|
→
|
→
|
→
|
стрелка вправо
|
|
↓
|
↓
|
↓
|
стрелка вниз
|
|
↔
|
↔
|
↔
|
стрелка влево-вправо
|
|
Прочие символы
|
|||
|
♠
|
♠
|
♠
|
знак масти "пики"
|
|
♣
|
♣
|
♣
|
знак масти "трефы"
|
|
♥
|
♥
|
♥
|
знак масти "червы"
|
|
♦
|
♦
|
♦
|
знак масти "бубны"
|
|
"
|
"
|
"
|
двойная кавычка
|
|
&
|
&
|
&
|
амперсанд
|
|
<
|
<
|
<
|
знак "меньше"
|
|
>
|
>
|
>
|
знак "больше"
|
|
Знаки пунктуации
|
|||
|
…
|
…
|
…
|
многоточие ...
|
|
′
|
′
|
′
|
одиночный штрих - минуты и футы
|
|
″
|
″
|
″
|
двойной штрих - секунды и дюймы
|
|
Общая пунктуация
|
|||
|
–
|
–
|
–
|
тире
|
|
—
|
—
|
—
|
длинное тире
|
|
‘
|
‘
|
‘
|
левая одиночная кавычка
|
|
’
|
’
|
’
|
правая одиночная кавычка
|
|
‚
|
‚
|
‚
|
нижняя одиночная кавычка
|
|
“
|
“
|
“
|
левая двойная кавычка
|
|
”
|
”
|
”
|
правая двойная кавычка
|
|
„
|
„
|
„
|
нижняя двойная кавычка
|
|
«
|
«
|
«
|
левая двойная угловая скобка
|
|
»
|
»
|
»
|
правая двойная угловая скобка
|
Спецсимволы HTML. Стрелки
Стрелки вправо
-
→
-
➔
-
➜
-
➝
-
➞
-
🠖
-
🠒
-
☞
-
☛
-
➟
-
➠
-
➢
-
➣
-
➥
-
➦
-
↛
-
↝
-
➤
-
↠
-
↣
-
↦
-
↬
-
⇀
-
⇁
-
⇒
-
⇏
-
⇛
-
⇝
-
⇢
-
⇥
-
⇨
-
⇰
-
⇴
-
⇉
-
⇶
-
⇸
-
⇻
-
⇾
-
⟴
-
⟶
-
⟹
-
⟾
-
⟼
-
⟿
-
⤀
-
⤁
-
⤅
-
⤃
-
⤇
-
⤍
-
⤏
-
⤐
-
⤑
-
⤔
-
⤕
-
⤖
-
⤗
-
⤘
-
⤚
-
⤜
-
⤞
-
⤠
-
⤳
-
⥇
-
⥓
-
⥗
-
⥟
-
⥛
-
⥬
-
⥭
-
⥤
-
⥰
-
⥅
-
⥱
-
⥲
-
⥴
-
⥵
-
⥸
-
⥹
-
➧
-
➨
-
➩
-
➪
-
➫
-
➬
-
➭
-
➮
-
➯
-
➱
-
➲
-
➳
-
➵
-
➸
-
➺
-
➻
-
➼
-
➽
-
➾
-
⍄
-
⍈
-
⍆
-
➙
-
➛
-
>
-
˃
-
ᐅ
-
ᐉ
-
ᐳ
-
ᗒ
-
⃕
-
⃗
-
»
-
›
-
❯
-
❱
-
˲
Стрелки влево
-
←
-
🠔
-
↚
-
🠐
-
☚
-
↜
-
↞
-
↢
-
↤
-
↫
-
↼
-
↽
-
⇐
-
⇍
-
⇚
-
⇇
-
⇜
-
⇠
-
⇤
-
⇦
-
⇷
-
⇺
-
⇽
-
⟵
-
⟸
-
⟽
-
⟻
-
⤂
-
⤆
-
⤌
-
⤎
-
⤙
-
⤛
-
⤝
-
⤟
-
⥆
-
⥒
-
⥖
-
⥚
-
⥞
-
⥪
-
⥫
-
⥢
-
⥳
-
⥶
-
⥷
-
⥺
-
⍃
-
⍇
-
⍅
-
<
-
˂
-
ᐊ
-
ᐸ
-
ᑉ
-
ᗕ
-
⃖
-
«
-
‹
-
❮
-
❰
-
˱
Стрелки вверх
-
↑
-
▲
-
🠕
-
🠑
-
↟
-
↥
-
↾
-
↿
-
⇑
-
⇞
-
⇡
-
⇪
-
⇧
-
⇫
-
⇬
-
⇭
-
⇮
-
⇯
-
⇈
-
⟰
-
⤊
-
⤉
-
⤒
-
⥉
-
⥔
-
⥘
-
⥜
-
⥠
-
⥣
-
⍐
-
⍓
-
⍍
-
⍏
-
^
-
˄
-
ˆ
-
˰
-
̑
-
̭
-
ᐃ
-
ᐞ
-
ᐱ
-
ᗑ
-
ᛣ
Стрелки вниз
-
↓
-
▼
-
🠗
-
🠓
-
☟
-
↡
-
↧
-
⇂
-
⇃
-
⇓
-
⇟
-
⇣
-
⇩
-
⇊
-
⟱
-
⤋
-
⤈
-
⤓
-
⥕
-
⥙
-
⥝
-
⥡
-
⥥
-
⍗
-
⍌
-
⍔
-
⍖
-
˅
-
ˇ
-
ˬ
-
̬
-
ᐁ
-
ᐯ
-
ᗐ
Двойные стрелки вправо-влево туда-сюда
-
↭
-
↮
-
↹
-
⇄
-
⇆
-
⇿
-
⬌
-
⇔
-
⇌
-
⇹
-
⟷
-
⤄
-
⥂
-
⥃
-
⥄
-
⥈
-
⥊
-
⥋
-
⥎
-
⥐
-
⇋
-
⥦
-
⥧
-
⥨
-
⥩
-
⬄
-
⇼
Двойные стрелки вверх-вниз туда-сюда
- ↨
-
⇅
-
⇕
-
⇳
-
⬍
-
⇵
-
⥮
-
⥯
-
⥌
-
⥍
-
⥏
-
⥑
Диагональные стрелки
-
⇖
-
⇗
-
⇘
-
⇙
-
⇱
-
⇲
-
⤡
-
⤢
-
⤣
-
⤤
-
⤥
-
⤦
-
⤧
-
⤨
-
⤩
-
⤪
-
⤭
-
⤮
-
⤯
-
⤰
-
⤱
-
⤲
-
➶
-
➴
-
➷
-
➹
-
➘
-
➚
-
⬈
-
⬉
-
⬊
-
⬋
-
⬀
-
⬁
-
⬂
-
⬃
Жирные стрелки
-
🠸
-
🠺
-
🠻
-
🠹
-
🡄
-
🡆
-
🡅
-
🡇
-
🡸
-
🡺
-
🡹
-
🡻
-
🡼
-
🡽
-
🡾
-
🡿
-
🢀
-
🢂
-
🢁
-
🢃
-
🢄
-
🢅
-
🢆
-
🢇
-
➨
-
➜
-
➽
-
❰
-
❱
Жирные сжатые стрелки
-
🠼
-
🠾
-
🠽
-
🠿
-
🡀
-
🡂
-
🡁
-
🡃
Изогнутые стрелки
-
⮨
-
⮩
-
⮪
-
⮫
-
➥
-
➦
-
⮬
-
⮭
-
⮮
-
⮯
Стрелки с тенью
-
🢠
-
🢡
-
🢢
-
🢣
-
🢤
-
🢥
-
🢦
-
🢧
-
🢨
-
🢩
-
🢪
-
🢫
-
➩
-
➪
-
➫
-
➬
-
➭
-
➮
-
➯
-
➱
Стрелки к чёрточке
-
⭰
-
⭲
-
⭱
-
⭳
-
⭶
-
⭷
-
⭸
-
⭹
-
⇤
-
⇥
-
⤒
-
⤓
-
↨
-
⤝
-
⤞
-
⤟
-
⤠
-
↤
-
↦
-
↥
-
↧
-
⬶
-
⤅
-
⟻
-
⟼
-
↸
-
⇱
-
⇲
Стрелки навигации
-
🡠
-
🡢
-
🡡
-
🡣
-
🡤
-
🡥
-
🡦
-
🡧
-
🡨
-
🡪
-
🡩
-
🡫
-
🡬
-
🡭
-
🡮
-
🡯
-
🡰
-
🡲
-
🡱
-
🡳
-
🡴
-
🡵
-
🡶
-
🡷
-
🡸
-
🡺
-
🡹
-
🡻
-
🡼
-
🡽
-
🡾
-
🡿
-
🢀
-
🢂
-
🢁
-
🢃
-
🢄
-
🢅
-
🢆
-
🢇
Палец указатель направления
-
☚
-
☞
-
☟
-
☛
Стрелки с прямым углом
-
↳
-
↲
-
↰
-
↱
-
↵
-
↴
-
☇
Круговые и закруглённые стрелки
-
↺
-
↻
-
⟲
-
⟳
-
⭯
-
⭮
-
↺
-
↻
-
⥀
-
⥁
-
↶
-
↷
-
⮌
-
⮍
-
⮎
-
⮏
-
⤻
-
⤸
-
⤾
-
⤿
-
⤺
-
⤼
-
⤽
-
⤹
-
🗘
-
⮔
-
⤶
-
⤷
-
⃕
Стрелки в круге
-
⮈
-
⮊
-
⮉
-
⮋
-
➲
Стрелки-ленты
-
⮰
-
⮱
-
⮲
-
⮳
-
⮴
-
⮵
-
⮶
-
⮷
Парные двойные стрелки
-
⮄
-
⮆
-
⮅
-
⮇
-
⇈
-
⇊
-
⇇
-
⇉
-
⇆
-
⇄
-
⇅
-
⇵
-
⮀
-
⮂
-
⮁
-
⮃
Тройные стрелки
-
⇶
-
⇚
-
⇛
-
⤊
-
⟱
Стрелки клавиатуры
-
←
-
→
-
↑
-
↓
Клавиша Tab
-
⭾
-
⭿
Стрелы
-
➶
-
➴
-
➷
-
➹
Волнистые и зигзагообразные стрелки
-
⬿
-
⤳
-
↜
-
↝
-
⇜
-
⇝
-
⬳
-
⟿
Стрелки-гарпуны
-
↼
-
⇀
-
↽
-
⇁
-
↿
-
↾
-
⇃
-
⇂
-
⥊
-
⥋
-
⥌
-
⥍
-
⥎
-
⥐
-
⥑
-
⥏
-
⥒
-
⥓
-
⥖
-
⥗
-
⥔
-
⥕
-
⥘
-
⥙
-
⥚
-
⥛
-
⥞
-
⥟
-
⥜
-
⥝
-
⥠
-
⥡
-
⥢
-
⥤
-
⥣
-
⥥
-
⇋
-
⇌
-
⥦
-
⥨
-
⥧
-
⥩
-
⥪
-
⥬
-
⥫
-
⥭
-
⥮
-
⥯
Перечёркнутые стрелки
-
⇷
-
⇸
-
⤉
-
⤈
-
⇹
-
⇺
-
⇻
-
⇞
-
⇟
-
⇼
-
⭺
-
⭼
-
⭻
-
⭽
-
⬴
-
⤀
-
⬵
-
⤁
-
⬹
-
⤔
-
⬺
-
⤕
-
⬻
-
⤖
-
⬼
-
⤗
-
⬽
-
⤘
Двуглавые стрелки
-
↞
-
↠
-
↟
-
↡
-
⯬
-
⯭
-
⯮
-
⯯
Разные стрелки
-
↯
-
☈
-
⥼
-
⥽
-
⥾
-
⥿
Стрелки внутри треугольника
-
🢔
-
🢖
-
🢕
-
🢗
Наконечники острие стрелок
-
⮜
-
⮞
-
⮝
-
⮟
-
➤
-
⮘
-
⮚
-
⮙
-
⮛
-
➢
-
➣
- ➤
-
▲
-
🢐
-
🢒
-
🢑
-
🢓
-
⌃
-
⌄
Спецсимволы. Стрелки HTML
ВНИМАНИЕ! Спецсимволы чувствительны к регистру, нельзя использовать < вместо <.
| HEX | HTML | Decimal | Вид | Описание |
| U+2190 | ← | ← | ← | стрелка влево |
| U+2191 | ↑ | ↑ | ↑ | стрелка вверх |
| U+2192 | → | → | → | стрелка вправо |
| U+2193 | ↓ | ↓ | ↓ | стрелка вниз |
| U+2194 | ↔ | ↔ | ↔ | стрелка влево-вправо |
| U+2195 | − | ↕ | ↕ | Стрелка вверх-вниз |
| − | − | ◄ | ◄ | треугольная стрелка влево |
| − | − | ▲ | ▲ | треугольная стрелка вверх |
| − | − | ► | ► | треугольная стрелка вправо |
| − | − | ▼ | ▼ | треугольная стрелка вниз |
| − | − | ˿ | ˿ | |
| − | ← | ← | ← | стрелка влево |
| − | ↑ | ↑ | ↑ | стрелка вверх |
| − | → | → | → | стрелка вправо |
| − | ↓ | ↓ | ↓ | стрелка вниз |
| − | ↔ | ↔ | ↔ | стрелка влево-вправо |
| U+2196 | − | ↖ | ↖ | Северо-западная стрела |
| U+2197 | − | ↗ | ↗ | Северо-восточная стрела |
| U+2198 | − | ↘ | ↘ | Юго-Восточная стрела |
| U+2199 | − | ↙ | ↙ | Юго-западная стрелка |
| U+219a | − | ↚ | ↚ | Левая стрелка с инсультом |
| U+219b | − | ↛ | ↛ | Вправо Стрелка со штрихом |
| U+219c | − | ↜ | ↜ | Левая стрелка |
| U+219d | − | ↝ | ↝ | Стрелка вправо |
| U+219e | − | ↞ | ↞ | Левая стрелка в двух направлениях |
| U+219f | − | ↟ | ↟ | Вверх Две стрелы вправо |
| U+21a0 | − | ↠ | ↠ | Вправо Две стрелы вправо |
| U+21a1 | − | ↡ | ↡ | Стрелка вниз с двумя стрелами |
| U+21a2 | − | ↢ | ↢ | Левая стрелка с хвостом |
| U+21a3 | − | ↣ | ↣ | Вправо Стрелка с хвостом |
| U+21a4 | − | ↤ | ↤ | Левая стрелка от бара |
| U+21a5 | − | ↥ | ↥ | Вверх Стрелка из бара |
| U+21a6 | − | ↦ | ↦ | Вправо Стрелка из бара |
| U+21a7 | − | ↧ | ↧ | Стрелка вниз от бара |
| U+21a8 | − | ↨ | ↨ | Стрелка вниз с базой |
| U+21a9 | − | ↩ | ↩ | Левая стрелка с крючком |
| U+21aa | − | ↪ | ↪ | Вправо Стрелка с крючком |
| U+21ab | − | ↫ | ↫ | Левая стрелка с петлей |
| U+21ac | − | ↬ | ↬ | Вправо Стрелка с петлей |
| U+21ad | − | ↭ | ↭ | Левая стрелка вправо |
| U+21ae | − | ↮ | ↮ | Левая стрелка вправо со штрихом |
| U+21af | − | ↯ | ↯ | Вниз Зигзаг Стрелка |
| U+21b0 | − | ↰ | ↰ | Стрелка вверх с наконечником влево |
| U+21b1 | − | ↱ | ↱ | Стрелка вверх с наконечником вправо |
| U+21b2 | − | ↲ | ↲ | Стрелка вниз со стрелкой влево |
| U+21b3 | − | ↳ | ↳ | Стрелка вниз со стрелкой вправо |
| U+21b4 | − | ↴ | ↴ | Вправо Стрелка с углом вниз |
| U+21b5 | − | ↵ | ↵ | Стрелка вниз с углом влево |
| U+21b6 | − | ↶ | ↶ | Стрелка вверх по полукруглой стрелке |
| U+21b7 | − | ↷ | ↷ | По часовой стрелке Верхняя полукруглая стрелка |
| U+21b8 | − | ↸ | ↸ | Северо-западная стрела в длинный бар |
| U+21b9 | − | ↹ | ↹ | Стрелка влево вправо |
| U+21ba | − | ↺ | ↺ | Стрелка открытого круга против часовой стрелки |
| U+21bb | − | ↻ | ↻ | Стрелка в обратном направлении по часовой стрелке |
| U+21bc | − | ↼ | ↼ | Левый Гарпун с Барбом вверх |
| U+21bd | − | ↽ | ↽ | Гарпун влево Гарнир вниз |
| U+21be | − | ↾ | ↾ | Наверх Гарпун с Барбом вправо |
| U+21bf | − | ↿ | ↿ | Вверх Гарпун с жаром влево |
| U+21c0 | − | ⇀ | ⇀ | Вправо Гарпун с Барбом вверх |
| U+21c1 | − | ⇁ | ⇁ | Вправо Гарпун с Барбом вниз |
| U+21c2 | − | ⇂ | ⇂ | Вниз Гарпун с Барбом вправо |
| U+21c3 | − | ⇃ | ⇃ | Вниз Гарпун с Барбом влево |
| U+21c4 | − | ⇄ | ⇄ | Вправо Стрелка над левой стрелкой |
| U+21c5 | − | ⇅ | ⇅ | Вверх Стрелка влево от стрелки вниз |
| U+21c6 | − | ⇆ | ⇆ | Левая стрелка вправо Стрелка вправо |
| U+21c7 | − | ⇇ | ⇇ | Левые парные стрелки |
| U+21c8 | − | ⇈ | ⇈ | Стрелки вверх |
| U+21c9 | − | ⇉ | ⇉ | Правые парные стрелки |
| U+21ca | − | ⇊ | ⇊ | Вниз парные стрелки |
| U+21cb | − | ⇋ | ⇋ | Левый Гарпун над правым Гарпуном |
| U+21cc | − | ⇌ | ⇌ | Вправо Гарпун над левым Гарпуном |
| U+21cd | − | ⇍ | ⇍ | Левая двойная стрелка с инсультом |
| U+21ce | − | ⇎ | ⇎ | Левая правая двойная стрелка с инсультом |
| U+21cf | − | ⇏ | ⇏ | Вправо Двойная стрелка с инсультом |
| U+21d0 | ⇐ | ⇐ | ⇐ | двойная стрелка влево |
| U+21d1 | ⇑ | ⇑ | ⇑ | двойная стрелка вверх |
| U+21d2 | ⇒ | ⇒ | ⇒ | двойная стрелка вправо |
| U+21d3 | ⇓ | ⇓ | ⇓ | двойная стрелка вниз |
| U+21d5 | − | ⇕ | ⇕ | Вверх вниз Двойная стрелка |
| U+21d6 | − | ⇖ | ⇖ | Северо-западная двойная стрела |
| U+21d7 | − | ⇗ | ⇗ | Северо-восточная двойная стрела |
| U+21d8 | − | ⇘ | ⇘ | Юго-восточная двойная стрела |
| U+21d9 | − | ⇙ | ⇙ | Юго-западная двойная стрелка |
| U+21da | − | ⇚ | ⇚ | Влево Тройная стрела |
| U+21db | − | ⇛ | ⇛ | Вправо Тройная стрела |
| U+21dc | − | ⇜ | ⇜ | Стрелка влево |
| U+21dd | − | ⇝ | ⇝ | Вправо Стрелка стрелки |
| U+21de | − | ⇞ | ⇞ | Стрелка вниз с двойным ударом |
| U+21df | − | ⇟ | ⇟ | Стрелка вверх с двойным ударом |
| U+21e0 | − | ⇠ | ⇠ | Левая стрелка |
| U+21e1 | − | ⇡ | ⇡ | Стрелка вверх |
| U+21e2 | − | ⇢ | ⇢ | Вправо Dashed Arrow |
| U+21e3 | − | ⇣ | ⇣ | Вниз Dashed Arrow |
| U+21e4 | − | ⇤ | ⇤ | Стрелка влево влево |
| U+21e5 | − | ⇥ | ⇥ | Вправо Стрелка в бар |
| U+21e6 | − | ⇦ | ⇦ | Слева направо |
| U+21e7 | − | ⇧ | ⇧ | Наверху Толстая стрела |
| U+21e8 | − | ⇨ | ⇨ | Вправо Thick Arrow |
| U+21e9 | − | ⇩ | ⇩ | Толстая стрела вниз |
| U+21ea | − | ⇪ | ⇪ | Вверх Thick Arrow From Bar |
| U+21eb | − | ⇫ | ⇫ | Наверху Толстая стрелка на пьедестале |
| U+21ec | − | ⇬ | ⇬ | Наверху Толстая стрелка на пьедестале с горизонтальной полосой |
| U+21ed | − | ⇭ | ⇭ | Наверху Толстая стрелка на пьедестале с вертикальной штангой |
| U+21ee | − | ⇮ | ⇮ | Наверху Толстая двойная стрелка |
| U+21ef | − | ⇯ | ⇯ | Наверху Толстая двойная стрелка на пьедестале |
| U+21f0 | − | ⇰ | ⇰ | Вправо Толстая стрела из стены |
| U+21f1 | − | ⇱ | ⇱ | Северо-западная стрела в угол |
| U+21f2 | − | ⇲ | ⇲ | Юго-восточная стрела в угол |
| U+21f3 | − | ⇳ | ⇳ | Вниз вниз Толстая стрела |
| U+21f4 | − | ⇴ | ⇴ | Стрелка вправо с небольшим кругом |
| U+21f5 | − | ⇵ | ⇵ | Стрелка вниз Стрелка влево вверх |
| U+21f6 | − | ⇶ | ⇶ | Три стрелки вправо |
| U+21f7 | − | ⇷ | ⇷ | Стрелка влево с вертикальным ходом |
| U+21f8 | − | ⇸ | ⇸ | Вправо Стрелка с вертикальным ходом |
| U+21f9 | − | ⇹ | ⇹ | Левая стрелка вправо с вертикальным ходом |
| U+21fa | − | ⇺ | ⇺ | Левая стрелка с двойным вертикальным ходом |
| U+21fb | − | ⇻ | ⇻ | Вправо Стрелка с двойным вертикальным ходом |
| U+21fc | − | ⇼ | ⇼ | Левая стрелка вправо с двойным вертикальным ходом |
| U+21fd | − | ⇽ | ⇽ | Левая стрелка с открытым движением |
| U+21fe | − | ⇾ | ⇾ | Прямоугольная стрелка вправо |
| U+21ff | − | ⇿ | ⇿ | Левая правая стрелка с открытой стрелкой |
| − | − | ≪ | ≪ | |
| − | − | ⍃ | ⍃ | |
| − | − | ⍄ | ⍄ | |
| − | − | ⍅ | ⍅ | |
| − | − | ⍆ | ⍆ | |
| − | − | ⍇ | ⍇ | |
| − | − | ⍈ | ⍈ | |
| − | − | ⍌ | ⍌ | |
| − | − | ⍍ | ⍍ | |
| − | − | ⍏ | ⍏ | |
| − | − | ⍐ | ⍐ | |
| − | − | ⍓ | ⍓ | |
| − | − | ⍔ | ⍔ | |
| − | − | ⍖ | ⍖ | |
| − | − | ⍗ | ⍗ | |
| − | − | ⏎ | ⏎ | |
| − | − | ☇ | ☇ | |
| − | − | ☈ | ☈ | |
| − | − | ➔ | ➔ | |
| − | − | ➘ | ➘ | |
| − | − | ➙ | ➙ | |
| − | − | ➚ | ➚ | |
| − | − | ➛ | ➛ | |
| − | − | ➜ | ➜ | |
| − | − | ➝ | ➝ | |
| − | − | ➞ | ➞ | |
| − | − | ➟ | ➟ | |
| − | − | ➠ | ➠ | |
| − | − | ➡ | ➡ | |
| − | − | ➢ | ➢ | |
| − | − | ➣ | ➣ | |
| − | − | ➤ | ➤ | |
| − | − | ➥ | ➥ | |
| − | − | ➦ | ➦ | |
| − | − | ➧ | ➧ | |
| − | − | ➨ | ➨ | |
| − | − | ➩ | ➩ | |
| − | − | ➪ | ➪ | |
| − | − | ➫ | ➫ | |
| − | − | ➬ | ➬ | |
| − | − | ➭ | ➭ | |
| − | − | ➮ | ➮ | |
| − | − | ➯ | ➯ | |
| − | − | ➱ | ➱ | |
| − | − | ➲ | ➲ | |
| − | − | ➳ | ➳ | |
| − | − | ➴ | ➴ | |
| − | − | ➵ | ➵ | |
| − | − | ➶ | ➶ | |
| − | − | ➷ | ➷ | |
| − | − | ➸ | ➸ | |
| − | − | ➹ | ➹ | |
| − | − | ➺ | ➺ | |
| − | − | ➻ | ➻ | |
| − | − | ➼ | ➼ | |
| − | − | ➽ | ➽ | |
| − | − | ➾ | ➾ | |
| − | − | ⟰ | ⟰ | |
| − | − | ⟱ | ⟱ | |
| − | − | ⟲ | ⟲ | |
| − | − | ⟳ | ⟳ | |
| − | − | ⟴ | ⟴ | |
| − | − | ⟵ | ⟵ | |
| − | − | ⟶ | ⟶ | |
| − | − | ⟷ | ⟷ | |
| − | − | ⟸ | ⟸ | |
| − | − | ⟹ | ⟹ | |
| − | − | ⟺ | ⟺ | |
| − | − | ⟻ | ⟻ | |
| − | − | ⟼ | ⟼ | |
| − | − | ⟽ | ⟽ | |
| − | − | ⟾ | ⟾ | |
| − | − | ⟿ | ⟿ | |
| − | − | ⤀ | ⤀ | |
| − | − | ⤁ | ⤁ | |
| − | − | ⤂ | ⤂ | |
| − | − | ⤃ | ⤃ | |
| − | − | ⤄ | ⤄ | |
| − | − | ⤅ | ⤅ | |
| − | − | ⤆ | ⤆ | |
| − | − | ⤇ | ⤇ | |
| − | − | ⤈ | ⤈ | |
| − | − | ⤉ | ⤉ | |
| − | − | ⤊ | ⤊ | |
| − | − | ⤋ | ⤋ | |
| − | − | ⤌ | ⤌ | |
| − | − | ⤍ | ⤍ | |
| − | − | ⤎ | ⤎ | |
| − | − | ⤏ | ⤏ | |
| − | − | ⤐ | ⤐ | |
| − | − | ⤑ | ⤑ | |
| − | − | ⤒ | ⤒ | |
| − | − | ⤓ | ⤓ | |
| − | − | ⤔ | ⤔ | |
| − | − | ⤕ | ⤕ | |
| − | − | ⤖ | ⤖ | |
| − | − | ⤗ | ⤗ | |
| − | − | ⤘ | ⤘ | |
| − | − | ⤙ | ⤙ | |
| − | − | ⤚ | ⤚ | |
| − | − | ⤛ | ⤛ | |
| − | − | ⤜ | ⤜ | |
| − | − | ⤝ | ⤝ | |
| − | − | ⤞ | ⤞ | |
| − | − | ⤟ | ⤟ | |
| − | − | ⤠ | ⤠ | |
| − | − | ⤡ | ⤡ | |
| − | − | ⤢ | ⤢ | |
| − | − | ⤣ | ⤣ | |
| − | − | ⤤ | ⤤ | |
| − | − | ⤥ | ⤥ | |
| − | − | ⤦ | ⤦ | |
| − | − | ⤧ | ⤧ | |
| − | − | ⤨ | ⤨ | |
| − | − | ⤩ | ⤩ | |
| − | − | ⤪ | ⤪ | |
| − | − | ⤭ | ⤭ | |
| − | − | ⤮ | ⤮ | |
| − | − | ⤯ | ⤯ | |
| − | − | ⤰ | ⤰ | |
| − | − | ⤱ | ⤱ | |
| − | − | ⤲ | ⤲ | |
| − | − | ⤳ | ⤳ | |
| − | − | ⤴ | ⤴ | |
| − | − | ⤵ | ⤵ | |
| − | − | ⤶ | ⤶ | |
| − | − | ⤷ | ⤷ | |
| − | − | ⤸ | ⤸ | |
| − | − | ⤹ | ⤹ | |
| − | − | ⤺ | ⤺ | |
| − | − | ⤻ | ⤻ | |
| − | − | ⤼ | ⤼ | |
| − | − | ⤽ | ⤽ | |
| − | − | ⤾ | ⤾ | |
| − | − | ⤿ | ⤿ | |
| − | − | ⥀ | ⥀ | |
| − | − | ⥁ | ⥁ | |
| − | − | ⥂ | ⥂ | |
| − | − | ⥃ | ⥃ | |
| − | − | ⥄ | ⥄ | |
| − | − | ⥅ | ⥅ | |
| − | − | ⥆ | ⥆ | |
| − | − | ⥇ | ⥇ | |
| − | − | ⥈ | ⥈ | |
| − | − | ⥉ | ⥉ | |
| − | − | ⥒ | ⥒ | |
| − | − | ⥓ | ⥓ | |
| − | − | ⥔ | ⥔ | |
| − | − | ⥕ | ⥕ | |
| − | − | ⥖ | ⥖ | |
| − | − | ⥗ | ⥗ | |
| − | − | ⥘ | ⥘ | |
| − | − | ⥙ | ⥙ | |
| − | − | ⥚ | ⥚ | |
| − | − | ⥛ | ⥛ | |
| − | − | ⥜ | ⥜ | |
| − | − | ⥝ | ⥝ | |
| − | − | ⥞ | ⥞ | |
| − | − | ⥟ | ⥟ | |
| − | − | ⥠ | ⥠ | |
| − | − | ⥡ | ⥡ | |
| − | − | ⥢ | ⥢ | |
| − | − | ⥣ | ⥣ | |
| − | − | ⥤ | ⥤ | |
| − | − | ⥥ | ⥥ | |
| − | − | ⥦ | ⥦ | |
| − | − | ⥧ | ⥧ | |
| − | − | ⥨ | ⥨ | |
| − | − | ⥩ | ⥩ | |
| − | − | ⥪ | ⥪ | |
| − | − | ⥫ | ⥫ | |
| − | − | ⥬ | ⥬ | |
| − | − | ⥭ | ⥭ | |
| − | − | ⥮ | ⥮ | |
| − | − | ⥯ | ⥯ | |
| − | − | ⥰ | ⥰ | |
| − | − | ⥱ | ⥱ | |
| − | − | ⥲ | ⥲ | |
| − | − | ⥳ | ⥳ | |
| − | − | ⥴ | ⥴ | |
| − | − | ⥵ | ⥵ | |
| − | − | ⥶ | ⥶ | |
| − | − | ⥷ | ⥷ | |
| − | − | ⥸ | ⥸ | |
| − | − | ⥹ | ⥹ | |
| − | − | ⥺ | ⥺ | |
| − | − | ⥻ | ⥻ | |
| − | − | ⬀ | ⬀ | |
| − | − | ⬁ | ⬁ | |
| − | − | ⬂ | ⬂ | |
| − | − | ⬃ | ⬃ | |
| − | − | ⬄ | ⬄ | |
| − | − | ⬅ | ⬅ | |
| − | − | ⬆ | ⬆ | |
| − | − | ⬇ | ⬇ | |
| − | − | ⬈ | ⬈ | |
| − | − | ⬉ | ⬉ | |
| − | − | ⬊ | ⬊ | |
| − | − | ⬋ | ⬋ | |
| − | − | ⬌ | ⬌ | |
| − | − | ⬍ | ⬍ | |
| − | − | ⬎ | ⬎ | |
| − | − | ⬏ | ⬏ | |
| − | − | ⬐ | ⬐ | |
| − | − | ⬑ | ⬑ | |
| − | − | ← | ← | |
| − | − | ↑ | ↑ | |
| − | − | → | → | |
| − | − | ↓ | ↓ | |
| − | − | ☛ | ☛ | указатель палец вправо |
| − | − | ☚ | ☚ | указатель палец влево |
| − | − | ☝ | ☝ | указатель палец вверх |
| − | − | ☞ | ☞ | указатель палец вправо |
| − | − | ☟ | ☟ | указатель палец вниз |
| − | − | ☜ | ☜ | указатель палец влево |
Список всех Селекторов в CSS
|
Селектор
|
Пример
|
Описание примера
|
|---|---|---|
|
*
|
*
|
Все элементы.
|
|
#id
|
#firstname
|
Элемент с id="firstname".
|
|
.class
|
.intro
|
Все элементы с class="intro".
|
|
.class1.class2
|
.name1.name2
|
Все элементы с class="name1 name2".
|
|
.class1 .class2
|
.name1 .name2
|
Все элементы с class="name2"у которых родитель с class="name1".
|
|
tag
|
p
|
Все <p>элементы.
|
|
tag.class
|
p.intro
|
Все <p>элементы с class="intro".
|
|
tag, tag
|
div, p
|
Все <div>и все <p>элементы.
|
|
tag tag
|
div p
|
Все <p>внутри всех <div>.
|
|
tag > tag
|
div > p
|
Все <p>прямой родитель которых <div>.
|
|
tag + tag
|
div + p
|
<p>который находятся сразу после <div>.
|
|
tag ~ tag
|
div ~ p
|
Все <p>которые находятся после <div>.
|
|
[attribute]
|
[target]
|
Все элементы с target="что-либо".
|
|
[attribute = value]
|
[target=_blank]
|
Все элементы с target="_blank".
|
|
[attribute ^= value]
|
a[href^="https"]
|
Каждый <a>атрибут hrefкоторого начинается с "https".
|
|
[attribute $= value]
|
a[href$=".pdf"]
|
Каждый <a>атрибут hrefкоторого заканчивается ".pdf".
|
|
[attribute *= value]
|
a[href*="w3schools"]
|
Каждый <a>атрибут hrefкоторого содержит подстроку "w3schools".
|
|
[attribute ~= value]
|
[title~=flower]
|
Все элементы в атрибуте titleкоторых есть слово "flower".
|
|
[attribute |= value]
|
[lang|=en]
|
Все элементы атрибут langкоторых начинается с "en".
|
|
:active
|
a:active
|
Активная ссылка.
|
|
::after
|
p::after
|
Вставляет псевод-элемент в начале каждого <p>элемента.
|
|
::before
|
p::before
|
Вставляет псевод-элемент в конце каждого <p>элемента.
|
|
:checked
|
input:checked
|
Все выбранные <input type="checkbox">элементы.
|
|
:default
|
input:default
|
Все <input>элементы.
|
|
:disabled
|
input:disabled
|
Все <input disabled>элементы.
|
|
:empty
|
p:empty
|
Все пустые <p>, в которых нет пробелом, текста или других элементов.
|
|
:enabled
|
input:enabled
|
Все активные (не disabled) элементы <input>.
|
|
:first-child
|
p:first-child
|
Первый элемент в списке родительского элемента.
|
|
:first-of-type
|
p:first-of-type
|
Первый <p>элемент в списке родительского элемента.
|
|
::first-letter
|
p::first-letter
|
Первая буква каждого <p>элемента.
|
|
::first-line
|
p::first-line
|
Первая линия каждого <p>элемента.
|
|
:focus
|
input:focus
|
<input>в котором находится курсор.
|
|
:focus-visible
|
a:focus-visible
|
Фокус сработает, только если на кнопку перешли с клавиатуры через TAB.
|
|
:focus-within
|
div:focus-within
|
Сработает на блоке, когда его внутренний элемент находится в фокусе.
|
|
:hover
|
a:hover
|
Сслыка на которую наведена мышка.
|
|
:in-range
|
input:in-range
|
Все <input>со значением в пределах указанного диапазона.
|
|
:indeterminate
|
input:indeterminate
|
Все <input>в статусе indeterminate.
|
|
:invalid
|
input:invalid
|
Все <input>с недопустимым значением.
|
|
:lang(language)
|
p:lang(it)
|
Все <p>с lang="it".
|
|
:last-child
|
p:last-child
|
Последний элемент в списке родительского элемента.
|
|
:last-of-type
|
p:last-of-type
|
Последний <p>в списке родительского элемента.
|
|
:link
|
a:link
|
Все непосещенные ссылки.
|
|
:not(selector)
|
:not(p)
|
Все не <p>элементы.
|
|
:not(:only-child)
|
div:not(:only-child)
|
Все <div>внутри которых больше одного элемента.
|
|
:nth-child(n)
|
p:nth-child(2)
|
Второй элемент в списке родительского элемента.
|
|
:nth-of-type(n)
|
p:nth-of-type(2)
|
Второй <p>в списке родительского элемента.
|
|
:nth-last-child(n)
|
p:nth-last-child(2)
|
Второй элемент в списке родительского элемента (счет идет с конца).
|
|
:nth-last-of-type(n)
|
p:nth-last-of-type(2)
|
Второй <p>в списке родительского элемента (счет идет с конца).
|
|
:only-child
|
p:only-child
|
Единственный <p>у родителя (других элементов быть не может).
|
|
:only-of-type
|
p:only-of-type
|
Один <p>у родителя (других элементы могут быть).
|
|
:optional
|
input:optional
|
Все <input>у которых нет артибута "required".
|
|
:required
|
input:required
|
Все <input>у которых указан атрибут "required".
|
|
:out-of-range
|
input:out-of-range
|
Все <input>со значением выходящим за указанный рэндж.
|
|
::placeholder
|
input::placeholder
|
Все <input>у которых указан атрибут "placeholder".
|
|
:read-only
|
input:read-only
|
Все <input>у которых указан атрибут "readonly".
|
|
:read-write
|
input:read-write
|
Все <input>у которых не указан атрибут "readonly".
|
|
:root
|
:root
|
Корен документа.
|
|
::selection
|
::selection
|
Выберет текущее выделение текста мышкой.
|
|
:target
|
#news:target
|
Выберет элемент с id="news"когда к нему пришил по клику.
|
|
:valid
|
input:valid
|
Все <input>с валидным значением.
|
|
:visited
|
a:visited
|
Все посещенные ссылки.
|
Описание CSS селекторов
*
* { margin:0; padding:0; }
#container * { border: 1px solid black; }
.class
<div class="error">
.error { color: red; }
#id
<div id="container">
#container { width: 960px; margin: auto; }
tag
a { color: red; }
ul { margin-left: 0; }
X, Y
h2,
li a { color: red; }
X Y
Х > Y
.parent > li{ border: 1px solid red; }
<ul class="parent">
<li> список1
<ul class="child">
<li>список11</li>
<li>список12</li>
</ul>
</li><!-- затронет -->
<li>список2</li><!-- затронет -->
<li>список3</li><!-- затронет -->
</ul>
Х ~ Y
div ~ p { color: red; }
Окрасит "текст 2" и "текст 3":
<div>текст</div>
<p>текст 2</p><!-- color: red; -->
<p>текст 3</p><!-- color: red; -->
Х + Y
div + p { color: red; }
Получим:
<div>текст</div>
<p>текст 2</p><!-- color: red; -->
<p>текст 3</p>
a:link, a:visited, a:hover, a:active, a:focus
-
a:link— выбирает обычную (не посещенную) ссылку. Обычно этот селектор записывается просто как a.
-
a:visited— выбирает уже посещенную ссылку.
-
a:hover— выбирает ссылку на которую наведена мышка (под курсором).
-
a:active— выбирает активную ссылку (на которую был сделан клик, пока еще никуда не кликали или когда на ссылку переключились при передвижении табом с клавиатуры).
-
a:focus— выбирает активную ссылку (на которую кликнули, но еще не отпустили кнопку мышки).
[attr]
a[title] { color: green; }
<a href="" title="описание">текст</a>
<a href="">текст 2</a>
[attr = value]
a[href="http://example.com"] { color: red; }
Окрасит только "текст":
<a href="http://example.com">текст</a><!-- color: red; -->
<a href="http://example.com/article">текст 2</a>
[attr *= value]
a[href*="example"] { color: red; }
<a href="http://example.com">текст</a><!-- color: red; -->
<a href="http://example.com/article">текст 2</a><!-- color: red; -->
<a href="http://xxx.ru/article">текст 2</a>
[attr ^= value]
a[href^="http"] {
background: url(path/to/external/icon.png) no-repeat;
padding-left: 10px;
}
<a href="http://example.com">текст</a>
<a href="/article">текст 2</a>
[attr $= value]
a[href$=".jpg"] { color: red; }
<a href="http://example.com/foto.jpg">текст</a>
<a href="http://example.com/foto2.png">текст 2</a>
[attr ~= value]
-
*=— ищет homeв любом месте значения. Найдет homeland.
-
~=— ищет homeразделеный пробелом. Найдет home land.
a[data-info ~= "external"] { color: red; }
a[data-info ~= "image"] { border: 1px solid black; }
<a href="http://example.com" data-info="external">текст</a><!-- окрасит в красный -->
<a href="http://nettuts.com">текст 2</a><!-- не тронет -->
<a href="http://example.com" data-info="external image">текст 3</a><!-- окрасит и установит рамку -->
<a href="http://example.com" data-info="image">текст 4</a><!-- установит рамку -->
[attr |= value]
:target
:target { color: red; }
<a href="#anchor1">Перейти на якорь 1</a>
<a href="#anchor2">Перейти на якорь 2</a>
<!-- При клике по этим ссылкам выберется соответствующий элемент ниже -->
<p id="anchor1">Элемент 1</p>
<p id="anchor2">Элемент 2</p>
:checked
input[type=radio]:checked { border:1px solid black; }
:default
<form>
<input type="submit"><!-- будет выбран -->
<input type="submit">
<input type="reset">
</form>
-
<option>считается дефолтным (:default), если это элемент с атрибутом selectedили первый enabled(NOT disabled) элемент по порядку DOM элементов. Для <select multiple>каждый selectedэлемент будет считаться дефолтным.
-
<input type="checkbox"> и <input type="radio"> считаются дефолтными, если они выбраны (имеют атрибут checked).
-
<button> считается дефолтной, если это базовая кнопка сабмита формы (<form>) — это первая в форме кнопка по порядку DOM элементов. Это также справедливо и для типов <input type="submit">.
:disabled
Примеры
<form action="#">
<legend>Shipping address</legend>
<input type="text" placeholder="Name">
<input type="text" placeholder="Address">
<input type="text" placeholder="Zip Code">
</form>
input[type="text"]:disabled {
background: #dddddd;
}
select.country:disabled {
background: #dddddd;
}
:enabled
Примеры
<form action="#">
<legend>Shipping address</legend>
<input type="text" placeholder="Name" disabled="disabled">
<input type="text" placeholder="Address">
<input type="text" placeholder="Zip Code">
</form>
input[type="text"]:enabled {
background: #fff;
}
input[type="text"]:disabled {
background: #dddddd;
}
:empty
.box {
background: red;
height: 200px;
width: 200px;
}
.box:empty {
background: lime;
}
<div class="box"><!-- пустой --></div>
<div class="box">Я буду красным</div>
<div class="box">
<!-- Я буду красным, так как перед комментарием стоят пробелы -->
</div>
::before
li:before {
content: '-';
display: inline-block;
margin-right: .5em;
}
-
элемент 1
-
элемент 2
::after
.clear:after {
content: '';
display: table;
clear: both;
}
:focus
input:focus {
background-color: yellow;
}
a:focus {
outline: 2px solid yellow;
}
input[type=text] {
width: 100px;
transition: ease-in-out, width .35s ease-in-out;
}
input[type=text]:focus {
width: 250px;
}
:focus-visible
:focus-within
div:focus-within {
background: cyan;
}
<form>
<label for="given_name">Given Name:</label>
<input id="given_name" type="text">
<br>
<label for="family_name">Family Name:</label>
<input id="family_name" type="text">
</form>
form {
border: 1px solid;
color: gray;
padding: 4px;
}
form:focus-within {
background: #ff8;
color: black;
}
input {
margin: 4px;
}
:hover
a:hover { border-bottom: 1px solid black; }
div:hover { background: #e3e3e3; }
:not(selector)
:not(:not(...)).
*:not(p) { color: green; }
ul li:not(.last) { color: blue; }
<ul>
<li>элемент 1</li>
<li>элемент 2</li>
<li class="last">элемент 3</li>
</ul>
::first-line, ::first-letter
-
::first-line стилизует начальную (первую) строку.
-
::first-lette rстилизует начальную (первую) букву. Изменяются только шрифт, цвет текста, фон и т.д. привязан к множеству параметров: ширина окна браузера, язык, шрифт и т.п.
#1 Выбираем первую букву в параграфе
p::first-letter {
float: left;
font-size: 2em;
font-weight: bold;
font-family: cursive;
padding-right:2px;
}
#2 Выбираем первую строку в абзаце
p::first-line {
font-weight: bold;
font-size: 1.2em;
}
:nth-child(n)
<h1>Заголовок</h1>
<p>Первый параграф.</p><!-- p:nth-child(2) -->
<p>Второй параграф.</p><!-- p:nth-of-type(2) -->
-
odd— нечетные.
-
even— четные.
-
число— порядковый номер с 1.
-
выражение с nan+b — a и b целые числа, n— счетчик от 0 до 999...
n = odd / even
p:nth-child( odd ) {
background: red;
}
p:nth-child( even ) {
background: blue;
}
<h1>Заголовок</h1>
<p>Первый параграф.</p><!-- blue -->
<p>Второй параграф.</p><!-- red -->
<p>Третий параграф.</p><!-- blue -->
n = число
p:nth-child(2) { color: red; }
<h1>Заголовок</h1>
<p>Первый параграф.</p><!-- red -->
<p>Второй параграф.</p>
<p>Третий параграф.</p>
n = выражение
-
в селекторе :nth-child(2)указана только "а".
-
:nth-child(odd) можно заменить на :nth-child(2n+1) - 1, 3, 5, 7 ...
-
:nth-child(even) можно заменить на :nth-child(2n) - 2, 4, 6, 8 ...
-
:nth-child(3n+4) - 4, 7, 10, 13 ...
-
:first-childможно заменить на :nth-child(0n+1) или :nth-child(1)
p:nth-child(3n) { background: red; }
<h1>Заголовок</h1>
<p>Параграф 1</p>
<p>Параграф 2</p><!-- background: red -->
<p>Параграф 3</p>
<p>Параграф 4</p>
<p>Параграф 5</p><!-- background: red -->
<p>Параграф 6</p>
<p>Параграф 7</p>
<p>Параграф 8</p><!-- background: red -->
<p>Параграф 9</p>
:nth-last-child(n)
-
odd— нечетные.
-
even— четные.
-
число— порядковый номер с 1.
-
выражение с nan+b— a и b целые числа, n— счетчик от 0 до 999...
Следующий код установит красным цветом второй с конца параграф:
li:nth-last-child(2) { color: red; }
<h1>Заголовок</h1>
<p>Первый параграф.</p>
<p>Второй параграф.</p><!-- red -->
<p>Третий параграф.</p>
:nth-of-type(n)
<h1>Заголовок</h1>
<p>Первый параграф.</p><!-- p:nth-child(2) -->
<p>Второй параграф.</p><!-- p:nth-of-type(2) -->
-
odd— нечетные.
-
even— четные.
-
число— порядковый номер с 1.
-
выражение с nan+b— a и b целые числа, n— счетчик от 0 до 999...
#1 n = add / even
p:nth-of-type(odd) { background: red; }
p:nth-of-type(even) { background: blue; }
<h1>Заголовок</h1>
<p>Первый параграф.</p><!-- red -->
<p>Второй параграф.</p><!-- blue -->
<p>Третий параграф.</p><!-- red -->
#2 n = число
li:nth-of-type(2) { color: red; }
<h1>Заголовок</h1>
<p>Первый параграф.</p>
<p>Второй параграф.</p><!-- red -->
<p>Третий параграф.</p>
#3 n = выражение
-
в селекторе :nth-of-type(2) указана только "а".
-
:nth-of-type(odd) можно заменить на :nth-of-type(2n+1)- 2, 4, 6, 8 ...
-
:nth-of-type(even) можно заменить на :nth-of-type(2n)- 1, 3, 5, 7 ...
-
:nth-of-type(3n+4) - 4, 7, 10, 13 ...
-
:first-of-type можно заменить на :nth-of-type(0n+1) или просто :nth-of-type(1)
p:nth-of-type(3n) { background: red; }
<h1>Заголовок</h1>
<p>Параграф 1</p>
<p>Параграф 2</p>
<p>Параграф 3</p><!-- background: red -->
<p>Параграф 4</p>
<p>Параграф 5</p>
<p>Параграф 6</p><!-- background: red -->
<p>Параграф 7</p>
<p>Параграф 8</p>
<p>Параграф 9</p><!-- background: red -->
:nth-last-of-type(n)
<h1>Заголовок</h1>
<p>Параграф 1</p><!-- background: red -->
<p>Параграф 2</p>
<p>Параграф 3</p>
<p>Параграф 4</p><!-- background: red -->
<p>Параграф 5</p>
<p>Параграф 6</p>
<p>Параграф 7</p><!-- background: red -->
<p>Параграф 8</p>
<p>Параграф 9</p>
:first-child
#1 Пример: обратимся к первому элементу в блоке #container
#container div:first-child{ color:red; }
<div id="container">
<div>элемент 1</div><!-- color:red; -->
<div>элемент 2</div>
</div>
<div id="container">
<h1>Заголовок</h1>
<div>элемент 1</div><!-- не выделит -->
<div>элемент 2</div>
</div>
#2 Обнуление границы
ul li:first-child { border-top: none; }
:last-child
#1 Пример: обратимся к первому с конца элементу в блоке #container
#container div:last-child{ color:red; }
<div id="container">
<div>элемент 1</div>
<div>элемент 2</div><!-- color:red; -->
</div>
<div id="container">
<div>элемент 1</div>
<div>элемент 2</div><!-- не выделит -->
<p>параграф</p>
</div>
#2 Покрасим последний элемент li в списке ul в зеленый:
ul > li:last-child { color: green; }
<ul>
<li>список 1</li>
<li>список 2</li>
<li>список 3</li><!-- color: green; -->
</ul>
:first-of-type, :last-of-type
#1 Пример: обратимся к первому элементу div в блоке #container
#container div:first-of-type{ color:red; }
<div id="container">
<h1>Заголовок</h1>
<div>элемент 1</div><!-- color:red; -->
<div>элемент 2</div>
</div>
#2 Обнуление границы
ul li:first-of-type { border-top: none; }
<ul>
<span>текст</span>
<li>элемент 1</li><!-- border-top: none; -->
<li>элемент 2</li>
<li>элемент 3</li>
</ul>
:only-child
Выберем элемент, если он единственный в блоке:
p:only-child { background: red; }
<div>
<p>параграф</p><!-- background: red; -->
</div>
<div>
<span>параграф</span><!-- не выберет, потому что X=p а не span -->
</div>
<div>
<p>текст</p><!-- не выберет, потому что на этом уровне 2 элемента -->
<span>параграф</span>
</div>
:not(:only-child)
li:not(:only-of-type) {
font-size: 1.25em;
}
<ul>
<li></li><!-- не будет выбран -->
</ul>
<ul>
<li></li><!-- будет выбран -->
<li></li><!-- будет выбран -->
</ul>
:only-of-type
p:only-of-type { background: red; }
<div>
<p>параграф</p><!-- background: red; -->
</div>
<div>
<span>параграф</span><!-- не выделится, потому что X=p а не span -->
</div>
<div>
<span>параграф</span>
<p>текст</p><!-- background: red; -->
</div>
#1 Выберем ulтолько с одним элементом в списке.
ul > li:only-of-type { font-weight: bold; }
Немного практики
#1 Сложное выделение
<div>
<p>параграф</p>
<ul>
<li>Список 1 </li>
<li>Список 2 </li>
</ul>
<ul>
<li>Список 3 </li>
<li>Список 4 </li>
</ul>
</div>
Решение 1
ul:first-of-type > li:nth-child(2) { font-weight: bold; }
Решение 2
p + ul li:last-child { font-weight: bold; }
Решение 3
ul:first-of-type li:nth-last-of-type(1) { font-weight: bold; }
Наглядное пособие по селекторам типа :nth-child
Считаем элементы в блоке с помощью nth-child
Выбор диапазона элементов
ol li:nth-child(n+7):nth-child(-n+14) {
background: lightpink;
}

Справочник атрибутов CSS
|
Атрибут CSS
|
Функция
|
|---|---|
|
background
|
Атрибут фона
|
|
background-attachment
|
Как ведет себя фон при прокручивании страницы
|
|
background-color
|
Цвет фона
|
|
background-image
|
Фоновый рисунок
|
|
background-position
|
Положение фонового рисунка
|
|
background-repeat
|
Повторение фона
|
|
border
|
Форматирование границ (бордюра) элемента
|
|
border-collapse
|
Слияние границ таблицы
|
|
border-color
|
Цвет границ элемента
|
|
border-spacing
|
Расстояние между границами ячеек таблицы
|
|
border-style
|
Вид рамки элемента
|
|
border-width
|
Ширина линии рамки
|
|
bottom
|
Положение нижней границы элемента
|
|
caption-side
|
Положение заголовка таблицы
|
|
clear
|
Отмена обтекания элемента текстом
|
|
color
|
Цвет
|
|
cursor
|
Курсор
|
|
direction
|
Направление вывода текста
|
|
display
|
Вид отображаемого элемента
|
|
empty-cells
|
Границы и фон пустых ячеек таблицы
|
|
float
|
Стороны смещения и обтекания элемента
|
|
font
|
Шрифт
|
|
font-family
|
Семейство шрифта
|
|
font-size
|
Кегль (размер) шрифта
|
|
font-style
|
Начертание шрифта
|
|
font-variant
|
Малые прописные буквы
|
|
font-weight
|
Насыщенность шрифта
|
|
height
|
Высота
|
|
left
|
Расстояние от левого края
|
|
letter-spacing
|
Межсимвольный интервал
|
|
line-height
|
Межстрочный интервал
|
|
list-style
|
Вид списочного маркера
|
|
list-style-image
|
Адрес файла картинки, используемой в качестве списочного маркера
|
|
list-style-position
|
Положение маркера
|
|
list-style-type
|
Вид маркера
|
|
margin
|
Внешний отступ
|
|
max-height
|
Максимальная высота
|
|
max-width
|
Максимальная ширина
|
|
min-height
|
Минимальная высота
|
|
min-width
|
Минимальная ширина
|
|
overflow
|
Управление выводом содержания блочного элемента
|
|
padding
|
Внутренний отступ
|
|
position
|
Положение элемента
|
|
right
|
Расстояние от правого края
|
|
table-layout
|
Подгонка ячеек таблицы по высоте и ширине
|
|
text-align
|
Выравнивание по горизонтали
|
|
text-decoration
|
Оформление текста
|
|
text-indent
|
Красная строка
|
|
text-transform
|
Преобразование текста
|
|
top
|
Расстояние от верхнего края
|
|
vertical-align
|
Выравнивание по вертикали
|
|
visibility
|
Видимость
|
|
white-space
|
Отделение слов друг от друга
|
|
width
|
Ширина
|
|
word-spacing
|
Интервал между словами
|
|
z-index
|
Порядок вывода слоев
|
Строка поиска <input type="number"> name имя ключа параметра value значение ключа
Строка поиска <input type="number">
|
имя ключа параметра |
|
|
|
заблокировано изменение пользователем |
|
заблокированы доступ, изменение пользователем и передача данных текущего параметра |
|
поле не может быть пустым |
|
|
|
|
|
|
|
подсказка-заглушка |
|
|
|
автозаполнение. Можно его отключить или сделать более конкретизированным. |
|
список рекомендованных значений |
|
|
<form>
<input type="number">
<input type="submit">
</form>
- Поле
<input type="number">не подходит для текстовых строк, состоящих из 16 и более цифр, например, номера пластиковой карты, так как длинные числа от 9007199254740991 могут округляться.
Количество товара
-
увеличение и уменьшение значения числового поля с помощью кнопок пошагового изменения;
-
сообщение об ошибке при вводе букв и дробных чисел;
-
минимальное значение 1 шт.
<form><input type="number" min="1" value="1"> шт</form>
Чётные положительные целые числа
<form><input type="number" step="2" min="2"></form>
Нечётные положительные целые числа
<form><input type="number" step="2" min="1"></form>
Круглые числа
<form><input type="number" step="10"></form>
Десятичная дробь с плавающей запятой
<form><input type="number" step="any"></form>
Денежный формат цены: «рубли,копейки» с двумя знаками после запятой ₽
<form><input type="number" step="0.01" min="0" placeholder="0,00"> ₽</form>
Ограничить количество символов в поле до 5
<form><input type="number" min="-9999" max="99999"></form>
Уменьшить длину <input type=number>
Атрибуты minlength, maxlength и size не работают.
Необходимое количество символов в поле определяется атрибутами min, max и step:
<!-- Достаточно выделить место на 6 символов -->
<input type="number" min="0" max="100" step="0.01"/>
Указать ширину в CSS (свойство width):
<style>
#dva {
width: 6em;
}
</style>
<input type="number" min="0" max="100" step="any" id="dva"/>
Стрелки у <input type=number>
Чтобы стрелочки были изначально, а не только при :hover и :focus в Chrome
<style>
#pyat::-webkit-inner-spin-button,
#pyat::-webkit-outer-spin-button {
opacity: 1;
}
</style>
<input type="number" id="pyat"/>
Убрать стрелки
<style>
.raz {
-moz-appearance: textfield;
}
.raz::-webkit-inner-spin-button {
display: none;
}
</style>
<input type="number" class="raz"/>
Стилизация стрелок «вверх»/«вниз» CSS
<style>
#raz {
position: relative;
display: inline-block;
}
#raz input {
font-size: 1em;
-moz-appearance: textfield;
}
#raz input::-webkit-inner-spin-button {
display: none;
}
#raz span {
position: absolute;
}
@supports (clip-path: polygon(50% 30%, 10% 90%, 90% 90%)) {
#raz input {
padding-right: 1em;
}
#raz span {
right: 0;
width: 1em;
height: 50%;
background: rgb(70,70,70);
cursor: pointer;
}
#raz span:hover {
background: red;
}
#raz span:nth-of-type(1) {
top: 0;
clip-path: polygon(50% 30%, 10% 90%, 90% 90%);
}
#raz span:nth-of-type(2) {
bottom: 0;
clip-path: polygon(50% 70%, 10% 10%, 90% 10%);
}
}
</style>
<span id="raz">
<input type="number" value="0">
<span onclick="this.previousElementSibling.stepUp()"></span>
<span onclick="this.previousElementSibling.previousElementSibling.stepDown()"></span>
</span>
Запретить ввод в поле, чтобы можно было пользоваться только кнопками редактирования
<style>
.raz {
all: unset;
-moz-appearance: textfield;
width: 3em;
text-align: center;
}
.raz::-webkit-inner-spin-button {
display: none;
}
</style>
<button type="button" onclick="this.nextElementSibling.stepDown()">-</button>
<input type="number" min="0" max="100" value="1" readonly class="raz">
<button type="button" onclick="this.previousElementSibling.stepUp()">+</button>
Вместо <input type="number"> использовать <input type="text">
Виртуальная клавиатура с дробно-числовым вводом
Атрибут inputmode плохо поддерживается браузерами.
<input inputmode="decimal">
На IOS (iPhone) если атрибут patternимеет значение [0-9]* или \d*, то на мобильном телефоне будет дана цифровая клавиатура.
Для отправки формы, поле должно содержать только цифры
<form><input inputmode="decimal" pattern="-?(\d+|\d+.\d+|.\d+)([eE][-+]?\d+)?"></form>
Функционал с JavaScript
При наборе не числа value возвратит пустое значение. Браузер может позволить/вынудить пользователя набрать число с запятой «20,5», но value примет значение с точкой «20.5», искл., IE.
value (строка) =""; valueAsNumber (число) ="";
Запретить ввод букв
<input type="number" id="check" step="any"/>
<script>
document.getElementById('check').onkeydown = function (e) {
return !(/^[А-Яа-яA-Za-z ]$/.test(e.key)); // IE > 9
}
</script>
Только одна точка или одна запятая
<input type="number" step="any" id="shest2"/>
<script>
document.getElementById('shest2').onkeydown = function (e) {
if (e.currentTarget.value.indexOf(".") != '-1' || e.currentTarget.value.indexOf(",") != '-1') {
return !(/[.,]/.test(e.key));
}
}
</script>
Ограничить ввод двумя знаками после запятой
Цифры, вносимые после 2-го символа после запятой, сразу обрезаются, дабы не совершать лишних телодвижений.
<input type="number" oninput="up(this)" step="0.01"/>
<script>
function up(e) {
if (e.value.indexOf(".") != '-1') {
e.value=e.value.substring(0, e.value.indexOf(".") + 3);
}
}
</script>
Обрезать последний лишний символ
<input type="number" step="any" id="shest1"/>
<script>
document.getElementById('shest1').oninput = function () {
if (this.value.length > 7) this.value = this.value.substr(0, 7); // в поле можно ввести только 7 символов
}
</script>
Разделение цифр пробелом
Наберите любое многозначное число
<input oninput="this.nextElementSibling.innerHTML = new Intl.NumberFormat('ru').format(this.valueAsNumber)" type="number">
<output> </output>Таблица «безопасных» цветов
|
255.255.204
|
255.255.153 | 255.255.102 | 255.255.51 | 255.255.0 | 204.204.0 |
| FFFFCC | FFFF99 | FFFF66 | FFFF33 | FFFF00 | CCCC00 |
| 255.204.102 | 255.204.0 | 255.204.51 | 204.153.0 | 204.153.51 | 153.102.0 |
| FFCC66 | FFCC00 | FFCC33 | CC9900 | CC9933 | 996600 |
| 255.153.0 | 255.153.51 | 204.153.102 | 204.102.0 | 153.102.51 | 102.51.0 |
| FF9900 | FF9933 | CC9966 | CC6600 | 996633 | 663300 |
| 255.204.153 | 255.153.102 | 255.102.0 | 204.102.51 | 153.51.0 | 102.0.0 |
| FFCC99 | FF9966 | FF6600 | CC6633 | 993300 | 660000 |
| 255.102.51 | 204.51.0 | 255.51.0 | 255.0.0 | 204.0.0 | 153.0.0 |
| FF6633 | CC3300 | FF3300 | FF0000 | CC0000 | 990000 |
| 255.204.204 | 255.153.153 | 255.102.102 | 255.51.51 | 255.0.51 | 204.0.51 |
| FFCCCC | FF9999 | FF6666 | FF3333 | FF0033 | CC0033 |
| 204.153.153 | 204.102.102 | 204.51.51 | 153.51.51 | 153.0.51 | 51.0.0 |
| CC9999 | CC6666 | CC3333 | 993333 | 990033 | 330000 |
| 255.102.153 | 255.51.102 | 255.0.102 | 204.51.102 | 153.102.102 | 102.51.51 |
| FF6699 | FF3366 | FF0066 | CC3366 | 996666 | 663333 |
| 255.153.204 | 255.51.153 | 255.0.153 | 204.0.102 | 153.51.102 | 102.0.51 |
| FF99CC | FF3399 | FF0099 | CC0066 | 993366 | 660033 |
| 255.102.204 | 255.0.204 | 255.51.204 | 204.102.153 | 204.0.153 | 153.0.102 |
| FF66CC | FF00CC | FF33CC | CC6699 | CC0099 | 990066 |
| 255.204.255 | 255.153.255 | 255.102.255 | 255.51.255 | 255.0.255 | 204.51.153 |
| FFCCFF | FF99FF | FF66FF | FF33FF | FF00FF | CC3399 |
| 204.153.204 | 204.102.204 | 204.0.204 | 204.51.204 | 153.0.153 | 153.51.153 |
| CC99CC | CC66CC | CC00CC | CC33CC | 990099 | 993399 |
| 204.102.255 | 204.51.255 | 204.0.255 | 153.0.204 | 153.102.153 | 102.0.102 |
| CC66FF | CC33FF | CC00FF | 9900CC | 996699 | 660066 |
| 204.153.255 | 153.51.204 | 153.51.255 | 153.0.255 | 102.0.153 | 102.51.102 |
| CC99FF | 9933CC | 9933FF | 9900FF | 660099 | 663366 |
| 153.102.204 | 153.102.255 | 102.0.204 | 102.51.204 | 102.51.153 | 51.0.51 |
| 9966CC | 9966FF | 6600CC | 6633CC | 663399 | 330033 |
| 204.204.255 | 153.153.255 | 102.51.255 | 102.0.255 | 51.0.153 | 51.0.102 |
| CCCCFF | 9999FF | 6633FF | 6600FF | 330099 | 330066 |
| 153.153.204 | 102.102.255 | 102.102.204 | 102.102.153 | 51.51.153 | 51.51.102 |
| 9999CC | 6666FF | 6666CC | 666699 | 333399 | 333366 |
| 51.51.255 | 51.0.255 | 51.0.204 | 51.51.204 | 0.0.153 | 0.0.102 |
| 3333FF | 3300FF | 3300CC | 3333CC | 000099 | 000066 |
| 102.153.255 | 51.102.255 | 0.0.255 | 0.0.204 | 0.51.204 | 0.0.51 |
| 6699FF | 3366FF | 0000FF | 0000CC | 0033CC | 000033 |
| 0.102.255 | 0.102.204 | 51.102.204 | 0.51.255 | 0.51.153 | 0.51.102 |
| 0066FF | 0066CC | 3366CC | 0033FF | 003399 | 003366 |
| 153.204.255 | 51.153.255 | 0.153.255 | 102.153.204 | 51.102.153 | 0.102.153 |
| 99CCFF | 3399FF | 0099FF | 6699CC | 336699 | 006699 |
| 102.204.255 | 51.204.255 | 0.204.255 | 51.153.204 | 0.153.204 | 0.51.51 |
| 66CCFF | 33CCFF | 00CCFF | 3399CC | 0099CC | 003333 |
| 153.204.204 | 102.204.204 | 51.153.153 | 102.153.153 | 0.102.102 | 51.102.102 |
| 99CCCC | 66CCCC | 339999 | 669999 | 006666 | 336666 |
| 204.255.255 | 153.255.255 | 102.255.255 | 51.255.255 | 0.255.255 | 0.204.204 |
| CCFFFF | 99FFFF | 66FFFF | 33FFFF | 00FFFF | 00CCCC |
| 153.255.204 | 102.255.204 | 51.255.204 | 0.255.204 | 51.204.204 | 0.153.153 |
| 99FFCC | 66FFCC | 33FFCC | 00FFCC | 33CCCC | 009999 |
| 102.204.153 | 51.204.153 | 0.204.153 | 51.153.102 | 0.153.102 | 0.102.51 |
| 66CC99 | 33CC99 | 00CC99 | 339966 | 009966 | 006633 |
| 102.255.153 | 51.255.153 | 0.255.153 | 51.204.102 | 0.204.102 | 0.153.51 |
| 66FF99 | 33FF99 | 00FF99 | 33CC66 | 00CC66 | 009933 |
| 153.255.153 | 102.255.102 | 51.255.102 | 0.255.102 | 51.153.51 | 0.102.0 |
| 99FF99 | 66FF66 | 33FF66 | 00FF66 | 339933 | 006600 |
| 204.255.204 | 153.204.153 | 102.204.102 | 102.153.102 | 51.102.51 | 0.51.0 |
| CCFFCC | 99CC99 | 66CC66 | 669966 | 336633 | 003300 |
| 51.255.51 | 0.255.51 | 0.255.0 | 0.204.0 | 51.204.51 | 0.204.51 |
| 33FF33 | 00FF33 | 00FF00 | 00CC00 | 33CC33 | 00CC33 |
| 102.255.0 | 102.255.51 | 51.255.0 | 51.204.0 | 51.153.0 | 0.153.0 |
| 66FF00 | 66FF33 | 33FF00 | 33CC00 | 339900 | 009900 |
| 204.255.153 | 153.255.102 | 102.204.0 | 102.204.51 | 102.153.51 | 51.102.0 |
| CCFF99 | 99FF66 | 66CC00 | 66CC33 | 669933 | 336600 |
| 153.255.0 | 153.255.51 | 153.204.102 | 153.204.0 | 153.204.51 | 102.153.0 |
| 99FF00 | 99FF33 | 99CC66 | 99CC00 | 99CC33 | 669900 |
| 204.255.102 | 204.255.0 | 204.255.51 | 204.204.153 | 102.102.51 | 51.51.0 |
| CCFF66 | CCFF00 | CCFF33 | CCCC99 | 666633 | 333300 |
| 204.204.102 | 204.204.51 | 153.153.51 | 153.153.102 | 153.153.0 | 102.102.0 |
| CCCC66 | CCCC33 | 999966 | 999933 | 999900 | 666600 |
| 255.255.255 | 204.204.204 | 153.153.153 | 102.102.102 | 51.51.51 | 0.0.0 |
| FFFFFF | CCCCCC | 999999 | 666666 | 333333 | 000000 |
Управление цветом
|
Аквамарин
|
|
aqua
|
#00FFFF
|
|
Белый
|
|
white
|
#FFFFFF
|
|
Желтый
|
|
yellow
|
#FFFF00
|
|
Зеленый
|
|
green
|
#008000
|
|
Золотистый
|
|
gold
|
#FFD700
|
|
Индиго
|
|
indigo
|
#4B0080
|
|
Каштановый
|
|
maroon
|
#800000
|
|
Красный
|
|
red
|
#FF0000
|
|
Оливковый
|
|
oliv
|
#808000
|
|
Пурпурный
|
|
purple
|
#800080
|
|
Светло-зеленый
|
|
lime
|
#00FF00
|
|
Серебристый
|
|
silver
|
#C0C0C0
|
|
Серый
|
|
gray
|
#808080
|
|
Сизый
|
|
teal
|
#008080
|
|
Синий
|
|
blue
|
#0000FF
|
|
Ультрамарин
|
|
navy
|
#000080
|
|
Фиолетовый
|
|
violet
|
#EE80EE
|
|
Фуксиновый
|
|
fuchsia
|
#FF00FF
|
|
Черный
|
|
black
|
#000000
|
Градации красного
|
Код
|
Цвет
|
Код
|
Цвет
|
|
#010000
|
|
#800000
|
|
|
#100000
|
|
#900000
|
|
|
#200000
|
|
#A00000
|
|
|
#300000
|
|
#B00000
|
|
|
#400000
|
|
#C00000
|
|
|
#500000
|
|
#D00000
|
|
|
#600000
|
|
#E00000
|
|
|
#700000
|
|
#FF0000
|
|
Градации зеленого
|
Код
|
Цвет
|
Код
|
Цвет
|
|
#000100
|
|
#008000
|
|
|
#001000
|
|
#009000
|
|
|
#002000
|
|
#00A000
|
|
|
#003000
|
|
#00B000
|
|
|
#004000
|
|
#00C000
|
|
|
#005000
|
|
#00D000
|
|
|
#006000
|
|
#00E000
|
|
|
#007000
|
|
#00FF00
|
|
Градации синего
|
Код
|
Цвет
|
Код
|
Цвет
|
|
#000001
|
|
#000080
|
|
|
#000010
|
|
#000090
|
|
|
#000020
|
|
#0000A0
|
|
|
#000030
|
|
#0000B0
|
|
|
#000040
|
|
#0000C0
|
|
|
#000050
|
|
#0000D0
|
|
|
#000060
|
|
#0000E0
|
|
|
#000070
|
|
#0000FF
|
|
Градации оранжевого цвета
|
Код
|
Цвет
|
|
#FFB000
|
1
|
|
#FFA800
|
2
|
|
#FFA000
|
3
|
|
#FF9800
|
4
|
|
#FF9000
|
5
|
|
#FF8800
|
6
|
|
#FF8000
|
7
|
|
#FF7800
|
8
|
|
#FF7000
|
9
|
|
#FF6800
|
10
|
|
#FF6000
|
11
|
|
#FF5800
|
12
|
Трансформации в CSS. transform
CSS-свойство transform позволяет вам поворачивать, масштабировать, наклонять или сдвигать элемент. Оно модифицирует координатное пространство для CSS визуальной форматируемой модели.
Если свойство имеет значение, отличное от none, будет создан контекст наложения. В этом случае, элемент будет действовать как содержащий блок для любых элементов position: fixed; или position: absolute; которые он содержит.
Предупреждение: Только трансформируемый элемент может быть transform. Т.е. все элементы, шаблоны которых регулируются блочной моделью CSS, кроме : неизменяемые инлайновые блоки, блоки таблица-колонка, и блоки таблица-колонка-группа.
Синтаксис
/* Ключевые слова */
transform: none;
/* Значения функций */
transform: matrix(1, 2, 3, 4, 5, 6);
transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
transform: perspective(17px);
transform: rotate(0.5turn);
transform: rotate3d(1, 2, 3, 10deg);
transform: rotateX(10deg);
transform: rotateY(10deg);
transform: rotateZ(10deg);
transform: translate(12px, 50%);
transform: translate3d(12px, 50%, 3em);
transform: translateX(2em);
transform: translateY(3in);
transform: translateZ(2px);
transform: scale(2, 0.5);
transform: scale3d(2.5, 1.2, 0.3);
transform: scaleX(2);
transform: scaleY(0.5);
transform: scaleZ(0.3);
transform: skew(30deg, 20deg);
transform: skewX(30deg);
transform: skewY(1.07rad);
/* Мультифункциональные значения */
transform: translateX(10px) rotate(10deg) translateY(5px);
transform: perspective(500px) translate(10px, 0, 20px) rotateY(3deg);
/* Глобальные значения */
transform: inherit;
transform: initial;
transform: unset;
Свойство
transform
может быть указано как значение ключевого слова none или как одно или более значений <transform-function>.
Значения
<transform-function>
Одна или более применяемых функций CSS-трансформации. Функции трансформации умножаются в порядке слева направо, что означает, что составное трансформирование эффективнее применять в порядке справа налево.
none
Указывает, что трансформация не должна применяться.
Формальный синтаксис
transform =
none |
<transform-list>
<transform-list> =
<transform-function>+
Если
perspective()
является одним из мультифункциональных значений, оно должно быть указано первым.
Примеры
HTML
CSS
div {
border: solid red;
transform: translate(30px, 20px) rotate(20deg);
width: 140px;
height: 60px;
}
Результат
Что такое pointer-events
Свойство pointer-events позволяет авторам контролировать, может ли элемент быть целью событий указывающего устройства пользователя (указатель, например, мышь) или нет. Это свойство используется для указания того, при каких обстоятельствах (если таковые имеются) событие указателя должно проходить «сквозь» элемент и нацеливаться на то, что находится «под» этим элементом. Это также применимо к другим поведениям «проверки попадания», таким как динамические псевдоклассы (:hover, :active, :focus), гиперссылки и Document.elementFromPoint().
Таким образом pointer-events – это свойство, позволяющее контролировать когда, как и может ли вообще указатель устройства (чаще всего мышь) взаимодействовать с элементом.
pointer-events: none предотвращает события указателя (как правило, мыши) для элемента: hover, active, click и т.п., в том числе и JavaScript событие click.
pointer-events: auto восстанавливает стандартное взаимодействие указателя с элементом.
Есть и другие значения свойства pointer-events, но они используются только при работе с SVG и я их не буду здесь рассматривать.
Небольшая особенность pointer-events, которую обязательно нужно учитывать
Предположим, вы установили для элемента JavaScript отслеживание события click. Затем выставили для него свойство pointer-events: none, а после этого опять поменяли этому элементу значение свойства pointer-eventsна auto. Тогда JavaScript, вызываемый при событии onclick, будет вызван опять при изменении значения свойства pointer-events на auto.
Кроссбраузерность pointer-events
Pointer-events, на удивление, поддерживается многими версиями браузеров. Но всё же подобные свойства нужно использовать аккуратно, чтобы не лишать пользователей возможности пользоваться основными функциями web приложения в старых версиях браузеров.
Так как же использовать pointer-events без вреда для кроссбраузерности? Можно воспользоваться Modernizr библиотекой для определения поддержки браузера этого свойства. А можно принять во внимание, что по сути подобная проблема возникнет в старой версии IE (так как другие браузеры обычно автоматически обновляются) и воспользоваться условными комментариями, если это возможно (пример 3).
Применение CSS свойства pointer-events на практике
Применений pointer-events в верстке можно найти в принципе столько, насколько у верстальщика хватит фантазии и потребностей. Есть парочка применений, которые и мне кажутся полезными. Напишу о них подробнее.
1. Предотвращение взаимодействия с изображениями
Если, к примеру, вы не хотите, чтобы у пользователя была возможность кликнуть правой кнопкой мыши по размещенному на сайте фото, то вы можете воспользоваться свойством pointer-event. Спасет ли это от незаконного копирования? Вряд ли…но жизнь воришке слегка подпортит.
Правой картинке задано как раз свойство pointer-events. Попробуйте на практике покликать.
2. Ускорения скролла
Давненько уже было описано, что скролл – тяжелая процедура, при которой перерисовывается контент. Там же написано, что события для элемента такие, как hover, click и т.п. так же требуют перерисовки элементов, соответственно замедляют работу браузера.
3. Дизайн-элементы поверх интерактивных карт
Нарисовала я как-то дизайн, в котором ключевым элементом была карта. Сделала скриншот Google карты и наложила на нее пару теней для украшения:

Она понравилась моему начальнику и всё бы ничего..но вот в Illustrator я наложила на карту тени, а в вёрстке как быть? Тут на помощь как раз придёт CSS свойство pointer-events, который позволит наложить декоративные элементы поверх карты, при этом не “закрывая” области интерактивной карты от взаимодействия с пользователем. Как вы уже догадались, я просто добавлю строчку
pointer-events: none
в CSS к элементам теней. Как быть с IE, который не поддерживает это свойство до 11 версии? В данном случае я просто не стану для пользователей IE показывать эти тени.

