移动端 2018年的笔记
一、移动端视口(Viewport )设置
先提出一个问题,
一个PC的页面在移动设备上展示效果是怎么样的呢?
iphone5在设备模拟器的宽度是320像素,一千多像素宽的PC页面在宽度320像素的移动设备上,是把整个页面全部展示,还是只看到页面的一部分?
实际上得到的效果(在iphone5的设备模拟器上)是把整个PC页面都看到了,iphone5只有320像素,为什么能把整个页面都看到呢?这是视口Viewport起到的作用。
1、讲一下viewport的历史
早在诺基亚的时代已经有移动web的雏形出现,那时PC页面可以用手机去访问,因为PC页面宽度都是一千像素左右,而那是的手机都是几百像素甚至更小,得到的效果在移动web初期,看到的是页面的一个角落,用户要拖动或是上下左右按钮来看页面。
于是就引入的viewportd的概念,viewport是把整个页面渲染在一个比例比较大的页面里(ios默认是980,安卓机不确定),通过渲染到980的尺寸后,在通过缩放看得到整个页面的全貌。
2、手机浏览器默认为我们做了两件事
1. 使页面渲染在一个980px(IOS)的viewport里
2. 渲染完后,通过缩放看到viewport的全貌
为什么手机浏览器不直接缩放,还要渲染加viewPort呢?
1000多像素的页面缩放到320像素排版可能会出问题,为了排版不出现问题,先虚拟一个980像素的ViewPost让页面排版正确,在通过缩放让看的正确,
这是手机浏览器,也是viewport为我们做的事情。
可以理解为两个viewPort
1. visual viewport ( 视口 )
2. layout viewport ( 布局 )
注意,
layout viewport不是原来页面大小,如ios默认Viewport是980px
可以理解为手机浏览器分两层,第一层layout viewport(布局viewport)负责把页面渲染到底层,在通过visual viewport(视口viewport)缩放看到页面的多少。
设计移动web,为什么不使用默认的980px的布局,使用viewport来开发呢?
1. 宽度不可控制,不同系统不同设备的默认值都可能不同
2. 页面缩小版显示,交互不友好
3. 链接不可点击
4. 有缩放,缩放后又有滚动
5. 最主要的是font-size为40px等于PC上12px同等物理大小,不规范
我们不用默认的viewport,可以通过meta标签去改变默认的viewport
3、设置meta标签
默认980宽度的viewport不是很适合开发移动web页面的,因为不规范,
下面我们设置meta标签,改造viewport来达到移动web我们想要的效果。
设置Viewport中meta标签的语法为
<meta name="viewport" content="name=value, name=value">
name值一般有下面几种参数:
1. width 设置布局viewport的特定值(device-width)
2. initial-scale 设置页面的初始缩放
3. minimum-scale 最小缩放
4. maximum-scale 最大缩放
5. user-scalable 用户能否缩放,我们设置为no用户不可缩放
下面做一个比较,
先看一下没有设置wievport时,js获取页面的宽度
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>没有viewport设置</title>
<style>
body{
margin:0;
}
#box{
width:320px;
height:568px;
background-color:orange;
}
</style>
</head>
<body>
<div id="box"></div>
<script>
//查看页面宽度的js代码
console.log(document.body.clientWidth); // 980
console.log(window.innerWidth); // 980
</script>
</body>
</html>在设备模拟器中,两段js返回的都是980,viewport是默认的980,DIV显的有点小
我们在通过viewport设置meat标签 content="width=320" 设置布局等于320
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=320">
<title>viewport设置</title>
<style>
body{
margin:0;
}
#box{
width:320px;
height:568px;
background-color:orange;
}
</style>
</head>
<body>
<div id="box"></div>
<script>
console.log(document.body.clientWidth); // 320
console.log(window.innerWidth); // 320
</script>
</body>
</html>document.body.clientWidth返回 320
window.innerWidth返回320
再设备模拟器的iphone5下,DIV刚好百分百铺满页面,
这里 content="width=320" 是iphone5的宽度,
如果是其它移动设备尺寸不是320,为了更好的兼容性,它提供我们这个值 content="width=device-width" 让布局宽度等于设备宽度。
最佳设置
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
这是是淘宝移动端的视口设置
<meta name=viewport content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
二、视口设置(妙味笔记)
viewport翻译过来叫视口,就是可视区窗口,说白了他就是专门来设置可视区大小缩放等等
不设置viewport,默认的可视区宽度在移动端一般是980像素,
一般是980像素不是绝对980像素,比如页面上有些元素超过980像素,它就根据页面内容的宽度走了
如果不设置viewport手机屏幕默认宽是980像素,显示文字的尺寸会很小,所以不能用默认值要设置一下,
移动端设置和PC不太一样,在PC端可视区多大就是多大,在移动端可视区大小是可以设置的。
1、width设置
常用的第一项设置width,可视区的宽度,有两种设置可以选
1. 数字number
2. 是一个关键字device-width是设备的宽度(device是设备的意思),也就是说让可视区宽度与设备宽度保持一致
在安卓手机直接设置尺寸,兼容性不是特别的好,
一般我们用的是第二个种设置device-width,宽度等于设备本身的宽度
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width"/>
<title>视口设置</title>
<style type="text/css">
body{
margin:0;
}
#box {
width: 300px;
height: 300px;
background:red;
margin:0 auto;
}
</style>
</head>
<body>
<div id="box"></div>
</body>
</html>2、user-scalable 是否允许用户进行缩放
在移动端有一个特性,通过双指操作可以放大缩小(大部分移动端会禁止缩放)
设置是否允许用户缩放
1. user-scalable=yes 允许缩放
2. user-scalable=no 禁止缩放
注意:
iOS10系统无效,在这之前都是支持的很好
3、minimum-scale 初始比例
什么是初始比例initial-scale,它还是和缩放有关,
如果设置初始 initial-scale=0.5 就是把页面缩放0.5显示,
整个把每个元素都缩放是很麻烦的,实际浏览器把可视窗口放大了一倍,里面的就等于缩放了0.5,元素缩小实际是把窗口的尺寸给放大了
初始比例要和最小缩放比率保持一致,最大最小的缩放比
minimum-scale=0.5 最小缩放比例
maximum-scale=0.5 最大缩放比例
4、像素比
把一个像素放大的N个像素去显示,N就是像素比,
每款手机都有像素比,每款手机的像素比都不太一样
我们用js提取一下像素比
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,user-scalable=no"/>
<title>缩放比</title>
<style type="text/css">
body{
margin:0;
}
#box {
width: 100px;
height: 100px;
background:red;
margin:0 auto;
}
</style>
</head>
<body>
<div id="box"></div>
<script>
console.log(window.devicePixelRatio); // 像素比是window对象上的一个属性devicePixelRatio
</script>
</body>
</html>三、移动开发像素Pixel的知识
通过一个例子学习相关知识,
首先提出一个问题,一张 640 x 1136 的图片,能不能在iPhone5上完全显示?
因为iPhone5的分辨率宣称是 640 x 1136,刚好这张图片就应该能再iphone5上,完全展示把屏幕铺满了吧?
代码很简单,div元素宽度、高度正好是640 x 1136
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style>
body{
margin:0;
}
#box{
width:640px;
height:1136px;
background-color:orange;
}
</style>
</head>
<body>
<div id="box"></div>
</body>
</html>打开chrome开发者调试工具,设备模拟器里iphone5,div元素没有把整个屏幕撑满,这是为什么呢?

在设备模拟器上我们发现iphone5的设备尺寸是320 x 568像素,iphone5不是640 x 1136像素吗,怎么变成320x568像素了?
这里说一下像素的基础知识点 像素和物理像素的关系,
iphone5对外宣传的 640 x 1136 是物理像素,而我们实际开发用的px是逻辑像素,两者之间的关系是不一样的
px css pixels逻辑像素,浏览器使用的抽象单位
dp,pt device independent pixels 设备无关像素
dpr devicePixelRatio 设备像素缩放比
下面是课堂解释
px为什么叫抽象单位,
因为他可以根据不同的设备和关系变大或变小,所以叫抽象单位
dp,pt设备无关像素,
意思是设备是固定的,物理像素是固定大小,不会像抽象像素那样可大可小,在物理上它多大就是多大
dpr
他们两者的关系是通过dpr(device independent pixels 设备像素缩放比)来控制他们两者的关系
它们两者之间的计算公示 1px = (dpr)^2 * dp
为什么iphone5是320*568px呢?就是因为iphone5的像素比dpr = 2
下面的图就是dpr等于2的情况:

平面上: 1px = (2)^2 * dp
根据上面的公示一个css像素就有4个物理像素去渲染
维度上 1px = 2 * dp
当成一个长度单位来说,一个css像素等于两个dp的长度
因此iphone 640dp*1136dp 除与2就等于 320px*568px,这就是设备尺寸是320px*568像素了
最关键的点就是dpr,为什么iphone5的dpr等于2呢?
下面的知识点就是DPI, PPI
DPI 打印机每英寸可以喷的墨汁点(一般用印刷行业)
PPI 屏幕每英寸的像素数量,即单位英寸内的像素密度
目前,在计算机显示设备参数描述上,二者意思表达的是一样的,都是单位英寸内像素的密度。
计算公示:以iPhone5为例
PPI=√(1136^2+640^2) / 4 = 226ppi (视网膜Retina屏)
PPI越高,像素数越高,图像越清晰。
以上内容来自
https://www.imooc.com/video/9564
下面是相关转帖
浅谈移动 Web 开发(上)深入概念
https://www.infoq.cn/article/development-of-the-mobile-web-deep-concept/
Hello,移动web基础知识整理
https://github.com/CruxF/IMOOC/issues/4
简简单单的移动web开发基础知识讲解
http://www.imooc.com/article/75342
四、适配
百分比适配
wiewport适配
rem适配
1、百分比布局
viewport把视口大小设置的跟设备一样的,虽然每种设备的宽度是不一样的,
四份DIV横向排成一排宽度各占四分之一,宽度可以设置25%就是四分之一了,问题出现在高度百分百不好算,还是写成具体的值,一般百分百一般只是配合使用
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,user-scalable=no">
<title>百分比适配</title>
<style>
body{
margin:0;
}
div{
height:100px;
width:25%;
float:left;
}
div:nth-of-type(1){
background:red;
}
div:nth-of-type(2){
background:orange;
}
div:nth-of-type(3){
background:yellow;
}
div:nth-of-type(4){
background:green;
}
</style>
</head>
<body>
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
</body>
</html>顺便说一下这里没有设置"width=device-width"仅设置"初始比例 ,最大缩放比例 ,最小缩放比例"视口大小是多少?视口默认是device-width,什么都不设置一般视口默认980px。
<meta name="viewport" content="user-scalable=no,initial-scale=1.0,maximum-scale=1.0 ,minimum-scale=1.0">
2、viewport适配
不把视口设置成content="width=device-width"固定的设备宽度,换一种写法,通过js生成初始比例initial-scale=1.0,最大缩放比例maxmum-scale=1.0,最小缩放比例minimum-scale=1.0
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script>
// 获取屏幕尺寸
var w = window.screen.width;
console.log(w);
// 通过视口viewport把屏幕尺寸都设置成一致的320px,
// js操作缩放比例,把窗口里内容缩放达到宽度320的效果,缩放窗口比例修改的是视口的大小。
var targetW = 320;
// 求出缩放值:
// 当前窗口尺寸/目标尺寸(把窗口里的元素放大,把分辨率缩小)
var scale = w/targetW;
console.log(scale * 375);
// 创建一个标签
var meta = document.createElement("meta");
// 设置name属性
meta.name = "viewport";
// 设置content属性
meta.content = "user-scalable=no,initial-scale="+scale+",maximum-scale="+scale+",minimum-scale="+scale+"";
// 把标签添加到头部
document.head.appendChild(meta);
// 320/4=80 高度80px
</script>
<title>viewport适配</title>
<style>
body{
margin:0;
}
div{
height:80px;
width:25%;
float:left;
}
div:nth-of-type(1){
background:red;
}
div:nth-of-type(2){
background:orange;
}
div:nth-of-type(3){
background:yellow;
}
div:nth-of-type(4){
background:green;
}
</style>
</head>
<body>
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
</body>
</html>3、rem布局
rem是根据根节点的字体大小计算的,怎么设置根节点HTML的字体大小?
1. 不同屏幕的宽度适配,首先用JS获取屏幕宽度
2. 根据屏幕大小的不同,设置根节点的字体大小 ( 屏幕宽度 / 16 )
以iphone5屏幕宽度320像素为例
1. 根节点的设置 <html style="font-size: 20px;"> ,意思是根节点字体大小是20像素,代表 1rem = 20px
2. 屏幕宽度320像素,四个div宽度80px就撑满一行了,1rem等于20px,80像素换算等于4rem,高度80px也一样等于4rem,
设备模拟器切换到iphone5,四个div变大撑满一行,这就完成了一个动态的计量单位的适配
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
<script>
(function(){
// 获取屏幕宽度
var html = document.documentElement;
var hWidth = html.getBoundingClientRect().width;
console.log(hWidth);
// 屏幕大小不同,设置不同的根节点
html.style.fontSize = hWidth/16 + 'px';
})();
</script>
<title>rem适配</title>
<style>
body{
margin:0;
}
div{
box-sizing:border-box;
height:4rem;
width:4rem;
float:left;
}
div:nth-of-type(1){
background:red;
}
div:nth-of-type(2){
background:orange;
}
div:nth-of-type(3){
background:yellow;
}
div:nth-of-type(4){
background:green;
}
</style>
</head>
<body>
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
</body>
</html>一个屏幕的宽度是320, 320 / 16 = 20 根节点字体被设置成20像素,就是1rem等于20像素,也就是说16rem刚好把屏幕撑满一整行
现在,在任何宽度的设备上打开,16rem宽的元素都撑满一行
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
<script>
(function(){
// 获取屏幕宽度
var html = document.documentElement;
var hWidth = html.getBoundingClientRect().width;
console.log(hWidth);
// 屏幕大小不同,设置不同的根节点
html.style.fontSize = hWidth/16 + 'px';
})();
</script>
<title>撑满一行</title>
<style>
body{
margin:0;
}
div{
box-sizing:border-box;
height:4rem;
width:16rem;
background:red;
}
</style>
</head>
<body>
<div>1</div>
</body>
</html>屏幕的宽度 / 16 代表1rem ,
16rem相当于乘回去,这个时候相当于整个屏幕的宽了
如果设计图宽度750像素,该怎么去适配呢?
屏幕的宽度除与50,代表一个元素要占满一整行给15rem就可以了,
如果屏幕的宽度除与15,代表50rem能占满一整行
那么设计稿上宽度是750,代表1rem等于50像素,在设计稿上量到一个元素宽100px,在页面结构上给他2rem就可以了,
也就是说设计图的宽是750,代码里是屏幕宽度除以15的话,就相当于750的设计图分成了15分,每一份都代表了1rem,1rem等于50像素,
量到设计图的每个元素大小,比如设计图的106像素(106 / 50 = 2.12),换算后是2.12rem
以设计稿的宽是750像素做一个实例
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>demo</title>
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
<script>
(function(){
var html = document.documentElement;
var hWidth = html.getBoundingClientRect().width;
console.log(hWidth);
html.style.fontSize = hWidth/16 + 'px';
})();
</script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="style.css"/>
</head>
<body>
<header id="header">
<a id="task" href="javascript:;"><span class="glyphicon glyphicon-tasks"></span></a>
<h1><span class="glyphicon glyphicon-lock"></span>Ruyic</h1>
<a id="refresh" href="javascript:;"><span class="glyphicon glyphicon-repeat"></span></a>
</header>
</body>
</html>less文件
@r:50rem;
a,
input,
button{
-webkit-tap-highlight-color:rgba(0, 0, 0, 0);
}
input,
button {
-webkit-appearance:none;
border-radius:0;
}
body,h1{
margin:0;
padding:0;
font-family:Helvetica;
}
a{
text-decoration:none;
}
body *{
-webkit-text-size-adjust:100%;
}
#header{
height:103/@r;
background-color:#ef3239;
position: relative;
a{
width:128/@r;
height:88/@r;
line-height:88/@r;
text-align:center;
position:absolute;
top:0;
}
#task{
left:0;
font-size:37/@r;
}
#refresh{
right:0;
font-size:36/@r;
}
span{
color:#fff;
}
h1{
text-align:center;
font-size:39/@r;
color:#fff;
line-height:88/@r;
span{
font-size:26/@r;
margin-right:16/@r;
}
}
}到这里基本的适配知识掌握了
五、移动端的一些常见设置
腾讯X5内核浏览器,强制竖屏
<meta name="x5-orientation" content="portrait" />
腾讯X5内核浏览器,强制横屏
<meta name="x5-orientation" content="landscape" />
腾讯X5内核浏览器,强制全屏,地址栏等都会隐藏
<meta name="x5-fullscreen" content="true" />
UC浏览器下,强制竖屏显示
<meta name="screen-orientation" content="portrait"/>
UC浏览器下,强制横屏显示
<meta name="screen-orientation" content="landscape"/>
UC浏览器下,强制全屏显示
<meta name="full-screen" content="yes"/>
禁止识别电话号码或邮件的识别,chrome应该已经自动禁止了这个功能
<meta name="format-detection" content="telephone=no,email=no" />
在移动端浏览器里,点击拨打电话和发邮件的链接
<a href="tel:13212345678">请拨打电话13212345678</a> <a href="mailto:admin@admin.com">请发送邮件</a>
去交或换掉A标签点击的时候的灰色的阴影,课程上说按钮也会出现点击阴影,如何去掉了A标签、按钮点击时的阴影
<style type="text/css">
a,
input,
button{
/*
设置点击时的高亮颜色样式,把阴影换成红色,不建议这样用
-webkit-tap-highlight-color:red;
*/
/* 把阴影变成透明的或没有颜色全透明的 */
-webkit-tap-highlight-color:rgba(0, 0, 0, 0);
}
</style>
<a href="http://baidu.com">baidu.com</a>
<input type="button" value="按钮">解决ios系统下按钮会变成圆角的问题,两条样式一起用圆角就彻底没有了
input,button{
/* */
-webkit-appearance:none;
border-radius:0;
}
<input type="button" value="按钮">移动端每台设备的默认字体都不太一样,移动端大部分设备都没有PC端的微软雅黑和宋体,所有设备都会有这么一款英文字体
body{
font-family:Helvetica;
}这条样式之前在chrome下解决字体最小12px的限制,新版chrome这条样式已经不能解决最小字体12的限制了,
但在移动端他还有用,在部分手机上切换横竖屏的时候字体会缩放,有写用户会在浏览器里设置字体大小,这条项设置可以禁止用户修改字体大小
body *{
-webkit-text-size-adjust:100%;
}教程里说会禁止掉移动端长按屏幕时会选中文字,注意"-webkit-user-select:none"这条样式在苹果手机上,会让表单没法选中,一定不要使用
body{
/*-webkit-user-select:none;*/
}"Font Boosting"问题,在webkit内核下偶尔P标签里的文字被浏览器放大了,给他设置一个最大高度 max-height:100%
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Font Boosting问题</title>
<meta name="viewport" content="width=device-width,user-scalable=no">
<style>
.p1{
font-size:18px;
line-height:30px;
height:30px;
}
.p2{
font-size:18px;
line-height:30px;
max-height:100%;
}
</style>
</head>
<body>
<p>Font Boosting</p>
<p>"Font Boosting"这个问题不是在所有地方都能遇到,必须是大段的文字才会出现这个问题。这是webkit内核浏览器,因为用户体验而放大文字。如果"p2"变的比"p1"大很多,就是遇到了Font Boosting问题。通常在一段文字我们没有给他设置高度的时候,在webkit内核下,文字的大小被浏览器放大了。原来这个特性被称作"Font Inflation",是webkit给浏览器端浏览器提供的一个特性。怎么解决呢?给他设置高度如果不好确定高度,给他设置一个最大高度"max-height:100%"</p>
</body>
</html>六、用css方法模仿一个固定定位
固定定位的问题,课程里说在移动端兼容不太好,移动端尽量不要使用固定定位,固定在顶部的元素滑动时会有些抖。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,user-scalable=no">
<title>用css方法模仿一个顶端固定定位</title>
<style>
html{
height:100%;
/*-- 1.页面滚动条被隐藏了 --*/
overflow:hidden;
/*-- 3.给html加一条"position:relative"相对定位 --*/
position:relative;
}
body{
height:100%;
margin:0;
/*-- 2. 出来的滚动条是body上的滚动条 --*/
overflow:auto;
}
header{
height:40px;
width:100%;
line-height:40px;
text-align:center;
color:#fff;
background:rgba(32,35,64,.7);
/*-- 4: 给header加一条position:absolute绝对定位,header根据html定位 --*/
position:absolute;
}
/*-- 页面内容填充的多一些 --*/
section{
height:1031px;
background:url(http://ruyic.com/blog/uploads/image/201907/pic1564549780422166.jpg);
/*-- 5: 添加一条padding-top:40px因为用的内容是图片换成margin-top --*/
margin-top:40px;
}
</style>
</head>
<body>
<header>Header</header>
<section></section>
</body>
</html>
<!--
1: 给html加一条"overflow:hidden"清除掉页面默认的滚动条。
html{
height:100%;
overflow:hidden;
}
2: 给body加一条"overflow:auto"样式,出现的滚动条是body上的滚动条"
body{
height:100%;
margin:0;
overflow:auto;
}
3: 给html加一条"position:relative"相对定位
html{
height:100%;
overflow:hidden;
position:relative;
}
4: 给header加一条"position:absolute"绝对定位,header根据html定位
header{
height:40px;
width:100%;
line-height:40px;
text-align:center;
color:#fff;
background:rgba(32,35,64,.7);
position:absolute;
}
5: 5: 添加一条padding-top:40px因为用的内容是图片换成margin-top
section{
height:1031px;
background:url(http://ruyic.com/blog/uploads/image/201907/pic1564549780422166.jpg);
margin-top:40px;
}
-->滚动条被header给盖着了,滚动条是body的,header是根据html定位的层级比body高。老版本安卓手机不支持这种方法。手机测试有回弹卡顿的问题,最终要用js来实现固定定位。
ios设备上body设置的overflow:hidden后,屏幕还是能横着拖移动,
比如设置header宽度为200%就出现了这个问题,解决方法给代码包一层元素wrap
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,user-scalable=no">
<title>ios下body的overflow问题</title>
<style>
html{
height:100%;
overflow:hidden;
}
body{
height:100%;
margin:0;
/*-- 2: HTML的绝对定位放到body里,overflow的值改hidden隐藏滚动条 --*/
overflow:hidden;
position:relative;
}
#wrap{
/*-- 3: 给外框一个overflow:auto,滚动条改在wrap上 --*/
height:100%;
overflow:auto;
}
header{
height:40px;
/*-- 1: 问题:这里改成200% --*/
width:200%;
line-height:40px;
text-align:center;
color:#fff;
background:rgba(32,35,64,.7);
/*-- 4: 这里不变,只是已根据html定位变成根据body定位 --*/
position:absolute;
}
section{
height:1031px;
background:url(http://ruyic.com/blog/uploads/image/201907/pic1564549780422166.jpg);
margin-top:40px;
}
</style>
</head>
<body>
<div id="wrap">
<header>Header</header>
<section></section>
</div>
</body>
</html>适配
百分比适配
wiewport适配
rem适配
viewport把视口大小设置的跟设备一样的,但每种设备的宽度还是不一样的。
百分比布局: 四份DIV横向排成一排宽度各占四分之一,宽度可以设置25%就是四分之一了,问题出现在高度百分百不好算,还是写成具体的值,一般百分百一般只是配合使用。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,user-scalable=no">
<title>百分比适配</title>
<style>
body{
margin:0;
}
div{
height:100px;
width:25%;
float:left;
}
div:nth-of-type(1){
background:red;
}
div:nth-of-type(2){
background:orange;
}
div:nth-of-type(3){
background:yellow;
}
div:nth-of-type(4){
background:green;
}
</style>
</head>
<body>
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
</body>
</html>顺便说一下这里没有设置"width=device-width"仅设置"初始比例 ,最大缩放比例 ,最小缩放比例"视口大小是多少?视口默认是device-width,什么都不设置一般视口默认980px。
<meta name="viewport" content="user-scalable=no,initial-scale=1.0,maximum-scale=1.0 ,minimum-scale=1.0">
viewport适配:不把视口设置成content="width=device-width"固定的设备宽度换一种写法。通过js生成initial-scale=1.0初始比例 ,maxmum-scale=1.0最大缩放比例 ,minimum-scale=1.0最小缩放比例。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script>
//屏幕尺寸
var w = window.screen.width;
console.log(w);
//通过viewport设置把屏幕尺寸都设置成一致的320px,
//js操作缩放比例,把窗口里内容缩放达到宽度320的效果,缩放窗口比例修改的是视口的大小。
var targetW = 320;
//求出缩放值:当前窗口尺寸/目标尺寸(把窗口里的元素放大,把分辨率缩小)
var scale = w/targetW;
console.log(scale * 375);
//创建一个标签
var meta = document.createElement("meta");
//设置name,content
meta.name = "viewport";
meta.content = "user-scalable=no,initial-scale="+scale+",maximum-scale="+scale+",minimum-scale="+scale+"";
//把标签添加到头部
document.head.appendChild(meta);
//320/4=80高度80px
</script>
<title>viewport适配</title>
<style>
body{
margin:0;
}
div{
height:80px;
width:25%;
float:left;
}
div:nth-of-type(1){
background:red;
}
div:nth-of-type(2){
background:orange;
}
div:nth-of-type(3){
background:yellow;
}
div:nth-of-type(4){
background:green;
}
</style>
</head>
<body>
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
</body>
</html>