没有脚本的 IE8 支持移动优先的最佳方式?

Posted

技术标签:

【中文标题】没有脚本的 IE8 支持移动优先的最佳方式?【英文标题】:Best way to support mobile first for IE8 without script? 【发布时间】:2014-06-19 08:25:28 【问题描述】:

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

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

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

出于性能和维护的考虑,我想避免使用像 respond.js 这样的脚本。


解决方案:

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

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

@mixin bp($bp) 

    @if $desktop-only 

        @content;

    

    @else 

        @include media($bp) 

            @content;

        

    


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

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

【问题讨论】:

如果您可以让 Sass 将您所有的全尺寸桌面样式输出到一个单独的文件中,您可以轻松地做到这一点并将该文件隐藏在条件 cmets 中,将其放置在每个其他样式表之后。 (我想如果没有预处理器,这会真的毛茸茸的......) 使用 Respond.js 可能最好的方法。 <!--[if lt IE 9]><script src="/js/respond.min.js"></script><![endif]-->。工作完成,仅在 IE8 及更低版本中加载。与在 SASS 中进行额外处理以迎合 IE8 相比,这必须更容易(并且维护更少)。 Compiling and maintaining ie-specific stylesheets的可能重复 【参考方案1】:

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

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

styles.scss

$compile-IE: false;

@import "all your other imports"

oldIE.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 之后解析的,所以用于较大视口的样式(如 bp L)将覆盖默认的移动样式。

希望这对您有所帮助! :)

【讨论】:

以上是关于没有脚本的 IE8 支持移动优先的最佳方式?的主要内容,如果未能解决你的问题,请参考以下文章

CSS/HTML |将注册移动到菜单底部的最佳方式是啥? [复制]

ie7、ie8 和 ie9 的最佳占位符 polyfil 脚本 [关闭]

检测移动设备的最佳方法是啥?

#yyds干货盘点# 抬头看天 | 谈谈移动端抓包方式和原理及如何防犯MITM

在 Document HEAD 中链接到外部脚本的最佳方式

定位用户的最佳方式[关闭]