Статьи

Введение в Sass в Rails

Sass (Syntaxically Awesome Stylesheets) — очень удобная реализация CSS. В моем предыдущем посте я дал широкий обзор Sass. Здесь я опишу более подробно функции, найденные в Sass. Я писал, что Sass позволяет использовать переменные для хранения шестнадцатеричных значений и выполнения арифметических операций с цветами, что снижает сложность, но также может сделать гораздо больше.

гнездование

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

#container p {
color: #6E6E6F;
width: 97%;
.tab {
margin-top:30px;
background-color: #ff0000;
color: #000000;
}
}

view raw
gistfile1.scss
hosted with ❤ by GitHub

теперь можно скомпилировать в:

#container p {
color: #6E6E6F;
width: 97%; }
#container p .tab {
margin-top:30px;
background-color: #ff0000;
color: #000000; }

view raw
gistfile1.scss
hosted with ❤ by GitHub

Справочные операторы

Еще одна полезная функция в Sass — оператор ссылки (&). Оператор ссылки позволяет ссылаться на родительские селекторы, что может быть очень полезно при необходимости вызова непосредственного родительского селектора, как показано ниже.

.test {
a {
color: #736F6E;;
&:hover { color: #ff9933; }
&:visited { color: #336699; }
}}

view raw
gistfile1.scss
hosted with ❤ by GitHub

может быть скомпилировано в:

.test a {
color: #736F6E; }
.test a:hover {
color: #ff9933; }
.test a:visited {
color: #336699; }

view raw
gistfile1.css
hosted with ❤ by GitHub

В приведенном выше случае оператор & был заменен непосредственным родительским селектором a .

Sass также позволяет вкладывать свойства из одного и того же пространства имен. Например, border-left, border-right, border-radius и border-style все связаны с пространством имен границ, и все, что нужно сделать, это упомянуть пространство имен один раз и вложить свойства.

.test {
border:{
style: solid;
left: thick double #ff0000;
right:
{
width:thick;
color:#00ff00;
}
}
}

view raw
gistfile1.scss
hosted with ❤ by GitHub

составлен в

.test {
border-style: solid;
border-left: thick double #ff0000;
border-right-width: thick;
border-right-style: double;
border-right-color: #00ff00; }

view raw
gistfile1.css
hosted with ❤ by GitHub

Если Sass не выглядит привлекательным для вас (пока), вот что-то намного лучше: элегантное навигационное меню в Sass. Я использовал все удивительные функции, обсуждаемые в этом уроке. Кроме того, попытка декодировать его в CSS должна помочь вам лучше понять Sass.

/*This is a clean gradient menu purely based on CSS3 */
$lightgrey: #A8ACAD; //assigning colors to variables
$darkgrey:#736F6E;
div#header
{
background:-webkit-gradient(linear, left top, left bottom, from($lightgrey), to($darkgrey)); //gradient for the navigation menu
background: -moz-linear-gradient(top, $lightgrey, $darkgrey);
border:
{ //nesting properties of a specific namespace
radius: 10px;
left: 1px solid rgba(0, 0, 0, 0.1);
right: 1px solid rgba(255, 255, 255, 0.1);
}
box:
{
shadow: 5px 5px 20px #a5a5a5;
}
width: 95%;
height: 50px;
margin:
{
left: 10px;
right: 20px;
}
ul
{
padding: 0;
margin: 0;
float: left;
}
li
{
float: left;
list-style: none;
a
{
&:link // reference operator in action
{
display: block;
text:
{
decoration: none;
align: center;
shadow: 0px 0px 10px #000;
}
height: 35px;
width: 95px;
padding:
{
top: 15px;
left: 10px;
right: 10px;
}
color: #ffffff;
font:
{
weight: bold;
}
border:
{
left: 1px solid rgba(255, 255, 255, 0.1);
right: 1px solid rgba(0, 0, 0, 0.1);
}
}
&:visited
{
color: #ffffff;
font:
{
weight: bold;
}
border:
{
left: 1px solid rgba(255, 255, 255, 0.1);
right: 1px solid rgba(0, 0, 0, 0.1);
}
text:
{
shadow: 0px 0px 10px #000;
}
}
&:hover
{
color: orange;
text:
{
shadow: 0px 0px 10px #000;
}
}
}
}
}//Sass is simply good, right?

view raw
gistfile1.scss
hosted with ❤ by GitHub

Вот версия CSS.

/*This is a clean gradient menu purely based on CSS3 */
div#header {
background: -webkit-gradient(linear, left top, left bottom, from(#a8acad), to(#736f6e));
background: -moz-linear-gradient(top, #a8acad, #736f6e);
border-radius: 10px;
border-left: 1px solid rgba(0, 0, 0, 0.1);
border-right: 1px solid rgba(255, 255, 255, 0.1);
box-shadow: 5px 5px 20px #a5a5a5;
width: 95%;
height: 50px;
margin-left: 10px;
margin-right: 20px; }
div#header ul {
padding: 0;
margin: 0;
float: left; }
div#header li {
float: left;
list-style: none; }
div#header li a:link {
display: block;
text-decoration: none;
text-align: center;
text-shadow: 0px 0px 10px #000;
height: 35px;
width: 95px;
padding-top: 15px;
padding-left: 10px;
padding-right: 10px;
color: #ffffff;
font-weight: bold;
border-left: 1px solid rgba(255, 255, 255, 0.1);
border-right: 1px solid rgba(0, 0, 0, 0.1); }
div#header li a:visited {
color: #ffffff;
font-weight: bold;
border-left: 1px solid rgba(255, 255, 255, 0.1);
border-right: 1px solid rgba(0, 0, 0, 0.1);
text-shadow: 0px 0px 10px #000; }
div#header li a:hover {
color: orange;
text-shadow: 0px 0px 10px #000; }

view raw
gistfile1.css
hosted with ❤ by GitHub

Возможно, вы заметили однострочные (//) и многострочные комментарии (/ * * /), которые я использовал во фрагменте кода. Комментарии Sass аналогичны тем, что встречаются в C ++, и они помогают улучшить читаемость исходного кода. CSS поддерживает блочные / многострочные комментарии. Однако он пока не поддерживает однострочные комментарии, поэтому они были удалены из исходного кода во время компиляции, как видно из фрагмента CSS в меню навигации.

функции

Функции лежат в основе всех языков программирования. У Sass есть много таких функций, включая RGB, HSL, прозрачность и другие цвета, строковые, числовые и списочные функции. Одной из полезных функций является триплет RGB, который можно преобразовать в шестнадцатеричное значение цвета с помощью функции rgb($red,$green,$blue) , как показано ниже.

p {
color: rgb(0, 255, 255);
}

view raw
gistfile1.scss
hosted with ❤ by GitHub

составлен в

p {
color:#00ffff; }

view raw
gistfile1.css
hosted with ❤ by GitHub

Есть также функции для смешивания цветов ( mix($color1, $color2, $weight) ) и извлечения компонентов цвета из заданного шестнадцатеричного значения, но мои личные избранные перечислены ниже.

opacify($color, $value)

Как следует из названия, opacify делает цвет более непрозрачным. $ color должен быть в формате rgba, а значение $ должно быть в диапазоне от 0 до 1.

transparentize($color,$value)
Эта функция преобразует цвета, делая их более прозрачными, уменьшая непрозрачность базового цвета $ с заданным значением $ . Другие включают в себя:

  • lighten($color, $value)
  • darken($color, $value)
  • saturate($color, $amount)
  • grayscale($color)

Sass также имеет математические функции, которые позволяют округлять до ближайшего целого числа, чтобы вычислить абсолютные значения и проценты. Они очень полезны при изменении цветов и расчете полей и отступов для элементов CSS. Подробнее можно прочитать здесь

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

интерполирование

Интерполяция также расширяет область видимости переменных в Sass. Например, он разрешает размещение переменных в селекторах, свойствах и пространствах имен. Ниже приведен такой пример.

$side:top;
$name: border;
$rad:7px;
.footer-#{$name}
{
background-color: #CCCCCC;
#{$name}-radius: $rad;
-moz-#{$name}-radius:$rad;
-webkit-#{$name}-radius: $rad;
#{$name}#{$side}: 2px double #fff000;
#{$name}-bottom: 2px double #fff000;
width: 95%;
}

view raw
gistfile1.scss
hosted with ❤ by GitHub

Вывод CSS:

.footer-border
{
background-color: #878382;
border-radius: 7px;
-moz-border-radius: 7px;
-webkit-border-radius: 7px;
border-top: 2px double #fff000;
border-bottom: 2px double #fff000;
width: 95%;
}

view raw
gistfile1.css
hosted with ❤ by GitHub

Примеси

Разработчики Ruby могут быть знакомы с миксинами, синонимичными с абстрактными базовыми классами. Существование миксинов является веской причиной для использования Sass поверх CSS. Миксины могут содержать что угодно, включая селекторы, содержащие свойства и родительские ссылки, правила, функции и даже принимать аргументы, что позволяет повторно использовать код. Они приведены ниже.

@mixin borderstuff
{
$name: border;
$rad:7px;
background-color: #CCCCCC;
#{$name}-radius: $rad;
-moz-#{$name}-radius:$rad;
-webkit-#{$name}-radius: $rad;
#{$name}-top: 2px double #fff000;
#{$name}-bottom: 2px double #fff000;
width: 95%;
}
div#header { @include borderstuff };
div#footer { @include borderstuff};

view raw
gistfile1.scss
hosted with ❤ by GitHub

Вывод CSS ниже.

div#header {
background-color: #CCCCCC;
border-radius: 7px;
-moz-border-radius: 7px;
-webkit-border-radius: 7px;
border-top: 2px double #fff000;
border-bottom: 2px double #fff000;
width: 95%; }
div#footer {
background-color: #CCCCCC;
border-radius: 7px;
-moz-border-radius: 7px;
-webkit-border-radius: 7px;
border-top: 2px double #fff000;
border-bottom: 2px double #fff000;
width: 95%; }

view raw
gistfile1.txt
hosted with ❤ by GitHub

Это очень впечатляет. Как уже упоминалось, mixins также может иметь аргументы, которые являются параметрами, передаваемыми в mixin, которые присваиваются значению при каждом вызове mixin, как показано ниже.

@mixin borderstuff ($bgcolor, $radius, $bordercolor)
{
background-color: $bgcolor;
border-radius: $radius;
-moz-border-radius:$radius;
-webkit-border-radius: $radius;
border-top: 2px double $bordercolor;
border-bottom: 2px double $bordercolor;
width: 95%;
}
div#header{ @include borderstuff(#cccccc, 10, #fff000)}

view raw
gistfile1.txt
hosted with ❤ by GitHub

В приведенном выше примере $bgcolor было присвоено значение #cccccc , $radius было 10, а $bordercolor было #fff000 .

Mixins также поддерживают аргументы по умолчанию. Например, @mixin borderstuff($bgcolor,$radius:10, $bordercolor) имеет аргумент значения по умолчанию, определенный для аргумента $radius . Если значение $radius не передается при вызове mixin, вместо него используется аргумент по умолчанию.

Директивы @import

С динамическими сайтами таблицы стилей растут со временем. В результате большинство веб-дизайнеров предпочитают разбивать таблицы стилей на несколько файлов и связывать их вместе, используя директиву CSS @import . Но проблема заключается в том, что каждая таблица стилей делает определенный HTTP-запрос, тем самым замедляя общее время загрузки веб-страницы. Отличным решением Sass для этого является использование директивы @import , которая связывает таблицы стилей вместе и преобразует их в отдельные файлы CSS.

Кроме того, @import также импортирует все переменные и миксины, определенные в таблице стилей, делая их доступными в основной таблице стилей.

Как уже говорилось ранее, все таблицы стилей можно поместить в каталог app / assets / stylesheets, а rails будет управлять остальными даже без директивы @import . Например:

@import «foo.scss«;

view raw
gistfile1.scss
hosted with ❤ by GitHub

Чтобы импортировать несколько файлов

@import «foo« «bar«; //the extension is optional and sass would look for foo.scss and bar.scss in the current directory and import them.

view raw
gistfile1.scss
hosted with ❤ by GitHub

Partials

Частичными являются файлы Sass с префиксом символа подчеркивания, которые можно импортировать, но не компилировать в CSS. Например, файл _borders.scss — это часть, которая не будет скомпилирована в _borders.css, но может быть импортирована из основного файла Sass с помощью следующей директивы импорта:

@import «borders» //note that I haven’t prefixed it with the underscore since it isn’t really necessary

view raw
gistfile1.txt
hosted with ❤ by GitHub

Директивы @media

Директивы @media в Sass работают аналогично CSS, за исключением того, что они также могут быть вложены в правила CSS. Когда директивы @media содержатся в правилах CSS, они поднимаются на более высокий уровень, тем самым сбрасывая все селекторы внутри правила.

.sidebar {
width: 300px;
@media screen and (orientation: landscape) {
width: 500px;
}
}

view raw
gistfile1.scss
hosted with ❤ by GitHub

компилируется в:

.sidebar {
width: 300px; }
@media screen and (orientation: landscape) {
.sidebar {
width: 500px; } }

view raw
gistfile1.css
hosted with ❤ by GitHub

Директивы @extend

Производные @extend являются одними из самых продвинутых и полезных функций в Sass. Они позволяют одному копировать все стили селектора в другой, не дублируя свойства селектора.

До Sass веб-разработчики решали эту проблему следующим образом.

<!—HTML—>
<div classerror Fatalerror«>
“You’ve encountered an error, notify the webmaster to resolve the issue” </div>

view raw
gistfile1.html
hosted with ❤ by GitHub

.error
{
border: 1px #fdd;
color: #332c2c;
}
.Fatalerror
{
border: 3px #ff0;
font-weight:bold;
}

view raw
gistfile1.css
hosted with ❤ by GitHub

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

Sass предлагает отличное решение для наследования селекторов через директиву @extend , как показано ниже.

.error
{
border: 1px #fdd;
color: #332c2c;
}
.Fatalerror
{
@extend .error
border: 3px #ff0;
font-weight:bold;
}

view raw
gistfile1.scss
hosted with ❤ by GitHub

Помимо классов, он также может наследовать селекторы от a:hover .

.link {
@extend a:hover;
}
a:hover {
text-decoration: underline;
}

view raw
gistfile1.scss
hosted with ❤ by GitHub

Кроме того, поддерживается многократное использование @extend .

.link {
@extend a:hover;
@extend .funky;
}
a:hover {
text-decoration: underline;
}
.funky {
font-weight:bold;
}

view raw
gistfile1.scss
hosted with ❤ by GitHub

Директивы управления

Управляющие директивы в Sass идентичны управляющим операторам в Ruby. Они предлагают Sass интеллект для принятия решений на основе определенных условий. Директива управления также позволяет повторить некоторые стили с небольшим изменением.

@если

Директива @if вычисляет выражение и возвращает стили, вложенные в выражение, которое оценивается как true.

.sidebar{
@if 5 < 3 { border: 2px dotted; }
@if 2*2 ==0 { border: 1px solid; }
@0<25 { border: 3px double; }
}
is compiled to
.sidebar{
border: 3px double
}

view raw
gistfile1.scss
hosted with ❤ by GitHub

Существует также @else if обычно следует за @if . Если оператор @if завершается неудачно, @else if будет выполняться до тех пор, пока он не удовлетворяет данному условию. Если все не удается, Sass в конечном итоге будет искать директиву @else которая действует как инструкция по умолчанию.

$bgcolor:cyan;
.sidebar{
@if $bgcolor==blue {background-color:#0000ff; color:#ffffff;}
@else if $bgcolor==red {background-color:#ff0000; color:#ffffff;}
@else if $bgcolor==cyan{background-color: #00ffff; color:#cccccc;}
@else {background-color:#ffffff;color:#000000;}
}

view raw
gistfile1.scss
hosted with ❤ by GitHub

составлен в

.sidebar{
background-color:#00ffff; color:#cccccc;}

view raw
gistfile1.txt
hosted with ❤ by GitHub

@за

Директива @for используется для зацикливания набора операторов. Например, если вас попросят создать стили для боковой панели веб-сайта. И если предположить, что боковая панель содержит более одного элемента CSS, практически идентичного, но с небольшим изменением, вы можете использовать директиву @for чтобы упростить задачу.

@for $i from 1 through 4 {
.sidebar-element-#{$i} { height: 2em * $i; }
}

view raw
gistfile1.scss
hosted with ❤ by GitHub

составлен в

.sidebar-element-1 {
height: 2em; }
.sidebar-element-2 {
height: 4em; }
.sidebar-element-3 {
height: 6em; }
.sidebar-element-4 {
height: 8em; }

view raw
gistfile1.css
hosted with ❤ by GitHub

@пока

Директива @while также используется для многократного вывода стилей CSS. Вот как можно добиться тех же результатов CSS, но с @while директивы @while .

$i:0
while $i<4
{ .sidebarelement#{$i} { height: 2em * $i; }
$i:$i+1;
}

view raw
gistfile1.scss
hosted with ❤ by GitHub

Sass делает веб-дизайн приятным — вы должны убедиться сами!

Полная документация по Sass доступна для получения дополнительной информации здесь: Документация Sass .