Статьи

Пишите лучше CSS с меньшими затратами

Less У меня есть признание: я думаю, что части CSS отстой. Это повторяющееся, утомительное и … ну, вроде тупое.

Я, например, считаю довольно нелогичным указывать стили потомков следующим образом:

#banner { color: white; background: black; } #banner a { color: yellow; } #banner p { margin: 0; } #banner ... #banner ... #banner ... 

… И так далее, и так далее. Вместо этого это имеет для меня больше смысла:

 #banner { color: white; background: black; a { color: yellow; } p { margin: 0em; } ... } 

А как насчет переменных? Они были бы крутыми

 @logo = #457301; h3 { color: @logo; } #sale { border: 1px solid @logo; } .alert { background: @logo; } 

Ты со мной? Что ж, Меньше обещает сделать эти мечты и больше счастливой реальностью. Вы бы написали таблицу стилей с использованием синтаксиса Less, который очень легко подобрать — это просто CSS с некоторыми дополнительными CSS-подобными дополнениями. Затем вы используете гем Less Ruby, чтобы преобразовать его в обычный CSS — запустите его из командной строки или включите в приложение.

Less позволяет вам использовать переменные и вложенные селекторы, как показано выше, но также предлагает способ включения классов в классы и некоторые простые математические операторы. Сладкий! Давайте разберем его с меньшими темпами и посмотрим, как он справляется с более простой таблицей стилей.

Допустим, я делаю таблицу стилей для достаточно распространенной структуры сетки, например:

Сетка: три вверху, четыре в центре, шесть внизу

Обычно я выбираю ширину для всей страницы (скажем, 960 пикселей — это популярный размер) и строю различные ширины на основе этого, возможно, действительно используя систему сетки из фреймворка. Я бы хотел, чтобы самые верхние блоки занимали одну треть ширины контейнера, второй набор — одну четверть, а нижние — одну шестую, поэтому я разделю соответствующим образом, используя свой удобный калькулятор. У меня есть определенный любимый зеленый, который я хотел бы использовать в качестве цвета заголовка для некоторых полей, цвета границы для вторичных заголовков и фона для нижнего колонтитула. Есть элемент, который выглядит как нижний колонтитул, но с другим шрифтом. О, и я хотел бы добавить некоторые базовые спецификации шрифтов в каждый из разделов — текст будет уменьшаться по мере того, как вы будете двигаться вниз. Все заводные:

 #container { width: 960px; } .box { float: left; } #main .box { width: 320px; } #main .box h3 { background: #450; } #secondary { font-size: 90%; } #secondary .box { width: 240px; border-bottom: 1px solid #450; } #footer { font-size: 80%; } #footer, #super { background: #450; color: #fff; } #footer .box { width: 160px; } #super { font-family: cursive; } 

Все отлично, пока я не решу, что хочу изменить ширину контейнера. Теперь мне нужно вернуться и отредактировать ширину container и каждого из потомков в main , secondary и footer . Затем я решил использовать фиолетовый вместо зеленого, поэтому мне нужно изменить цвет заголовков основных блоков, границ дополнительных блоков и фона нижних колонтитулов. Досадно!

Давайте представим, что вместо этого я использовал Less для этой задачи. Во-первых, конечно, мне нужно установить Less, это быстрая работа в командной строке:

 sudo gem install less 

Теперь я открою новый текстовый файл и начну писать Меньше. Я укажу
базовая ширина в переменной, @base :

 @base: 960px; 

И мой любимый цвет:

 @pretty: #450; 

Затем я буду использовать переменную @base чтобы указать ширину основного, дополнительного и нижнего полей, как часть этой общей ширины. Чтобы определить каждого из дочерних блоков каждого раздела, я буду использовать вложенные селекторы, чтобы определить, как я хочу, чтобы дочерние блоки каждого раздела отображались. Переменная @pretty используется везде, где мне нужно указать этот цвет. Вот остальная часть моего файла Less:

 #container { width: @base; } .box { float: left; } #main { .box { width: @base / 3; h3 { color: @pretty; } } } #secondary { font-size: 90%; .box { width: @base / 4; border-bottom: 1px solid @pretty; } } #footer { font-size: 80%; background: @pretty; color: #fff; .box { width: @base / 6; } } 

Поскольку super выглядит так же, как и footer , но с другим шрифтом, я буду использовать технику включения классов Less (они называют это mixin), чтобы сказать ей также включать эти объявления:

 #super { #footer; font-family: cursive; } 

Я создам файл CSS, используя это простое утверждение в командной строке:

 lessc mystylesheet.less 

В результате появляется таблица стилей с почти таким же содержимым, что и у меня, как обычно, описанным выше, за исключением моих объявлений footer и super объявлений. Вместо того, чтобы группироваться, общие декларации повторяются:

 #footer { font-size: 80%; background: #450; color: #fff; } #super { font-size: 80%; background: #450; color: #fff; font-family: cursive; } 

Подробнее об этом маленьком раздражении позже.

Теперь, так как Less создал почти одинаковую таблицу стилей, вам может быть интересно, куда я иду с этим. Ну, вот здесь мы и подошли к той части, где пришло время изменить свое мнение о ширине и цвете, и именно здесь Менесс действительно вступает в свои права. На этот раз мне нужно изменить только две строки в моей таблице стилей. Прежде всего, давайте настроим значение базовой переменной, например так:

 @base: 720px; 

Теперь давайте изменим зеленый цвет на фиолетовый:

 @pretty: #619; 

Теперь я могу оставить остальные объявления в покое и создать новый файл CSS. Для меня сделаны пересчеты ширины ящиков и замены цвета:

 #container { width: 720px; } .box { float: left; } #main .box { width: 240px; } #main .box h3 { color: #619; } #secondary { font-size: 90%; } #secondary .box { border-bottom: 1px solid #619; width: 180px; } #footer { font-size: 80%; background: #619; color: #fff; } #footer .box { width: 120px; } #super { font-size: 80%; background: #619; color: #fff; font-family: cursive; } 

Конечно, это очень простой пример. В реальном мире сложный шаблон на основе сетки может содержать десятки объявлений, основанных на одной фигуре; цветовая схема может вращаться вокруг двух или трех основных оттенков. Используя Less, мы можем рассматривать эти базовые определения как истинные переменные и тратить меньше времени на их поддержание.

Метод включения Less может быть более аккуратным, если он достаточно умен, чтобы сгруппировать общие элементы смешанных объявлений. С другой стороны, мне нравится то, как это получается здесь — мне нравится организовывать мою таблицу стилей в разделы в соответствии с назначением:

 /* heading styles */ ... /* main content styles */ ... /* footer styles */ ... 

Если в области заголовка есть стиль, который мне нравится, и я хочу, чтобы элемент в моем нижнем колонтитуле напоминал его, я бы предпочел не хранить этот элемент нижнего колонтитула в разделе заголовков. Если вы хотите быть умным и использовать сгруппированные селекторы, вам придется поместить оба этих стиля куда-нибудь. Удобство этой функции перевешивает эту небольшую неприятность для меня, и, конечно, использование миксинов абсолютно необязательно.

Мне нравится, когда умные люди придумывают отличные способы сэкономить время на CSS, и я вижу, что буду использовать этот отличный инструмент в будущем. Вы можете проверить Меньше на его веб-сайте.