Как создать меток calc для передачи в качестве выражения для генерации тегов?
Я работаю над стилем sass, в котором я хочу использовать элемент calc
для динамического размера некоторого контента. Поскольку элемент calc
не был стандартизирован, мне нужно настроить таргетинг calc()
, -moz-calc()
и -webkit-calc()
.
Есть ли способ создать mixin или функцию, через которую я могу передать выражение, чтобы он генерировал требуемые теги, которые затем могут быть установлены как width
или height
?
Ответы
Ответ 1
Это был бы базовый mixin с аргументом, к счастью, выражения не зависят от браузера в пределах поддерживаемой области:
@mixin calc($property, $expression) {
#{$property}: -webkit-calc(#{$expression});
#{$property}: calc(#{$expression});
}
.test {
@include calc(width, "25% - 1em");
}
Будет отображаться как
.test {
width: -webkit-calc(25% - 1em);
width: calc(25% - 1em);
}
Возможно, вы захотите включить значение "по умолчанию", если флажок не поддерживается.
Ответ 2
Compass предлагает общую утилиту, чтобы добавить префиксы поставщиков только для такого случая.
@import "compass/css3/shared";
$experimental-support-for-opera: true; // Optional, since it off by default
.test {
@include experimental-value(width, calc(25% - 1em));
}
Ответ 3
Использование calc может быть выполнено довольно легко, используя функцию unquote:
$variable: 100%
height: $variable //for browsers that don't support the calc function
height:unquote("-moz-calc(")$variable unquote("+ 44px)")
height:unquote("-o-calc(")$variable unquote("+ 44px)")
height:unquote("-webkit-calc(")$variable unquote("+ 44px)")
height:unquote("calc(")$variable unquote("+ 44px)")
отобразит как:
height: 100%;
height: -moz-calc( 100% + 44px);
height: -o-calc( 100% + 44px);
height: -webkit-calc( 100% + 44px);
height: calc( 100% + 44px);
Вы также можете попробовать создать mixin, как было предложено выше, но я немного отличаюсь:
$var1: 1
$var2: $var1 * 100%
@mixin calc($property, $variable, $operation, $value, $fallback)
#{$property}: $fallback //for browsers that don't support calc function
#{$property}: -mox-calc(#{$variable} #{$operation} #{$value})
#{$property}: -o-calc(#{$variable} #{$operation} #{$value})
#{$property}: -webkit-calc(#{$variable} #{$operation} #{$value})
#{$property}: calc(#{$variable} #{$operation} #{$value})
.item
@include calc(height, $var1 / $var2, "+", 44px, $var1 / $var2 - 2%)
отобразит как:
.item {
height: 98%;
height: -mox-calc(100% + 44px);
height: -o-calc(100% + 44px);
height: -webkit-calc(100% + 44px);
height: calc(100% + 44px);
}
Ответ 4
Другой способ написать:
@mixin calc($prop, $val) {
@each $pre in -webkit-, -moz-, -o- {
#{$prop}: $pre + calc(#{$val});
}
#{$prop}: calc(#{$val});
}
.myClass {
@include calc(width, "25% - 1em");
}
Я думаю, что это более элегантный способ.