我试图根据类型设置不同元素的显示样式,同时使用less来匹配一组规则。
在定义规则后使用&
将元素类型附加到规则的末尾,无论是否有空格,这显然都不起作用。
我确信编写以下内容的重复性更低,更优化:
&.admin {
.service_provider.security_class_admin,
.service_provider.security_class_admin_manager,
.service_provider.security_class_admin_user,
.service_provider.security_class_admin_manager_user {
display: block;
}
th {
&.service_provider.security_class_admin,
&.service_provider.security_class_admin_manager,
&.service_provider.security_class_admin_user,
&.service_provider.security_class_admin_manager_user {
display: table-cell;
}
}
button {
&.service_provider.security_class_admin,
&.service_provider.security_class_admin_manager,
&.service_provider.security_class_admin_user,
&.service_provider.security_class_admin_manager_user {
display: inline-block;
}
}
}
我非常感谢帮助找到最佳解决方案。
答案 0 :(得分:3)
目前,无法在选择器链的中间插入选择器。它可以仅在开始或结束时添加。最后添加对你的情况不起作用,因为元素类型选择器只能在开始时。
您可以使用write a mixin使其具有所有常用选择器并接受规则集作为输入。
&.admin{
.common-selectors({display: block;});
th{
.common-selectors({display: table-cell;}, append);
}
button{
.common-selectors({display: inline-block;}, append);
}
}
.common-selectors(@props, @type:child){
& when (@type = append) { /* type check because the element type is appended */
&.service_provider.security_class_admin,
&.service_provider.security_class_admin_manager,
&.service_provider.security_class_admin_user,
&.service_provider.security_class_admin_manager_user{
@props();
}
}
& when not (@type = append) { /* type check because default shouldn't be appended */
.service_provider.security_class_admin,
.service_provider.security_class_admin_manager,
.service_provider.security_class_admin_user,
.service_provider.security_class_admin_manager_user{
@props();
}
}
}
基于上述代码的已编译输出的代码段
.admin .service_provider.security_class_admin,
.admin .service_provider.security_class_admin_manager,
.admin .service_provider.security_class_admin_user,
.admin .service_provider.security_class_admin_manager_user {
display: block;
}
.admin th.service_provider.security_class_admin,
.admin th.service_provider.security_class_admin_manager,
.admin th.service_provider.security_class_admin_user,
.admin th.service_provider.security_class_admin_manager_user {
display: table-cell;
}
.admin button.service_provider.security_class_admin,
.admin button.service_provider.security_class_admin_manager,
.admin button.service_provider.security_class_admin_user,
.admin button.service_provider.security_class_admin_manager_user {
display: inline-block;
}
div,
span,
button,
th,
tr,
table {
border: 1px solid;
margin: 10px;
}

<div class='admin'>
<div class='service_provider security_class_admin'>Admin</div>
<div class='service_provider security_class_admin_manager'>Manager</div>
<div class='service_provider security_class_admin_user'>User</div>
<div class='service_provider security_class_admin_manager_user'>Manager User</div>
</div>
<div class='admin'>
<span class='service_provider security_class_admin'>Admin</span>
<span class='service_provider security_class_admin_manager'>Manager</span>
<span class='service_provider security_class_admin_user'>User</span>
<span class='service_provider security_class_admin_manager_user'>Manager User</span>
</div>
<div class='admin'>
<button class='service_provider security_class_admin'>Admin</button>
<button class='service_provider security_class_admin_manager'>Manager</button>
<button class='service_provider security_class_admin_user'>User</button>
<button class='service_provider security_class_admin_manager_user'>Manager User</button>
</div>
<table>
<tr>
<th class='service_provider security_class_admin'>Admin</th>
<th class='service_provider security_class_admin_manager'>Manager</th>
<th class='service_provider security_class_admin_user'>User</th>
<th class='service_provider security_class_admin_manager_user'>Manager User</th>
</tr>
</table>
&#13;
或者,mixins的一个较短的方法是使用通用选择器(*
)来阻止所有元素的显示。
&.admin{
* {
.common-selectors({display: block;});
}
th{
.common-selectors({display: table-cell;});
}
button{
.common-selectors({display: inline-block;});
}
}
.common-selectors(@props, @type:child){
&.service_provider.security_class_admin,
&.service_provider.security_class_admin_manager,
&.service_provider.security_class_admin_user,
&.service_provider.security_class_admin_manager_user{
@props();
}
}
基于上述代码的已编译输出的代码段
.admin *.service_provider.security_class_admin,
.admin *.service_provider.security_class_admin_manager,
.admin *.service_provider.security_class_admin_user,
.admin *.service_provider.security_class_admin_manager_user {
display: block;
}
.admin th.service_provider.security_class_admin,
.admin th.service_provider.security_class_admin_manager,
.admin th.service_provider.security_class_admin_user,
.admin th.service_provider.security_class_admin_manager_user {
display: table-cell;
}
.admin button.service_provider.security_class_admin,
.admin button.service_provider.security_class_admin_manager,
.admin button.service_provider.security_class_admin_user,
.admin button.service_provider.security_class_admin_manager_user {
display: inline-block;
}
div,
span,
button,
th,
tr,
table {
border: 1px solid;
margin: 10px;
}
&#13;
<div class='admin'>
<div class='service_provider security_class_admin'>Admin</div>
<div class='service_provider security_class_admin_manager'>Manager</div>
<div class='service_provider security_class_admin_user'>User</div>
<div class='service_provider security_class_admin_manager_user'>Manager User</div>
</div>
<div class='admin'>
<span class='service_provider security_class_admin'>Admin</span>
<span class='service_provider security_class_admin_manager'>Manager</span>
<span class='service_provider security_class_admin_user'>User</span>
<span class='service_provider security_class_admin_manager_user'>Manager User</span>
</div>
<div class='admin'>
<button class='service_provider security_class_admin'>Admin</button>
<button class='service_provider security_class_admin_manager'>Manager</button>
<button class='service_provider security_class_admin_user'>User</button>
<button class='service_provider security_class_admin_manager_user'>Manager User</button>
</div>
<table>
<tr>
<th class='service_provider security_class_admin'>Admin</th>
<th class='service_provider security_class_admin_manager'>Manager</th>
<th class='service_provider security_class_admin_user'>User</th>
<th class='service_provider security_class_admin_manager_user'>Manager User</th>
</tr>
</table>
&#13;
答案 1 :(得分:1)
感谢您的帮助,加上我从以下帖子中了解到的for-in循环: How to generate CSS with loop in less
我现在有:
.for(@list, @code) {
& {
.loop(@i:1) when (@i =< length(@list)) {
@value: extract(@list, @i);
@code();
.loop(@i + 1);
}
.loop();
}
}
.role-varients(@orgType, @variants, @props, @type:child){
.for(@variants, {
& when (@type = append) {
&.@{orgType}.security_class_@{value} {
@props();
}
}
& when not (@type = append) {
.@{orgType}.security_class_@{value} {
@props();
}
}
});
}
@admin-roles: admin, admin_manager, admin_user, admin_manager_user;
@manager-roles: manager, admin_manager, manager_user, admin_manager_user;
@user-roles: user, admin_user, manager_user, admin_manager_user;
&.service_provider{
&.admin{
.role-varients(service_provider, @admin-roles, {display: block;});
th{
.role-varients(service_provider, @admin-roles, {display: table-cell;}, append);
}
button{
.role-varients(service_provider, @admin-roles, {display: inline-block;}, append);
}
}
&.manager{
.role-varients(service_provider, @manager-roles, {display: block;});
th{
.role-varients(service_provider, @manager-roles, {display: table-cell;}, append);
}
button{
.role-varients(service_provider, @manager-roles, {display: inline-block;}, append);
}
}
&.user{
.role-varients(service_provider, @user-roles, {display: block;});
th{
.role-varients(service_provider, @user-roles, {display: table-cell;}, append);
}
button{
.role-varients(service_provider, @user-roles, {display: inline-block;}, append);
}
}
}
&.client{
&.admin{
.role-varients(client, @admin-roles, {display: block;});
th{
.role-varients(client, @admin-roles, {display: table-cell;}, append);
}
button{
.role-varients(client, @admin-roles, {display: inline-block;}, append);
}
}
&.manager{
.role-varients(client, @manager-roles, {display: block;});
th{
.role-varients(client, @manager-roles, {display: table-cell;}, append);
}
button{
.role-varients(client, @manager-roles, {display: inline-block;}, append);
}
}
&.user{
.role-varients(client, @user-roles, {display: block;});
th{
.role-varients(client, @user-roles, {display: table-cell;}, append);
}
button{
.role-varients(client, @user-roles, {display: inline-block;}, append);
}
}
}
&.vendor{
&.admin{
.role-varients(vendor, @admin-roles, {display: block;});
th{
.role-varients(vendor, @admin-roles, {display: table-cell;}, append);
}
button{
.role-varients(vendor, @admin-roles, {display: inline-block;}, append);
}
}
&.manager{
.role-varients(vendor, @manager-roles, {display: block;});
th{
.role-varients(vendor, @manager-roles, {display: table-cell;}, append);
}
button{
.role-varients(vendor, @manager-roles, {display: inline-block;}, append);
}
}
&.user{
.role-varients(vendor, @user-roles, {display: block;});
th{
.role-varients(vendor, @user-roles, {display: table-cell;}, append);
}
button{
.role-varients(vendor, @user-roles, {display: inline-block;}, append);
}
}
}
我会使用另一个for循环来处理3个主要块[service_provider,client,vendor]但我正在使用的地方。@ {value}我想范围是因为在循环中有一个循环并且它不会产生预期的结果。
虽然上面看起来仍然很长,但它绝对比手动编写每个规则更好。
我的解决方案来自于Harry的输入,所以我想我应该将他的答案标记为正确吗?再次感谢所有;)