CSS селекторы
Термин селектор может относиться к простому селектору (simple selector), составному селектору (compound selector), сложному селектору (complex selector) или списку селекторов.
К простым селекторам относятся:
Составной селектор — это последовательность простых селекторов, которые не разделены комбинаторами, т. е. за одним селектором сразу идёт следующий. Он выбирает элемент, который соответствует всем простым селекторам, которые он содержит. Селектор типа или универсальный селектор, входящий в составной селектор, должен быть расположен первым в этой последовательности. В составном селекторе допустим только один селектор типа или универсальный селектор.
Сложный селектор — это последовательность селекторов, которые разделены комбинаторами.
Список селекторов — это селекторы, перечисленные через запятую.
Комбинаторы
Для объединения простых CSS селекторов, используются комбинаторы, которые указывают взаимосвязь между простыми селекторами. Существует несколько различных комбинаторов в CSS2, и один дополнительный в CSS3, когда вы их используете, они меняют характер самого селектора.
| Комбинатор | Пример | Описание | CSS | |||
|---|---|---|---|---|---|---|
| элемент элемент | div span | Выбор всех элементов внутри , которые расположены сразу после элементов ol | Выбор всех элементов
Псевдо-классыПсевдо-класс – это простой селектор, который используется для выбора того, что не может быть выбрано с помощью других селекторов или может быть выбрано, но достаточно трудным способом. , который является первым дочерним элементом своего родителя. | 2 | ||
| :lang(язык) | p:lang(ru) | Выбор каждого элемента , который является первым из элементов своего родительского элемента. | 3 | |||
| :last-of-type | p:last-of-type | Выбор каждого элемента , который является последним из элементов своего родительского элемента. | 3 | |||
| :only-of-type | p:only-of-type | Выбор каждого элемента , который является единственным элементом своего родительского элемента. | 3 | |||
| :only-child | p:only-child | Выбор каждого элемента , который является единственным дочерним элементом своего родительского элемента. | 3 | |||
| :nth-child(n) | p:nth-child(2) | Выбор каждого элемента , который является вторым дочерним элементом своего родительского элемента. | 3 | |||
| :nth-last-child(n) | p:nth-last-child(2) | Выбор каждого элемента , который является вторым дочерним элементом своего родительского элемента, считая от последнего дочернего элемента. | 3 | |||
| :nth-of-type(n) | p:nth-of-type(2) | Выбор каждого элемента , который является вторым дочерним элементом своего родительского элемента. | 3 | |||
| :nth-last-of-type(n) | p:nth-last-of-type(2) | Выбор каждого элемента , который является вторым дочерним элементом своего родительского элемента, считая от последнего дочернего элемента. | 3 | |||
| :last-child | p:last-child | Выбор каждого элемента , который является последним элементом своего родительского элемента. | 3 | |||
| :root | :root | Выбор корневого элемента в документе. | 3 | |||
| :empty | p:empty | Выбор каждого элемента Псевдо-элементыПсевдо-элемент – это виртуальный элемент, который не существует в явном виде в дереве элементов документа. Псевдо-элементы используются для выбора тех частей элемента, которые не могут быть выбраны с помощью других селекторов, а также для стилизации не всего элемента, а отдельных его частей. Селекторы CSSВ CSS-селекторы используются для стилизации HTML элементов на веб-странице. Существует широкий выбор CSS-селекторов, позволяющий максимально точно отбирать элементы для стилизации. В этой статье и её подстатьях мы в мельчайших подробностях рассмотрим разные их типы и увидим, как они работают.
Что такое селекторы?Вы уже встречались с селекторами. Это выражения, которые говорят браузеру, к какому элементу HTML нужно применить те или иные свойства CSS, определённые внутри блока объявления стиля. В CSS селекторы определяются в спецификации CSS-селекторов; как и другие части CSS, нужно поддерживать их работу в браузерах. Большинство селекторов, которые вы встретите, определены в Спецификации селекторов 3 уровня, где вы сможете найти всю информацию о поддержке селекторов в браузерах. Несколько селекторовА могу написать короче — просто отделив селекторы запятыми: Пробел можно вставлять до или после запятой. Ещё удобнее писать каждый селектор с новой строки: В упражнении ниже объедините два селектора в одном правиле. Результат должен остаться таким же. При объединении селекторов таким образом, при условии если хоть один селектор будет недействительным, всё правило будет пропущено. В примере ниже правило для селектора класса не будет работать, в то время как h1 будет стилизован. Типы селекторовПонимание того, какой именно селектор вам нужен, очень помогает подобрать подходящий элемент. Сейчас мы разберём разные виды селекторов. Селекторы тегов, классов и идентификаторовК этой группе относятся селекторы HTML-элементов, таких как К группе относятся и селекторы классов: или селекторы идентификаторов (ID): Селекторы атрибутовЭта группа селекторов позволяет выбирать селекторы, основываясь на наличии у них конкретного атрибута элемента: или основываясь на значении атрибута: Псевдоклассы, псевдоэлементыК группе ещё относятся псевдоэлементы, которые выбирают определённую часть элемента (вместо целого элемента). Например, ::first-line всегда выбирает первую строку внутри элемента (абзаца в нашем случае), действуя, как если бы тег оборачивал первую строку, а затем был стилизован. КомбинаторыИ последняя группа селекторов: она позволяет объединять селекторы, чтобы было легче находить конкретные элементы внутри документа. В следующем примере мы отыскали дочерний элемент с помощью комбинатора дочерних элементов ( > ): ПродолжениеНиже можно просмотреть таблицу различных видов селекторов с соответствующими ссылками, или вы можете двинуться дальше: нас ждут селекторы тегов, классов и идентификаторов. Справка о селекторахВ таблице ниже — доступные сейчас селекторы, а также ссылки к страницам, где рассказывается, как использовать каждый из них. Я также добавил ссылки на страницы MDN для каждого селектора, чтобы вы могли проверить, поддерживаются ли они браузерами. Список всех Селекторов в CSSВ этой статье я постараюсь понятно объяснить что такое CSS селекторы и как использовать каждый из них. Здесь описаны все селекторы, которые нужно знать при работе с CSS. CSS селектор — это то что позволяет выбирать нужный элемент в HTML документе, чтобы потом применить к этому элементу CSS стили (полный список CSS стилей). CSS селекторы (список)элементы. | ||||
| tag.class | p.intro | Все элементы. | ||||
| tag tag | div p | Все прямой родитель которых который находятся сразу после которые находятся после =flower] | Все элементы в атрибуте title которых есть слово «flower». | |||
| [attribute |= value] | [lang|=en] | Все элементы атрибут lang которых начинается с «en». | ||||
| :active | a:active | Активная ссылка. | ||||
| ::after | p::after | Вставляет псевод-элемент в начале каждого элемента. | ||||
| ::before | p::before | Вставляет псевод-элемент в конце каждого элемента. | ||||
| :checked | input:checked | Все выбранные элементы. | ||||
| :default | input:default | Все элементы. | ||||
| :disabled | input:disabled | Все элементы. | ||||
| :empty | p:empty | Все пустые элемент в списке родительского элемента. | ||||
| ::first-letter | p::first-letter | Первая буква каждого элемента. | ||||
| ::first-line | p::first-line | Первая линия каждого элемента. | ||||
| :focus | input:focus | в котором находится курсор. | ||||
| :focus-visible | a:focus-visible | Фокус сработает, только если на кнопку перешли с клавиатуры через TAB. | ||||
| :focus-within | div:focus-within | Сработает на блоке, когда его внутренний элемент находится в фокусе. | ||||
| :hover | a:hover | Сслыка на которую наведена мышка. | ||||
| :in-range | input:in-range | Все со значением в пределах указанного диапазона. | ||||
| :indeterminate | input:indeterminate | Все в статусе indeterminate. | ||||
| :invalid | input:invalid | Все с недопустимым значением. | ||||
| :lang(language) | p:lang(it) | Все в списке родительского элемента. | ||||
| :link | a:link | Все непосещенные ссылки. | ||||
| :not(selector) | :not(p) | Все не элементы. | ||||
| :not(:only-child) | div:not(:only-child) | Все внутри которых больше одного элемента. | ||||
| :nth-child(n) | p:nth-child(2) | Второй элемент в списке родительского элемента. | ||||
| :nth-of-type(n) | p:nth-of-type(2) | Второй в списке родительского элемента. | ||||
| :nth-last-child(n) | p:nth-last-child(2) | Второй элемент в списке родительского элемента (счет идет с конца). | ||||
| :nth-last-of-type(n) | p:nth-last-of-type(2) | Второй в списке родительского элемента (счет идет с конца). | ||||
| :only-child | p:only-child | Единственный у родителя (других элементов быть не может). | ||||
| :only-of-type | p:only-of-type | Один у родителя (других элементы могут быть). | ||||
| :optional | input:optional | Все у которых нет артибута «required». | ||||
| :required | input:required | Все у которых указан атрибут «required». | ||||
| :out-of-range | input:out-of-range | Все со значением выходящим за указанный рэндж. | ||||
| ::placeholder | input::placeholder | Все у которых указан атрибут «placeholder». | ||||
| :read-only | input:read-only | Все у которых указан атрибут «readonly». | ||||
| :read-write | input:read-write | Все у которых не указан атрибут «readonly». | ||||
| :root | :root | Корен документа. | ||||
| ::selection | ::selection | Выберет текущее выделение текста мышкой. | ||||
| :target | #news:target | Выберет элемент с id=»news» когда к нему пришил по клику. | ||||
| :valid | input:valid | Все с валидным значением. | ||||
| :visited | a:visited | Все посещенные ссылки. |
меню
Описание CSS селекторов
Выбирает абсолютно все элементы. Например, такой код обнуляет внутренние и внешние отступы у всех элементов на странице:
* можно использовать в связке с другими селекторами. Например, выделим все дочерние элементы #container сплошной черной рамкой шириной 1px.
* создает повышенную нагрузку на скорость работы браузера, поэтому используйте его только по необходимости.
.class
У одного элемента может быть несколько классов (через пробел):
Идентификатор может быть присвоен только одному элементу на странице (если присвоить несколько, то мир не рухнет, но так делать не принято).
Следующий код устанавливает ширину и отступ элемента с идентификатором:
Селектор по ID имеет больший приоритет над селектором по классу (см. начало статьи). Поэтому по возможности используйте селекторы класса, это считается правилом хорошего тона и позволит при необходимости без лишних усилий «перебить» стили.
Селектор HTML тега. Применяться ко всем указанным элементам в документе. Часто используется для задания цвета, фона, шрифта и др.
Следующий код задает цвет текста для всех ссылок и отступы для UL списков:
Объединяет несколько селекторов, так чтобы указать всем выбранным селекторам одинаковые стили.
Следующий код задает цвет текста для заголовков h2 и ссылок в теге LI:
Это правило можно сочетать с идентификаторами и классами: body.opera a < color:blue; >.
Выбирает элементы Y, которые являются дочерними к X. Выбирается только первый уровень дочерних элементов.
Добавит отступ для li первого уровня, т.е. тех который является прямым потомком элемента ul :
Это правило не коснется
- .
Окрасит «текст 2» и «текст 3»:
Выбирает первый элемент Y, который находится после X (не вложен, а рядом). Стили будут применяться только к последнему элементу X.
a:link, a:visited, a:hover, a:active, a:focus
Выбирает элементы (обычно это поля формы или ссылки) в зависимости от их состояния.
Выбирает элементы, которые содержат указанный атрибут. Селектор атрибутов.
Окрасит только «текст»:
[attr = value]
Выбирает элементы, у которых есть атрибут с указанным значением. Селектор атрибутов с точным значением.
Окрасит только «текст»:
[attr *= value]
Выбирает элементы, у которых в значении указанного атрибута встречается указанная подстрока. Селектор атрибутов с плавающим значением.
Окрасит «текст» и «текст 2»:
[attr ^= value]
Выбирает элементы, у которых значение атрибута начинается с указанной строки. Селектор атрибутов со значением в начале.
Установит фоновую картинку только для «текст»:
Выбирает элементы, у которых значение атрибута заканчивается на указанную строку. Селектор атрибутов со значением в конце.
Например, выберем элементы, которые ссылаются на файлы определенного расширения.
Выбирает элементы, у которых в значении атрибута есть указанное слово. Селектор атрибутов с одним из значений разделенных пробелом.
Об этом селекторе не многие знают, а ведь он иногда очень удобен.
[attr |= value]
Выбирает элементы, у которых значение атрибута равно указанной строке или начинается с неё.
:target
:checked
Например, следующий код выделяет сплошной черной рамкой в 1px область возле включенного флажка:
:default
считается дефолтным ( :default ), если это элемент с атрибутом selected или первый enabled (NOT disabled) элемент по порядку DOM элементов. Для каждый selected элемент будет считаться дефолтным.
и считаются дефолтными, если они выбраны (имеют атрибут checked ).
Установим цвет фона элементов — все отключенные элементы SELECT с классом COUNTRY:
:enabled
Выбирает включенный (активный) элемент.
Элемент считается включён, когда с ним можно взаимодействовать (выбрать, кликнуть, сфокусироваться, вписать что-либо и т.д.). enabled включенными элементами считаются все не disabled элементы.
Примеры
Установим белый цвет фона для всех активных (enabled) элементов и серый для всех неактивных (disabled):
:empty
Выбирает любой пустой элемент. Пустой значит в нём не должно быть ничего (ни одной node): ни пробелов, ни текста, ни других элементов. HTML комментарии, CSS код не повлияют на то что элемент будет считать не пустой.
::before
X::before добавляет псевдо-элемент в начало X (внутрь тега). Работает вместе со свойством X::before < content:'' >, которое указывает содержание добавленного элемента. content нужно указывать даже если содержание пустое ( content:» ), т.к. элемент должен хоть что-то содержать.
Например с помощью таких стилей, можно указать значок для LI списка:
::after
X:after добавляет псевдо-элемент в конец X (внутрь тега). Работать только совместно со свойством X::after < content:'' >, которое указывает содержание добавленного элемента. content нужно указывать даже если содержание пустое ( content:» ), т.к. элемент должен хоть что-то содержать.
Например с помощью таких стилей, можно создать блок который будет очищать все вышестоящие обтекающие элементы. Частый прием в верстке:
:focus
Выбирает активный HTML элемент, тот который находится в фокусе. Обычно применяется к элементам формы. Может применяться к любым элементам переключение на которые возможно с клавиатуры или которые предназначены для пользовательского ввода данных.
В этом примере при перемещении курсора в поле его фон будет изменен на желтый:
В этом примере стили применяться к любой ссылке на которую был сдела клик:
В этом примере при перемещении курсора в поле его ширина будет постепенно увеличиваться со 100 до 250 пикселей:
:focus-visible
Применяется, когда элемент соответствует псевдоклассу :focus и браузер считает, что фокус должен быть очевиден на элементе.
:focus-within
Этот селектор полезен, например, для выделения всего контейнера
:hover
В следующем примере при наведении мышкой под ссылкой будет появляться черная линия толщиной 1px (замена свойству underline):
В следующем коде показано изменение цвета фона при наведении на элемент
:not(selector)
Следующий код выбирает для стилизации все элементы, кроме элемента p :
Выберет «элемент 1» и «элемент 2»:
::first-line, ::first-letter
#1 Выбираем первую букву в параграфе
Применит указанные стили для всех начальных букв всех абзацев в документе.
#2 Выбираем первую строку в абзаце
Применит указанные стили для всех начальных строк всех абзацев в документе.
:nth-child(n)
X:nth-child(n) выбирает каждый «n-ый» элемент Х, который находится на одном уровне с X. Считает все элементы на уровне X (неважно какой у элемента тег, т.е. любой тип, а не только тип X). Под типом подразумевается именно тег элемента (div, span, li), а не его класс или что-то еще.
Заметка: Есть такой же селектор :nth-of-type(n) разница между ними в том, что X:nth-child(n) считает все элементы на одном уровне, не важно какой тип указан в Х, а Х:nth-of-type(n) считает только элементы типа Х находящиеся на одном уровне. Например:
n = odd / even
Раскрасим четные и нечетные параграфы в разные цвета:
n = число
Установит красным цветом второй элемент:
Окрасит «Второй параграф.»:
n = выражение
Обратимся к каждому третьему элементу на текущем уровне, где расположены p:
:nth-last-child(n)
Выбирает начиная с конца. Работает точно также как и :nth-child(n) только отсчет идет не сверху, а снизу.
Следующий код установит красным цветом второй с конца параграф:
Окрасит «Второй параграф.»:
:nth-of-type(n)
Выбирает элемент по номеру указанному в «n». X:nth-of-type начинает отсчет от первого элемента типа X находящегося на одном уровне. Под типом подразумевается именно тег элемента (div, span, li), а не его класс.
Заметка: есть такой же селектор :nth-child(n) разница между ними в том, что X:nth-of-type(n) выберет только элементы типа Х находящиеся на одном уровне, а X:nth-child(n) считает все элементы всех типов на одном уровне, не важно какой тип указан в Х. Например:
#1 n = add / even
Раскрасим четные и нечетные параграфы в разные цвета. Считает именно параграфы без h1, как это делает :nth-child :
#2 n = число
Установит красным цветом второй элемент:
Окрасит «Второй параграф.»:
#3 n = выражение
Например: обратимся к каждому третьему элементу p на текущем уровне, где расположены p:
:nth-last-of-type(n)
Например: обратимся к каждому третьему элементу p с конца, на текущем уровне, где расположены p :
:first-child
X:first-child Выбирает первый элемент который находится на одном уровне с Х. Отсчет начинается с любого элемента не обязательно Х.
X:first-child это тоже самое что X:nth-child(1)
#1 Пример: обратимся к первому элементу в блоке #container
А вот так не выделит ничего:
#2 Обнуление границы
:last-child
X:last-child Выбирает первый с конца элемент который находится на одном уровне с Х. Отсчет начинается с любого элемента не обязательно X.
X:last-child это тоже самое что X:nth-last-child(1)
#1 Пример: обратимся к первому с конца элементу в блоке #container
А вот так ничего не выделит:
#2 Покрасим последний элемент li в списке ul в зеленый:
:first-of-type, :last-of-type
X:first-of-type это тоже самое что X:nth-of-type(1)
#1 Пример: обратимся к первому элементу div в блоке #container
#2 Обнуление границы
:first-of-type часто используется для обнуления свойства border на граничных элементах списка:
:only-child
X:only-child Выбирает элемент X, который единственный на уровне X. При подсчете элементов название тега X НЕ учитывается.
Другими словами: выбирает дочерние элементы X только, когда у родителя количество всех дочерних элементов (неважно какой тип) равно 1.
Выберем элемент, если он единственный в блоке:
:not(:only-child)
Это может пригодится, чтобы выбрать все элементы блока только в том случае, если в этом блоке больше чем один элемент.
В результате если у нас один элемент он НЕ будет выбран:
А если больше одного, то будут выбраны все:
:only-of-type
X:only-of-type Выбирает элемент X, который единственный на уровне X (не имеет соседей). При подсчете элементов учитывается название тега X.
Другими словами: выбирает дочерние элементы X только, когда у родителя количество всех дочерних элементов типа X равно 1.
#1 Выберем ul только с одним элементом в списке.
Немного практики
#1 Сложное выделение
У нас есть такой код:
Как обратиться к «Список 2»?
Решение 1
Код находит первый список, затем находит его прямого наследника и у которого порядковый номер в списке равен 2.
Решение 2
Использование соседних селекторов.
Браузер находит ul, следующий сразу за p, затем находит его последний дочерний элемент.
Решение 3
Это решение пожалуй самое правильное, потому что если между ul или li попадут другие теги, этот пример все равно будет выбирать нужный нам li:
Браузер выбирает первый ul (именно ul), затем находит первый с конца элемент li (именно li).
Наглядное пособие по селекторам типа :nth-child
Считаем элементы в блоке с помощью nth-child
Выбор диапазона элементов
Допустим, у вас есть список из 20 элементов и нужно выбрать элементы с 7 по 14 включительно. Это можно сделать вот так:
CSS-селекторы: Способы задавать CSS-стили для HTML-элементов
Всем привет, с вами Сергей Никонов и в этой статье я расскажу про CSS-селекторы и как с помощью них задавать CSS-стили для вашего сайта. Мы рассмотрим различные способы и правила, как с помощью CSS-селекторов задавать стили для HTML-страницы.
Это один из уроков курса HTML/CSS Advanced и если вы хотите научиться верстать веб-сайты на профессиональном уровене, я рекомендую проходить этот курс на сайте FructCode с интерактивными упражнениями для закрепления ваших знаний полученных из курса верстки сайтов.
Только на сайте FructCode вы можете найти актуальных версии моих курсов!
Что такое CSS-селекторы (CSS Selectors)
На первый взгляд вам может показаться, что определение CSS-селекторов сложное и непонятное. Но не волнуйтесь, на самом деле на практике все намного проще, чем кажется. И давайте сейчас на простых примерах рассмотрим что такое CSS-селекторы.
Видео Что такое CSS-селекторы: Способы задавать стили для HTML-элементов
Кстати, не забудь подписаться на наш YouTube канал FructCode, где вы можете найти много полезных обучающих видео о верстке сайтов.
Универсальный CSS-селектор * (звездочка)
С помощью универсального CSS-селектора * (звездочка) вы можете задавать правила какие CSS-стили применять сразу ко всем HTML тегам.
Пример кода, как задать с помощью универсального CSS-селектора * (звездочка) стили для всех HTML-элементов.
See the Pen BaWqwVm by Sergey Nikonov (@sergey-nikonov) on CodePen.
В итоге, ко всем HTML-тегам на странице, включая h1, span, div и другим применятся CSS-стили: размер шрифта 30px, цвет текста красный.
Универсальный CSS-селектор используется достаточно частно при создании верстки сайтов и вот почему. Дело в том, что пользователи используют различные браузеры: Google Chrome, Mozilla Firefox, Safari, Opera, Edge, различные мобильные браузеры и даже Internet Explorer старых версий. И каждый из браузеров может задавать свои CSS-стили для HTML-элементов по умолчанию. И та же HTML-форма будет выглядеть в разных браузерах по-разному.
И для того, чтобы ваш веб-сайт соответствовал макету дизайна сайта, обычно используют сброс стандартных стилей (reset css), которые задают браузеры. Reset CSS представляет набор CSS-стилей, который подключается к HTML-странице, в котором прописаны правила отображения для всевозможных HTML-элементов.
При применении Reset CSS или Normalize CSS, HTML-элементы выглядит примерно одинаково в большинстве браузеров.
CSS-селекторы по классу (Class selectors)
С помощью данного css-селектора вы можете задавать стили для HTML элементов у которых установлен тот или иной class.
Простой пример CSS-селектора по классу:
Запись CSS-стилей через точку «.» и без пробелов
А запись в виде div.color.text-color, когда без пробелов описывается несколько классов, обозначает, что стили применятся только к
Запись CSS-стилей через запятую «,»
Запись CSS-стилей через пробел (space)
А так, с помощью CSS-селекторов (комбинатор потомков или descendant combinator), когда вы указываете в CSS-стилях элементы через пробел, вы можете применить стили к html-элементам, которые находятся внутри этих html-элементов вне зависимости от вложенности.
Еще один пример для лучшего понимания как задать CSS-стили с помощью CSS-селекторов, когда вы пишите стили через пробел. Мы можем задать внутри
- всем тегам , независимо на каком уровне вложенности находится , фоновый цвет «gray»:
Запись CSS-стилей через знак больше «>»
При использовании комбинатора со знаком больше (>), CSS-стили задаются только для тех HTML-элементов, которые являются дочерними по отношению к задаваемому HTML-элементу.
Лучше понять как работает комбинатор “>” вам поможет пример.
Этот стиль применится только для первого потомка (child), но не будет работать для последующих:
Запись CSS-стилей через знак “
» можно выбирать все HTML-элементы, которые являются потомками указанного элемента.
Пример как с помощью записи CSS-стилей со знаком “
Запись CSS-стилей через знак плюс «+»
Если c помощью записи CSS-стилей со знаком “
» можно выбирать все HTML-элементы, которые являются потомками(child) указанного элемента, то с помощью записи плюс “+” можно выбрать только один HTML-элемент.
И вот простой пример:
Запись CSS-стилей для HTML-элемента по атрибуту
Имея название HTML-атрибута, мы можем задавать стили для данного HTML-элемента. Ярким примером может служить и мы можем задавать CSS-стили исходя из атрибута.
Например у нас есть какая-то html-форма и мы хотим задать разные CSS-стили для с разными type: text и password. Когда мы будем печатать текст в с типом text мы хотим задать цвет текста «green», а для с типом password мы хотим задать цвет текста «magenta». И с помощью CSS-селекторов по атрибуту мы можем это сделать:
Для HTML-элементов можно задавать атрибуты, которые мы можем и сами придумать. Атрибуты задаются для различных целей, когда нужно запрограммировать определенное поведение. И мы им также может задавать CSS-стили:
Вывод
Также рекомендуем подписаться на наш YouTube канал FructCode, где переодически появляются полезные материалы для обучения верстке сайтов и программированию.
С вами был Сергей Никонов, успехов в обучении!





