SCSS - 在基于@extend 的方法中使用@mixins(经典 css)
SCSS - Using @mixins in an @extend based method (classy css)
我被 Una Kravits 创造她的 S 的方法所吸引CSS。
https://una.im/classy-css/
我 运行 关注的问题是在该页面的底部,她正在使用 @mixin 使构建更容易。但在我看来,如果我以所示方式使用混合,我最终会得到重复的代码。
取自她的一些例子post:
不使用mixin
$color--primary: #b29;
$color--secondary: #19d;
%btn--base {
border: 1px solid currentColor;
border-radius: 1.5em;
background: none;
outline: none;
transition-duration: .25s;
cursor: pointer;
margin: 30px;
padding: .5em 1em;
&:hover {
color: white;
background: black;
}
}
%btn--primary {
@extend %btn--base;
color: $color--primary;
font-size: 1.5em;
}
%btn--secondary {
@extend %btn--base;
color: $color--secondary;
font-size: 1.1em;
}
.hero {
&__btn {
@extend %btn--primary;
}
}
.sidebar {
&__btn {
@extend %btn--secondary;
}
}
.global-nav {
&__btn {
@extend %btn--secondary;
&--login {
@extend .global-nav__btn;
margin-right: 1em;
// at this point, you're
// styling .global-nav__btn--login
}
}
}
结果 css 没有重复
.hero__btn, .sidebar__btn, .global-nav__btn, .global-nav__btn--login {
border: 1px solid currentColor;
border-radius: 1.5em;
background: none;
outline: none;
transition-duration: .25s;
cursor: pointer;
margin: 30px;
padding: .5em 1em;
}
.hero__btn:hover, .sidebar__btn:hover, .global-nav__btn:hover, .global-nav__btn--login:hover {
color: white;
background: black;
}
.hero__btn {
color: #b29;
font-size: 1.5em;
}
.sidebar__btn, .global-nav__btn, .global-nav__btn--login {
color: #19d;
font-size: 1.1em;
}
.global-nav__btn--login {
margin-right: 1em;
}
好的,到目前为止一切顺利。但随后她建议使用@mixin。现在我真的很喜欢这个想法,我喜欢能够使用 @if @else,而且我真的很喜欢能够使用 @mixin 和静默占位符传递参数。她的示例只构建了一次 css 语句(两个悬停)。例如,我将在原始示例下方添加一些。注意结果 css 是如何重复的。我在这里错过了什么吗?我可以使用上面的示例,但同样,我真的很喜欢将 @mixin 与它的选项结合使用的选项。
例子
// the colon after the argument denotes a default value
// creating the constructor function (mixin)
@mixin btn-me($color: hotpink, $size: normal) {
border: 1px solid $color;
border-radius: 1.5em;
background: none;
outline: none;
transition-duration: .25s;
cursor: pointer;
margin: 30px;
padding: .5em 1em;
@if $size == 'small' {
font-size: .8em;
} @else {
font-size: 1.2em;
}
&:hover {
color: white;
background: $color;
}
}
// creating placeholder classes to extend from and reference
%btn--primary {
@include btn-me; // no arguments means it takes defaults
}
%btn--secondary {
@include btn-me(blue, small);
}
%additional--btn--to--show--repeats {
@include btn-me(green, small);
}
// instantiating the code with semantic naming
// this is the only moment that we are writing
// any code to be compiled
.hero__btn {
@extend %btn--secondary;
}
.additional__btn {
@extend %btn--secondary;
}
.additional__btn__two {
@extend %btn--primary;
}
.additional__btn__three {
@extend %additional--btn--to--show--repeats;
}
结果重复CSS
.additional__btn__two {
border: 1px solid hotpink;
border-radius: 1.5em;
background: none;
outline: none;
transition-duration: .25s;
cursor: pointer;
margin: 30px;
padding: .5em 1em;
font-size: 1.2em;
}
.additional__btn__two:hover {
color: white;
background: hotpink;
}
.hero__btn, .additional__btn {
border: 1px solid blue;
border-radius: 1.5em;
background: none;
outline: none;
transition-duration: .25s;
cursor: pointer;
margin: 30px;
padding: .5em 1em;
font-size: .8em;
}
.hero__btn:hover, .additional__btn:hover {
color: white;
background: blue;
}
.additional__btn__three {
border: 1px solid green;
border-radius: 1.5em;
background: none;
outline: none;
transition-duration: .25s;
cursor: pointer;
margin: 30px;
padding: .5em 1em;
font-size: .8em;
}
.additional__btn__three:hover {
color: white;
background: green;
}
不幸的是,mixin 就是这样工作的。如果您想减小文件大小,我会考虑仅对要更改的属性使用 mixin,并对不变的 css 规则使用常规扩展。
@mixin btn-me($color: hotpink, $size: normal) {
border: 1px solid $color;
@if $size == 'small' {
font-size: .8em;
} @else {
font-size: 1.2em;
}
&:hover {
background: $color;
}
}
%btn {
border-radius: 1.5em;
background: none;
outline: none;
transition-duration: .25s;
cursor: pointer;
margin: 30px;
padding: .5em 1em;
&:hover {
color: white;
}
}
%btn--primary {
@include btn-me; // no arguments means it takes defaults
@extend %btn;
}
%btn--secondary {
@include btn-me(blue, small);
@extend %btn;
}
我被 Una Kravits 创造她的 S 的方法所吸引CSS。 https://una.im/classy-css/
我 运行 关注的问题是在该页面的底部,她正在使用 @mixin 使构建更容易。但在我看来,如果我以所示方式使用混合,我最终会得到重复的代码。
取自她的一些例子post:
不使用mixin
$color--primary: #b29;
$color--secondary: #19d;
%btn--base {
border: 1px solid currentColor;
border-radius: 1.5em;
background: none;
outline: none;
transition-duration: .25s;
cursor: pointer;
margin: 30px;
padding: .5em 1em;
&:hover {
color: white;
background: black;
}
}
%btn--primary {
@extend %btn--base;
color: $color--primary;
font-size: 1.5em;
}
%btn--secondary {
@extend %btn--base;
color: $color--secondary;
font-size: 1.1em;
}
.hero {
&__btn {
@extend %btn--primary;
}
}
.sidebar {
&__btn {
@extend %btn--secondary;
}
}
.global-nav {
&__btn {
@extend %btn--secondary;
&--login {
@extend .global-nav__btn;
margin-right: 1em;
// at this point, you're
// styling .global-nav__btn--login
}
}
}
结果 css 没有重复
.hero__btn, .sidebar__btn, .global-nav__btn, .global-nav__btn--login {
border: 1px solid currentColor;
border-radius: 1.5em;
background: none;
outline: none;
transition-duration: .25s;
cursor: pointer;
margin: 30px;
padding: .5em 1em;
}
.hero__btn:hover, .sidebar__btn:hover, .global-nav__btn:hover, .global-nav__btn--login:hover {
color: white;
background: black;
}
.hero__btn {
color: #b29;
font-size: 1.5em;
}
.sidebar__btn, .global-nav__btn, .global-nav__btn--login {
color: #19d;
font-size: 1.1em;
}
.global-nav__btn--login {
margin-right: 1em;
}
好的,到目前为止一切顺利。但随后她建议使用@mixin。现在我真的很喜欢这个想法,我喜欢能够使用 @if @else,而且我真的很喜欢能够使用 @mixin 和静默占位符传递参数。她的示例只构建了一次 css 语句(两个悬停)。例如,我将在原始示例下方添加一些。注意结果 css 是如何重复的。我在这里错过了什么吗?我可以使用上面的示例,但同样,我真的很喜欢将 @mixin 与它的选项结合使用的选项。
例子
// the colon after the argument denotes a default value
// creating the constructor function (mixin)
@mixin btn-me($color: hotpink, $size: normal) {
border: 1px solid $color;
border-radius: 1.5em;
background: none;
outline: none;
transition-duration: .25s;
cursor: pointer;
margin: 30px;
padding: .5em 1em;
@if $size == 'small' {
font-size: .8em;
} @else {
font-size: 1.2em;
}
&:hover {
color: white;
background: $color;
}
}
// creating placeholder classes to extend from and reference
%btn--primary {
@include btn-me; // no arguments means it takes defaults
}
%btn--secondary {
@include btn-me(blue, small);
}
%additional--btn--to--show--repeats {
@include btn-me(green, small);
}
// instantiating the code with semantic naming
// this is the only moment that we are writing
// any code to be compiled
.hero__btn {
@extend %btn--secondary;
}
.additional__btn {
@extend %btn--secondary;
}
.additional__btn__two {
@extend %btn--primary;
}
.additional__btn__three {
@extend %additional--btn--to--show--repeats;
}
结果重复CSS
.additional__btn__two {
border: 1px solid hotpink;
border-radius: 1.5em;
background: none;
outline: none;
transition-duration: .25s;
cursor: pointer;
margin: 30px;
padding: .5em 1em;
font-size: 1.2em;
}
.additional__btn__two:hover {
color: white;
background: hotpink;
}
.hero__btn, .additional__btn {
border: 1px solid blue;
border-radius: 1.5em;
background: none;
outline: none;
transition-duration: .25s;
cursor: pointer;
margin: 30px;
padding: .5em 1em;
font-size: .8em;
}
.hero__btn:hover, .additional__btn:hover {
color: white;
background: blue;
}
.additional__btn__three {
border: 1px solid green;
border-radius: 1.5em;
background: none;
outline: none;
transition-duration: .25s;
cursor: pointer;
margin: 30px;
padding: .5em 1em;
font-size: .8em;
}
.additional__btn__three:hover {
color: white;
background: green;
}
不幸的是,mixin 就是这样工作的。如果您想减小文件大小,我会考虑仅对要更改的属性使用 mixin,并对不变的 css 规则使用常规扩展。
@mixin btn-me($color: hotpink, $size: normal) {
border: 1px solid $color;
@if $size == 'small' {
font-size: .8em;
} @else {
font-size: 1.2em;
}
&:hover {
background: $color;
}
}
%btn {
border-radius: 1.5em;
background: none;
outline: none;
transition-duration: .25s;
cursor: pointer;
margin: 30px;
padding: .5em 1em;
&:hover {
color: white;
}
}
%btn--primary {
@include btn-me; // no arguments means it takes defaults
@extend %btn;
}
%btn--secondary {
@include btn-me(blue, small);
@extend %btn;
}