在 SCSS 的 for 循环中生成线性渐变
Generate linear gradient in a for loop in SCSS
我已经编写了一个 mixin 来创建具有 4 条并排线的背景,利用 linear-gradient
在任何位置任何大小和任何角度但是我想知道是否会有让它更有活力的方法?
@mixin corner-lines($start, $gap, $width, $angle, $colour) {
background:
linear-gradient($angle,
#0000 $start,
#0000 calc(#{$start} + #{$gap}),
$colour calc(#{$start} + #{$gap}),
$colour calc(#{$start} + (#{$gap} * 2) + #{$width}),
#0000 calc(#{$start} + (#{$gap} * 2) + #{$width}),
#0000 calc(#{$start} + (#{$gap} * 3) + #{$width})),
linear-gradient($angle,
#0000 calc(#{$start} + (#{$gap} * 4) + #{$width}),
#0000 calc(#{$start} + (#{$gap} * 5) + #{$width}),
$colour calc(#{$start} + (#{$gap} * 5) + #{$width}),
$colour calc(#{$start} + (#{$gap} * 6) + (#{$width} * 2)),
#0000 calc(#{$start} + (#{$gap} * 6) + (#{$width} * 2)),
#0000 calc(#{$start} + (#{$gap} * 7) + (#{$width} * 2))),
linear-gradient($angle,
#0000 calc(#{$start} + (#{$gap} * 8) + (#{$width} * 2)),
#0000 calc(#{$start} + (#{$gap} * 9) + (#{$width} * 2)),
$colour calc(#{$start} + (#{$gap} * 9) + (#{$width} * 2)),
$colour calc(#{$start} + (#{$gap} * 10) + (#{$width} * 3)),
#0000 calc(#{$start} + (#{$gap} * 10) + (#{$width} * 3)),
#0000 calc(#{$start} + (#{$gap} * 11) + (#{$width} * 3))),
linear-gradient($angle,
#0000 calc(#{$start} + (#{$gap} * 12) + (#{$width} * 3)),
#0000 calc(#{$start} + (#{$gap} * 13) + (#{$width} * 3)),
$colour calc(#{$start} + (#{$gap} * 13) + (#{$width} * 3)),
$colour calc(#{$start} + (#{$gap} * 14) + (#{$width} * 4)),
#0000 calc(#{$start} + (#{$gap} * 14) + (#{$width} * 4)),
#0000 calc(#{$start} + (#{$gap} * 15) + (#{$width} * 4)));
}
如果给定角度 -45deg
,间距 5px
,宽度 10px
:
但是目前,如果我想将行数加倍,我必须复制粘贴 linear-gradient
以使背景元素变大
有什么方法可以循环 n
次并生成这么长的线性渐变?
如果我循环我会使用这样的东西,这个例子不起作用,但我会如何处理它:
$my-var: "someValue";
@while $i <= (#{$steps} * 4) {
$my-var: $my-var + linear-gradient($angle,
#0000 calc(#{$start} + (#{$gap} * #{$i}) + (#{$width} * $i)),
#0000 calc(#{$start} + (#{$gap} * (#{$i} + 1)) + (#{$width} * #{$i})),
$colour calc(#{$start} + (#{$gap} * (#{$i} + 1)) + (#{$width} * #{$i})),
$colour calc(#{$start} + (#{$gap} * (#{$i} + 2)) + (#{$width} * (#{$i} + 1))),
#0000 calc(#{$start} + (#{$gap} * (#{$i} + 2)) + (#{$width} * (#{$i} + 1))),
#0000 calc(#{$start} + (#{$gap} * (#{$i} + 3)) + (#{$width} * (#{$i} + 1))));
$i: $i + 4
}
我什至不确定这是否可行,因为我不认为你可以连接 属性 值,但我想我还是要问一下。
codesandbox: https://codesandbox.io/s/nostalgic-diffie-yxzgo?file=/src/styles.scss
谢谢!
编辑 (12/08/20): 结合 Temani Afif 和 Monzoor Tamal 的回答,我得到了想要的结果。这是一个无需对任何宽度进行硬编码就可以为我工作的混音:
@mixin corner-lines($gap, $width, $n, $color) {
position: relative;
&::before {
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: calc(#{$n} * (#{$width} + #{$gap}));
background:
repeating-linear-gradient(90deg,
transparent 0 #{$gap},
#{$color} 0 calc(#{$gap} + #{$width}));
content: '';
transform: skew(-45deg);
transform-origin: top;
}
}
我会使用不同的方法来执行此操作,如果没有 SASS 会更容易处理。你只需要调整CSS个变量来控制渐变:
.box {
width:200px;
height:200px;
display:inline-block;
background:pink;
}
.gradient {
--n:3;
--gap:15px;
--width:20px;
--color:red;
position:relative;
z-index:0;
overflow:hidden;
}
.gradient::before {
content:"";
position:absolute;
top:0;
left:0;
bottom:0;
width:calc(var(--n)*(var(--width) + var(--gap)));
background:
repeating-linear-gradient(90deg,
transparent 0 var(--gap),
var(--color) 0 calc(var(--gap) + var(--width)));
transform:skew(-45deg);
transform-origin:top;
}
<div class="box gradient"></div>
<div class="box gradient" style="--n:5"></div>
<div class="box gradient" style="--n:2;--width:30px;--color:blue;"></div>
<div class="box gradient" style="--n:4;--gap:20px;--width:25px;--color:yellow;"></div>
@mixin stripe($startColor, $endColor, $stripeAngel: -45, $stripeSize: 20px, $contentWidth: 100px, $contentAngel: 135,) {
background:
linear-gradient(
#{$contentAngel}deg,
rgba(255, 255, 255, 0.0) $contentWidth,
rgb(255, 255, 255) 0),
repeating-linear-gradient(
#{$stripeAngel}deg,
$startColor,
$startColor $stripeSize,
$endColor $stripeSize,
$endColor $stripeSize * 2);
}
.tt {
height: 100vh;
padding: 5em;
// @include corner-lines(90%, 5px, 10px, -45deg, red)
@include stripe(red, #ffffff, -45, 20px, 100px, 135)
}
您只需更改 $contentWidth
大小。让我知道是否有帮助。
我已经编写了一个 mixin 来创建具有 4 条并排线的背景,利用 linear-gradient
在任何位置任何大小和任何角度但是我想知道是否会有让它更有活力的方法?
@mixin corner-lines($start, $gap, $width, $angle, $colour) {
background:
linear-gradient($angle,
#0000 $start,
#0000 calc(#{$start} + #{$gap}),
$colour calc(#{$start} + #{$gap}),
$colour calc(#{$start} + (#{$gap} * 2) + #{$width}),
#0000 calc(#{$start} + (#{$gap} * 2) + #{$width}),
#0000 calc(#{$start} + (#{$gap} * 3) + #{$width})),
linear-gradient($angle,
#0000 calc(#{$start} + (#{$gap} * 4) + #{$width}),
#0000 calc(#{$start} + (#{$gap} * 5) + #{$width}),
$colour calc(#{$start} + (#{$gap} * 5) + #{$width}),
$colour calc(#{$start} + (#{$gap} * 6) + (#{$width} * 2)),
#0000 calc(#{$start} + (#{$gap} * 6) + (#{$width} * 2)),
#0000 calc(#{$start} + (#{$gap} * 7) + (#{$width} * 2))),
linear-gradient($angle,
#0000 calc(#{$start} + (#{$gap} * 8) + (#{$width} * 2)),
#0000 calc(#{$start} + (#{$gap} * 9) + (#{$width} * 2)),
$colour calc(#{$start} + (#{$gap} * 9) + (#{$width} * 2)),
$colour calc(#{$start} + (#{$gap} * 10) + (#{$width} * 3)),
#0000 calc(#{$start} + (#{$gap} * 10) + (#{$width} * 3)),
#0000 calc(#{$start} + (#{$gap} * 11) + (#{$width} * 3))),
linear-gradient($angle,
#0000 calc(#{$start} + (#{$gap} * 12) + (#{$width} * 3)),
#0000 calc(#{$start} + (#{$gap} * 13) + (#{$width} * 3)),
$colour calc(#{$start} + (#{$gap} * 13) + (#{$width} * 3)),
$colour calc(#{$start} + (#{$gap} * 14) + (#{$width} * 4)),
#0000 calc(#{$start} + (#{$gap} * 14) + (#{$width} * 4)),
#0000 calc(#{$start} + (#{$gap} * 15) + (#{$width} * 4)));
}
如果给定角度 -45deg
,间距 5px
,宽度 10px
:
但是目前,如果我想将行数加倍,我必须复制粘贴 linear-gradient
以使背景元素变大
有什么方法可以循环 n
次并生成这么长的线性渐变?
如果我循环我会使用这样的东西,这个例子不起作用,但我会如何处理它:
$my-var: "someValue";
@while $i <= (#{$steps} * 4) {
$my-var: $my-var + linear-gradient($angle,
#0000 calc(#{$start} + (#{$gap} * #{$i}) + (#{$width} * $i)),
#0000 calc(#{$start} + (#{$gap} * (#{$i} + 1)) + (#{$width} * #{$i})),
$colour calc(#{$start} + (#{$gap} * (#{$i} + 1)) + (#{$width} * #{$i})),
$colour calc(#{$start} + (#{$gap} * (#{$i} + 2)) + (#{$width} * (#{$i} + 1))),
#0000 calc(#{$start} + (#{$gap} * (#{$i} + 2)) + (#{$width} * (#{$i} + 1))),
#0000 calc(#{$start} + (#{$gap} * (#{$i} + 3)) + (#{$width} * (#{$i} + 1))));
$i: $i + 4
}
我什至不确定这是否可行,因为我不认为你可以连接 属性 值,但我想我还是要问一下。
codesandbox: https://codesandbox.io/s/nostalgic-diffie-yxzgo?file=/src/styles.scss
谢谢!
编辑 (12/08/20): 结合 Temani Afif 和 Monzoor Tamal 的回答,我得到了想要的结果。这是一个无需对任何宽度进行硬编码就可以为我工作的混音:
@mixin corner-lines($gap, $width, $n, $color) {
position: relative;
&::before {
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: calc(#{$n} * (#{$width} + #{$gap}));
background:
repeating-linear-gradient(90deg,
transparent 0 #{$gap},
#{$color} 0 calc(#{$gap} + #{$width}));
content: '';
transform: skew(-45deg);
transform-origin: top;
}
}
我会使用不同的方法来执行此操作,如果没有 SASS 会更容易处理。你只需要调整CSS个变量来控制渐变:
.box {
width:200px;
height:200px;
display:inline-block;
background:pink;
}
.gradient {
--n:3;
--gap:15px;
--width:20px;
--color:red;
position:relative;
z-index:0;
overflow:hidden;
}
.gradient::before {
content:"";
position:absolute;
top:0;
left:0;
bottom:0;
width:calc(var(--n)*(var(--width) + var(--gap)));
background:
repeating-linear-gradient(90deg,
transparent 0 var(--gap),
var(--color) 0 calc(var(--gap) + var(--width)));
transform:skew(-45deg);
transform-origin:top;
}
<div class="box gradient"></div>
<div class="box gradient" style="--n:5"></div>
<div class="box gradient" style="--n:2;--width:30px;--color:blue;"></div>
<div class="box gradient" style="--n:4;--gap:20px;--width:25px;--color:yellow;"></div>
@mixin stripe($startColor, $endColor, $stripeAngel: -45, $stripeSize: 20px, $contentWidth: 100px, $contentAngel: 135,) {
background:
linear-gradient(
#{$contentAngel}deg,
rgba(255, 255, 255, 0.0) $contentWidth,
rgb(255, 255, 255) 0),
repeating-linear-gradient(
#{$stripeAngel}deg,
$startColor,
$startColor $stripeSize,
$endColor $stripeSize,
$endColor $stripeSize * 2);
}
.tt {
height: 100vh;
padding: 5em;
// @include corner-lines(90%, 5px, 10px, -45deg, red)
@include stripe(red, #ffffff, -45, 20px, 100px, 135)
}
您只需更改 $contentWidth
大小。让我知道是否有帮助。