浏览器兼容性问题及其解决方案

浏览器兼容性问题及其解决方案是指不同的浏览器对同一段代码有不同的解析 造成页面显示效果不统一的效果

大家好,欢迎来到IT知识分享网。

一、认识浏览器

四大内核: Blink、Gecko、WebKit、Trident (不再活跃)

主流浏览器
IE(Trident内核)、Firefox(火狐:Gecko内核)、Safari(苹果:webkit内核)、Google Chrome(谷歌:Blink内核)、Opera(欧朋:Blink内核)

二、了解兼容问题

W3C对标准的推进,Firefox,Chrome,Safari,Opera的出现,结束了IE雄霸天下的日子。

1、什么是浏览器兼容性问题

2、不一样的原因是什么

浏览器各浏览器使用了不同的内核,并且它们处理同一件事情的时候思路不同。

3、为什么浏览器会存在兼容问题?

  • 同一浏览器,版本越老,存在 bug 越多,相对于版本越新的浏览器,对新属性和标签、新特性支持越少。
  • 不同浏览器,核心技术(内核)不同,标准不同,实现方式也有差异,最终呈现出来在大众面前的效果也是会有差异。
  • 设计师写出了不规范的代码,不规范的代码会使不兼容现象更加突出。

从浏览器内核的角度来看,浏览器兼容性问题可分为以下三类:

  • 渲染相关:和 样式 相关的问题,即体现在布局效果上的问题。
  • 脚本相关:和 脚本 相关的问题,包括JavaScript和DOM、BOM方面的问题。对于某些浏览器的功能方面的特性,也属于这一类。
  • 其他类别:除以上两类问题外的功能性问题,一般是浏览器自身提供的功能,在内核层之上的。

不规则的嵌套:

<div> <li>新闻标题一</li> <li>新闻标题一</li> <li>新闻标题一</li> </div> 

div 中直接嵌套 li 元素是不合标准的,li 应该处于 ul 内。此类问题常见的还有 p 中嵌套 div, table等元素。

不规范的DOM接口和属性设置:

document.all.a_name.style.top = 35; 

上面代码中 top 的值,其实应该是一个字符串值,需有单位。例如:35px。

总之,人为的原因也占很大一部分。而人为造成兼容性问题的原因,除了粗心之外,大都源于浏览器bug的存在,和开发者对标准的不了解。

比如,如果要做一个功能,功能是想让鼠标悬停在 img 元素上方时,可以出现提示信息,经常针对 IE 做开发的人,可能会使用 img 元素的 “alt” 属性,但其他浏览器中就是不给 “alt” 属性面子。因为 W3C 标准中规定要去做这件事的属性是 “title”,大多浏览器符合标准,IE 不符合,这是 IE 浏览器内核的问题;开发者不知道 “title” ,不遵循标准去写代码,是开发者的问题。

所以,一个问题分两半,浏览器和开发者都有责任。既然都有责任,就都有义务去解决兼容性问题。那么,从浏览器的角度来讲,它的厂商应该修复浏览器的 bug 和不合标准的地方,当某一天 IE 的 “alt” 不能用于提示了,还有人用这个错误的属性去显示提示么?

从开发者角度来讲,多了解标准,了解浏览器兼容性问题,就可以在开发的过程中,有效的避开兼容性问题,让你的页面在所有浏览器中畅通无阻。

三、处理兼容问题的思路

1、要不要做?

(1)从产品的角度看:产品的受众、受众的浏览器比例、效果优先还是基本功能优先。

(2)成本的角度:有无必要做这个兼容。

2、做到什么程度?

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

3、怎么做?

4、渐进增强和优雅降级

四、JS兼容

1、vue项目在IE11下一片空白

原因
IE10浏览器解析不了es6的语法,需要我们使用babel(Babel是一种工具链,主要用于将ECMAScript 2015+代码转换为当前和旧版浏览器或环境中的向后兼容版本的JavaScript)。但是Babel 默认只转换新的 JavaScript 语法(syntax),而不转换新的 API ,比如 Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise 等全局对象,以及一些定义在全局对象上的方法(比如 Object.assign)都不会转码。

解决方法1:babel-polyfill
在vue项目中安装babel-polyfill,polyfill翻译过来叫做垫片/补丁。就是用社区上提供的一段代码,让我们在不兼容某些新特性的浏览器上,使用该新特性。

npm install --save-dev babel-polyfill 
npm i --save core-js 

在main.js入口文件中引入:

2.'core-js' 导入几种形式: // 导入所有新提案api import "core-js"; // 唯一稳定的'core js'功能-es和web标准 import "core-js/stable"; // 仅支持稳定的ES功能 import "core-js/es"; // 只导入指定api import "core-js/features/set"; import "core-js/stable/set"; import "core-js/es/set"; 

总结:简单使用,不太考虑优化: 1.npm i –save core-js 2.main.js入口文件中导入import “core-js”;
推荐使用:兼容性推荐使用core-js,因为core-js包含了babel-polyfill,且babel-polyfill已经逐步放弃使用了

2、addEventListener 与 attachEvent 区别

attachEvent ——兼容:IE7、IE8;不兼容 firefox、chrome、IE9、IE10、IE11、safari、opera。
addEventListener——兼容:firefox、chrome、IE、safari、opera;不兼容 IE7、IE8

function addEvent(elm, evType, fn, useCapture) { 
    if (elm.addEventListener) { 
    // W3C标准 elm.addEventListener(evType, fn, useCapture); return true; } else if (elm.attachEvent) { 
    // IE var r = elm.attachEvent('on' + evType, fn); // IE5+ return r; } else { 
    elm['on' + evType] = fn; // DOM事件 } } 

3、事件对象的兼容

 e = ev || window.event 

4、滚动事件的兼容

scrollTop = document.documentElement.scrollTop || document.body.scrollTop 

5、阻止冒泡的兼容

if (e.stopPropagation) { 
    e.stopPropagation() } else { 
    e.cancelBubble = true } 

6、阻止默认行为的兼容

link.onclick = function(event) { 
    // 执行自定义逻辑 if (event.preventDefault) { 
    event.preventDefault(); } else { 
    event.returnValue = false; } return false; }; 

7、const 问题

8、event.x 与 event.y 问题

IE下,event 对象有 x、y 属性,但是没有 pageX、pageY属性;Firefox下,event 对象有pageX、pageY属性,但是没有 x、y属性。

var myX = event.x ? event.x : event.pageX; var myY = event.y ? event.y : event.pageY; 

9、禁止选取网页内容

在Firefox下需要用CSS禁止选取网页内容,在IE用JS禁止

-moz-user-select: none; // Firefox obj.onselectstart = function { 
   return false;} // IE 

五、CSS兼容

1、ormalize.css

使用ormalize.css 抹平差异,同时可以定制自己的 reset.css,例如通过通配符选择器或者标签选择器(推荐),全局重置样式

2、CSS3兼容前缀表示

写法 内核 浏览器
-webkit- webkit渲染引擎 chrome/safari
-moz- gecko渲染引擎 Firefox
-ms- trident渲染引擎 IE
-o- opeck渲染引擎 Opera
.box{ 
    height: 40px; background-color: red; color: #fff; border-radius: 5px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } 

可以使用 Autoprefixer 是一个用于自动添加 CSS 浏览器前缀的工具,以确保你的样式在不同浏览器中正确地显示。它可以根据 Can I Use 数据库来确定需要添加哪些前缀,以满足特定的浏览器兼容性要求。

安装Autoprefixer

npm install autoprefixer --save-dev 

配置 Autoprefixer:

// .browserslistrc last 2 versions > 1% IE 11 // 这个配置表示支持最新的两个浏览器版本 // 全球使用率超过1%的浏览器,以及 Internet Explorer 11。 

使用 Autoprefixer:

const autoprefixer = require('autoprefixer'); module.exports = { 
    module: { 
    rules: [ { 
    test: /\.css$/, use: [ 'style-loader', 'css-loader', { 
    loader: 'postcss-loader', options: { 
    postcssOptions: { 
    plugins: [ autoprefixer(), ], }, }, }, ], }, ], }, }; 

在上述示例中,postcss-loader 用于调用 Autoprefixer 插件。

Autoprefixer 会根据你指定的目标浏览器版本自动添加适当的前缀,以确保样式在这些浏览器中正确渲染。这简化了开发人员在编写样式时考虑兼容性的工作。

3、图片加a标签在IE9中会有边框

img{ 
   border:none} 

4、IE9以下浏览器不能使用opacity

Firefox/Chrome/Safari/Opera浏览器使用opacity;IE浏览器使用filter

opacity: 0.7; /*FF chrome safari opera*/ filter: alpha(opacity:70); /*用了ie滤镜,可以兼容ie*/ 

5、cursor兼容问题

统一使用 {cursor:pointer}

6、a标签css状态的顺序

按照link–visited–hover–active 的顺序编写

7、在Chrome中字体不能小于10px

p{ 
   font-size: 12px; transform: scale(0.8);} 

这里推荐一个网站,把css转换成兼容的

http://autoprefixer.github.io/

六、移动端兼容问题

1、禁止iOS弹出各种操作窗口

-webkit-touch-callout:none 

2、禁止iOS和Android用户选中文字

-webkit-user-select:none 

3、iOS下取消input在输入的时候英文首字母的默认大写

<input autocapitalize="off" autocorrect="off" /> 

4、Android下取消输入语音按钮

input::-webkit-input-speech-button { 
   display: none} 

5、在移动端修改难看的点击的高亮效果,iOS和安卓下都有效

* { 
   -webkit-tap-highlight-color:rgba(0,0,0,0);} 

6、在Android上placeholder文字设置行高会偏上

input有placeholder情况下不要设置行高

7、overflow: scroll或auto;在iOS上滑动卡顿的问题

-webkit-overflow-scrolling: touch; 

8、iOS中日期如:2022-02-22 00:00:00格式的时间转时间戳不成功

需要将时间中的’00:00:00去除之后才能转为时间戳’

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/112047.html

(0)
上一篇 2026-01-21 07:26
下一篇 2026-01-21 07:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信