浏览器兼容(代码片段)

baimeishaoxia baimeishaoxia     2022-12-14     366

关键词:

一、什么是浏览器兼容问题

同一份代码,有的浏览器显示效果正常,有的浏览器显示不正常

二、为什么会有浏览器兼容问题

  • 同一产品,版本越老 bug 越多
  • 同一产品,版本越新,功能越多。老的浏览器还没有这个功能,当然显示有误
  • 不同浏览器,不同标准,不同效果。比如不同浏览器的内核都不一样

三、用到的网站

1、caniuse.com 查CSS属性兼容情况

技术图片

技术图片

2、browserhacks 查 Hack 的写法

四、处理兼容问题的思路

  • 1、要不要做

产品的角度(产品的受众、受众的浏览器比例、效果优先还是基本功能优先)
成本的角度 (有无必要做某件事)

  • 2、做到什么程度

让哪些浏览器支持哪些效果

  • 3、如何做

(1)根据兼容需求选择技术框架/库(jquery)
(2)根据兼容需求选择兼容工具(html5shiv.js、respond.js、css reset、normalize.css、Modernizr)
postCSS
(3)条件注释、CSS Hack、js 能力检测做一些修补

五、渐进增强和优雅降级

渐进增强(progressive enhancement):
针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验
优雅降级 (graceful degradation):
一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。

六、处理兼容问题的方法


1、选择合适的框架

(1)Bootstrap (>=ie8)
(2)jQuery 1.~ (>=ie6), jQuery 2.~ (>=ie9)
(3)Vue (>= ie9)
(4)react(兼容ie8)
不同的框架兼容的浏览器不一样,在开发之前需要留意一下

2、条件注释(又叫IE条件注释)

条件注释 (conditional comment) 是于HTML源码中被IE有条件解释的语句。条件注释可被用来向IE提供及隐藏代码。

  <!--[if IE 6]>
    <p>You are using Internet Explorer 6.</p>
    <![endif]-->
    <!--[if !IE]><!-->
    <script>alert(1);</script>
    <!--<![endif]-->
    <!--[if IE 8]>
    <link href="ie8only.css" rel="stylesheet">
    <![endif]-->

使用了条件注释的页面在 Windows Internet Explorer 9 中可正常工作,但在 Internet Explorer 10 中无法正常工作。 IE10不再支持条件注释

3、CSS hack

(1)起因:由于不同厂商的浏览器(比如Internet Explorer,Safari,Mozilla Firefox,Chrome等),或者是同一厂商的浏览器的不同版本(如IE6和IE7),对CSS的解析认识不完全一样,因此会导致生成的页面效果不一样,得不到我们所需要的页面效果。

我们需要针对不同的浏览器去写不同的CSS,让它能在不同的浏览器中也能得到我们想要的页面效果。实际项目中CSS Hack大部分是针对IE浏览器不同版本之间的表现差异而引入的。

(2)CSS hack表现形式
hack(黑客)利用不同浏览器的bug,来实现浏览器的兼容问题
CSS Hack大致有3种表现形式,CSS属性前缀法、选择器前缀法以及IE条件注释法(即HTML头部引用if IE)Hack

  • 属性前缀法(即类内部Hack)

例如 IE6能识别下划线_和星号* ,
IE7能识别星号*,但不能识别下划线_
IE6~IE10都认识"9",但firefox前述三个都不能认识

这些都是ie的bug,我们可以通过这些bug来识别ie的 版本

.box
  color: red;
  _color: blue; /*ie6*/
  *color: pink; /*ie67*/
  color: yellow9;  /*ie/edge 6-8*/
  • 选择器前缀法(即选择器Hack)
  • IE条件注释法(即HTML条件注释Hack)

针对所有IE(注:IE10+已经不再支持条件注释): <!--[if IE]>IE浏览器显示的内容 <![endif]-->;
针对IE6及以下版本:<!--[if lt IE 6]>只在IE6-显示的内容 <![endif]-->。
这类Hack不仅对CSS生效,对写在判断语句里面的所有代码都会生效

<!–-[if IE 7]>
<link rel="stylesheet" href="ie7.css" type="text/css" />
<![endif]–->

(3)举个栗子

.target
  display: inline-block;//inline-block在ie以上才支持
  *display: inline; //设置它为inline元素
  *zoom: 1;//是ie67比较老的功能,可以触发ie的haslayout,生成类似bfc的效果
.clearfix:after
  content: ‘‘;
  display: block;
  clear: both;

.clearfix
  *zoom: 1; /* 仅对ie67有效,可以用来清除浮动*/

总结:css hack 就是为了将某些功能兼容ie的低版本,换了一种写法来实现功能。然后利用ie的bug,通过*或者_来执行一些只有低版本ie能识别的代码。

<!DOCTYPE html>
<!--[if IEMobile 7 ]> <html dir="ltr" lang="en-US"class="no-js iem7"> <![endif]-->  //如果是移动端的,增加一个iem7的class
<!--[if lt IE 7 ]> <html dir="ltr" lang="en-US" class="no-js ie6 oldie"> <![endif]-->  //如果是小于ie7,增加一个ie6的class
<!--[if IE 7 ]>    <html dir="ltr" lang="en-US" class="no-js ie7 oldie"> <![endif]-->  //如果是ie7,增加一个ie7的class
<!--[if IE 8 ]>    <html dir="ltr" lang="en-US" class="no-js ie8 oldie"> <![endif]-->  // 如果是ie7,增加一个ie7的class
<!--[if (gte IE 9)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html dir="ltr" lang="en-US" class="no-js"><!--<![endif]-->

可以如图去使用class。就像给不同ie浏览器添加class属性,通过.class来选中某个浏览器,对应的给它添加一些功能。就不用通过浏览器的bug来选择ie浏览器了。

技术图片

七:常见css属性的兼容情况

  • inline-block: >=ie8
  • min-width/min-height: >=ie8
  • :before,:after: >=ie8
  • div:hover: >=ie7
  • inline-block: >=ie8
  • background-size: >=ie9
  • 圆角: >= ie9
  • 阴影: >= ie9
  • 动画/渐变: >= ie10

八:处理兼容的开发工具

html5shiv.js
respond.js
css reset
normalize.css
Modernizr
这是处理兼容思路的转变,之前处理兼容处理的是浏览器。而Modernizr方法不关心浏览器,帮助探测浏览器是否支持某种新特性,也就是说Modernizr只关心有没有对应的css特性。
运行的时候它会在html元素上添加一批CSS的class名称,这些class名称标记当前浏览器支持哪些特性和不支持哪些特性
详情见文档:Modernizr介绍文章

技术图片

本文转载于猿2048:浏览器兼容

























javascript添加事件浏览器兼容(代码片段)

查看详情

csscss下拉菜单-跨浏览器兼容(代码片段)

查看详情

浏览器兼容汇总(代码片段)

1.动画(1)@keyframes@keyframesmymovefromtop:0px;totop:200px;@-moz-keyframesmymovefromtop:0px;totop:200px;@-webkit-keyframesmymovefromtop:0px;totop:200px;@-o-keyframesmymovefromtop:0px 查看详情

浏览器兼容性问题(代码片段)

为什么会有兼容问题?由于市场上浏览器种类众多,而不同浏览器其内核亦不尽相同,所以各个浏览器对网页的解析就有一定出入,这也是导致浏览器兼容问题出现的主要原因,我们的网页需要在主流浏览器上正常运行,就需要... 查看详情

常用兼容代码(代码片段)

兼容代码为任意元素绑定多个相同的事件<script>functionaddEventListener(element,type,fn)//判断浏览器是否支持这个方法if(element.addEventListener)element.addEventListener(type,fn,false);elseif(element.attachEvent)element.attac 查看详情

text浏览器的兼容性和移动性(代码片段)

查看详情

javascript控制台日志跨浏览器兼容性(代码片段)

查看详情

vuecli浏览器兼容性(代码片段)

浏览器兼容性关于浏览器的兼容我们可以从下面一些内容来了解与认识:VueCLI3初始化的项目,你会发现有package.json文件里的browserslist字段(或一个单独的.browserslistrc文件),指定了项目的目标浏览器的范围。这个值会被... 查看详情

vuecli浏览器兼容性(代码片段)

浏览器兼容性关于浏览器的兼容我们可以从下面一些内容来了解与认识:VueCLI3初始化的项目,你会发现有package.json文件里的browserslist字段(或一个单独的.browserslistrc文件),指定了项目的目标浏览器的范围。这个值会被... 查看详情

浏览器不兼容问题和浏览器优化(代码片段)

...1、html兼容性问题问题:HTML5新的语义标签在低版本的老IE浏览器中存在兼容性问题解决方案:引用第三方解析库<scriptsrc="https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"></script>-2、css兼容问题1、图片问题a、图片下方有间隙... 查看详情

兼容各浏览器的鼠标滚动事件写法(代码片段)

wheelEvent="onwheel"indocument.createElement("div")?"wheel"://Modernbrowserssupport"wheel"document.onmousewheel!==undefined?"mousewheel"://WebkitandIEsupportatleast"mousewheel""DOMMouseScroll"//let‘sassumethatremainingbrowsersareolderFirefox 查看详情

浏览器兼容问题记录(代码片段)

chrome,firefox,IE,360,等1.@mediaalland(-ms-high-contrast:none),(-ms-high-contrast:active)以此来识别IE10+以上的浏览器.但是注意,在该属性内的class,只会对没在该属性内的class的属性进行替代.如果比如:.oper-wrapposition:absolute;width:100%;dis 查看详情

css浏览器兼容复杂css3渐变的示例(代码片段)

查看详情

阻止右键点击个浏览器兼容(代码片段)

<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body><!--oncontextmenu="returnfalse",兼容safari--><divstyle=" 查看详情

关于es6的兼容性问题(代码片段)

为什么ES6会有兼容性问题?由于广大用户使用的浏览器版本在发布的时候也许早于ES6的定稿和发布,而到了今天,我们在编程中如果使用了ES6的新特性,浏览器若没有更新版本,或者新版本中没有对ES6的特性进行兼容,那么浏览... 查看详情

解决浏览器兼容es6特性(代码片段)

为什么ES6会有兼容性问题?由于广大用户使用的浏览器版本在发布的时候也许早于ES6的定稿和发布,而到了今天,我们在编程中如果使用了ES6的新特性,浏览器若没有更新版本,或者新版本中没有对ES6的特性进行兼容,那么浏览... 查看详情

css跨浏览器自动垂直/水平居中(chrome和表格兼容)(代码片段)

查看详情

关于浏览器兼容性问题(代码片段)

阅读目录   1.Web标准以及W3C   2.主流浏览器内核   3.标准模式(StandardsMode)和怪异模式(QuirksMode)   4.CSS盒模型   5.重置浏览器样式   6.HTML语义化&nb 查看详情