Введение
Хотя CSS-подобных языков не так уж и много – на слуху и на плаву сейчас и вовсе одни Sass и Less, я все же начну с ответа на вопрос «А зачем нужен еще один?».
Если коротко, то TeaCSS не плодит новых сущностей, ведь этот тот же CSS, в который в качестве языка добавили JavaScript.
У этого подхода есть свои плюсы и минусы.
Плюсы – практически никаких подводных камней. Файл tea преобразуется в JavaScript, наполненный простыми командами вывода. Этот JavaScript можно отлаживать, смотреть в FireBug и вообще его поведение предсказуемо. В этом и состоит очевидность подхода, в вебе уже и так превалирует JS, поэтому вам не придется учить ничего нового.
Минусы – вы все-таки лишаетесь некоторых сущностей предметной области CSS, таких как «пиксели», «проценты» и т.п. Вы работаете с CSS именно как с текстом. Придется писать width:@{100+200}px, а не width: 100px + 200px.
TeaCSS – это именно шаблонизатор или препроцессор CSS, а не новый язык, который нужно учить. В этом его сила и слабость.
Я планировал написать несколько статей, в которых с нарастающей сложностью будет рассказываться про язык и те задачи, для которых он был разработан.
В этой (первой) статье, я расскажу по то, как включить TeaCSS в ваш цикл разработки и покажу с примерами то, что не умеют делать Sass и Less, но умеет герой сегодняшней статьи.
Короткий туториал
Для тех, кто пользуется Sass и Less, можно читать по диагонали.
Есть всего 3 простых вещи, который позволяют описать TeaCSS. Это:
- Внедренный яваскрипт
- Вложенные правила
- Миксины (необязательны и могут заменены на п.1 )
Внедренный яваскрипт
Во время процессинга CSS вы можете исполнить любой JS-код. Он будет исполнен ровно как написано. При помощи этого вы можете объявлять переменные, функции, делать циклы, чтоб объявить схожие правила, генерировать картинки, рисовать вспомогательные интерфейсы, да и вообще – делать что душе угодно.
Исполнять код просто:
/* однострочный код */
@ var baseColor = 'red';
Или так:
/* много строчек */
@{
var baseColor = ‘red’;
var borderColor = darken(‘red’,20);
}
Потом внутри любого CSS правила вы можете использовать JS-выражения.
Например:
body { color: @baseColor; } // для простых выражений, или
/* со скобками @{} чтоб явно указать конец выражения */
body { color: @{lighten(baseColor,Math.sin(3.14)); }
Вложенные правила
Позволяют писать составные селекторы лесенкой.
/* TeaCSS */
#header {
h1 {
font-size: 26px;
font-weight: bold;
}
p { font-size: 12px;
a {
text-decoration: none;
&:hover { border-width: 1px }
}
}
}
Миксины
Синтаксический сахар, похожи на LESS-овские. Позволяют сохранить набор правил для использования в другом контексте с параметрами.
.my_mixin(color) { // - это лишь сахар для my_mixin = function (color) {
color: @color;
}
body {
.my_mixin('red');
}
За более подробными объяснениями отсылаю на сайт – teacss.org
Как подключить к своему проекту
Очень важно понимать, что teacss не претендует на то, чтоб становится заменой CSS в продакшене, это именно решение для разработки, поэтому должен существовать как способ превращения TeaCSS в обычный CSS, так и способ посмотреть, что получается прямо в браузере.
Для просмотра все просто.
<link tea="style.tea">
<script src="teacss.js"></script>
И вуаля, вы увидите превью вашего стиля на текущей странице. В своих проектах я использую что-то вроде.
<? if $applicationMode=='development' ?>
<link tea="style.tea">
<script src="teacss.js"></script>
<? else ?>
<link type="text/css" rel="stylesheet" href="style.css">
<? endif ?>
Остается вопрос, как превратить *.tea в *.css
В ранних версиях для этого была консольная утилита, но т.к. TeaCSS стал поддерживать различные чисто-браузерные фишки, вроде Canvas, то было решено оставить этот вопрос на откуп разработчику. Вы можете вывести простой интерфейс для сохранения файла и решить, что делать с полученным текстом. В целом это часть большой концепции «Ваш код – это и есть ваша IDE», о которой я расскажу в дальнейших статьях, а пока просто добавьте в дев-версию верстки что-то вроде:
<script>
teacss.buildCallback(function(files){
$.post(location.href,{css:files['default.css']});
});
<? if (isset($_POST['css']) file_put_contents('your/location/style.css', $_POST['css']) ?>
</script>
Аналогично, на других серверных языках (кстати, pull request-ы приветствуются).
Создание картинок на лету
Первый и единственный в этой статье фокус.
По сути, встроенный в teacss Canvas – это обертка над канвасом браузера, такая обертка, которая позволяет использовать WebGL и обычный двумерный контекст для генерирования изображений.
При переводе *.tea в *.css вы можете сохранить сгенерированную картинку в файл. Зачем это нужно?
Рассказывая о переменных в CSS и приводя примеры DRY подхода к разработке разработчики того же LESS лукавят. Не всякий дизайн можно сверстать чистым CSS, сайты, где это достижимо скорее в меньшинстве. Большая часть хитрых бордюров, фонов, шапок и т.п. тоже зависят от этих переменных (базовых цветов, например), поэтому после простой замены значения, вам нужно открывать Фотошоп и перерисовывать или изменять графику для сайта.
С teacss вы можете сделать графику параметрической тоже (пример из документации):
@ color1 = 'red';
@ color2 = 'blue';
body {
@{
// pretty clear here, huh?
var canvas = new Canvas("background.png");
canvas.replaceColors( {
'#ffae00':color1,
'#f7e7ba':lighten(color1,30),
'#705551':color2
});
// display
canvas.background('bg.png');
}
}
Для более полного понимания принципу покажу генерацию фона с 0. Например, полосатого фона. Кстати, можно оформить как миксин и потом использовать в последующих проектах.
.background_striped(size,width,color) {
@{
(new Canvas(size,size))
.draw2D(function(ctx){
ctx.beginPath();
ctx.lineWidth = width;
ctx.strokeStyle = color.toString();
ctx.moveTo(-size,-size); ctx.lineTo(size*2,size*2);
ctx.moveTo(-size-size,-size); ctx.lineTo(size,size*2);
ctx.moveTo(-size+size,-size); ctx.lineTo(size*3,size*2);
ctx.stroke();
})
.background();
}
}
И вот пример использования:
teacss.org/stripes.htm
Заключение
Как, наверное, стало понятно из предыдущего раздела, teacss – это не совсем шаблонизатор CSS т.к. выдает на выход, например, еще и картинки. Скажу больше, его можно использовать как универсальный шаблонизатор и генерировать им мобильные интерфейсы, шаблоны и скрипты.
Как раз про это и про архитектуру самого проекта я расскажу в следующей статье.
P.S.
Я решил написать эту статью т.к. по сути делаю вещи очень похожие одновременно на последний проект Adobe — Brackets и на кикстартеровский Light-table. Но есть несколько отличий и мне кажется, что они могут быть ключевыми, чтоб рассказать про них, нужно начать с библиотеки, которая лежит в основе проекта — teacss. Надеюсь найти на хабре единомышленников и помощников/партнеров этот самый большой проект.
Автор: boomyjee