我正在使用以下 LESS mixins 来生成用于 bidi 的 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 在从左到右的上下文中,或者div.myclass
如果div 在从右到左的上下文中,我会得到一组规则。padding-left:10px
padding-right:10px
我现在正在尝试将其转换为 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 mixins 中的中间选择器,则会收到以下错误: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 的方法。
有人可以帮助这个迁移吗