SASS 中多个断点的样式
Styles for multiple breakpoints in SASS
我在 SASS 中定义了两个 mixin,它们使我可以轻松地放置媒体查询。我遇到的问题是我在许多查询中经常重复自己。也就是说,我的一些样式更改对于平板电脑和移动断点是相同的,而另一些则不同。示例:
.foo
float: left
width: 50%
+tablet()
float: none
display: block
width: 100%
+mobile()
float: none
display: block
width: 100%
我的 mixins 定义如下:
=tablet
@media (min-width: #{$mobile-width} + 1) and (max-width: #{$tablet-width})
@content
=mobile
@media (max-width: #{$mobile-width})
@content
我很想做这样的事情:
...
+tablet(), +mobile
float: none
display: block
width: 100%
无法编译,那么让我的 SASS 样式表保持干燥的最佳方法是什么?
您可以将手机和平板电脑媒体定义为字符串,然后连接这些字符串。
Scss 可以轻松转换为sass。
$mobile-width: 320px;
$tablet-width: 760px;
// Media queries as strings
$tablet: "(min-width: #{$mobile-width + 1}) and (max-width: #{$tablet-width})";
$mobile: "(max-width: #{$mobile-width})";
// Converts a list to a string with delimiters between elements
@function join-list($list, $separator: ", ") {
$result-string: "";
@each $item in $list {
// Index of the current item of `$list` list
$index: index($list, $item);
$result-string: $result-string + $item;
// If this is not the last item, adds separator
@if ($index != length($list)) {
$result-string: $result-string + $separator;
}
}
@return $result-string;
}
@mixin get-media($medias...) {
@media #{join-list($medias, " and ")} {
@content;
}
}
.foo {
float: left;
width: 50%;
@include get-media($mobile, $tablet) {
// or @include get-media($mobile) {
// or @include get-media($tablet) {
float: none;
display: block;
width: 100%;
}
}
Css 输出:
.foo {
float: left;
width: 50%;
}
@media (max-width: 320px) and (min-width: 321px) and (max-width: 760px) {
.foo {
float: none;
display: block;
width: 100%;
}
}
SassMeister demo.
根据@Stefan F 的评论,在这种情况下最简单的做法是创建第三个名为(类似于)的 mixin:+both()
,它封装了手机和平板电脑的尺寸。 (我自己回答这个问题只是因为他没有,而且已经有一段时间了。)
示例:
=both
@media (max-width: #{$tablet-width})
@content
用法:
.foo
float: left
width: 50%
+both()
float: none
display: block
width: 100%
我在 SASS 中定义了两个 mixin,它们使我可以轻松地放置媒体查询。我遇到的问题是我在许多查询中经常重复自己。也就是说,我的一些样式更改对于平板电脑和移动断点是相同的,而另一些则不同。示例:
.foo
float: left
width: 50%
+tablet()
float: none
display: block
width: 100%
+mobile()
float: none
display: block
width: 100%
我的 mixins 定义如下:
=tablet
@media (min-width: #{$mobile-width} + 1) and (max-width: #{$tablet-width})
@content
=mobile
@media (max-width: #{$mobile-width})
@content
我很想做这样的事情:
...
+tablet(), +mobile
float: none
display: block
width: 100%
无法编译,那么让我的 SASS 样式表保持干燥的最佳方法是什么?
您可以将手机和平板电脑媒体定义为字符串,然后连接这些字符串。
Scss 可以轻松转换为sass。
$mobile-width: 320px;
$tablet-width: 760px;
// Media queries as strings
$tablet: "(min-width: #{$mobile-width + 1}) and (max-width: #{$tablet-width})";
$mobile: "(max-width: #{$mobile-width})";
// Converts a list to a string with delimiters between elements
@function join-list($list, $separator: ", ") {
$result-string: "";
@each $item in $list {
// Index of the current item of `$list` list
$index: index($list, $item);
$result-string: $result-string + $item;
// If this is not the last item, adds separator
@if ($index != length($list)) {
$result-string: $result-string + $separator;
}
}
@return $result-string;
}
@mixin get-media($medias...) {
@media #{join-list($medias, " and ")} {
@content;
}
}
.foo {
float: left;
width: 50%;
@include get-media($mobile, $tablet) {
// or @include get-media($mobile) {
// or @include get-media($tablet) {
float: none;
display: block;
width: 100%;
}
}
Css 输出:
.foo {
float: left;
width: 50%;
}
@media (max-width: 320px) and (min-width: 321px) and (max-width: 760px) {
.foo {
float: none;
display: block;
width: 100%;
}
}
SassMeister demo.
根据@Stefan F 的评论,在这种情况下最简单的做法是创建第三个名为(类似于)的 mixin:+both()
,它封装了手机和平板电脑的尺寸。 (我自己回答这个问题只是因为他没有,而且已经有一段时间了。)
示例:
=both
@media (max-width: #{$tablet-width})
@content
用法:
.foo
float: left
width: 50%
+both()
float: none
display: block
width: 100%