css-менеджмент в 2016
TRANSCRIPT
CSS-менеджмент в 2016Тимофей Чаптыков
[email protected] @chaptykov
Стили
Неотъемлемая и неотделимая часть приложения.
• Стили должны подчиняться правилам экосистемы JavaScript
• JavaScript-приложение должно учитывать специфику работы со
стиялми
12
SMACSS by Johnathan Snook
<header class="l-header">
<div class="block">
<div class="block-elem is-modified"></div>
</div>
</header>
21
BEMIT by CSS Wizardy
<div class="o-obj@md c-block c-block--mod">
<p class="o-obj__elem@md c-block__elem">
Lorem ipsum
</p>
</div>
22
Atomic CSS by Yahoo
<div class="foo Bd C(#0280ae) Ta(c)">
<p class="Op(0) foo:h>Op(1)">Lorem ipsum</p>
</div>
23
CSS как js-модуль
import './block.css';
import React from 'react';
export const Block = () => {
return <div className="foo" />;
};
29
CSS-модули
import s from './block.css';
import React from 'react';
export const Block = () => {
return <div className={s.foo} />;
};
34
Конфигурация Webpack
{ test: /\.css$/, loader: 'style!css-loader?modules&importLoaders=1&' + 'localIdentName=[name]__[local]___[hash:base64:5]' }
35
Результат
<style>
.block__foo___bg5ax { /* rules are here */ }
</style>
…
<div class="block__foo___bg5ax"></div>
36
Уместное переиспользование
:root {
--linkHoverColor: blue;
}
header {
background: var(—linkHoverColor); /* ? */
}
39
Инструментирование
Возможность отслеживания или установления количественных
параметров уровня производительности программного продукта,
а также возможность диагностировать ошибки и записывать
информацию для отслеживания причин их возникновения.
42
Инструментирование
Возможность отслеживания или установления количественных
параметров уровня производительности программного продукта,
а также возможность диагностировать ошибки и записывать
информацию для отслеживания причин их возникновения.
43
Инструментирование
• Низкий уровень — код, конструкции языка
• Высокий уровень — абстракции приложения
Условная терминология
44
Диагностика ошибок
• JSHint
• JSLint
• JSCS
• ESLint
46
Диагностика ошибок
• JSHint
• JSLint
• JSCS
• ESLint �
48
Проверка стиля кода в JS
function() {
var foo = 1;
var bar = 2;
}
Expected indentation of 4 spaces
52
Другие вопросы
• Сколько селекторов в ваших стилях?
• Какая максимальная специфичность?
• Сколько видов цветов используется в ваших стилях?
54
Оптимизация CSS
• CSSO
• clean-css
• cssnano
56
CSSO — минимизируем CSS Доклад Романа Дворнова на WSD
57
Инструментирование CSS
• Встроенные стили или отдельный бандл?
• Разделение на чанки?
• Асинхронная загрузка стилей?
• Кеширование в localStorage?
• Critical CSS?
60
Инструменты
• CSSComb
• postcss-sort
• Stylelint для проверки
68
Порядок блоков в CSS
• Константы сверху
• Селекторы по порядку их использования в DOM
• Анимации и медиавыражения вниз
70
:root { --color: red;}
.foo { color: var(--color); animation: fade 1s ease; }
@keyframes fade { from { opacity: 0; } to { opacity: 0; }}
71
.foo { line-height: 2; font-size: 14px; top: 50%; margin-left: -20px; width: 40px; margin-top: -20px; font-family: Helvetica, Arial, sans-serif; font-weight: bold; left: 50%; height: 40px; text-align: center; position: absolute; } 75
.foo { position: absolute; top: 50%; left: 50%; margin-top: -20px; margin-left: -20px; width: 40px; height: 40px; font-size: 14px; line-height: 2; font-family: Helvetica, Arial, sans-serif; font-weight: bold; text-align: center; } 76
Используем сокращенную запись.foo { position: absolute; top: 50%; left: 50%; margin: -20px 0 0 -20px; width: 40px; height: 40px; font: bold 14px/2 Helvetica, Arial, sans-serif; text-align: center; }
77
postcss-short
.foo {
position: absolute 50% * * 50%;
margin: -20px 0 0 -20px;
size: 40px;
font: bold 14px/2 Helvetica, Arial, sans-serif;
text-align: center;
}
78
До.foo { background-image: linear-gradient( to bottom, #000000 0%, #000000 50%, #ffffff 50%, #ffffff 100% );}
80
.foo {
display: block;
}
/**
* - Переопределяем поведение строкового элемента?
* - Переопределяем вышестоящее правило?
* - Просто лишнее правило? На всякий случай?
*/
85
Соглашения
• Не пишем значения по умолчанию
• Использование каждого правила должно быть обосновано
86
.foo {
margin-top: 20px;
}
/**
* - Какие значения для остальных отступов?
* - Переопределяем браузерные свойства (h1, ul)?
*/
87
Соглашения
• По умолчанию полная запись правила
• Отдельная запись для переопределния или сохранения
определенных выше правил
88
Выводы
• Прислушиваемся к экосистеме
• Используем компонентный подход
• Оставляем возможности для инструментирования
• Пишем для завтрашнего себя
90