Sass вредит производительности?
Я занимаюсь самообразованием. Чтение этой:
движок оценивает каждое правило справа налево, начиная с самого правого селектора (называемого "ключом") и перемещаясь через каждый селектор, пока не найдет совпадение или не отбросит правило. ("Селектора" - это элемент документа, к которому должно применяться правило.)
например:
ul li a {...}
#footer h3 {...}
* html #atticPromo ul li a {...]
Теперь, некоторый пример кода Sass выводит для меня:
#content #blog {
/* ... */
}
/* line 85, ../sass/screen.scss */
#content #flickr {
/* ... */
}
#content #flickr div p {
/* ... */
}
этот выглядит немного неловко.. я делаю что-то не так? Это проблема общения между мной и Сасс? Мы теряем его?
редактировать: Некоторый код SCSS:
#flickr {
@include columns(5,8);
background: url('../img/ipadbg.png') no-repeat;
#ipod-gloss {
z-index: 999;
position: relative;
}
div {
margin-top: -80px;
margin-right: 20px;
h2 {
color: $white;
font-size: 24px;
}
p {
margin-top: 40px;
}
}
}
Боковая Бонус!: в статье говорится, что браузеры (или, по крайней мере, Firefox) ищут селекторы справа налево. Я не мог понять, почему это более эффективно, почему. Есть зацепки?
2 ответов
вы должны найти компромисс между ремонтопригодностью (вложенность облегчает поиск вашего пути в таблице стилей) и производительностью рендеринга.
эмпирическое правило говорит, что вы должны попытаться ограничить себя трехуровневой вложенностью, и вы должны избегать идентификаторов гнезда, если это не необходимо.
тем не менее, я думаю, что вложенность слишком много не самая большая проблема. Как только я узнал о силе миксинов, я использовал их много.
например, это является ли моя часто используемая кнопка mixin:
@mixin small-button($active-color: $active-color, $hover-color: $button-hover-color, $shadow: true)
display: inline-block
padding: 4px 10px
margin:
right: 10px
bottom: 10px
border: none
background-color: $button-color
color: $font-color-inv
+sans-serif-font(9px, 700)
text-align: center
text-transform: uppercase
cursor: pointer
@if $shadow
+light-shadow
&:hover
text-decoration: none
background-color: $hover-color
&:last-child
margin-right: 0
a
color: $font-color-inv
&, &:hover
text-decoration: none
&.disabled
+opacity(0.75)
&:hover
background-color: $button-color
&.active
background-color: $active-color
&.disabled:hover
background-color: $active-color
вы видите, совсем немного кода. Применение таких микшинов ко многим элементам на Вашей странице приведет к большому CSS-файлу, который требует больше времени для интерпретации.
в старомодном CSS-способе вы бы дали каждому элементу кнопки, например, класс .маленькая кнопка. Но этот метод загрязняет вашу разметку несемантическими классами.
Sass предоставляет решение, хотя: наследование селектора через @extend директива.
если вы установили значения по умолчанию для вашего параметра mixin, вы также можете предоставить простой класс, который использует mixins с вашим значением по умолчанию:
// Use this mixin via @extend if you are fine with the parameter defaults
.small-button
+small-button
и тогда вы можете просто наследовать от этого класса в различных контекстах:
#admin-interface
input[type=submit]
@extend .small-button
результирующий оператор CSS агрегирует все использования .маленькая кнопка в одно правило с разделенными запятыми селекторами:
.small-button, #admin-interface input[type=submit] {
display: inline-block;
...
}
В заключение, наивное использование Sass может повлиять на производительность CSS. Используется мудро, однако, это ремонтопригодно благодаря хорошо структурированному и сухому коду, это приводит к правильному разделению разметки и стиля (только семантические классы) и позволяет смарт и performant CSS-код.
SASS-это только язык, который компилируется до CSS. Если вас интересует производительность SASS с точки зрения того, как она работает в браузере, то SASS не входит в уравнение-он будет скомпилирован и подан в браузер как обычный CSS.
из того, что я вижу из вашего использования SASS, есть несколько вещей, которые я мог бы предложить:
- не есть вложить все.
возможность вложить правила внутри друг друга в SASS есть языковая функция, но вам не нужно этого делать, если это не имеет смысла.
С точки зрения вашего общего использования CSS:
- если вложенность становится слишком тяжелой / громоздкой, подумайте об использовании классов, где это имеет смысл.
- когда необходимо использовать иерархию элементов DOM, рассмотрите возможность использования [дочернего комбинатора]:
.foo > .bar
.
идентификаторы должны быть уникальными, поэтому всегда должны быть только ссылка на один элемент. Большую часть времени они могут быть правилами CSS сами по себе -#content #flickr
станет просто #flickr
, например, - и браузеры оптимизировать поиск для одного идентификатора. Единственный раз, когда вам понадобится что-то вроде #id1 #id2
Если #id2
должен появляться в разных контекстах на разных страницах.
если ваш селектор содержит такие вещи, как #id div p
, что div
является либо излишним, либо служит определенной цели.
- если это лишнее, измените правило на
#id p
, который выбирает любой<p>
это происходит как потомок#id
. - если он служит определенной цели, Рассмотрите возможность классификации
<div>
С именем класса, которое описывает его назначение-возможно<div class="photos-list">
. Тогда ваш CSS может стать.photos-list p
, что гораздо более ремонтопригодно и многоразово.