
гнездование
Sass уменьшает сложность кодирования, позволяя программисту вкладывать селекторы и свойства селектора. Естественно, программисты находят в этом большую ценность. Например, возможность вкладывать CSS-правила в определенный класс / идентификатор гораздо удобнее, чем многократно вводить их. Таким образом, как и другие широко распространенные языки программирования, такие как Ruby, Sass теперь допускает вложение функций и циклов с помощью CSS.
| #container p { | |
| color: #6E6E6F; | |
| width: 97%; | |
| .tab { | |
| margin-top:30px; | |
| background-color: #ff0000; | |
| color: #000000; | |
| } | |
| } |
теперь можно скомпилировать в:
| #container p { | |
| color: #6E6E6F; | |
| width: 97%; } | |
| #container p .tab { | |
| margin-top:30px; | |
| background-color: #ff0000; | |
| color: #000000; } |
Справочные операторы
Еще одна полезная функция в Sass — оператор ссылки (&). Оператор ссылки позволяет ссылаться на родительские селекторы, что может быть очень полезно при необходимости вызова непосредственного родительского селектора, как показано ниже.
| .test { | |
| a { | |
| color: #736F6E;; | |
| &:hover { color: #ff9933; } | |
| &:visited { color: #336699; } | |
| }} |
может быть скомпилировано в:
| .test a { | |
| color: #736F6E; } | |
| .test a:hover { | |
| color: #ff9933; } | |
| .test a:visited { | |
| color: #336699; } |
В приведенном выше случае оператор & был заменен непосредственным родительским селектором a .
Sass также позволяет вкладывать свойства из одного и того же пространства имен. Например, border-left, border-right, border-radius и border-style все связаны с пространством имен границ, и все, что нужно сделать, это упомянуть пространство имен один раз и вложить свойства.
| .test { | |
| border:{ | |
| style: solid; | |
| left: thick double #ff0000; | |
| right: | |
| { | |
| width:thick; | |
| color:#00ff00; | |
| } | |
| } | |
| } |
составлен в
| .test { | |
| border-style: solid; | |
| border-left: thick double #ff0000; | |
| border-right-width: thick; | |
| border-right-style: double; | |
| border-right-color: #00ff00; } |
Если 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? |
Вот версия 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; } |
Возможно, вы заметили однострочные (//) и многострочные комментарии (/ * * /), которые я использовал во фрагменте кода. Комментарии Sass аналогичны тем, что встречаются в C ++, и они помогают улучшить читаемость исходного кода. CSS поддерживает блочные / многострочные комментарии. Однако он пока не поддерживает однострочные комментарии, поэтому они были удалены из исходного кода во время компиляции, как видно из фрагмента CSS в меню навигации.
функции
Функции лежат в основе всех языков программирования. У Sass есть много таких функций, включая RGB, HSL, прозрачность и другие цвета, строковые, числовые и списочные функции. Одной из полезных функций является триплет RGB, который можно преобразовать в шестнадцатеричное значение цвета с помощью функции rgb($red,$green,$blue) , как показано ниже.
| p { | |
| color: rgb(0, 255, 255); | |
| } |
составлен в
| p { | |
| color:#00ffff; } |
Есть также функции для смешивания цветов ( 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%; | |
| } |
Вывод 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%; | |
| } |
Примеси
Разработчики 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}; |
Вывод 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%; } |
Это очень впечатляет. Как уже упоминалось, 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)} |
В приведенном выше примере $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«; |
Чтобы импортировать несколько файлов
| @import «foo« «bar«; //the extension is optional and sass would look for foo.scss and bar.scss in the current directory and import them. |
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 |
Директивы @media
Директивы @media в Sass работают аналогично CSS, за исключением того, что они также могут быть вложены в правила CSS. Когда директивы @media содержатся в правилах CSS, они поднимаются на более высокий уровень, тем самым сбрасывая все селекторы внутри правила.
| .sidebar { | |
| width: 300px; | |
| @media screen and (orientation: landscape) { | |
| width: 500px; | |
| } | |
| } |
компилируется в:
| .sidebar { | |
| width: 300px; } | |
| @media screen and (orientation: landscape) { | |
| .sidebar { | |
| width: 500px; } } |
Директивы @extend
Производные @extend являются одними из самых продвинутых и полезных функций в Sass. Они позволяют одному копировать все стили селектора в другой, не дублируя свойства селектора.
До Sass веб-разработчики решали эту проблему следующим образом.
| <!—HTML—> | |
| <div class=»error Fatalerror«> | |
| “You’ve encountered an error, notify the webmaster to resolve the issue” </div> |
| .error | |
| { | |
| border: 1px #fdd; | |
| color: #332c2c; | |
| } | |
| .Fatalerror | |
| { | |
| border: 3px #ff0; | |
| font-weight:bold; | |
| } |
К сожалению, класс Fatalerror не существовал бы, если бы он не использовался с ошибкой класса, что вызывает проблемы с поддержанием кода в долгосрочной перспективе.
Sass предлагает отличное решение для наследования селекторов через директиву @extend , как показано ниже.
| .error | |
| { | |
| border: 1px #fdd; | |
| color: #332c2c; | |
| } | |
| .Fatalerror | |
| { | |
| @extend .error | |
| border: 3px #ff0; | |
| font-weight:bold; | |
| } |
Помимо классов, он также может наследовать селекторы от a:hover .
| .link { | |
| @extend a:hover; | |
| } | |
| a:hover { | |
| text-decoration: underline; | |
| } |
Кроме того, поддерживается многократное использование @extend .
| .link { | |
| @extend a:hover; | |
| @extend .funky; | |
| } | |
| a:hover { | |
| text-decoration: underline; | |
| } | |
| .funky { | |
| font-weight:bold; | |
| } |
Директивы управления
Управляющие директивы в 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 | |
| } |
Существует также @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;} | |
| } |
составлен в
| .sidebar{ | |
| background-color:#00ffff; color:#cccccc;} |
@за
Директива @for используется для зацикливания набора операторов. Например, если вас попросят создать стили для боковой панели веб-сайта. И если предположить, что боковая панель содержит более одного элемента CSS, практически идентичного, но с небольшим изменением, вы можете использовать директиву @for чтобы упростить задачу.
| @for $i from 1 through 4 { | |
| .sidebar-element-#{$i} { height: 2em * $i; } | |
| } |
составлен в
| .sidebar-element-1 { | |
| height: 2em; } | |
| .sidebar-element-2 { | |
| height: 4em; } | |
| .sidebar-element-3 { | |
| height: 6em; } | |
| .sidebar-element-4 { | |
| height: 8em; } |
@пока
Директива @while также используется для многократного вывода стилей CSS. Вот как можно добиться тех же результатов CSS, но с @while директивы @while .
| $i:0 | |
| while $i<4 | |
| { .sidebar—element—#{$i} { height: 2em * $i; } | |
| $i:$i+1; | |
| } |
Sass делает веб-дизайн приятным — вы должны убедиться сами!
Полная документация по Sass доступна для получения дополнительной информации здесь: Документация Sass .