首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将Sass变量用于CSS3媒体查询

将Sass变量用于CSS3媒体查询
EN

Stack Overflow用户
提问于 2012-02-03 08:41:49
回答 4查看 107.3K关注 0票数 148

我尝试将Sass变量的使用与@media查询结合使用,如下所示:

代码语言:javascript
复制
$base_width:1160px;

@media screen and (max-width: 1170px) {$base_width: 960px;}
@media screen and (min-width: 1171px) {$base_width: 1160px;}

然后,在基于样式表宽度百分比的度量中的不同点定义$base_width,以生成流畅的布局。

当我这样做时,变量似乎可以正确识别,但媒体查询的条件却不能。例如,上面的代码生成1160px的布局,而不考虑屏幕宽度。如果我像这样翻转@media语句:

代码语言:javascript
复制
@media screen and (min-width: 1171px) {$base_width: 1160px;}
@media screen and (max-width: 1170px) {$base_width: 960px;}

它产生一个960px的布局,同样与屏幕宽度无关。还要注意,如果我删除了$base_width: 1160px;的第一行,它将返回一个未定义变量的错误。知道我错过了什么吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-03 23:17:28

这根本是不可能的。因为触发器@media screen and (max-width: 1170px)发生在客户端。

只有当SASS获取包含$base_width变量的样式表中的所有规则和属性并相应地复制/更改它们时,才有可能实现预期的结果。

因为它不会自动工作,所以你可以像这样手动完成:

代码语言:javascript
复制
@media screen and (max-width: 1170px)
      $base_width: 960px // you need to indent it to (re)set it just within this media-query
      // now you copy all the css rules/properties that contain or are relative to $base_width e.g.
      #wrapper
          width: $base_width
          ...

@media screen and (min-width: 1171px)
    $base_width: 1160px
      #wrapper
          width: $base_width
          ...

这不是真的干,但你能做的最好了。

如果每次的更改都是相同的,那么您还可以准备一个包含所有更改的值的混合,这样您就不需要重复了。此外,您可以尝试将mixin与特定的更改组合在一起。像这样:

代码语言:javascript
复制
@media screen and (min-width: 1171px)
    +base_width_changes(1160px)
    #width-1171-specific-element // additional specific changes, that aren't in the mixin
        display: block

Mixin看起来就像这样

代码语言:javascript
复制
=base_width_changes($base_width)
    #wrapper
        width: $base_width
票数 113
EN

Stack Overflow用户

发布于 2015-03-11 20:35:57

与Philipp Zedler的答案类似,您可以使用mixin来完成此操作。这让你可以把所有的东西放在一个文件中。

代码语言:javascript
复制
    @mixin styling($base-width) {
        // your SCSS here, e.g.
        #Contents {
            width: $base-width;
        }
    }

    @media screen and (max-width: 1170px) {
        @include styling($base-width: 960px);
    }
    @media screen and (min-width: 1171px) {
        @include styling($base-width: 1160px);
    }
票数 72
EN

Stack Overflow用户

发布于 2019-03-22 17:22:14

这在SASS中是不可能的,但在CSS变量(或CSS custom properties)中是可能的。唯一的缺点是浏览器支持-但实际上有一个PostCSS插件- postcss-css-variables -它“扁平化”了CSS变量的使用(这也为你提供了对旧浏览器的支持)。

下面的示例可以很好地使用SASS (并且对于postcss-css变量,您也可以获得对旧浏览器的支持)。

代码语言:javascript
复制
$mq-laptop: 1440px;
$mq-desktop: 1680px;

:root {
    --font-size-regular: 14px;
    --gutter: 1rem;
}

// The fact that we have to use a `max-width` media query here, so as to not
// overlap with the next media query, is a quirk of postcss-css-variables
@media (min-width: $mq-laptop) and (max-width: $mq-desktop - 1px) {
    :root {
        --font-size-regular: 16px;
        --gutter: 1.5rem;
    }
}

@media (min-width: $mq-desktop) {
    :root {
        --font-size-regular: 18px;
        --gutter: 1.75rem;
    }
}

.my-element {
    font-size: var(--font-size-regular);
    padding: 0 calc(var(--gutter) / 2);
}

这将产生以下CSS。重复的媒体查询会增加文件大小,但我发现一旦web服务器应用gzip (它通常会自动执行),增加的文件大小通常可以忽略不计。

代码语言:javascript
复制
.my-element {
  font-size: 14px;
  padding: 0 calc(1rem / 2);
}
@media (min-width: 1680px) {
  .my-element {
  padding: 0 calc(1.75rem / 2);
  }
}
@media (min-width: 1440px) and (max-width: 1679px) {
  .my-element {
  padding: 0 calc(1.5rem / 2);
  }
}
@media (min-width: 1680px) {
  .my-element {
  font-size: 18px;
  }
}
@media (min-width: 1440px) and (max-width: 1679px) {
  .my-element {
  font-size: 16px;
  }
}
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9122195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档