Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >常见的html、css以及javascript兼容方案

常见的html、css以及javascript兼容方案

作者头像
从入门到进错门
发布于 2018-08-21 08:41:27
发布于 2018-08-21 08:41:27
2K0
举报

    浏览器兼容性一直是一个前端开发人员不可避免的大问题,这篇文章主要列举了html、css以及javascript中一些常见的兼容性问题以及对应的解决方案。

文中所有的demo下载地址:https://github.com/usecodelee/compatibility

Html&CSS部分:

1. audio&video

一般的做法:

<video controls="controls" autoplay="autoplay" width="512" height="288" src="myvideo.mp4"></video>

更好的做法:

<video width="512" height="288">

<source src="myvideo.mp4" type="video/mp4"></source> <source src="myvideo.ogv" type="video/ogg"></source> <source src="myvideo.webm" type="video/webm"></source> <object width="512" height="288" type="application/x-shockwave-flash" data="myvideo.swf">

<param name="movie" value="myvideo.swf" /> <param name="flashvars" value="autostart=true&file=myvideo.swf" />

 </object> 当前浏览器不支持 video直接播放,点击这里下载视频: <a href="myvideo.webm">下载视频</a>

</video>

2. display:inline-block;在ie6、ie7下只有设置在默认显示方式为inline的元素上才会生效,请实现兼容ie6、ie7的通用的方式。

解决方案:

display: inline-block; *display: inline; *zoom: 1;

通过 *zoom: 1; 去触发hasLayout的行为,然后通过 *display: inline; 去支持IE7及以下版本(高版本会直接使用display: inline-block;)  当hasLayout和inline在一起的时候,就触发了inline-block的行为在IE7及以下版本。

3. ul和ol列表缩进

      消除ul、ol等列表的缩进时,样式应写成:list-style:none;margin:0px;padding:0px;其中margin属性对IE有效,padding属性对FireFox有效。在IE中,设置margin:0px可以去除列表的上下左右缩进、空白以及列表编号或圆点,设置padding对样式没有影响;在 Firefox 中,设置margin:0px仅仅可以去除上下的空白,设置padding:0px后仅仅可以去掉左右缩进,还必须设置list- style:none才 能去除列表编号或圆点。也就是说,在IE中仅仅设置margin:0px即可达到最终效果,而在Firefox中必须同时设置margin:0px、 padding:0px以及list-style:none三项才能达到最终效果。 

4. border-radius

语法: border-radius:[ <length> | <percentage> ]{1,4} [ / [ <length> | <percentage> ]{1,4} ]? <length>:用长度值设置对象的圆角半径长度。不允许负值 <percentage>:用百分比设置对象的圆角半径长度。不允许负值

border-radius:20px;

兼容方法: 低版本的chrome:-webkit-border-radius:10px; 低版本的firefox:-moz-border-radius:10px; ie7以下版本不支持圆角 IE6/7/8:引入ie-css3兼容文件,不支持除了黑色(#000)以外的其他颜色

5. IE的双边距bug

设置为float的div在ie下设置的margin会加倍。这是一个ie6都存在的bug。 

解决方案:在这个div里面加上display:inline;  例如: 

Html: <div id=”div1”></div> 

CSS:

.div2 { background-color: red; float: left; width: 150px; height: 150px; margin: 5px 0 5px 100px; display:inline; }

6. box-shadow

语法: box-shadow:none|[inset? && [<offset-x><offset-y><blur-radius>?<spread-radius>?<color>?]]# inset:设置对象的阴影类型为内阴影。该值为空时,则对象的阴影类型为外阴影 <offset-x>: 这是第一个 length值设置水平偏移量,如果是负值则阴影位于元素左边。 <offset-y>: 这是第二个 length值设置垂直偏移量,如果是负值则阴影位于元素上面。 <blur-radius>:这是第三个 length值。值越大,糊糊面积越大,阴影就越大越淡。 不能为负值。默认为0,此时阴影边缘锐利。 <color>:设置对象的阴影的颜色。 实例:

.div2 { background-color: red; float: left; width: 150px; height: 150px; margin: 5px 0 5px 100px; box-shadow: 20px 20px 10px #ccc; }

IE7、8:

解决方案: 第一种方法:

filter: progid:dXImageTransform.Microsoft.DropShadow(color=#cccccc, offX=20, offY=20, positives=true);

IE7、8:

第二种方法:

filter: progid:DXImageTransform.Microsoft.Shadow(color='#cccccc', Direction='120', Strength='20');

两种方法都存在的缺点:阴影不能边缘模糊

7. transform

兼容方法:

.transform{ -webkit-transform: x,y; -moz-transform: x,y; -ms-transform: x,y; -o-transform: x,y; transform: x,y; }

垂直翻转:

transform:rotateY(180deg)

IE8及以下:用IE滤镜

filter:fliph;//水平翻转 filter:flipv;//垂直翻转

JavaScript部分:

1. JSON.stringify函数在ie6/7中不支持,如何兼容?

if(!window.JSON) {     window.JSON = {         parse: function(sJson) {             return eval("(" + sJSON + ")");         },         stringify: function(obj) {             var result = "";             for(var key in obj) {                 if(typeof obj[key] == "string") {                     result += "\"" + key + "\":\"" + obj[key] + "\",";                 } else if(obj[key] instanceof RegExp) {                     result += "\"" + key + "\":{},";                 } else if(typeof obj[key] == "undefined" || obj[key] instanceof Function) {} else if(obj[key] instanceof Array) {                     result += "\"" + key + "\":[";                     var arr = obj[key];                     for(var item in arr) {                         if(typeof arr[item] == "string") {                             result += "\"" + arr[item] + "\",";                         } else if(arr[item] instanceof RegExp) {                             result += "{},";                         } else if(typeof arr[item] == "undefined" || arr[item] instanceof Function) {                             result += null + ",";                         } else if(arr[item] instanceof Object) {                             result += this.stringify(arr[item]) + ",";                         } else {                             result += arr[item] + ",";                         }                     }                     result = result.slice(0, -1) + "],"                 } else if(obj[key] instanceof Object) {} else {                     result += "\"" + key + "\":" + obj[key] + ",";                 }             }             return "{" + result.slice(0, -1) + "}";         }     }; }

2. element.children能够获取元素的元素子节点,但是低版本的ie不支持,如何在低版本的ie上兼容类似的功能。

function getElementChildren(element){     if(!element.children){         var element_arr = [];         var list = element.ChildNodes;         for(i=0; i<list.length; i++){             if (list[i].nodetype==1) {                 element_arr.push(list[i]);             }         }         return element_arr;     } else{         return element.children;     } }

3. element.dataset能够获取元素的自定义属性,但是低版本的ie不支持,如何在低版本的ie上兼容类似的功能。

function dataset(element) {

var obj = {}; if(element.dataset) {

return element.dataset;

} else { // console.log(element.attributes); for(var i = 0; i < element.attributes.length; i++) {

var key = element.attributes[i].nodeName; if(/^data-\w+$/.test(key)) { //判断是否以data-开头的属性名

var value = element.attributes[i].nodeValue; //值 var keyName = key.match(/^data-(\w+)/)[1]; //键名 obj[keyName] = value; //对象添加属性 }

}

} return obj;

}

4. window.getComputedStyle能够获取元素的实际样式,但是低版本的ie8及以下不支持,如何在低版本的ie上兼容类似的功能。

//获取当前样式 function getStyle(element, att) {

//特性侦测 if(window.getComputedStyle) {

//优先使用W3C规范 return window.getComputedStyle(element)[att];

} else {

//针对IE9以下兼容 return element.currentStyle[att];

}

}

文中所有的demo下载地址:https://github.com/usecodelee/compatibility

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年11月04日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
常见的手写代码题集
要求是 yield 后面只能是 Promise 或 Thunk 函数,详见 es6.ruanyifeng.com/#docs/gener…
前端迷
2020/02/19
7240
第147天:web前端开发中的各种居中总结
方法① :行内元素 (父元素)text-align,(子元素)inline-block
半指温柔乐
2018/09/11
4890
CSS常见兼容性问题总结
浏览器的兼容性问题,通常是因为不同的浏览器对同一段代码有不同的解析,造成页面显示不统一的情况。
书童小二
2018/09/03
1.2K0
CSS常见兼容性问题总结
第140天:前端开发中浏览器兼容性问题总结(一)
我们在开发的时候会明确项目要兼容哪些浏览器的最低版本,我之前的项目要求兼容IE8.0以上的版本,Chrome 48以上,FireFox 44以上。有了这些最基本的要求,在开发中就是要考虑到CSS样式和JavaScript的在这些浏览器的兼容性了 一、html部分
半指温柔乐
2018/09/11
3.2K0
CSS使用技巧
然后,将小容器定位为absolute,再将它的左上角沿y轴下移50%,最后将它margin-top上移本身高度的50%即可。
神葳
2021/01/22
1.4K0
CSS使用技巧
在修改模板的过程中,需要重写CSS样式表。正好看到instantshift.com有一篇CSS常用技巧的总结文章,我就把它整理出来,供自己参考,也希望对大家有用。
ruanyf
2018/09/21
1.3K0
CSS使用技巧
50道CSS基础面试题
23 0 0 50道CSS基础面试题 1 介绍一下标准的CSS的盒子模型?与低版本IE的盒子模型有什么不同的? 标准盒子模型:宽度=内容的宽度(content)+ border + padding + margin 低版本IE盒子模型:宽度=内容宽度(content+border+padding)+ margin 2 box-sizing属性? 用来控制元素的盒子模型的解析模式,默认为content-box context-box:W3C的标准盒子模型,设置元素的 height/width 属性
慕白
2018/07/06
1.7K0
CSS布局解决方案(上)
前端布局非常重要的一环就是页面框架的搭建,也是最基础的一环。在页面框架的搭建之中,又有居中布局、多列布局以及全局布局,今天我们就来总结总结前端干货中的CSS布局。 水平居中 1)使用inline-b
腾讯NEXT学位
2018/05/15
1.3K0
超全整理前端开发面试题——CSS篇(2016年)
介绍一下标准的CSS的盒子模型?低版本IE的盒子模型有什么不同的? (1)有两种,IE 盒子模型、W3C 盒子模型; (2)盒模型:内容(content)、填充(padding)、边界(margin)、边框(border); (3)区别:IE的content部分把 border 和 padding计算了进去; CSS选择符有哪些?哪些属性可以继承? * 1.id选择器( # myid) 2.类选择器(.myclassname) 3.标签选择器(div, h1, p) 4.相邻选择器(h
前朝楚水
2018/04/04
2.7K0
CSS布局解决方案(居中布局)
前端布局非常重要的一环就是页面框架的搭建,也是最基础的一环。在页面框架的搭建之中,又有居中布局、多列布局以及全局布局,今天我们就来总结总结前端干货中的CSS布局。
用户1093975
2018/08/03
1.8K0
【CSS】处理兼容性问题 | CSS Hack | IE
(1)IE6双边距bug: 块属性标签添加了浮动float之后,若在浮动方向上也有margin值,则margin值会加倍。这种问题主要就是会把某些元素挤到了第二行。
前端修罗场
2023/10/07
4090
我碰到的那些面试题html+css
http://www.sohu.com/a/330231789_120174705
李才哥
2019/09/08
1.3K0
「资深前端工程师总结」前端面试知识点大全—CSS篇
display:none使用后,元素的宽度,高度都会丢失,视为不存在不加载;元素原来占据的空间位置不保留;产生回流和重绘;
用户5997198
2019/08/09
1.7K0
「资深前端工程师总结」前端面试知识点大全—CSS篇
30+有用的CSS代码片段
在一篇文章中收集所有的CSS代码片段几乎是不可能的事情,但是我们这里列出了一些相对于其他的更有用的代码片段,不要被这些代码的长度所吓到,因为它们都很容易实现,并且具有良好的文档。除了那些解决常见的恼人的问题外,也包含了一些解决新问题的新技术。 1.垂直对齐 如果你之前遇到过这个问题,你就应该知道它是多么的烦人,幸运的是,现在你可以使用CSS3变换来解决这个问题: .vc{ position: relative; top: 50%; -webkit-transform: transl
前朝楚水
2018/04/02
1K0
Web前端最全面试宝典- CSS篇
1. 说下行内元素和块级元素的区别?行内块元素的兼容性使用(IE8 以下) Q1)行内元素:会在水平方向排列,不能包含块级元素,设置width无效,height无效(可以设置line-height),margin上下无效,padding上下无效。 块级元素:各占据一行,垂直方向排列。从新行开始结束接着一个断行。 Q2)兼容性:display:inline-block;display:inline;zoom:1; 2.清除浮动有哪些方式?比较好的方式是哪一种? 1)父级div定义height。 2)结尾处加空
用户1097444
2022/06/29
1.2K0
Web前端最全面试宝典- CSS篇
前端面试之HTML && CSS
带!important 标记的样式属性优先级最高; 样式表的来源相同时: !important > 行内样式>ID选择器 > 类选择器 > 标签 > 通配符 > 继承 > 浏览器默认属性
CODER-V
2023/03/04
4.5K0
CSS中常见的BUG调试
拥有布局的元素负责自身及其子元素的尺寸及定位,而没有布局的元素仅仅能依靠近期的祖先元素进行控制。
全栈程序员站长
2022/07/07
3940
Css详细介绍
(就近原则): !important > id > class > tag (!important 比内联优先级高)
FGGIT
2024/10/15
3030
HTML+CSS高级
第一章 一、内联块     display: inline-block;      1、特征:                1.1     块级元素在一行显示     (得到内联元素的属性)           1.2     内联元素支持宽高     (得到块的属性)           1.3     没有宽度的时候,内容撑开宽度     (得到内联元
用户1148399
2018/01/09
6.2K0
前端开发面试题答案(二)
(2)盒模型:内容(content)、填充(padding)、边界(margin)、边框(border);
疯狂的技术宅
2019/03/28
1.5K0
相关推荐
常见的手写代码题集
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档