从下一个数组条目获取@each vars 中的 SCSS Mixin
Get in SCSS Mixin inside @each vars from next array entrie
我想提高我的前端质量标准,今天为背景图像部分构建一个小帮手:
.html
<div></div>
.scss
@mixin backgroundImage($path: '/assets/images', $fileName: null, $supports: null, $fileType: '.jpg', $unitType: 'px', $startFrom: 0) {
@each $res in $supports {
@media only screen and (min-width: $startFrom / 720 / 1280 / 1920 / 2560 / Last not need) and (max-width: $res#{$unitType}) {
background-image: url("#{$path}#{$fileName}-#{$res}#{$fileType}");
}
}
}
div {
height: 100vh;
background-size: cover;
background-repeat: no-repeat;
background-position: 50%, 50%;
background-color: navajowhite;
@include backgroundImage($fileName: 'background', $supports: (720, 1280, 1920, 2560, 3840), $startFrom: 480);
}
我试图创建一个 stackblitz,但后来意识到我无法上传图像。因此,如果您需要一个演示来测试,请在根目录中创建一个名为 index.html 的文件夹,名为 assets/images/
并在其中放置 5 个名为 background-720
、background-1280
等的文件。 .
好的,关键是我需要在这里:(min-width: $startFrom / 720 / 1280 / 1920 / 2560 / Last not need)
得到每个 @each
最后一个 @each
的 $supports
的数量。只是在第一个 @each
我需要使用 $startFrom
我知道这很混乱。但我以前从未写过复杂的 SCSS Mixins。我希望有人能帮助我。
我认为您唯一的问题是路径之间缺少斜线,因为它解析为 /assets/imagesbackground-$sz.jpg
,而且我也不认为您需要 $startFrom
,因为您可以只需将其添加到 $supports
数组即可。
这是我对其进行的更改,它似乎运行良好:
@mixin backgroundImage($path: '@/assets/images', $fileType: '.jpg', $unitType: 'px', $fileName: null, $supports: null, $startFrom: 0) {
@each $size in $supports {
@media only screen and (min-width: $startFrom#{$unitType}) and (max-width: $size#{$unitType}) {
background-image: url("#{$path}/#{$fileName}-#{$size}#{$fileType}");
}
}
}
好的,我现在明白了...最终的工作代码:
@mixin resBgImg($path: '/assets/images/', $fileName: null, $resolutions: null, $fileType: '.jpg', $unitType: 'px', $startFrom: 0)
@for $i from 1 through length($resolutions)
$min: $startFrom
@if $i > 1
$min: nth($resolutions, $i - 1)
$max: nth($resolutions, $i)
@if $i == length($resolutions)
@media only screen and (min-width: $min + 1+$unitType)
background-image: url("#{$path}#{$fileName}-#{$max}#{$fileType}")
@else
@media only screen and (min-width: $min + if($i > 1, 1, 0)+$unitType) and (max-width: $max+$unitType)
background-image: url("#{$path}#{$fileName}-#{$max}#{$fileType}")
我想提高我的前端质量标准,今天为背景图像部分构建一个小帮手:
.html
<div></div>
.scss
@mixin backgroundImage($path: '/assets/images', $fileName: null, $supports: null, $fileType: '.jpg', $unitType: 'px', $startFrom: 0) {
@each $res in $supports {
@media only screen and (min-width: $startFrom / 720 / 1280 / 1920 / 2560 / Last not need) and (max-width: $res#{$unitType}) {
background-image: url("#{$path}#{$fileName}-#{$res}#{$fileType}");
}
}
}
div {
height: 100vh;
background-size: cover;
background-repeat: no-repeat;
background-position: 50%, 50%;
background-color: navajowhite;
@include backgroundImage($fileName: 'background', $supports: (720, 1280, 1920, 2560, 3840), $startFrom: 480);
}
我试图创建一个 stackblitz,但后来意识到我无法上传图像。因此,如果您需要一个演示来测试,请在根目录中创建一个名为 index.html 的文件夹,名为 assets/images/
并在其中放置 5 个名为 background-720
、background-1280
等的文件。 .
好的,关键是我需要在这里:(min-width: $startFrom / 720 / 1280 / 1920 / 2560 / Last not need)
得到每个 @each
最后一个 @each
的 $supports
的数量。只是在第一个 @each
我需要使用 $startFrom
我知道这很混乱。但我以前从未写过复杂的 SCSS Mixins。我希望有人能帮助我。
我认为您唯一的问题是路径之间缺少斜线,因为它解析为 /assets/imagesbackground-$sz.jpg
,而且我也不认为您需要 $startFrom
,因为您可以只需将其添加到 $supports
数组即可。
这是我对其进行的更改,它似乎运行良好:
@mixin backgroundImage($path: '@/assets/images', $fileType: '.jpg', $unitType: 'px', $fileName: null, $supports: null, $startFrom: 0) {
@each $size in $supports {
@media only screen and (min-width: $startFrom#{$unitType}) and (max-width: $size#{$unitType}) {
background-image: url("#{$path}/#{$fileName}-#{$size}#{$fileType}");
}
}
}
好的,我现在明白了...最终的工作代码:
@mixin resBgImg($path: '/assets/images/', $fileName: null, $resolutions: null, $fileType: '.jpg', $unitType: 'px', $startFrom: 0)
@for $i from 1 through length($resolutions)
$min: $startFrom
@if $i > 1
$min: nth($resolutions, $i - 1)
$max: nth($resolutions, $i)
@if $i == length($resolutions)
@media only screen and (min-width: $min + 1+$unitType)
background-image: url("#{$path}#{$fileName}-#{$max}#{$fileType}")
@else
@media only screen and (min-width: $min + if($i > 1, 1, 0)+$unitType) and (max-width: $max+$unitType)
background-image: url("#{$path}#{$fileName}-#{$max}#{$fileType}")