Css 如何创建';转换';在使用多个参数的SCS中混合?
我想为transform创建一个mixin,它有两个参数:translate和rotate。我试过几种方法,但没有一种有效,我也不知道为什么Css 如何创建';转换';在使用多个参数的SCS中混合?,css,sass,less,scss-mixins,Css,Sass,Less,Scss Mixins,我想为transform创建一个mixin,它有两个参数:translate和rotate。我试过几种方法,但没有一种有效,我也不知道为什么 @mixin transform($transforms) { -moz-transform: $transforms; -o-transform: $transforms; -ms-transform: $transforms; -webkit-transform: $transforms; transform:
@mixin transform($transforms) {
-moz-transform: $transforms;
-o-transform: $transforms;
-ms-transform: $transforms;
-webkit-transform: $transforms;
transform: $transforms;
}
@mixin rotate ($deg) {
@include transform(rotate(#{$deg}deg));
}
@mixin translate($x, $y) {
@include transform(translate($x, $y));
}
在nav.scss中,我像这样包含它
@include transform(rotate(45));
@include transform(translate(0,9px));
它不会改变演示页面中的任何内容
没有mixin,我只使用:
span:before {
transform: translateY(9px) rotate(45deg);
}
它是有效的,但我想用mixin实现同样的结果,但我不知道如何实现。几天前我开始学习SASS。我不认为你需要像那样嵌套混合器。您可以利用和: 如果只想用一个参数调用mixin,那么mixin的参数现在有一个默认值。可以使用关键字语法显式调用参数。在我的示例中,我只需要第二个参数,所以我这样做了:
@include transformNew($translate:translate(10px,40px))代码>。如果只需要第一个参数,那么只需传递值就足够了,不需要关键字
如果需要两个参数,只需将它们都传递。在您的代码中,如果您两次调用mixin,那么您已经用第二次调用覆盖了第一个值。
这不会发生在这里。我还为您创建了一个用于处理代码的工具。一般来说,我建议您使用来处理供应商前缀,因为您通常会添加比需要更多的前缀
在转换的情况下,只需添加
-webkit-transform: ...;
transform: ...;
此外,当您需要处理属性值时,它变得相当难以处理:
transition: transform 300ms;
// prefixed
-webkit-transition: -webkit-transform 300ms;
transition: -webkit-transform 300ms;
transition: transform 300ms;
transition: transform 300ms, -webkit-transform 300ms;
要回答您的问题,我认为最简单的方法是使用(允许传递任意数量的参数)在空格分隔的列表中连接在一起:
// Mixin
@mixin transform($transforms...) {
// combine the passed transforms into a space separated list
$transform-list: join($transforms, null, space);
// print out the transforms
-webkit-transform: $transform-list;
-moz-transform: $transform-list;
-ms-transform: $transform-list;
-o-transform: $transform-list;
transform: $transform-list;
}
// Include
span::before {
@include transform(
rotate(90deg),
translate(0,9px),
// ... add more transforms if you need
);
}
// CSS output
span::before {
-webkit-transform: rotate(90deg) translate(0, 9px);
-moz-transform: rotate(90deg) translate(0, 9px);
-ms-transform: rotate(90deg) translate(0, 9px);
-o-transform: rotate(90deg) translate(0, 9px);
transform: rotate(90deg) translate(0, 9px);
}
两件事。当您执行@include transform(rotate(45))
时,您正在尝试嵌套mixin调用——这将调用transform mixin并将值rotate(45)传递给它——请注意,您缺少deg
,因此它的css无效,无法工作。如果要调用rotate mixin,必须执行@include rotate(45)
。第二件事,确保您正在选择器下的css规则集中使用@include mixin
,例如span:before{@include myMixin();},以便它添加的样式位于该选择器下。
// Mixin
@mixin transform($transforms...) {
// combine the passed transforms into a space separated list
$transform-list: join($transforms, null, space);
// print out the transforms
-webkit-transform: $transform-list;
-moz-transform: $transform-list;
-ms-transform: $transform-list;
-o-transform: $transform-list;
transform: $transform-list;
}
// Include
span::before {
@include transform(
rotate(90deg),
translate(0,9px),
// ... add more transforms if you need
);
}
// CSS output
span::before {
-webkit-transform: rotate(90deg) translate(0, 9px);
-moz-transform: rotate(90deg) translate(0, 9px);
-ms-transform: rotate(90deg) translate(0, 9px);
-o-transform: rotate(90deg) translate(0, 9px);
transform: rotate(90deg) translate(0, 9px);
}