Top
1.reset.css
body,p,ul,ol,li,dl,dt,dd,h1,h2,h3,h4,h5,h6,form,fieldset,legend,input,select,textarea,button,th,td {margin: 0;padding: 0;}h1,h2,h3,h4,h5,h6 {font-size: 100%;}ul,dl,ol {list-style: none;}img,fieldset,input[type='submit'] {border: 0 none;}img {display: inline-block;overflow: hidden;vertical-align: top;}em {font-style: normal;}strong {font-weight: normal;}table {border-collapse: collapse;border-spacing: 0;}button,input[type='button'] {cursor: pointer;border: 0 none;}textarea {word-wrap: break-word;resize: none;}menu {margin: 0;padding: 0;}body {-webkit-user-select: none;-webkit-text-size-adjust: 100% !important;font-family: Helvetica;}input[type='number'] {-webkit-user-select: text;}a,button,input,img {-webkit-touch-callout: none;}input,select,textarea {outline: none;}a,button,input {-webkit-tap-highlight-color: rgba(0, 0, 0, 0);}html,body {height: 100%;}a {text-decoration: none;}
html
<metacontent="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no"name="viewport"/><!-- viewport-fit ios11 新特新 适配X 必须为viewport-fit=cover 要不然constant函数不生效--><metaname="viewport"content="width=device-width, viewport-fit=cover, initial-scale=1, shrink-to-fit=no, user-scalable=0, maximum-scale=1, minimum-scale=1"/><meta content="yes" name="apple-mobile-web-app-capable" /><meta content="black" name="apple-mobile-web-app-status-bar-style" /><meta content="telephone=no" name="format-detection" /><meta content="email=no" name="format-detection" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><!-- user-scalable=0 禁止用户缩放 --><meta name="theme-color" content="#000000" /><!-- IOS中禁用将数字识别为电话号码/忽略Android平台中对邮箱地址的识别 --><meta name="format-detection" content="telephone=no, email=no" /><!-- 启用360浏览器的极速模式(webkit) --><meta name="renderer" content="webkit" /><!-- 避免IE使用兼容模式 --><meta http-equiv="X-UA-Compatible" content="IE=edge" /><!-- 针对手持设备优化,主要是针对一些老的不识别viewport的浏览器,比如黑莓 --><meta name="HandheldFriendly" content="true" /><!-- 微软的老式浏览器 --><meta name="MobileOptimized" content="320" /><!-- uc强制竖屏 --><meta name="screen-orientation" content="portrait" /><!-- QQ强制竖屏 --><meta name="x5-orientation" content="portrait" /><!-- UC强制全屏 --><meta name="full-screen" content="yes" /><!-- QQ强制全屏 --><meta name="x5-fullscreen" content="true" /><!-- UC应用模式 --><meta name="browsermode" content="application" /><!-- QQ应用模式 --><meta name="x5-page-mode" content="app" /><!-- windows phone 点击无高光 --><meta name="msapplication-tap-highlight" content="no" />
ios 滚动卡顿解决
<body ontouchstart=""></body>
body,html {touch-action: manipulation;overflow: auto;-webkit-overflow-scrolling: touch;}
特殊机型 ```css / iPhoneX适配 / @media only screen and (device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) { .class { } }
/ 适配iPhone4 分辨率为960x640,web窗口的高度仅有832px,容易引起适配的问题,如页面的主体按钮被隐藏在屏幕外 /
@media (device-height: 480px) and (-webkit-min-device-pixel-ratio: 2) { .class { } }
/ 当小于800px屏幕时,就加载style2.css文件 / @import url(‘style2.css’) screen and (max-device-width: 800px);
5. iPhone X安全区域指的是一个可视窗口范围,处于安全区域的内容不受圆角(corners)、齐刘海(sensor housing)、小黑条(Home Indicator)影响:::infoviewport-fit<br />iOS11 新增特性,苹果公司为了适配 iPhoneX 对现有 viewport meta 标签的一个扩展,用于设置网页在可视窗口的布局方式,可设置 三个值:<br />auto:::::::info默认值,跟 contain 表现一致。页面内容显示在 safe area 内。viewprot-fit:auto 等同于 viewport-fit:contain::::::infocontain:::::::info可视窗口完全包含网页内容(左图)。页面内容显示在 safe area 内。viewport-fit:contain::::::infocover:::::::info网页内容完全覆盖可视窗口(右图)。页面内容充满屏幕。viewport-fit:cover::::::infoconstant 函数::::::infoiOS11 新增特性,Webkit 的一个 CSS 函数,用于设定安全区域与边界的距离,有四个预定义的变量(单位是 px):::::::infosafe-area-inset-left:安全区域距离左边界距离::::::infosafe-area-inset-right:安全区域距离右边界距离::::::infosafe-area-inset-top:安全区域距离顶部边界距离::::::infosafe-area-inset-bottom:安全区域距离底部边界距离::::::info网页默认不添加扩展的表现是 viewport-fit=contain,需要适配 iPhoneX 必须设置 viewport-fit=cover,不然 constant 函数是不起作用的,这是适配的必要条件。::::::info官方文档中提到将来 env()要替换 constant (),目前还不可用::::::info这两个函数都是 webkit 中 css 函数,可以直接使用变量函数,只有在 webkit 内核下才支持::::::infoconstant: 针对 iOS < 11.2 以下系统::::::infoenv: 针对于 iOS >= 11.2 的系统:::<a name="a118aa8f"></a>#### 适配例子第一步:设置网页在可视窗口的布局方式```html<meta name="viewport" content="width=device-width, viewport-fit=cover" />
第二步:页面主体内容限定在安全区域内
body {/* 适配齐刘海 */padding-top: constant(safe-area-inset-top);/* 适配底部黑条 */padding-bottom: constant(safe-area-inset-bottom);}
第三步:fixed 元素的适配
bottom 不是 0 的情况
/* bottom 不是 0 的情况 */.fixed {bottom: calc(50px (原来的 bottom 值) + constant(safe-area-inset-bottom));}
吸底的情况(bottom=0)
/* 方法 1 :设置内边距 扩展高度 *//* 这个方案需要吸底条必须是有背景色的,因为扩展的部分背景是跟随外容器的,否则出现镂空情况。 */.fix {padding-bottom: constant(safe-area-inset-bottom);}/* 直接扩展高度 */.fix {height: calc(60px (原来的高度值) + constant(safe-area-inset-bottom));}
/* 方法 2 :在元素下面用一个空 div 填充, 但是背景色要一致 */.blank {position: fixed;bottom: 0;height: 0;width: 100%;height: constant(safe-area-inset-bottom);background-color: #fff;}/* 吸底元素样式 */.fix {margin-bottom: constant(safe-area-inset-bottom);}
使用@supports 隔离兼容模式
因为只有有齐刘海和底部黑条的机型才需要适配样式,可以用@support 配合使用:
@supports (bottom: constant(safe-area-inset-bottom)) {body {padding-bottom: constant(safe-area-inset-bottom);}}
因为只有有齐刘海和底部黑条的机型才需要适配样式,可以用@support 配合使用:
@mixin iphonex-css {padding-top: constant(safe-area-inset-top); //为导航栏+状态栏的高度 88pxpadding-top: env(safe-area-inset-top); //为导航栏+状态栏的高度 88pxpadding-left: constant(safe-area-inset-left); //如果未竖屏时为 0padding-left: env(safe-area-inset-left); //如果未竖屏时为 0padding-right: constant(safe-area-inset-right); //如果未竖屏时为 0padding-right: env(safe-area-inset-right); //如果未竖屏时为 0padding-bottom: constant(safe-area-inset-bottom); //为底下圆弧的高度 34pxpadding-bottom: env(safe-area-inset-bottom); //为底下圆弧的高度 34px}@mixin iphonex-support {@supports (bottom: constant(safe-area-inset-top)) or(bottom: env(safe-area-inset-top)) {body.iphonex {@include iphonex-css;}}}
@media 媒体查询
@mixin iphonex-css {padding-top: constant(safe-area-inset-top); //为导航栏+状态栏的高度 88pxpadding-top: env(safe-area-inset-top); //为导航栏+状态栏的高度 88pxpadding-left: constant(safe-area-inset-left); //如果未竖屏时为 0padding-left: env(safe-area-inset-left); //如果未竖屏时为 0padding-right: constant(safe-area-inset-right); //如果未竖屏时为 0padding-right: env(safe-area-inset-right); //如果未竖屏时为 0padding-bottom: constant(safe-area-inset-bottom); //为底下圆弧的高度 34pxpadding-bottom: env(safe-area-inset-bottom); //为底下圆弧的高度 34px}/* iphonex 适配 */@mixin iphonex-media {@media only screen and (device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) {body.iphonex {@include iphonex-css;}}}
:::info
100vh 在 ios 的 Safari 和 Chrome 是恒定不变的,并不会随着顶部地址栏和底部工具栏的隐藏而减小。原因大概说的是因为改变视口高度会使页面重新布局,而滚动的同时重新布局会导致影响 fps。所以浏览器厂商选择了视口高度固定为最大值而不随浏览器控件的隐藏改变。
在 ios 的 Safari 和 Chrome 对 env(safe-area-inset-bottom)的表现也不一样,其 Safari 中 env(safe-area-inset-bottom)会随着底部工具栏的隐藏而变化,其值为 0 或 34。而在 Chrome 中 env(safe-area-inset-bottom)被固定为 34 不随工具栏隐藏而改变。
以上信息测试环境为
iPhone Xs Max ::: :::info IOS 12.2 ::: :::info Chrome 74.0.3729.121 :::
.image {background-image: url(image@1x.png);}@media (min-resolution: 2dppx) {.image {background-image: url(image@2x.png);}}meidaImage(@1, @2, @3).imagebackground-image: url(@1)@media(min-resolution: 2dppx).imagebackground-image: url(@2);@media(min-resolution: 3dppx).imagebackground-image: url(@3);
适配方案
方案一:amfe-flexible+postcss-pxtorem
:::info amfe-flexible:根据设备宽度,修改根元素 html 的大小,以适配不同终端 ::: :::info postcss-pxtorem:将 css 中的 px 转为 rem 单位,用了它就不用自己计算 rem 值了 ::: :::info 注意:amfe-flexible 是 lib-flexible 的优化,主要区别是 amfe-flexible 不会改变视口大小 ::: :::info 安装 + 配置 :::
安装 amfe-flexible 和 postcss-pxtorem
npm i -s amfe-flexiblenpm i postcss-pxtorem --save -dev
配置 amfe-flexible
// 入口文件main.js中引入import 'amfe-flexible/index.js'
在 index.html 中修改 meta
<metaname="viewport"content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"/>
:::info amfe-flexible 干了什么呢? ::: :::info 给元素动态改写 font-size 的值 ::: :::info 设置 1rem = viewWidth / 10 ::: :::info 设置页面刷新时重置 rem ::: :::info 支持 0.5px :::
- 配置 postcss-pxtorem 在 vue.config.js 中添加
const pxtorem = require('postcss-pxtorem')const autoprefixer = require('autoprefixer') 主要用来处理浏览器前缀问题module.exports = {css: {sourceMap: false,loaderOptions: {postcss: {plugins: [autoprefixer(),pxtorem({unitPrecision: 5, //保留小数位selectorBlackList: ['.recharge', '.van'], //过滤的类名replace: true, //默认直接替换属性mediaQuery: false,minPixelValue: 6, //所有小于设置的样式都不被转换rootValue: 37.5, //默认根目录字体大小(px)propList: ['*'],})]}}}}
方案二:postcss-px-to-viewport + vm
:::warning
什么情况下适合使用 vw 呢?
容器适配,可以使用 vw
文本的适配,可以使用 vw
大于 1px 的边框、圆角、阴影都可以使用 vw
内距和外距,可以使用 vw :::
1. vite + vant 可以使用postcss-pxtorem, postcss-px-to-viewport vite中暂时缺少参数file对vant适配例:file.dirname.includes(path.join('node_modules', 'vant')) ? 375 : 750;2. webpack + vant 俩方案都可,推荐使用postcss-px-to-viewport。
// postcss.config.jsconst path = require('path');module.exports = ({ file }) => {const designWidth = file.dirname.includes(path.join('node_modules', 'vant')) ? 375 : 750;return {plugins: {"postcss-px-to-viewport": {unitToConvert: "px",viewportWidth: designWidth,unitPrecision: 6,propList: ["*"],viewportUnit: "vw",fontViewportUnit: "vw",selectorBlackList: [],minPixelValue: 1,mediaQuery: true,landscape: false}}}https://github.com/evrone/postcss-px-to-viewport/blob/master/README_CN.md
H5 在IOS中时间格式 new Date()
不支持的格式:2020-04-15 12:30:59
支持的格式:”2020-04-15 12:30:59”.replace(/-/g, “/”) 斜杠
