2013-09-01 16 views
3

Я рассматривал UiKit, фреймворк, построенный с помощью LESS, и заметил довольно интересную особенность: крючки. Посмотрите на следующие команды в рамках:Есть «крючки» в SASS?

.uk-panel-badge { 
    position: absolute; 
    top: 0; 
    right: 0; 
    z-index: 1; 
    .hook-panel-badge; 
} 

.hook-panel-badge() {} 

Если вы хотите переопределить в теме, скажем, вы строите за пределами основных файлов (файлы, которые приходят позже в компиляции), то вы могли бы сделать следующее :

.hook-panel-badge() { 
    right:auto; 
} 

так, в сущности, это выглядит, как вы можете переопределить/настроить селекторы без добавления дополнительных селекторов, поэтому он сохраняет разметку как можно меньше.

Есть ли что-нибудь подобное в SASS? Это выглядит как удивительная функция, которую я бы хотел использовать в качестве пользователя SASS в первую очередь, но я не нашел @extend, чтобы быть тем же. Благодаря!

Update

Функция placeholder, кажется, ближе всего я нашел:

.panel { 
    background:red; 
    @extend %hook-panel; 
} 

%hook-panel { 
    color:blue; 
} 

Что делает, как:

.panel { 
    background: red; } 

.panel { 
    color: blue; } 

и может быть определен после (который является удивительным), но это все еще дублирует селектор. В любом случае, нужно только указать значение заполнителя в исходном селекторе, в которое оно включено?

+0

Если вы определяете загрузку свойств в классе SASS, то в нижней части этого класса используйте '@extend hook-class', чтобы конфликтующие свойства« hook-class »были перезаписаны, даже если они (вроде) объявлены впоследствии ? Я предполагаю, что так вы сказали, что вы упомянули '@ extend' в своем вопросе ... –

+0

Проблема, которую я видел, делая что-то вроде того, что вы говорите, я все равно получаю дубликаты селекторов: [пример] (http: // pastebin .com/dRaUnR3B) – Zach

+0

Я понимаю, что вы имеете в виду. Поэтому поведение SASS заключается в сохранении исходного класса, но LESS его уничтожает. Разметка была бы такой же, хотя - в примере, который вы указали, использование класса 'uk-panel-badge' создаст синий фон. Единственное различие заключается в том, что файлы CSS для версии SASS будут немного больше (мы говорим о небольшой разнице). –

ответ

1

SASS имеет аналогичный объект под названием mixins:

// Define the mixin 
@mixin large-text 
    font-family: Arial 
    color: #ff0000 

// Use it 
.page-title 
    @include large-text 
    padding: 10px 


// Compiled CSS 
.page-title { 
    font-family: Arial; 
    color: #ff0000; 
    padding: 10px; 
} 

Красота микс-ин в том, что они могут принимать аргументы, так что вам не нужно переопределить часто меняемые селекторы:

// Define 
@mixin sexy-border($color, $width) 
    border-color: $color 
    border-width: $width 
    border-style: dashed 


// Paragraphs in general will have a sexy blue 10px dashed border 
p 
    @include sexy-border(blue, 10px) 


// Paragraphs of class "plain" will have a plain old black 1px solid border 
p.plain 
    @include sexy-border(black, 1px) 
    border-style: solid 


// Compiled CSS 
p { 
    border-color: blue; 
    border-width: 10px; 
    border-style: dashed; 
} 
p.plain { 
    border-color: black; 
    border-width: 1px; 
    border-style: solid; 
} 

SASS mixin documentation.

+0

Привет, спасибо за ответ. Я полностью осведомлен о миксинах (извините за то, что не уточнил это), но они, похоже, не действуют так же, как то, что сделал LESS. В примере LESS он включен до того, как он будет объявлен почти как «если это существует», что делает его довольно легко подключаемой областью, в то время как микшины объявлены ранее и в отличие от того, что МЕНЬШЕ, не могут быть вызваны дважды (см. Пример LESS имеет начальный .hook() {} ниже начального включения)? – Zach

+0

Я не LESS wiz, поэтому я не понял нюансов того, что вы были после. Да, миксины должны быть объявлены заранее, но что вы подразумеваете под «[mixins] нельзя вызывать дважды» - разве это не значит, что весь смысл сделать их многоразовыми? –

+0

Я имею в виду «объявление» mixin, но это не повлияет на эту часть, поскольку они должны быть объявлены заранее. Определенно странно натолкнуться на часть LESS, которая превосходит SASS (если это был рабочий процесс, который вы использовали) – Zach

1

Насколько я могу судить, точное соответствие поведения LESS к эквиваленту SASS отсутствует.

У вас есть следующие варианты:

  1. @extend

    .uk-panel-badge { 
        position: absolute; 
        top: 0; 
        right: 0; 
        z-index: 1; 
        @extend .hook-panel-badge; 
    } 
    
    .hook-panel-badge{ 
        right:auto; 
    } 
    

    , в результате чего:

    .uk-panel-badge { 
         position: absolute; 
         top: 0; 
         right: 0; 
         z-index: 1; 
    } 
    
    .hook-panel-badge, .uk-panel-badge { 
         right: auto; 
    } 
    

    Это производит немного больше CSS, чем МЕНЬШЕ эквивалент делает, потому что оригинал (unhooked) сохраняется.

  2. @mixin

    //theme.scss: 
    
    @mixin hook-panel-badge(){ 
    } 
    
    @import "hooks"; 
    
    .uk-panel-badge { 
        position: absolute; 
        top: 0; 
        right: 0; 
        z-index: 1; 
        @include hook-panel-badge; 
    } 
    
    _hooks.scss: 
    
    //theme creator can override hooks in here. 
    
    @mixin hook-panel-badge(){ 
        right:auto; 
    } 
    

    Это создает тот же код, как ваш ШАОН, но недостатком является то, что вам нужно определить пустую подмешать для каждого hookable класса, который немного усилий. (Вы могли бы, конечно, поместить все это в файл _hooks.scss, но это сделает код переопределения более трудным для чтения.

EDIT: Я предполагаю, что есть еще один вариант, как показано ниже, что позволяет экономить немного набрав на стороне extendee, но отходит от стандартного синтаксиса CSS для удлинителя немного слишком много для моего симпатия. Конечно, вы можете использовать неполный файл, как в 2.

@mixin hook($class){ 
    //generic override. 
    @if($class == "uk-panel-badge"){ 
     right:auto; 
    } 

    @else if($class== "selector2"){ 
     //override other classes in this way. 
    } 

} 

.uk-panel-badge { 
    position: absolute; 
    top: 0; 
    right: 0; 
    z-index: 1; 
    @include hook("uk-panel-badge"); 
} 

В целом я все еще чувствую, что 1 - лучший подход.

+0

Действительно оценивайте различные варианты здесь - так что кажется, что ключевое различие здесь - это наследование (что мне нужно будет указать мои переопределения до фактического включения mixin, а не после того, как будет выполнено LESS). Я [написал статью об этом прошлой ночью] (http://zslabs.com/articles/pluggable-selectors) и даже с примером # 2, который по-прежнему требует, чтобы крючки были отделены от исходной разметки, поэтому я не уверен если он работает (он не достигает полного круга, чтобы найти что-либо, что переопределяет исходный mixin перед установкой значения). Еще раз спасибо. – Zach