SASS 3.2 媒体查询和 Internet Explorer 支持

Posted

技术标签:

【中文标题】SASS 3.2 媒体查询和 Internet Explorer 支持【英文标题】:SASS 3.2 Media Queries and Internet Explorer Support 【发布时间】:2012-05-24 04:28:21 【问题描述】:

我最近在我一直从事的项目中使用 @content 块在 SASS 3.2 中实现了 this technique,并且我刚刚到了需要包括对旧浏览器(例如 IE7 和 8)的支持的地步.

例子:

.overview 
  padding: 0 0 19px;

  @include respond-to(medium-screens) 
    padding-top: 19px;
   //medium-screens

  @include respond-to(wide-screens) 
    padding-top: 19px;
   //medium-screens

它们都不支持媒体查询,过去我经常通过为这些浏览器提供所有样式来处理这个问题,当时我将媒体查询分成单独的部分文件,例如 _320.scss、_480.scss并在我的 IE 样式表中像这样加载它们:

@import 320.scss;
@import 480.scss;
etc.

这将加载所有样式,并始终为 IE7 - 8 分配 940 像素(或任何最大宽度)的布局和样式。通过像这样在 SASS 3.2 内嵌样式中嵌套样式,它消除了对单独的部分样式表的需要,但完全搞砸了我为 IE 加载样式的方式。

关于如何解决这个问题的任何想法或解决方案?我可以使用诸如 respond.js 之类的 polyfill 来强制 IE 使用媒体查询,但我更愿意只为 IE 提供一个不灵活的网站。

关于如何最好地组织这些文件或更好的解决方案有什么想法吗?

【问题讨论】:

你找到答案了吗?我有完全相同的问题。 【参考方案1】:

我在很多工作中都使用 LESS,但在大型项目中,有很多人在跨文件工作,我不喜欢使用断点文件,例如 1024.less。

我和我的团队使用模块化方法,例如 header.less,其中包含仅针对标头的所有代码,包括相关的断点。

为了解决 IE 问题(我们在公司环境中工作),我使用这种方法:

@media screen\9, screen and (min-width: 40em) 
    /* Media queries here */

媒体查询中的代码始终由 IE7 及更少版本执行。 IE9 及更高版本像适当的浏览器一样遵循媒体查询。问题是IE8。为了解决这个问题,你需要让它表现得像 IE7

X-UA-Compatible "IE=7,IE=9,IE=edge"

我发现如果在 html 的元标记中设置,这并不总是有效,因此请使用服务器标头进行设置。

在此处查看要点: https://gist.github.com/thefella/9888963

让 IE8 像 IE7 一样运行并不是一个适合所有人的解决方案,但它适合我的需求。

【讨论】:

这也可以用于@media \0screen\,screen\9 ...,它将css应用到IE8而不让它表现得像IE7(来自blog.keithclark.co.uk/wp-content/uploads/2012/11/…)【参考方案2】:

如果您想将所有内容集中在一个屋檐下,并且对旧浏览器的访问者只有一个 http 请求,您可以这样做

设置你对 mixin 的初始响应

// initial variables set-up

$doc-font-size: 16;
$doc-line-height: 24;

// media query mixin (min-width only)

@mixin breakpoint($point) 
    @media (min-width: $point / $doc-font-size +em)  @content; 

这将创建一个最小宽度媒体查询并将您的 px 值 ($point) 输出为 em 值。

从这里你需要创建这个 mixin

@mixin rwdIE($name, $wrapper-class, $IE: true) 
  @if $IE == true 
      .lt-ie9 .#$wrapper-class 
        @content;
      
    .#$wrapper-class  
       @include breakpoint($name) 
         @content;
       
    
  
  @else if $IE == false 
    .#$wrapper-class  
      @include breakpoint($name) 
          @content;
      
      
  

这里如果你像这样通过一段 Sass(SCSS)

@include rwdIE(456, test) 
  background-color: #d13400; 

它将返回此代码

.lt-ie9 .test 
  background-color: #d13400;


@media (min-width: 28.5em) 
  .test 
    background-color: #d13400;
  

这将在一个文件中为您提供 IE 和“新浏览器”CSS。如果你写 -

@include rwdIE(456, test, false) 
  background-color: #d13400; 

你会得到 -

@media (min-width: 28.5em) 
  .test 
    background-color: #d13400;
  

我希望这会有所帮助,我在 codepen 上也有这个 - http://codepen.io/sturobson/pen/CzGuI

【讨论】:

【参考方案3】:

您可以为 IE

这里有完整的解释http://jakearchibald.github.com/sass-ie/,但基本上你有这个mixin:

$fix-mqs: false !default;

@mixin respond-min($width) 
    // If we're outputting for a fixed media query set...
    @if $fix-mqs 
        // ...and if we should apply these rules...
        @if $fix-mqs >= $width 
            // ...output the content the user gave us.
            @content;
        
    
    @else 
        // Otherwise, output it using a regular media query
        @media screen and (min-width: $width) 
            @content;
        
    

你会这样使用:

@include respond-min(45em) 
    float: left;
    width: 70%;

这将在all.scss 中,它会通过媒体查询编译成all.css。但是,您还有一个额外的文件,all-old-ie.scss

$fix-mqs: 65em;
@import 'all';

这只是导入所有内容,但会在假宽度为 65em 的情况下展平媒体查询块。

【讨论】:

【参考方案4】:

Jake Archibald has the best technique 迄今为止,我已经看到了实现这一目标。这种技术会自动为 IE 创建一个单独的样式表,在您的媒体查询中使用所有相同的样式,但没有媒体查询本身。

如果您有兴趣使用它,我还致力于将这种技术内置到流行的 breakpoint extension for Sass 中!

【讨论】:

【参考方案5】:

我使用了一个CSS3 Mixin,它有一个用于 IE 过滤器的变量。您可以通过使用全局变量 $forIE 或其他东西来做类似的事情,将媒体查询 mixin 包装在 if 中,然后生成带有或不带查询的样式表。

@if $forIE == 0 
    // Media Query Mixin

或者使用@if 导入第三个 scss (_forIE.scss?),它将覆盖您的 IE 特定样式。

【讨论】:

以上是关于SASS 3.2 媒体查询和 Internet Explorer 支持的主要内容,如果未能解决你的问题,请参考以下文章

使用 Sass 从媒体查询中扩展选择器

scss Vanilla CSS媒体查询+ Sass媒体查询mixin

按元素、功能和媒体查询构建 CSS(SASS、LESS)文件:3D 代码结构? [关闭]

Sass 中的媒体查询

如何在 CSS 3 媒体查询中使用 SASS 逻辑 [重复]

如何添加“定向媒体查询”来引导4 sass媒体查询