认识响应式兼容问题respond.js和html5shiv.js
来源:互联网 发布:淘宝一千零一夜视频4 编辑:程序博客网 时间:2024/05/17 03:08
html5shiv.js让IE6、IE7、IE8支持html
用于解决IE9以下版本浏览器对HTML5新增标签不识别,并导致CSS不起作用的问题。所以我们在使用过程中,想要让低版本的浏览器,即IE9以下的浏览器支持,那么这款html5shiv.js是一个非常好的选择!
上面这段代码仅会在IE浏览器下运行,还有一点需要注意,在页面中调用Html5.js文件必须添加在页面的head元素内,因为IE浏览器必须在元素解析前知道这个元素,所以这个js文件不能在页面底部调用。
二、相关图片
三、本站下载
js下载 http://www.ijquery.cn/js/html5shiv.js
官方网站 https://code.google.com/p/html5shiv/
官方下载 https://github.com/aFarkas/html5shiv/releases
四、使用方法
Respond.js让IE6-8支持CSS3 Media Query
Bootstrap里面就引入了这个js文件,从名字看出来是自适应的兼容。打开IE看了一下,效果挺好的,自适应的效果挺好的。Respond.js让不支持css3 Media Query的浏览器包括IE6-IE8等其他浏览器支持查询。
1.在css中正常用 min/max-width media queries
@media screen and (min-width: 480px){ ...styles for 480px and up go here }
2.引入respond.min.js,但要在css的后面(越早引入越好,在ie下面看到页面闪屏的概率就越低,因为最初css会先渲染出来,如果respond.js加载得很后面,这时重新根据media query解析出来的css会再改变一次页面的布局等,所以看起来有闪屏的现象)
实现思路
- 1.把head中所有<link rel=“sheetstyle” href=“xx”/>的css路径取出来放入数组
- 2.然后遍历数组一个个发ajax请求
- 3.ajax回调后仅分析response中的media query的min-width和max-width语法,分析出viewport变化区间对应相应的css块
- 4.页面初始化时和window.resize时,根据当前viewport使用相应的css块。
//检测是否支持media query,检测css是否有效的方法都差不多,创建一个元素应用该css后检测元素宽度,然后清除该元素。window.matchMedia = window.matchMedia || (function(doc, undefined){ var bool, docElem = doc.documentElement, refNode = docElem.firstElementChild || docElem.firstChild, // fakeBody required for fakeBody = doc.createElement('body'), div = doc.createElement('div'); div.id = 'mq-test-1'; div.style.cssText = "position:absolute;top:-100em"; fakeBody.style.background = "none"; fakeBody.appendChild(div); return function(q){ div.innerHTML = ''; docElem.insertBefore(fakeBody, refNode); bool = div.offsetWidth == 42; docElem.removeChild(fakeBody); return { matches: bool, media: q }; };})(document);
.......if( !!href && isCSS && !parsedSheets[ href ] ){ // selectivizr exposes css through the rawCssText expando if (sheet.styleSheet && sheet.styleSheet.rawCssText) { //sheet.styleSheet.rawCssText看不懂,原来是方便selectivizr和respond.js联用,http://selectivizr.com/tests/respond/ //selectivizr的作用是 CSS3 selectors for IE;约定将原csstext放在styleSheet的link上的扩展属性rawCssText上;这里如果联用selectivizr可以少次ajax请求 translate( sheet.styleSheet.rawCssText, href, media ); parsedSheets[ href ] = true; } else { if( (!/^([a-zA-Z:]*\/\/)/.test( href ) && !base) || href.replace( RegExp.$1, "" ).split( "/" )[0] === win.location.host ){ requestQueue.push( { href: href, media: media } ); } }}.......
其余的代码就是ajax实现和translate media query的max-width min-width的逻辑了;可以看出这里必须依赖ajax请求css路径才能得到css文件中的mediaquery的内容,那ajax的跨域问题就要解决了;由于我们的静态资源都是要放cdn的,respond.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>
这里ajax跨域实现是通过代理页面将获取到的css,再通过window.name通信实现;如在respond.proxy.js中
function checkFrameName() { var cssText; try { cssText = iframe.contentWindow.name; var now = new Date().getTime(),useTime = now - initTime; alert('获取css耗时:'+ useTime + 'ms'); } catch (e) { } if (cssText) { ……//销毁之前用于通信的iframe,后续回调callback callback(cssText); } else{ win.setTimeout(checkFrameName, 100); }}win.setTimeout(checkFrameName, 500);//500ms后确认内部iframe的name值是否传递过来,后续再更新当前viewport该用的css。
因为实现跨域代理的问题,初始化页面时应用上全部css耗时较长,以下光测试从开始执行该js文件到css取回调用之前的耗时为500ms-515ms之间(每次刷新结果不一样),ie8下测试结果如下
测试结果发现,刷新页面后会有明显的闪屏(以该测试demo为例,一开始页面背景是黑色的,这是默认css中的,跨域js执行完成后分析出media query中的该viewport尺寸下应该应用red的背景,所以又变成红色),间隔时间为500ms以上。所以体验不是很好,而且该场景中ajax跨域目前已经没有更好的实现方式,500ms间隔的闪屏避免不了。
同时因为是ajax请求css,所以会因为响应式而额外产生一个请求,好在之前css请求过一遍,这次ajax请求是读取浏览器缓存中的,如下图中fiddler的检测结果中的第三个请求和第六个请求:
- 优点:压缩后仅1k,不跨域时性能ok,只需引入respond.js通用易用
- 缺点:仅支持media query的min-width和max-width(用于响应式够用);支持跨域,虽然配置有点麻烦,实现跨域代价高而且有闪屏体验欠佳。
- 认识响应式兼容问题respond.js和html5shiv.js
- 响应式布局之html5shiv.js/Respond.js
- html5shiv.js和respond.min.js
- html5shiv.js和respond.min.js
- html5shiv.js和respond.min.js
- respond.js 解决IE6~8的响应式布局问题
- respond.js解决IE6~8的响应式布局问题
- 解决IE兼容性问题,我问一下你啊,你是不是没差 你说我要你何用啊html5shiv.js和respond.min.js
- Respond.js
- Respond.js
- respond.js
- html5shiv.js分析
- html5shiv.js分析
- HTML5 respond.js 解决IE6~8的响应式布局问题
- ie8响应式兼容方案,respond.js的用法及使用时无效的解决办法
- css3 @media不支持ie8怎么办?用respond.js 解决IE6~8的响应式布局问题
- HTML5 respond.js 解决IE6~8的响应式布局问题
- HTML5 respond.js 解决IE6~8的响应式布局问题
- BZOJ 4318: OSU!
- 两数之和
- 16. 3Sum Closest LeetCode题解
- bdata位变量数据类型
- PHP优化----php脚本优化
- 认识响应式兼容问题respond.js和html5shiv.js
- scala——实例 new_customer_extract
- C
- maven 阿里云 中央仓库
- 使用Kotlin开发Android 扩展函数(Extensions)
- xcode版本太低,拷贝文件到路径
- 文章标题
- java获取当前路径的几种方法
- 正则表达式元字符说明