css - 在没有脚本的情况下支持 IE8 移动优先的最佳方式?

标签 css internet-explorer-8 responsive-design sass compass-sass

我正在使用 SASS、Compass、Bourbon 和 Neat 创建一个精彩的响应式网站。

但是,我突然意识到 IE8(缺乏媒体查询支持)只会输出移动版本,因为我使用的是移动优先方法。

有没有办法使用SASS自动生成IE8的样式,并将所有最大的媒体查询转换为默认值?我希望 IE8 只获得完整的桌面外观。

由于性能和维护问题,我想避免使用像respond.js这样的脚本。


解决方案:

我正在将 Compass 与 Bourbon SASS 库一起使用。 Bourbon 有一个我想使用的 media() mixin。

根据下面选定的答案,我最终为 bourbon 提供的 media() mixin 创建了一个简单的包装器 mixin。

@mixin bp($bp) {

    @if $desktop-only {

        @content;

    }

    @else {

        @include media($bp) {

            @content;

        }

    }

}

在我的 ie.scss 文件(由 Compass 使用)中,我将 $desktop-only 变量设置为 true。这会删除媒体查询本身,并简单地将查询中的属性放入其中。因为它们的顺序稍后出现在编译的 CSS 中,所以它优先于仅移动设置,然后 IE 使用该样式。

这会导致 CSS 文件稍微臃肿,但这是值得的,因为不需要额外的脚本来使其呈现桌面版本。

最佳答案

我自己为此编写了一个解决方案。您所需要的只是两个不同的 CSS 文件(一个用于现代浏览器,一个用于旧版 IE 浏览器)和一个 cleaver mixin。

创建第二个 SASS 文件,Compass 可以监视该文件并调用该文件,例如 oldIE.scss。将原始 SASS 文件(styles.scss 或其他文件)中的所有导入复制到此文件。然后在它们中添加一个新变量:$compile-IE。像这样设置值:

样式.scss

$compile-IE: false;

@import "all your other imports"

旧IE.scss

$compile-IE: true;

@import "all your other imports"

Compass 现在将为您创建两个不同的 CSS 文件。您可以将它们放置在标记的 HEAD 中,如下所示:

<link type="text/css" href="styles.css" rel="stylesheet" media="all" />
<!--[if (gte IE 6) & (lte IE 8)]>
<link type="text/css" href="oldIE.css" rel="stylesheet" media="all" />
<![endif]-->

一旦你有了这两个文件,你就可以开始使用断点编写 SASS 了,这要归功于以下 mixin:

// ----- Media-queries ----- // 
$breakpoints: S 480px, M 600px, L 769px;

@mixin bp($bp) {
// If compile-IE is true (IE8 <=) then just use the desktop overrides and parse them without @media queries
   @if $compile-IE {
      @content;
   }
   // If compile-IE is false (modern browsers) then parse the @media queries
   @else {
      @each $breakpoint in $breakpoints {
         @if $bp == nth($breakpoint, 1) {
            @media (min-width: nth($breakpoint, 2)) {
               @content;
            }
         }
      }
   }
}

按如下方式调用 mixin:

p {
   color: blue;
   font-size: 16px;
   @include bp(L) {
     font-size: 13px;
   }
}

现在,如果变量 $compile-IEfalse(对于现代浏览器),输出将是这样的:

p {
  color: blue;
  font-size: 16px; }
  @media (min-width: 768px) {
    p {
       font-size: 13px; 
  } 
}

当变量 $compile-IEtrue(对于较旧的 IE 版本)时,输出将是这样的:

p {
  color: blue;
  font-size: 16px;
  font-size: 13px; 
}

由于 font-size: 13px 是在 font-size: 16px 之后解析的,因此用于较大视口(viewport)(如 bp L)的样式将覆盖默认的移动设备造型。

希望这对您有帮助! :)

关于css - 在没有脚本的情况下支持 IE8 移动优先的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23431749/

相关文章:

html - CSS 列 : left/right split, 中间内容堆叠

html - 如何在不使用 Positioning、Divs 或 Backgrounds 的情况下将图片放在其他图片之上?

html - 覆盖响应式网站的 ASP.NET DropDownList 宽度

html - 如何为地铁用户界面创建具有响应高度的网页?

javascript - 漂亮的谷歌地图实现黑白

css - 按钮样式 div 的放置不同于按钮的放置

javascript - Highchart 导出图表在 IE8 或 IE9 中不返回图像

javascript - IE8 XmlHttpRequest调试

css - 文本在 IE7/8 中的透明背景上不抗锯齿

html - 响应式网页设计 + SCSS 站点组织