前言
最近,接了一个客户的原生页面。客户要求该页面必须兼容IE9及其以上版本的浏览器,同时要求360浏览器的兼容模式可以正常访问。360浏览器是可以通过代码强制极速模式的,这个问题比较容易解决。但是要兼容IE9,许多CSS3属性和H5新增的API都是无法使用的。本文对这个项目中出现的部分IE9兼容问题做个系统的总结。
一、强制360浏览器使用极速模式访问
大家都知道,360浏览器存在两个访问模式:“极速模式”和“兼容模式”。极速模式采用Blink内核,是苹果公司的Webkit内核的一个分支,由Google公司研发并使用在Chrome浏览器中。兼容模式采用Trident内核,是用于IE浏览器的内核。
至于在兼容模式下,具体兼容的是IE的哪个版本,可以在360浏览器的兼容模式下,鼠标右键单击页面空白位置,在弹出的菜单中选择“切换兼容性模式”,勾选具体的IE版本即可。
由于Blink内核和Trident内核对页面内容渲染的差异性较大,因此使用现代前端技术制作的Web页面,很有可能在兼容模式下无法正常显示。为了解决这个问题,我们可以通过下列代码,让该页面强制在360浏览器的极速模式下工作并渲染。
<meta name="renderer" content="webkit" />
二、IE9对CSS3的支持
1、盒模型布局
从页面布局角度来说,IE9的Trident内核的盒模型计算方式和Blink内核的盒模型计算方式是不一样的,这主要体现在盒元素的padding属性上。
例如:一个div块级元素在效果图中的宽度为400px,高度为600px,同时四周带有20px的填充大小。
<div class="box"></div>
(1)在Blink内核中,为div块级元素添加padding填充,会将整个块级元素撑大。若要依然保持该元素的效果图尺寸,则需要从效果图尺寸中减去周围的填充大小。代码如下所示。
.box{ width:360px; // 效果图宽度-左填充大小-右填充大小=400px-20px-20px=360px height:560px; // 效果图高度-上填充大小-下填充大小=600px-20px-20px=560px padding:20px; }
(2)在Trident内核中,为div块级元素添加padding填充,并不会将整个块级元素撑大。所以也无需减去四周填充的大小。代码如下所示。
.box{ width:400px; height:600px; padding:20px; }
鉴于上述区别,在书写代码时要兼容IE9应该怎么解决呢?
CSS3提供了一个box-sizing属性,用于设置盒模型的布局模式。该属性从IE8就开始支持了。当box-sizing属性取值为border-box时,使用了该属性的元素在添加padding属性后,就无需从效果图宽度和高度中减去相应方向的填充大小了。
那么,我们只需要让所有的容器都设置box-sizing属性为border-box即可统一盒模型的布局模式,自然也就兼容IE9浏览器了。代码如下所示。
*{box-sizing:border-box;}
大家在这句CSS代码的作用下,可以大胆的进行盒模型布局,无需考虑兼容性。
2、IE9对弹性盒布局的支持
肯定的说,IE9是不支持弹性盒布局的。最简单的方法就是不使用Flex弹性盒布局。
这里为大家介绍一个名为Flex-Native的js库,它可以让IE9使用Flex弹性盒布局。
(1)在页面中加载Flex-Native库。
<script src="https://unpkg.com/flex-native@latest"></script>
(2)在要使用弹性盒布局的容器上启用Flex功能。
.box{ display:flex; //兼容Blink内核 -js-display:flex; //在Flex-Native的作用下兼容Trident内核 }
(3)其他的Flex属性正常使用即可。
3、IE9不支持下列CSS3属性
(1)text-shadow
(2)transform
(3)transition
(4)columns
(5)outline-offset
(6)resize
(7)border-image
(8)CSS3渐变色
4、IE9不支持下列CSS选择器
(1)::before
(2)::after
(3)::first-letter
(4)::first-line
三、IE9对jQuery的支持
互联网上有许多关于“IE9只支持2.0版本以下的jQuery”的言论。改项目完成后,我将jQuery的版本升级至了3.5.1,亲测有效。至少轮播图、滑动门使用的部分jQuery选择器和方法是可以使用的。
如果有测试出IE9不支持jQuery 2.0版本以上的哪个选择器或方法的,可以补充进来。
四、IE9不支持placeholder属性
HTML5设置了placeholder属性,方便的为表单元素书写文本占位符。但是IE9不支持该属性。解决方法可以通过编写jQuery或JavaScript原生脚本来实现。
1、普通文本框的解决方案
实现原理:借助文本框的value属性来实现占位符。
(1)当文本框获得鼠标焦点时,若文本框的内容时placeholder属性设置的文本,则让文本框内容消失。
(2)当文本框释放鼠标焦点时,若文本框的内容为空,则让文本框恢复placeholder属性设置的文本。
我用的是原生JavaScript完成的,在jQuery支持的情况下,大家也可以采用jQuery实现。
//封装根据类名查找DOM节点的函数 function $$(className){ return document.getElementsByClassName(className); } // 文本框的placeholder属性 兼容IE9 if("msDoNotTrack"in window.navigator){ //判断浏览器是否为IE9 for(var i=0;i<$$("input").length;i++){ var text=$$("input")[i].getAttribute("placeholder"); $$("input")[i].value=text; $$("input")[i].addEventListener("focus",function(){ if(this.value==this.getAttribute("placeholder")){ this.value=""; } }) $$("input")[i].addEventListener("blur",function(){ var text=this.getAttribute("placeholder"); if(this.value==""){ this.value=text; } }) } }
2、密码域的解决方案
产生问题:对于密码域不能单纯的使用value属性来通过脚本模拟placeholder功能,因为value属性的取值在密码域中显示的是小圆点的密码掩码,而不是真实的文本内容。
解决方案:通过不断地改变密码域的type属性的取值,让密码域默认的type取值为text,这样就可以显示value属性值了。
(1)当密码域获得鼠标焦点时,让其type属性修改为password,以保证用户输入密码时无法被看到。
(2)当密码域释放鼠标焦点时,让其type属性修改为text,以保证显示placeholder占位文本。
function $$(className){ return document.getElementsByClassName(className); } // 文本框的placeholder属性 兼容IE9 if("msDoNotTrack"in window.navigator){ $$("password")[0].type="text"; $$("password")[0].addEventListener("focus",function(){ this.type="password"; }) for(var i=0;i<$$("password").length;i++){ var text=$$("password")[i].getAttribute("placeholder"); $$("password")[i].value=text; $$("password")[i].addEventListener("focus",function(){ if(this.value==this.getAttribute("placeholder")){ this.value=""; } }) $$("password")[i].addEventListener("blur",function(){ var text=this.getAttribute("placeholder"); if(this.value==""){ this.value=text; this.type="text" } }) } }
总结
此次总结IE9兼容性问题,一定还有不足的地方。在后面的文章中,我会大量积累IE9兼容性遇到的其他问题,大家如果遇到此类项目,可以借鉴使用。
原生页面,兼容IE9
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]