在不同的浏览器宽度下使用不同的 CSS 声明,常见的方案是使用 media query,但这个方案不支持 IE9 以下浏览器。

国外比较流行的 UI 框架 bootstrap v3 版本中使用 media query 技术实现了栅格布局 ,但要兼容 IE8 的话,( IE6/7 没有中国占比那么高,所以不用兼容)需要引入 Respond.js 的方案。

该方案的原理分以下 4 步:

1、在样式 link 之后,载入 respond.js ,该脚本会获取在他之前出现的 link 节点到一个数组

2、发送 ajax 请求重新获取 link 数组中 css 文件文本内容

3、通过分析文本内容中 @media 类声明,重新计算并应用相关样式

4、在 window.resize 时,触发第 3 步逻辑

这里的问题点有两个:

1、第 2 步是否会造成重复的请求消耗?

2、如果 css 静态资源存放域名与当前页面不同,势必会遇到 js 同源策略的限制,如何突破跨域问题?

问题 1 比较好回答,基本包括 IE 在内的所有浏览器都会对 GET 请求进行缓存,由于在第 1 步的时候浏览器已经请求过所有的 CSS 文件,因此在第 2 步 ajax 的时候会直接使用本地缓存,不会造成性能损耗。但由于需引用一个 respond.proxy.gif 来 hack IE 路径问题,可能会造成一个额外的请求损耗。

问题 2 确实存在,Respond.js 通过 iframe proxy file 的方案突破了同源策略,详细的讲解可参考这篇文章《Respond.js让IE6-8支持CSS3 Media Query》或自行百度相关JS跨域知识。但在 Respond.js 场景中会造成两个问题:

1、由于 iframe 的创建是异步的,respond.proxy.js 无法阻塞渲染,势必会造成页面样式的闪动(先应用了默认样式,第 3 步样式分析完毕后,又重新应用一次样式)

2、由于 iframe proxy file 在 css 资源请求完成时的事件无法主动回调(子iframe无法访问非同源父窗口),而是通过父窗口的一个定时器不断读取子窗口 window.name 值来实现被动通讯,因此样式的渲染就存在进一步的延迟。

如果使用场景无法接收问题 2 所带来的负面影响(有情怀的前端工程师都会把静态资源部署到一个独立域名,以提升网页性能,而且也无法接受页面出现明显的重绘这种体验损失),则需要考虑其他方案(另外 Respond.js 项目作者已经有几年没有维护了,部分BUG还没修复 )。本文就此问题发散出一个基于 SASS + JS 的解决方案,以供参考。思路如下:

1、通常屏幕的分辨率宽度是符合一定规范的,而PC端网站栅格布局的常见宽度是可以穷举的:1024px、1280px、1440px、1600px、 1920px

2、在样式中,针对不同的浏览器宽度,我们可以复写多条样式规则,例如 body{} 、.w1280px body{} 、.w1440px body{},达到个性化的目的

3、当 window.resize 时,动态的在 html 节点上改变预设好的宽度 className ,例如宽度 width = 1620px 时,满足 width > 1600px && width < 1920px ,因此 html.classList.add('w1600px')

以上方法十分直观,IE6/7/8 使用以上方案,其他支持 media query 的浏览器则使用 @media only screen and (min-width: 1620px)  的 css 样式方案。对于样式维护性的问题(写一大坨 @media 和 .w1440px body 之类的相同样式肯定不利于维护),我们通过 SASS mixin 来解决,具体代码参考以下样式:

@mixin mediaWidth($min-width: 1024px, $max-width: null) {
$widthSet: (1024px, 1280px, 1440px, 1600px, 1920px);
$selector: (); @if $max-width {
@media only screen and (min-width: $min-width) and (max-width: $max-width){
@content;
}
} @else {
@media only screen and (min-width: $min-width) {
@content;
}
} @each $item in $widthSet {
@if $max-width {
@if $item >= $min-width and $item < $max-width {
$selector: append($selector, unquote('.w#{$item} &'), 'comma');
}
} @else {
@if $item >= $min-width{
$selector: append($selector, unquote('.w#{$item} &'), 'comma');
}
}
} #{$selector}{
@content;
} } body{
width: 1024px;
background-color: red; @include mediaWidth(1024px) {
width: 1024px;
background-color: orange;
} @include mediaWidth(1280px, 1440px) {
width: 1280px;
background-color: green;
} @include mediaWidth(1600px) {
width: 1600px;
background-color: blue;
} }

以上 SASS 编译之后的 CSS 为:

body {
width: 1024px;
background-color: red;
}
@media only screen and (min-width: 1024px) {
body {
width: 1024px;
background-color: orange;
}
}
.w1024px body, .w1280px body, .w1440px body, .w1600px body, .w1920px body {
width: 1024px;
background-color: orange;
}
@media only screen and (min-width: 1280px) and (max-width: 1440px) {
body {
width: 1280px;
background-color: green;
}
}
.w1280px body {
width: 1280px;
background-color: green;
}
@media only screen and (min-width: 1600px) {
body {
width: 1600px;
background-color: blue;
}
}
.w1600px body, .w1920px body {
width: 1600px;
background-color: blue;
}

问题一:如果项目中没用到 SASS 怎么办?

从实际项目经验来看,SASS 的引入可以大幅提高样式文件的维护性,而且不会对前端项目流程带来任何影响,因为你可以直接用编辑器的编译工具在保存文件时同步编译出 CSS 文件,例如 sublime text 的 sass build 和 build on save 插件,更不用说 sass 命令行、compass、grunt、gulp 之类的工具了。

问题二:如果不会 SASS 怎么办?

学就是了,看看这个就知道有多简单了《SASS用法指南》。

以上代码示例,参看此 demo:http://yekai.net/demo/ie-media-query.html

一种让 IE6/7/8 支持 media query 响应式设计的方法的更多相关文章

  1. CSS3 Media Query 响应式媒体查询

    在CSS中,有一个极其实用的功能:@media 响应式布局.具体来说,就是可以根据客户端的介质和屏幕大小,提供不同的样式表或者只展示样式表中的一部分.通过响应式布局,可以达到只使用单一文件提供多平台的 ...

  2. CSS3学习笔记--media query 响应式布局

    语法:@media screen and (min-width: 320px) and (max-width : 479px) media属性后面跟着的是一个 screen 的媒体类型(上面说过的十种 ...

  3. IE8不支持响应式设计解决方法

    下载并引入 respond.js 即可 为了针对IE8应用这段脚本,需要针对IE8的条件注释 <!--[if lt IE 9]> --- <! [endif]--> 为了不让并 ...

  4. 第一章 响应式设计之Media Quer

    书里谈到尽量不要使用Media Queriy. 但是过多使用media query,会导致CSS变得脆弱和页面难以维护.一些方法可以减少页面使用 media query. 响应式设计: (1) 使用百 ...

  5. CSS3 Media Queries(响应式布局可以让你定制不同的分辨率和设备)

    点评:Media Queries这功能是非常强大的,他可以让你定制不同的分辨率和设备,并在不改变内容的情况下,让你制作的web页面在不同的分辨率和设备下都能显示正常,并且不会因此而丢失样式   Med ...

  6. 前端响应式设计中@media等的相关运用

    现在做前端响应式网站特别,响应式成为现在前端设计一个热点,它成为热点的最主要的原因就是,移动端设备屏幕的种类多样,那么如何设置响应式屏幕. /*打印样式*/ @mediaprint{color:red ...

  7. media screen 响应式布局(知识点)

    一.什么是响应式布局? 响应式布局是Ethan Marcotte在2010年5月份提出的一个概念,简而言之,就是一个网站能够兼容多个终端--而不是为每个终端做一个特定的版本.这个概念是为解决移动互联网 ...

  8. 响应式设计的思考:媒体查询(media query)

    Jason Grigsby发表了篇文章,<CSS Media Query for Mobile is Fool’s Gold>对媒体查询(media query)吐槽,大意是在移动设备上使 ...

  9. HTML5实践 -- 使用CSS3 Media Queries实现响应式设计

    CSS3 Media用法介绍:http://www.w3cplus.com/content/css3-media-queries 转载请注明原创地址:http://www.cnblogs.com/so ...

随机推荐

  1. Linux系统目录结构以及简单说明

    Linux系统目录结构以及简单说明 linux目录图: / root --- 启动Linux时使用的一些核心文件.如操作系统内核.引导程序Grub等. home --- 存储普通用户的个人文件 ftp ...

  2. 迭代器模式/iterator模式/对象行为型模式

    意图 又名:游标(Cursor): 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 动机 一个聚合对象,提供访问元素的方法,而有不暴露它的内部结构.如list,将对列表的访问 ...

  3. HDU 5795 A Simple Nim 打表求SG函数的规律

    A Simple Nim Problem Description   Two players take turns picking candies from n heaps,the player wh ...

  4. ASP.NET探讨:技术的学习顺序问题

    作者: シtearシ  来源: 博客园  发布时间: 2011-09-27 08:40  阅读: 7675 次  推荐: 25   原文链接   [收藏]   摘要:很多人对于ASP.NET的入门和学 ...

  5. bash快捷键

    https://linuxtoy.org/archives/bash-shortcuts.html 编辑命令 Ctrl + a :移到命令行首 Ctrl + e :移到命令行尾 Ctrl + f :按 ...

  6. HDU-SupportOrNot训练实录

    菜鸡队训练实录. 现场赛记录: 2016:[名称:奖项/排名] ZJPSC:Gold/1 CCPC中南邀请赛:Gold/1 ICPC Dalian:Gold/24 ICPC Beijing:Gold/ ...

  7. 前馈网络求导概论(一)·Softmax篇

    Softmax是啥? Hopfield网络的能量观点 1982年的Hopfiled网络首次将统计物理学的能量观点引入到神经网络中, 将神经网络的全局最小值求解,近似认为是求解热力学系统的能量最低点(最 ...

  8. 如何发布付费WP8应用

    如何发布付费应用,听起来蛮简单的,事实上也确实如此,但是发布付费WP8应用前的资料填写却让我郁闷不已. 我打开仪表板,点击进入账户--账户摘要,填写税务资料和付款账户,发现付款账户保存成功了,税务资料 ...

  9. CSS 是程序员的画笔

    在未来的所有界面.皮肤,都将使用CSS来表现.包括网页.应用.甚至现实物体的包装等等. 因为CSS实践的理念十分优秀:抽离.分类.统一. CSS将是程序员的画笔. 刚做出来的程序基本都是一个样子.产品 ...

  10. Difference between WCF and Web API and WCF REST and Web Service

    The .Net framework has a number of technologies that allow you to create HTTP services such as Web S ...