# Respond.js

Respond.js让不支持css3 Media Query的浏览器包括IE6-IE8等其他浏览器支持媒体查询。

Respond.js 是一个快速、轻量的 polyfill,用于为 IE6-8 以及其它不支持 CSS3 Media Queries 的浏览器提供媒体查询的 min-widthmax-width特性,实现响应式网页设计(Responsive Web Design)。

响应式布局,理想状态是,对PC/移动各种终端进行响应。媒体查询的支持程度是IE9+以及其他现代的浏览器,但是IE8在市场当中仍然占据了比较大量的市场份额,使我们不得不进行IE低端浏览器的考虑。那么如何在 IE6~8 浏览器中兼容响应式布局呢?

这里我们需要借助这样一个文件:respond.js.

文件下载地址:respond.js.

自己在阅读了官方文档之后,进行了一系列测试。友情提示各位朋友,关于respond.js的使用,有一些需要注意的地方,一旦不注意,在IE6-8中就无法显示出来。

# 插件原理

既然要实现响应式网页,那么就需要用到媒体查询,媒体查询的核心是min-widthmax-width,而IE8以下以及一些其它的浏览器不支持这两个属性,respond.js是怎么做的呢?

  • 将head中所有外部引入的CSS文件路径取出来存储到一个数组当中;
  • 遍历数组,并一个个发送AJAX请求;
  • AJAX回调后,分析response中的media querymin-widthmax-width语法(注意,仅仅支持min-widthmax-width),分析出viewport变化区间对应相应的css块;
  • 页面初始化时和window.resize时,根据当前viewport使用相应的css块。

# 使用方法

考虑到IE9是支持CSS3的,所以直接在HTML页面的head标签中添加脚本引入即可:

<head>
    <link rel="stylesheet" href="style.css">
    <!--[if lt IE 9]>
      <script src="js/respond.js"></script>
    <![endif]—>
</head>

讲道理,我们是应该将js文件放在html文件的最后,但是repond.js文件,我还是建议你将它放在head中,并且放在css文件的后面。 越早引入越好,在IE下面看到页面闪屏的概率就越低,因为最初css会先渲染出来,如果respond.js加载得很后面,这时重新根据media query解析出来的css会再改变一次页面的布局等,所以看起来有闪屏的现象.

# 核心结论

那么此时,就可以根据基本的实现思路,得到一些书写代码时要注意的地方:

  • 需要启动本地服务器(localhost),不能使用普通本地的url地址(file://开头);
  • 需要外部引入CSS文件,将CSS样式书写在style中是无效的;
  • 由于respond插件是查找CSS文件,再进行处理,所以respond文件一定要放置在CSS文件的后面
  • 另外,虽然把respond放置在head里还是在body后面都能够实现,但是建议放置在head中(具体原因在下面的文档提示中有提到)
  • 最好不要为CSS设置utf-8的编码,使用默认(原因详见下面的文档提示部分)

# 文档提示

在官方文档当中的一些提示:

  • 越早的引入respond.js文件,也就越可能避免IE下出现的闪屏。
  • 不支持嵌套的媒体查询
  • utf-8的字符编码对respond.js文件的运行有影响 官方API原文:if CSS files are encoded in UTF-8 with Byte-Order-Mark, they will not work with Respond.js in IE7 or IE8. 基本含义就是:utf-8格式的CSS文件字符编码会对插件造成影响 但是在我使用IE6-8进行测试的时候,都能够正常显示(无论是在css文件中增加charset设置还是在link标签中增加charset设置)。因此,并不是太清楚这个位置bug的含义。
  • 跨域可能会出现闪屏(还没有测试,具体情况不详)

# NOTE

  • #####Respond.js 和 跨域(cross-domain) CSS 的问题

    如果Respond.js和CSS文件被放在不同的域名或子域名下面(例如,使用CDN)时需要一些额外的设置。请参考Respond.js文档获取详细信息。

  • #####Internet Explorer 8 与 box-sizing

    IE8不能完全支持box-sizing: border-box;min-widthmax-widthmin-heightmax-height一同使用。由于此原因,从Bootstrap v3.0.1版本开始,我们不再为.container使用max-width

  • #####IE兼容模式

    Bootstrap不支持IE的兼容模式。为了让IE浏览器运行最新的渲染模式,建议将此 标签加入到你的页面中: <meta http-equiv="X-UA-Compatible" content="IE=Edge"> 此标签被加入到所有文档页面和案例页面中,以确保在每个被支持的IE浏览器中保持最好的页面展现效果。

  • #####Respond.js和@import

    Respond.js不支持通过@import引入的CSS文件。例如,Drupal一般被配置为通过@import引入CSS文件,Respond.js对其将无法起到作用。

# Tips

从respond.js的工作原理可以知道,它将head中所有外部引入的CSS文件路径取出来存储到一个数组当中;然后遍历数组,并一个个发送AJAX请求;可以看出这里必须依赖ajax请求css路径才能得到css文件中的mediaquery的内容,那ajax的跨域问题就要解决了;

由于我们的静态资源都是要放在cdn的,responds.js也给出了跨域方法,即引入代理页面。 //把cross-domain/respond-proxy.html 放到cdn上 //把cross-domain/respond.proxy.gif 放到当前域服务器上

<!-- Respond.js proxy on external server -->
<link href="http://externalcdn.com/respond-proxy.html" id="respond-proxy" rel="respond-proxy" />

<!-- Respond.js redirect location on local server -->
<link href="/path/to/respond.proxy.gif" id="respond-redirect" rel="respond-redirect" />

<!-- Respond.js proxy script on local server -->
<script src="/path/to/respond.proxy.js"></script>

###其他的支持响应式布局的插件-css3-dediaqueries.js css3-mediaqueries.js支持几乎所有的media query的语法。会出现闪屏。并不是很推荐使用,虽然能够支持全部的mediaqueries,但min-widthmax-width其实就可以满足我们对响应式布局的需要。

# 补充一点

if CSS files are encoded in UTF-8 with Byte-Order-Mark,they will not work with Repond.js in IE7 or IE8.
也就是说保存格式应该是utf-8无BOM格式,BOM会影响程序对文档的处理,正常的utf-8文档应该没事。

# Tips

always link stylesheets or write inline CSS before js scripts.

Respond.js on Github: https://github.com/scottjehl/Respond (opens new window).