SASS 偏移位置mixin麻烦
SASS offset position mixin troubles
在过去的几个小时里,我一直在尝试进行偏移定位混合。我一直在为很多错误而苦苦挣扎,我不明白哪里出了问题。
这是最新版本,
@function is-offset-prop-valid($value) {
$values: auto initial inherit 0;
@return (type-of($value) == number and not unitless($value))
and (index($values, $value) != false);
}
@mixin position($position, $args) {
$offsets: top right bottom left;
@each $offset in $offsets {
$i: index($args, $offset);
@if $i == length($args) {
@error "Empty offset values not allowed";
} else {
@if is-offset-prop-valid(nth($args, $i+1)) {
#{$offset}: nth($args, $i+1);
} else {
@error "Set value #{nth($args, $i+1)} not a valid property for #{$offset}";
}
}
}
positon: $position;
}
通常我会将 nth($args, $i + 1)
设置为变量,但为了这个示例,我保留了它。
当我使用 mixin 时
.abs {
@include position(absolute, top 10px);
}
我从内部 if 语句中得到这个错误:
Set value 10px not a valid property for top
我修复了你的代码并稍微重写了它。萨斯迈斯特 demo.
首先,is-offset-prop-valid
函数现在更具可读性。
其次,mixin position
确实循环参数 ($args
),而不是 $offsets
。我添加了更多参数检查(查看评论)。在else
之前需要写@
符号:@else
.
@function is-offset-prop-valid($value) {
$values: auto initial inherit 0;
$is-numder: type-of($value) == number;
$is-unitless: unitless($value);
$match-default-values: index($values, $value) != null;
@return ($is-numder and not $is-unitless) or $match-default-values;
}
@mixin position($position, $args...) {
$offsets: top right bottom left;
@if length($args) == 0 {
@error "Empty offset values not allowed.";
}
@each $arg in $args {
// Check offset key-value pair
@if length($arg) != 2 {
@error "Invalid pair offset-name: offset-value.";
}
$offset: nth($arg, 1);
$value: nth($arg, 2);
// Check offset name parameter
@if index($offsets, $offset) == null {
@error "Invalid offset name: `#{$offset}`.";
}
// Check offset value parameter
@if not is-offset-prop-valid($value) {
@error "Set value `#{$value}` not a valid property for `#{$offset}`.";
}
#{$offset}: $value;
}
position: $position;
}
.abs {
@include position(absolute, top 10px, left 23px);
}
但在我看来,简单的设置位置要简单得多,也更容易理解:
.abs {
top: 10px;
left: 23px;
position: absolute;
}
在过去的几个小时里,我一直在尝试进行偏移定位混合。我一直在为很多错误而苦苦挣扎,我不明白哪里出了问题。
这是最新版本,
@function is-offset-prop-valid($value) {
$values: auto initial inherit 0;
@return (type-of($value) == number and not unitless($value))
and (index($values, $value) != false);
}
@mixin position($position, $args) {
$offsets: top right bottom left;
@each $offset in $offsets {
$i: index($args, $offset);
@if $i == length($args) {
@error "Empty offset values not allowed";
} else {
@if is-offset-prop-valid(nth($args, $i+1)) {
#{$offset}: nth($args, $i+1);
} else {
@error "Set value #{nth($args, $i+1)} not a valid property for #{$offset}";
}
}
}
positon: $position;
}
通常我会将 nth($args, $i + 1)
设置为变量,但为了这个示例,我保留了它。
当我使用 mixin 时
.abs {
@include position(absolute, top 10px);
}
我从内部 if 语句中得到这个错误:
Set value 10px not a valid property for top
我修复了你的代码并稍微重写了它。萨斯迈斯特 demo.
首先,is-offset-prop-valid
函数现在更具可读性。
其次,mixin position
确实循环参数 ($args
),而不是 $offsets
。我添加了更多参数检查(查看评论)。在else
之前需要写@
符号:@else
.
@function is-offset-prop-valid($value) {
$values: auto initial inherit 0;
$is-numder: type-of($value) == number;
$is-unitless: unitless($value);
$match-default-values: index($values, $value) != null;
@return ($is-numder and not $is-unitless) or $match-default-values;
}
@mixin position($position, $args...) {
$offsets: top right bottom left;
@if length($args) == 0 {
@error "Empty offset values not allowed.";
}
@each $arg in $args {
// Check offset key-value pair
@if length($arg) != 2 {
@error "Invalid pair offset-name: offset-value.";
}
$offset: nth($arg, 1);
$value: nth($arg, 2);
// Check offset name parameter
@if index($offsets, $offset) == null {
@error "Invalid offset name: `#{$offset}`.";
}
// Check offset value parameter
@if not is-offset-prop-valid($value) {
@error "Set value `#{$value}` not a valid property for `#{$offset}`.";
}
#{$offset}: $value;
}
position: $position;
}
.abs {
@include position(absolute, top 10px, left 23px);
}
但在我看来,简单的设置位置要简单得多,也更容易理解:
.abs {
top: 10px;
left: 23px;
position: absolute;
}