Less 用于生成媒体查询的函数较少
您能否用LESS编写一个函数,在传入断点的值时输出媒体查询 我希望能够像这样动态创建它们:Less 用于生成媒体查询的函数较少,less,Less,您能否用LESS编写一个函数,在传入断点的值时输出媒体查询 我希望能够像这样动态创建它们: // Something like this .media(@min, @max) { @query: ~"@media (min-width: @{min}) and (max-width: @{max})"; } .class { .media(100px, 400px) { color: red; } .media(401px, 50
// Something like this
.media(@min, @max) {
@query: ~"@media (min-width: @{min}) and (max-width: @{max})";
}
.class {
.media(100px, 400px) {
color: red;
}
.media(401px, 500px) {
color: green;
}
}
// Outputs this:
@media (min-width: 100px) and (max-width: 400px) {
.class {
color: red;
}
}
@media (min-width: 401px) and (max-width: 500px) {
.class {
color: green;
}
}
我想我已经做到了,但是因为mixin是在同一个范围内调用的,所以在第二次调用中没有分配变量:
.media (@min, @max) {
@query: ~"(min-width: @{min}) and (max-width: @{max})";
}
.class {
width: 100%;
max-width: 300px;
.media(100px, 400px);
@media @query {
color: red;
}
.media(401px, 800px);
@media @query {
color: green;
}
}
第一个代码段的主要问题是不能使用mixin调用为
{…}
块设置标识符。在代码段中,请执行以下操作:
.media(100px, 400px) {
color: red;
}
实际上是一个新的mixin定义,而不是以前定义的.media
mixin调用(因此它不会输出任何内容,因为这个新的mixin从未被调用)。
以及正确的mixin调用语法:
.media(100px, 400px); {
color: red;
}
在这种情况下,相当于:
@query: ~"@media (min-width: 100px) and (max-width: 400px)"; {
color: red;
}
这当然没有任何意义,因为它会抛出一个错误
----
您的第二个代码段更为正确,但是是的,因为两个mixin调用共享相同的作用域,所以只有一个@query
变量。可以通过将它们放入未命名的命名空间(这只是一个具有名称的规则集,因此它创建了一个新范围,但随后作为外部规则集的一部分输出)来隔离它们:
这是一个技巧,但显然它看起来不是真正有用的东西(太冗长和不可读),因此为了参考起见,提及其他方法是有意义的:
----
今天,针对特定情况,最干净的解决方案是使用:
虽然我怀疑在实际项目中,每次需要相应的媒体时,您是否会明确重复像素值,因此最终很可能会以更多语义混合结束,例如:
.media(@min, @max, @styles) {
@media (min-width: @min)
and (max-width: @max) {
@styles();
}
}
.tiny-screen(@styles) {.media(100px, 400px, @styles)}
.not-so-tiny-screen(@styles) {.media(401px, 800px, @styles)}
.class {
.tiny-screen({
color: red;
});
.not-so-tiny-screen({
color: green;
});
}
----
将规则集传递给mixin并不是实现这一目标的唯一方法,还有其他方法有各种优缺点(如果采用“语义媒体块”的方式,其中一些方法看起来更可读)。例如,请参见(显然,在这里搜索
[less]媒体
,以便找到更多的灵感)。我昨天实际上在做一件事,与您上两个片段非常相似,但是,正如您所提到的,它变得过于冗长而不实用+我需要一个非常彻底的答案。非常感谢。
.media(@min, @max, @styles) {
@media (min-width: @min)
and (max-width: @max) {
@styles();
}
}
.class {
.media(100px, 400px, {
color: red;
});
.media(401px, 800px, {
color: green;
});
}
.media(@min, @max, @styles) {
@media (min-width: @min)
and (max-width: @max) {
@styles();
}
}
.tiny-screen(@styles) {.media(100px, 400px, @styles)}
.not-so-tiny-screen(@styles) {.media(401px, 800px, @styles)}
.class {
.tiny-screen({
color: red;
});
.not-so-tiny-screen({
color: green;
});
}