前端兼容 适配

server/2024/9/25 11:18:43/

一、浏览器

1、内核

浏览器内核优缺点
IEtrident不安全
Chromewebkit -> blink速度快,有兼容
safriwebkit有兼容
firefoxgecko功能强大 耗性能
Operapresto -> blinkpresto 速度快,有兼容

2、浏览器兼容

1、html兼容

  1. 超链接访问过后hover样式不再出现
    解决方案:修改顺序 L-V-H-A
    a:link a:visited a:hover a:active
  2. 字体大小不一致:14px: IE16,下留白3px; firefox17:上留白1,下留白3
    解决:设置统一行高
    html{ font-size: 14px; line-height: 14px; }
  3. IE10,11input输入内容后出现‘x’
    input::-ms-clear{display: none;}
  4. IE8不支持canvas:下载Google出的Excanvas.js库
  5. IE不支持html5:借用前辈封装好的js库— html5shiv.js

2、css兼容

css hack

  1. 条件注释法
<!--[if IE]>这段文字只在IE显示<![END if]-->
  1. 选择器前缀法
 *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有效等等
  1. 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;
  1. 不同浏览器的标签默认的margin和padding不同
通配符:*{margin:0;padding:0;}
  1. IE6双边距问题:
    元素float后,设置margin;ie6中显示的magrin比设置的大,后面的元素被顶到下一行

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

  1. 图片有默认边距:
1.把图片变成块级元素:display:block
2.把图片设置成左浮动:float:left
3.把图片父元素的字体大小设置为0
4.如果父元素下,只有一张图片,将父元素高度设置成和图片高度一致即可。
5.给图片设置:vertical-align:middle
  1. 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);
}
  1. min-height不兼容
{ min-height: 200px; height: auto !important; height: 200px; overflow:visible;}
  1. text-align居中问题
margin-left: auto;margin-right:auto;
  1. cursor:hand; safari不支持:
cursor: pointer;
  1. IE8以下不支持css3的background-size属性:使用filter
  2. IE8不支持CSS媒体查询:

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

<script src="https://cdn.bootcss.com/respond.js/1.1.0/respond.min.js"></script>
  1. 边距重叠问题:

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

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

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

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

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

  1. IE最小宽高不生效:IE不识别min-这个属性
#box {width: 80px;height: 35px;
}
html>body #body {width: auto;height: auto;min-width: 80px;min-height: 35px;
}

3、js兼容

  1. 事件绑定:
  2. 获取event对象
  3. 获取event事件源对象
  4. 阻止冒泡
  5. 阻止默认行为
  6. 获取滚轮距离
  7. 访问父节点
  8. innerText的问题
if (navigator.appName.indexOf("Explorer") > -1){document.getElementById("element").innerText = "text"; // IE
} else {document.getElementById("element").textContent = "text"; // 其他
}
类型浏览器IE其他解决
事件绑定、删除attachEvent、detachEventaddEventlistener、removeEventListener
事件对象window.eventev
事件源对象srcElementtarget
阻止冒泡cacelBuble = truestopPropagation
阻止默认事件returnValue = falsepreventDefault
获取滚轮距离body.scrollTopdocument.documentElement.scrollTopdocument.documentElement.scrollTop \\document.body.scrollTop
访问父节点parentNode、parentElementparentNode统一使用parentNode
innerText问题innerTextcontentText
获取键盘码e.whiche.keyCodee.keyCode\\ e.which

4、运行机制

单线程
宏任务微任务
异步
事件循环

3、移动端兼容 ios和android

  1. 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, “/”);

  1. ios端 h5返回不刷新页面

问题描述: ios端打开h5页面后,从a页面跳转到b页面,然后再返回a页面之后,发现a页面没有刷新。貌似是ios会在浏览网页后生成一个类似快照的东西,当返回时,直接调用这个快照进行展示,从而提高性能。安卓手机的h5返回时都会刷新,ios好像是部分机型也会刷新。
但是如果我们需要在返回时重新获取下最新的信息,这个机制就会存在bug。
解决办法:

//pageshow里的 persisted 属性 表示该页面是否从浏览器缓存中读取。
window.addEventListener('pageshow', function (event) {  if (event.persisted) {  //重载页面或者刷新数据}  
}); 
  1. 移动端媒体自动播放

二、适配

常用单位
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的范围情况下,调用此cssif(window.screen.width >= 1680){document.write('<link rel="stylesheet" href="css/index_1920.css">');}// 分辨率在1600-1680这个范围的情况下,调用此csselse if(window.screen.width >= 1600){document.write('<link rel="stylesheet" href="css/index_1600.css">');}// 分辨率小于1600的范围情况下,调用此csselse{document.write('<link rel="stylesheet" href="css/index.css">');}
</script>

3、媒体查询

link元素中的CSS媒体查询

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

css3设置

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">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>

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">
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"></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布局


http://www.ppmy.cn/server/18322.html

相关文章

Cocos Creator 声音管理模块SoundMgr详解

前言 Cocos Creator 是一款用于开发2D和3D游戏的跨平台游戏引擎&#xff0c;它提供了丰富的功能和工具&#xff0c;使开发者能够快速开发出高质量的游戏。在游戏开发中&#xff0c;声音是一个非常重要的元素&#xff0c;可以增强游戏的氛围和互动性。为了更好地管理游戏中的声…

3.常用的“二次”编解码方式

为什么需要“二次”编解码? 假设我们把解决半包粘包问题的常用三种解码器叫一次解码器 那么我们在项目中,除了可选的的压缩解压缩之外,还需要一层解码,因为一次解码的结果是字节,需要和项目中所使用的对象做转化,方便使用,这层解码器可以称为“二次解码器”,相应的,…

基于实现地图弹窗轮播功能及遇到的问题解决

基本使用 获取地图 geojson 数据 链接&#xff1a; 阿里云数据可视化平台 获取ECharts npm install echarts 或者是使用地址链接 <script src"https://registry.npmmirror.com/echarts/5.4.3/files/dist/echarts.min.js"></script> <script src…

详细解析什么是期权交易的获利方法

期权交易的获利方法 在期权交易之前进行充分的准备工作和风险评估是至关重要的。其中行情结构、策略方法、预期收益和风险评估&#xff0c;是期权交易成功的关键要素。它们能帮助我们更好地制定交易计划&#xff0c;控制风险&#xff0c;并追求稳定的利润。以下是对这四点的详…

各省人力资本数据集(2005-2022年)

01、数据简介 人力资本是指凝聚在劳动者身上的知识、技能和健康等要素所构成的一种资本类型。这种资本是通过投资形成的&#xff0c;包括教育、培训、实践经验、保健等方面的投入&#xff0c;以及在劳动力国内流动和移民入境等方面的投资。人力资本是经济增长和发展的重要因素…

设计模式:里氏代换原则(Liskov Substitution Principle,LSP)介绍

里氏代换原则&#xff08;Liskov Substitution Principle&#xff0c;LSP&#xff09;是面向对象设计原则的一部分&#xff0c;它强调子类对象应该能够替换其父类对象而不影响程序的正确性。换句话说&#xff0c;子类对象应该可以在不改变程序正确性的前提下替换掉父类对象。 …

父类、接口、功能类的个人理解

父类、接口、功能类的个人理解 三种设计思路 三种设计思路 类&#xff1a;最常见&#xff0c;能够实现所有功能 功能类&#xff1a;实现特定功能的类 接口&#xff1a; 1.对外暴露&#xff0c;实现类实现指定功能&#xff0c;然后暴露指定方法供外部调用。 2.常按照功能来创建…

LeetCode 151. 反转字符串中的单词

LeetCode 151. 反转字符串中的单词 1、题目 题目链接&#xff1a;151. 反转字符串中的单词 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间…