Лекции
September 14, 2021

Язык CSS: основы

Введение

CSS — язык для описания стилей документа, он как и HTML является декларативным. Для CSS существуют расширения: препроцессоры (SASS, LESS, Stylus) и постпроцессоры (PostCSS), но у современного CSS есть всё необходимое для того, чтобы можно было не использовать препроцессоры.

Декларативность

Так же, как и в HTML — мы формально описываем желаемый результат. Например, если мы хотим получить непрерывную красного цвета рамку вокруг элемента шириной 2 пикселя мы прямо так и напишем:

.border {
  border-style: solid;
  border-width: 2px;
  border-color: red;
}

Языковые конструкции

Основной языковой конструкцией в CSS являются именно стили, которые мы задаём тем или иным элементам. А для привязки к этим элементам используются селекторы. В примере выше — наш селектор будет искать любой элемент с классом "border". Существует несколько разных видов селекторов. Базовые это:

  • Селектор по тегу (пишется так: div)
  • Селектор по классу (пишется так: .border)
  • Селектор по id (пишется так: #id)

Так же существуют специфичные селекторы, которые могут заглядывать в атрибуты, например селектор input[type="email"] будет искать на странице все поля ввода с типом email. Есть и более сложные селекторы, как то:

  • * (выбирает ВООБЩЕ ВСЕ ЭЛЕМЕНТЫ на странице)
  • > (выбирает дочерний элемент по отношению к родительскому)
  • ~ (выбирает элементы, которые находятся на этом же уровне вложенности, после указанного элемента, с тем же родителем)
  • + (выбирает элемент, который находится непосредственно после указанного элемента, если у них общий родитель)
  • : (селектор по псевдоклассу, например: ::after, :hover)

Пример работы с селекторами

a:hover {/* ссылка в состоянии hover */}

ul + li {/* 
  выберет любой <li> элемент,
  который находится непосредственно
  после элемента <ul>
*/}

* {/* выберет любой элемент */}

#navbar {/* выберет элемент с id="navbar" */}

.navbar {/* выберет элемент с class="navbar" */}

ul > li {/*
  выберет только дочерние элементы <li>,
  которые находятся внутри, на первом уровне
  вложенности по отношению к элементу <ul>
*/}

p ~ span {/*
  выберет все элементы <span>, которые
  находятся после элемента <p> внутри одного родителя
*/}

p span {/*
  выберет все элементы <span>,
  которые лежат внутри элемента <p>
*/}

p, span {/*
  выберет все элементы <p> и <span>
*/}

a.link:not(.link-visited) {/*
  выберет все элементы <a> с классом "link",
  у которых отсутствует класс "link-visited"
*/}

Что почитать?

Ссылка на презентацию: https://docs.google.com/presentation/d/12XGe0u1SJu7PkGuYCl_V_sIpYhhs3iZ2OYAdd07Or3o/edit?usp=sharing