前端兼容 适配

PIKA___CHEW 2024-07-14 15:03:02 阅读 87

一、浏览器

1、内核

浏览器 内核 优缺点
IE trident 不安全
Chrome webkit -> blink 速度快,有兼容
safri webkit 有兼容
firefox gecko 功能强大 耗性能
Opera presto -> blink presto 速度快,有兼容

2、浏览器兼容

1、html兼容

超链接访问过后hover样式不再出现

解决方案:修改顺序 L-V-H-A

<code> a:link a:visited a:hover a:active 字体大小不一致:14px: IE16,下留白3px; firefox17:上留白1,下留白3

解决:设置统一行高

html{ font-size: 14px; line-height: 14px; } IE10,11input输入内容后出现‘x’

input::-ms-clear{display: none;} IE8不支持canvas:下载Google出的Excanvas.js库IE不支持html5:借用前辈封装好的js库— html5shiv.js

2、css兼容

css hack

条件注释法

<!--[if IE]>这段文字只在IE显示<![END if]-->

选择器前缀法

*html *前缀只对IE6生效

*+html *+前缀只对IE7生效

@media screen\9{ ...} 只对IE6/7生效

@media \0screen { body { background: red; }} 只对IE8有效

@media \0screen\,screen\9{ body { background: blue; }} 只对IE6/7/8有效

@media screen\0 { body { background: green; }} 只对IE8/9/10有效

@media screen and (min-width:0\0) { body { background: gray; }} 只对IE9/10有效

@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { body { background: orange; }} 只对IE10有效等等

IE不支持css3新属性:投影 渐变 旋转 圆角

解决:前缀

-webkit-: safri

-moz-: firefox

-o-: opera

-ms-: IE

-webkit-box-shadow: #000 0px 1px 2px;

-moz-box-shadow: #000 0px 1px 2px;

-ms-box-shadow: #000 0px 1px 2px;

-o-box-shadow: #000 0px 1px 2px;

box-shadow: #000 0px 1px 2px;

不同浏览器的标签默认的margin和padding不同

通配符:*{ margin:0;padding:0;}

IE6双边距问题:

元素float后,设置margin;ie6中显示的magrin比设置的大,后面的元素被顶到下一行

解决:在float元素上设置:display:inline;

图片有默认边距:

1.把图片变成块级元素:display:block

2.把图片设置成左浮动:float:left

3.把图片父元素的字体大小设置为0

4.如果父元素下,只有一张图片,将父元素高度设置成和图片高度一致即可。

5.给图片设置:vertical-align:middle

IE9以下不能使用opacity属性

.box {

/* 一点其他的样式... */

background-color: #000;opacity: 0.5;

/* 兼容Firefox浏览器 */

-moz-opacity: 0.5;filter: alpha(opacity=50);

/* IE6 */

filter: progid:DXImageTransform.Microsoft.Alpha(style=0, opacity=50);

}

min-height不兼容

{ min-height: 200px; height: auto !important; height: 200px; overflow:visible;}

text-align居中问题

margin-left: auto;margin-right:auto;

cursor:hand; safari不支持:

cursor: pointer;

IE8以下不支持css3的background-size属性:使用filterIE8不支持CSS媒体查询:

Respond.js可帮助IE6-8兼容 “min/max-width” 媒体查询条件

<script src="https://cdn.bootcss.com/respond.js/1.1.0/respond.min.js"></script>code>

边距重叠问题:

两个元素都设置了margin,显示最大的一个:一个盒子设置div包裹

标签的高度小于10px,IE6,IE7 显示的比实际高

设置overflow:hidden 或者line-height 的值小于元素高度

两个块级元素,父元素设置了overflow:auto;子元素设置了position:relative ;且高度大于父元素,在IE6、IE7会被隐藏而不是溢出;

解决方案:父级元素设置position:relative

IE最小宽高不生效:IE不识别min-这个属性

#box {

width: 80px;

height: 35px;

}

html>body #body {

width: auto;

height: auto;

min-width: 80px;

min-height: 35px;

}

3、js兼容

事件绑定:获取event对象获取event事件源对象阻止冒泡阻止默认行为获取滚轮距离访问父节点innerText的问题

if (navigator.appName.indexOf("Explorer") > -1){

document.getElementById("element").innerText = "text"; // IE

} else {

document.getElementById("element").textContent = "text"; // 其他

}

类型浏览器 IE 其他 解决
事件绑定、删除 attachEvent、detachEvent addEventlistener、removeEventListener
事件对象 window.event ev
事件源对象 srcElement target
阻止冒泡 cacelBuble = true stopPropagation
阻止默认事件 returnValue = false preventDefault
获取滚轮距离 body.scrollTop document.documentElement.scrollTop document.documentElement.scrollTop \\document.body.scrollTop
访问父节点 parentNode、parentElement parentNode 统一使用parentNode
innerText问题 innerText contentText
获取键盘码 e.which e.keyCode e.keyCode\\ e.which

4、运行机制

单线程

宏任务微任务

异步

事件循环

3、移动端兼容 ios和android

ios端 new Date() 问题

问题描述: ios规定日期要以“ / ”分割,而不能用“ - ”。

比如在ios:new Date(‘2023-01-01 00:00:00’) 会返回NaN(在pc端safari是Invalid Date)

解决办法: 改用“/”分割,例如:new Date(‘2023/01/01 00:00:00’)

**替换字符串: **new Date(“2023-01-01 00:00:00”).replace(/-/g, “/”);

ios端 h5返回不刷新页面

问题描述: ios端打开h5页面后,从a页面跳转到b页面,然后再返回a页面之后,发现a页面没有刷新。貌似是ios会在浏览网页后生成一个类似快照的东西,当返回时,直接调用这个快照进行展示,从而提高性能。安卓手机的h5返回时都会刷新,ios好像是部分机型也会刷新。

但是如果我们需要在返回时重新获取下最新的信息,这个机制就会存在bug。

解决办法:

//pageshow里的 persisted 属性 表示该页面是否从浏览器缓存中读取。

window.addEventListener('pageshow', function (event) {

if (event.persisted) {

//重载页面或者刷新数据

}

});

移动端媒体自动播放

二、适配

常用单位

px 固定的单位;

em 是根据其父元素的字体大小来设置(太多的不确定性);

rem 是根据网页的根元素(html)来设置字体大小。

vw window.innerWidth 的数值的 1%

vh window.innerHeight 的数值的 1%

rpx: (小程序单位)可以根据屏幕宽度进行自适应。规定屏幕宽为750rpx。如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375px = 750物理像素,1rpx = 0.5px = 1物理像素。

1、静态布局:pc端

2、根据不同的分辨率加载不同的css样式文件,自适应布局

<script>

// 分辨率大于等于1680,大部分为1920的范围情况下,调用此css

if(window.screen.width >= 1680){

document.write('<link rel="stylesheet" href="css/index_1920.css">');code>

}

// 分辨率在1600-1680这个范围的情况下,调用此css

else if(window.screen.width >= 1600){

document.write('<link rel="stylesheet" href="css/index_1600.css">');code>

}

// 分辨率小于1600的范围情况下,调用此css

else{

document.write('<link rel="stylesheet" href="css/index.css">');code>

}

</script>

3、媒体查询

link元素中的CSS媒体查询

<link rel="stylesheet" media="(max-width: 800px)" href="example.css" />code>

css3设置

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">code>

viewport:视口

width=device-width:就将布局视口设置成了理想的视口。

initial-scale:[0,10] 初始缩放比例,1表示不缩放

maximum-scale:[0,10] 最小缩放比例

maximum-scale: [0,10] 最大缩放比例

user-scalable: yes/no 是否允许手动缩放页面,默认值为yes

语法:

/* 大屏幕 */

@media only screen and (min-width:1200px) {

对应的样式

}

/* 中等屏幕 */

@media only screen and (min-width: 992px)and (max-width: 1199px) {

对应的样式

}

/* 小屏幕 */

// 页面大于 768px, 小于 991px 时显示的样式效果

@media only screen and (min-width: 768px)and (max-width: 991px) {

对应的样式

}

/* 手机端显示 */

// 屏幕小于 767px 时的样式

@media only screen and (max-width: 767px) {

对应的样式

}

4、rem布局(移动端)

1、媒体查询结合rem布局

媒体查询动态修改根元素的大小,使得rem 一直在跟着变化,响应式就成功了。

2、flexble.js和rem布局:

它的原理是把当前设备划分为10等份,但是不同设备下,比例还是一致的。

我们要做的,就是确定好我们当前设备的html文字大小就可以了

下载地址:https://github.com/amfe/lib-flexible

1.下载flexible.js放到项目目录里去

2.引入flexible.js

<script src="js/flexible.js"></script>code>

css文件

body {

min-width: 320px;

max-width: 750px;

/* flexible 给我们划分了 10 等份,所以应该是10rem */

width: 10rem;

margin: 0 auto;

line-height: 1.5;

font-family: Arial, Helvetica;

background: #f2f2f2;

}

3、vw+vh+rem屏幕适配方案

1. vw、vh是基于视口的布局方案,故这个meta元素的视口必须声明。(解决宽高自动适配)

<meta name="viewport" content="width=device-width,initial-scale=1.0">code>

2. rem布局-解决字体适配

rem布局原理:根据CSS的媒体查询功能,更改html根字体大小,实现字体大小随屏幕尺寸变化。

@media only screen and (max-width: 1600px) and (min-width: 1280px){

html{

font-size: 14px;

}

}

@media only screen and (max-width: 1280px) and (min-width: 960px){

html{

font-size: 12px;

}

}

@media only screen and (max-width: 960px){

html{

font-size: 10px;

}

}

3. vw、vh、rem的使用

<template>

<div class="box">code>

</div>

</template>

<style>

.box{

width:50vw;

height: 20vh;

line-height: 20vh;

font-size: 1.5rem;

margin:0 auto;

font-weight: bold;

background-color: rgba(255,255,255,0.8);

}

</style>

5、百分比布局 (流式布局)

1.左侧固定右侧自适应-定位

2.浮动+触发BFC

3.flex布局



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。