将 less mixins 转换为 scss
converting less mixins to scss
我使用以下 LESS mixin 生成 css 以供双向使用。
.ltr(@ltrRules) {
body[dir="ltr"] & ,
body[dir="rtl"] *[dir="ltr"] & ,
body[dir="rtl"] *[dir="ltr"]& { @ltrRules(); }
}
.rtl (@rtlRules) {
body[dir="rtl"] & ,
body[dir="ltr"] *[dir="rtl"] & ,
body[dir="ltr"] *[dir="rtl"]& { @rtlRules(); }
}
.bidi(@ltrRules,@rtlRules) {
.ltr(@ltrRules);
.rtl(@rtlRules);
}
那些以后会像这样使用:
// padding
// ------------------------------------------
.padding-start(@p) {
.bidi(
{ padding-left: @p } ,
{ padding-right: @p }
)
}
.padding-end(@p) {
.bidi(
{ padding-right: @p } ,
{ padding-left: @p }
)
}
我最终写成这样:
div.myclass {
.padding-start(10px)
}
如果 div 在从左到右的上下文中或与 padding-right:10px
一起,我会得到一组规则,这些规则将 div.myclass
与 padding-left:10px
一起设置样式如果 div 处于从右到左的上下文中。
我现在正在尝试将其转换为 SCSS,并且我必须执行以下操作:
@mixin ltr {
body[dir="ltr"] & ,
//body[dir="rtl"] *[dir="ltr"]&
body[dir="rtl"] *[dir="ltr"] & { @content }
}
@mixin rtl {
body[dir="rtl"] & ,
//body[dir="ltr"] *[dir="rtl"]&
body[dir="ltr"] *[dir="rtl"] & { @content}
}
/*
@mixin bidi($ltrRules,$rtlRules) {
@include ltr(@include ltrRules);
@include rtl(@include rtlRules);
}
*/
@mixin bidi-padding-start($p) {
@include ltr {
padding-left: $p;
}
@include rtl {
padding-right: $p;
}
}
但我还有几个问题:
1) 如果我取消注释 rtl 和 ltr mixin 中的中间选择器,则会出现以下错误:Invalid CSS after "[dir="ltr"]": expected "{", was "&". "&" may only be used at the beginning of a compound selector.
我可以没有这条规则,但我不想...我希望它能编译
.myclass {
@include padding-start(10px)
}
进入:
body[dir="rtl"] .myclass ,
body[dir="ltr"] *[dir="rtl"] .myclass ,
body[dir="ltr"] *[dir="rtl"].myclass
2) 我找不到实现 @mixin bidi
的方法,因为我找不到将两个内容块传递给 mixin 的方法。
有人可以帮助完成此迁移吗
目前 SASS 的功能仅限于将单个 @content
块传递到 @mixin
。在 github issue 上有一个功能请求讨论,但它已经关闭,看起来它从未实现过。
在那次讨论中,有人 suggested a workaround 有效地与 @extend
合作。它通过使用 %placeholders
来允许您引用临时规则集。但是,它似乎有点老套,需要针对具有更深嵌套的更复杂的规则集进行测试。
@mixin ltr {
body[dir="ltr"] & ,
//body[dir="rtl"] *[dir="ltr"]&
body[dir="rtl"] *[dir="ltr"] & { @content }
}
@mixin rtl {
body[dir="rtl"] & ,
//body[dir="ltr"] *[dir="rtl"]&
body[dir="ltr"] *[dir="rtl"] & { @content}
}
@mixin bidi {
@content;
@include ltr {
@extend %ltr !optional;
}
@include rtl {
@extend %rtl !optional;
}
}
@mixin padding-end($p) {
@include bidi {
@at-root {
%ltr {
padding-right: $p;
}
%rtl {
padding-left: $p;
}
}
}
}
.test {
@include padding-end(5px);
}
对于未来的开发者来说,另一个可能更具可读性的选项可能只是显式调用两个 mixins 来代替 bidi
。可以编写脚本来进行此迁移。
@mixin padding-end($p) {
@include rtl {
padding-left: $p;
}
@include ltr {
padding-right: $p;
}
}
我使用以下 LESS mixin 生成 css 以供双向使用。
.ltr(@ltrRules) {
body[dir="ltr"] & ,
body[dir="rtl"] *[dir="ltr"] & ,
body[dir="rtl"] *[dir="ltr"]& { @ltrRules(); }
}
.rtl (@rtlRules) {
body[dir="rtl"] & ,
body[dir="ltr"] *[dir="rtl"] & ,
body[dir="ltr"] *[dir="rtl"]& { @rtlRules(); }
}
.bidi(@ltrRules,@rtlRules) {
.ltr(@ltrRules);
.rtl(@rtlRules);
}
那些以后会像这样使用:
// padding
// ------------------------------------------
.padding-start(@p) {
.bidi(
{ padding-left: @p } ,
{ padding-right: @p }
)
}
.padding-end(@p) {
.bidi(
{ padding-right: @p } ,
{ padding-left: @p }
)
}
我最终写成这样:
div.myclass {
.padding-start(10px)
}
如果 div 在从左到右的上下文中或与 padding-right:10px
一起,我会得到一组规则,这些规则将 div.myclass
与 padding-left:10px
一起设置样式如果 div 处于从右到左的上下文中。
我现在正在尝试将其转换为 SCSS,并且我必须执行以下操作:
@mixin ltr {
body[dir="ltr"] & ,
//body[dir="rtl"] *[dir="ltr"]&
body[dir="rtl"] *[dir="ltr"] & { @content }
}
@mixin rtl {
body[dir="rtl"] & ,
//body[dir="ltr"] *[dir="rtl"]&
body[dir="ltr"] *[dir="rtl"] & { @content}
}
/*
@mixin bidi($ltrRules,$rtlRules) {
@include ltr(@include ltrRules);
@include rtl(@include rtlRules);
}
*/
@mixin bidi-padding-start($p) {
@include ltr {
padding-left: $p;
}
@include rtl {
padding-right: $p;
}
}
但我还有几个问题:
1) 如果我取消注释 rtl 和 ltr mixin 中的中间选择器,则会出现以下错误:Invalid CSS after "[dir="ltr"]": expected "{", was "&". "&" may only be used at the beginning of a compound selector.
我可以没有这条规则,但我不想...我希望它能编译
.myclass {
@include padding-start(10px)
}
进入:
body[dir="rtl"] .myclass ,
body[dir="ltr"] *[dir="rtl"] .myclass ,
body[dir="ltr"] *[dir="rtl"].myclass
2) 我找不到实现 @mixin bidi
的方法,因为我找不到将两个内容块传递给 mixin 的方法。
有人可以帮助完成此迁移吗
目前 SASS 的功能仅限于将单个 @content
块传递到 @mixin
。在 github issue 上有一个功能请求讨论,但它已经关闭,看起来它从未实现过。
在那次讨论中,有人 suggested a workaround 有效地与 @extend
合作。它通过使用 %placeholders
来允许您引用临时规则集。但是,它似乎有点老套,需要针对具有更深嵌套的更复杂的规则集进行测试。
@mixin ltr {
body[dir="ltr"] & ,
//body[dir="rtl"] *[dir="ltr"]&
body[dir="rtl"] *[dir="ltr"] & { @content }
}
@mixin rtl {
body[dir="rtl"] & ,
//body[dir="ltr"] *[dir="rtl"]&
body[dir="ltr"] *[dir="rtl"] & { @content}
}
@mixin bidi {
@content;
@include ltr {
@extend %ltr !optional;
}
@include rtl {
@extend %rtl !optional;
}
}
@mixin padding-end($p) {
@include bidi {
@at-root {
%ltr {
padding-right: $p;
}
%rtl {
padding-left: $p;
}
}
}
}
.test {
@include padding-end(5px);
}
对于未来的开发者来说,另一个可能更具可读性的选项可能只是显式调用两个 mixins 来代替 bidi
。可以编写脚本来进行此迁移。
@mixin padding-end($p) {
@include rtl {
padding-left: $p;
}
@include ltr {
padding-right: $p;
}
}