我有一个小问题...... 有没有选择将多个背景与LESS混合?
我在LESS中有背景设置:
.background_centered(
@url,
@position_horizontal: center,
@position_vertical: top,
@background-repeat: no-repeat,
@transparency: transparent) {
background: @arguments;
}
现在:我需要写出具有多个背景的输出风格,所以我这样做:
.class {
.background_centered(url('../img/war_top_baner_gp.png'),url('../img/war_header_bg.png'));
}
在最终输出中某些东西不正确我有这个:
background: url('/../img/war_top_baner_gp.png')
url('/../img/war_header_bg.png') top no-repeat transparent;
有什么不对?是否可以这样做?
答案 0 :(得分:10)
我不知道本地具有应用/循环mixin的所有参数的功能,但是有很多选项可以解决这个问题。
您可以将自定义javascript函数添加到执行所需操作的less块中。 Here is a link to a nice reference for custom functions
但你也可以用更少的东西建立一个小循环:
// for loop
.for(@l,@obg,@i:1) when (@l > @i) {
@nbg: `@{url}[@{i}]`;
@bg: ~"@{obg}, @{nbg} @{rest}";
.for(@l, @bg, @i + 1);
}
// multiple background urls + additional bg properties
.bgmixin(@url, @rest){
@num: unit(`@{url}.length`);
@bg: ~`@{url}[0]` @rest;
.for(@num, @bg);
background: ~"@{bg}";
}
// defining bg urls
@url: 'url("../img/war_top_baner_gp.png")', 'url("../img/war_header_bg.png")';
// including the bgmixin in .class
.class{
.bgmixin(@url, center top no-repeat transparent);
}
输出
.class {
background: url("../img/war_top_baner_gp.png") center top no-repeat transparent,
url("../img/war_header_bg.png") center top no-repeat transparent;
}
如果我理解你,这就是你想要的。
编辑:我只想在此添加我的想法是找到一个更通用的解决方案,实际上是通过数组元素循环/递归,这样可以很容易地使用不同的属性与它们各自的图像 - 所以你给函数提供了一个url数组和一个其他属性的数组。在这里,我将尝试说明这个想法:
.for(@l,@obg,@i:1) when (@l > @i) {
@nbg: `@{url}[@{i}]`; @nattr: `@{attr}[@{i}]`;;
@bg: "@{obg}, @{nbg} @{nattr}";
.for(@l, @bg, @i + 1);
}
.bgmixin(@url, @attr){
@num: unit(`@{url}.length`);
@bg: ~`@{url}[0]` ~`@{attr}[0]`;
.for(@num, @bg);
background: ~"@{bg}";
}
@urls: "url('../img/centered_image_bg.png')", "url('../img/left_image_bg.png')";
@attr: "center top no-repeat transparent", "left top y-repeat";
.class{
.bgmixin(@urls, @attr);
}
,输出如下:
.class {
background: url('../img/centered_image_bg.png') center top no-repeat transparent,
url('../img/left_image_bg.png') left top y-repeat;
}
答案 1 :(得分:5)
在LESS中将多个属性值传递给单个属性具有挑战性。你现在的代码显然适用于单个背景。要获得多个,您通常必须使用字符串。
以下内容允许通过将多个url作为单个字符串传递给第一个参数来输入,然后使用内联javascript对字符串进行替换并将这些url连接到其他参数。
<强> LESS 强>
.background_centered(
@urls,
@position_horizontal: center,
@position_vertical: top,
@background-repeat: no-repeat,
@transparency: transparent ) {
@combinedValues: ~"@{position_horizontal} @{position_vertical} @{background-repeat} @{transparency}";
@urlsRewrite: ~`@{urls}.replace(/\)/g, ') @{combinedValues}')`;
background: @urlsRewrite;
}
.class {
.background_centered("url('../img/war_top_baner_gp.png'), url('../img/war_header_bg.png')");
}
<强>输出强>
.class {
background: url('../img/war_top_baner_gp.png') center top no-repeat transparent, url('../img/war_header_bg.png') center top no-repeat transparent;
}
答案 2 :(得分:1)
要将逗号分隔的参数列表传递给mixin,只需在mixin调用中使用;
而不是逗号:
.mixin(@bg, @color) {
background: @bg;
color: @color;
}
.class {
.mixin(url('img/bg.png') no-repeat, red; white);
}
输出:
.class {
background: url('img/bg.png') no-repeat, #ff0000;
color: #ffffff;
}
答案 3 :(得分:0)
你不需要在mixin中粘贴几个背景。您可以使用LESS语言的原生merge
功能。
merge
功能允许聚合多个值 属性在单个下的逗号或空格分隔列表中 属性。merge
对于背景等属性非常有用 变换。
因此,您的代码可能会更少:
.element {
background+: url("../1.png") center top no-repeat transparent;
background+: url("../2.png") left top repeat;
background+: url("../3.png") right top repeat;
}
这比复杂的mixin简单得多。
生成的css:
.element {
background: url("../1.png") center top no-repeat transparent,
url("../2.png") left top repeat,
url("../3.png") right top repeat;
}