屏幕尺寸:指屏幕的对角线的长度,单位是英寸,常见的屏幕尺寸有3.5、3.7、4.2、4.7、5.0、5.5、6.0等。
屏幕分辨率:指在横纵向上的像素点数,单位是px,1px=1个像素点。一般以纵向像素*横向像素来表示一个手机的分辨率,如1920*1080。(这里的1像素指的是物理设备的1个像素点)
屏幕像素密度:屏幕上每英寸可以显示的像素点的数量,单位是ppi。屏幕像素密度与屏幕尺寸和屏幕分辨率有关,在单一变化条件下,屏幕尺寸越小、分辨率越高,像素密度越大,反之越小。
iPhone 3GS和iPhone 4对比。屏幕尺寸一样,屏幕分辨率相差一倍,屏幕像素密度也相差一倍。
计算像素密度的公式:
在早先的移动设备中,屏幕像素密度都比较低,如iphone3分辨率为320x480,在iphone3上,1像素是等于一个屏幕物理像素。后来随着技术的发展,移动设备的屏幕像素密度越来越高,从iphone4开始,苹果公司推出了Retina屏,分辨率提高了一倍,变成640x960,但屏幕尺寸却没变化,这就意味着同样大小的屏幕上,像素却多了一倍,这时,1像素是等于两个物理像素。
这是描述物理性质的一个数值,表示计算机屏幕横向有1366个像素发光点,纵向有768个像素点。
像素是构成数码影像的基本单元,通常以像素每英寸PPI为单位来表示影像分辨率大小。
上网的时候看网页,物理分辨率和网页呈递的效果,息息相关。
对于同一个网页,不更改字号的情况,分辨率越大,同样字号看着越小。
把计算机分辨率调大,设为1366*768,此时网页旁边的留白很多。
如果这个事,在手机上也是遵循同样的规则,那坏了,手机屏幕的分辨率,惊人的大。
iPhone8的分辨率1334*750 iPhone8 Plus分辨率1920*1080 三星S8的分辨率2960*1440 小米6的分辨率1920*1080 |
做一个网页,页面上放一个1000px的盒子,放置了h1和p,都是默认字号,会发现h1哪像h1啊?
写一个测试语句:手机认为自己的屏幕宽度是980px,注意这个数值,不是分辨率。
document.getElementsByTagName('h2')[0].innerHTML=document.documentElement.clientWidth; |
现在,这个980是什么?为什么不是手机的分辨率,这是默认视口的宽度。
视口(viewport)是手机web制作非常重要的概念,发明人是乔布斯,乔布斯预见到一件事,就是手机的屏幕会越来越清晰,PPI(每平方英寸的像素数,像素密度)会越来越大。此时如果手机按照自己的分辨率去渲染网页,页面上的文字将不可读,20px的文字看不清。所以,手机不能认为自己的宽度是自己的分辨率!乔布斯说,每个手机可以由工程师自由的设置“显示分辨率”,起名叫“视口”。也就是说,手机在视口中呈递页面,而不是分辨率的物理窗口。视口中1px等于真实物理的多个px。乔布斯说,默认视口980px,因为980px是实世界上绝大多数网页的版心。此时刚刚好能够卡住它们,像在3000米的高空俯视整个页面。但是,乔布斯还说,前端工程师必须能够自己设置。
写一个meta标签:此时手机认为自己的视口是device-width(当前设备)的视口宽度
width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" /> width 设置layout viewport 的宽度,为一个正整数,或字符串"device-width" initial-scale 设置页面的初始缩放值,为一个数字,可以带小数 minimum-scale 允许用户的最小缩放值,为一个数字,可以带小数 maximum-scale 允许用户的最大缩放值,为一个数字,可以带小数 height 设置layout viewport 的高度,这个属性对我们并不重要,很少使用 user-scalable 是否允许用户进行缩放,值为"no"或"yes", no 代表不允许,yes代表允许||IOS10 无效 |
此时手机会认为自己的视口是500px宽,称这条语句“约束视口”
|
此时页面文字变大了。
小米屏幕的物理分辨率横向1080个像素,而现在手机认为自己是500px的宽度,所以一个视口px等于2.16真实px。
把所有设备都约束为固定的视口宽度,不合理!比如小米6的分辨率是1080,约束为500。iPhone8的分辨率750,页面约束为500,此时iPhone8的视口分辨率1px等于真实分辨率1.5px,加上iPhone8手机本来就小,iPhone8中的h1看的感觉要比小米6小,所以iPhone8应该认为自己有更小的视口,比如360,可以增加点视口,此时大家的h1不都一样了吗?
乔布斯规定,所有的手机出厂的时候,就有一个设备的补偿视口宽度。叫做“出厂视口”,此时这个设备将在出厂的时候写入一个视口宽度,这个宽度下看网页,h1和h1感觉一致
出厂视口 |
品牌 |
320 |
iPhone4、iPhone5 |
360 |
华为P9,小米5、6等等 中国国产的手机一律都是360,实际上不合理。 |
375 |
iPhone6、iPhone7、iPhone8 |
414 |
iPhone6 plus、iPhone7 plus、iPhone8 plus |
完整的meta设置:
meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0,user-scalable=no" id="viewport" />
视口的值不要背,面试的时候也不用考,因为视口就是为了屏蔽手机和手机的不同而设置的值。视口的值,每个手机不一样,正是因为手机和手机视口值不一样,才让手机看到的14px文字的感觉是一样的。
视口的最终目的:屏蔽手机的尺寸、像素密度差异,让任何手机中的文字看起来一样大。
当你不写meta的时候,此时视口980。写了就是出场视口。就是320、360、414等等…… 永远都得不到分辨率。
window对象有一个devicePixelRatio属性,它可以得到设备物理像素和设备独立像素的比例,也就是 devicePixelRatio = 物理像素 / 独立像素。
CSS中的px就可以看作是设备的独立像素,所以通过devicePixelRatio可以知道该设备1px代表多少个物理像素。例如,在Retina屏的iphone上,devicePixelRatio值为2,也就是说1px相当于2个物理像素。
iPhone6屏幕分辨率是1334*750px,所以系数是2x。那device-width就等于750/2=375px。
iPhone6 Plus屏幕分辨率是2208*1242px,所以系数是3x。那device-width就等于1242/3=414px。
手机web页面没有版心,都是撑满的,因为:
1、手机本身就小,如果再留白,寸土寸金的地方就浪费
2、APP也是撑满的,用户手机上网的时候,也希望能看到更多的内容,所以撑满。
|
|
|
|
此时没有版心,都是100%,就会给制作带来难度,因为尺寸不能写px单位了,如果版心设置为360px,此时iPhone7 plus的414视口会看见留白。
|
|
用百分比布局设置宽度、高度(绝大多数高度可以用px)、padding、margin的布局。叫做流式布局,页面有弹性,所以也叫弹性布局:
|
|
|
下面讲解基本功:
→ div是body的亲儿子,60%指的是窗口宽度的60% |
→ 60%指的是div的width的60%,无视div的padding。
|
小题目:
div{width:600px;padding-left:100px;} p{width:50%;} |
请问p多宽?此时p应该是300px宽度,因为无视父亲的padding。
看看padding,都参考父亲的width。注意,竖直方向上的padding也是看父亲的width,而不是height。
→ padding-left:10%;指的是父亲的width的10%,而不是父亲的padding。
padding-top:10%;指的是父亲的width的10%,而不是父亲的height。 |
小题目:
div{ width:800px; padding-left:400px; padding:153px 234px 341px; } p{ width:50%; height:100px; padding-left:10%; paading-right:10%; padding-top:10%; padding-bottom:10%; }
请画出p此时的盒模型图。
div的padding是逗你的,因为压根没用,儿子的padding-left如果用百分比写,表示的仍然是父亲的width属性的百分之多少。儿子的padding-top和padding-bottom也是参考父亲的width,所以答案:
小题目:
|
div{ width: 794px; height: 200px; border: 1px solid #000; padding: 124px 34px 34px 23px; } p:nth-child(1){ float: left; width: 30%; padding: 10% 20% 30%; height: 50px; background-color: orange; } p:nth-child(2){ float: left; width: 30%; height: 50px; background-color: blue; }
请问蓝色盒子和橙色盒子是否能够浮动成功,是否能够并排显示。
答案: 计算1号p,总宽度是30% + 20% + 20% = 70%。 2号p总宽度30%,刚好能并排。
再来看margin,一律参考父亲width,不参考父亲的margin和height。
div{ width: 200px; height: 600px; border: 10% solid #000; } p{ margin: 10%;}
总结:无论margin、padding、width、height,无论竖直方向还是水平方向,参考的都是父亲的width。
calc()的运算规则
calc()使用通用的数学运算规则,但是也提供更智能的功能:
使用“+”、“-”、“*” 和 “/”四则运算;
可以使用百分比、px、em、rem等单位;
可以混合使用各种单位进行计算;
表达式中有“+”和“-”时,其前后必须要有空格,如"widht: calc(12%+5em)"这种没有空格的写法是错误的;
表达式中有“*”和“/”时,其前后可以没有空格,但建议留有空格。
border不能用百分比写。所以会带来麻烦:
border: 10% solid #000; |
1 float: left;width:50%; border:1px solid red
2 float: left;width:50%; border:1px solid red
|
p就不能浮动成功,因为总宽度已经是100%,又多了4个px。
此时边框不能写成百分百,所以就不好减。
div{ width: 500px; height: 300px; background: orange; } div p{ width: 50% /*这里不能轻松减去2px*/ height: 200px; float: left; background: green; border:1px solid #000; }
但是CSS3中新增的calc函数能:
div{ width: 500px; height: 300px; background: orange; } div p{ width: calc(50% - 2px); /*css3中新增了calc函数*/ height: 200px; float: left; background: green; border:1px solid #000; }
使用的时候一定要在运算符前后加上空格:
calc(50%-2px); |
正确的应该是:
calc(50% - 2px); |
对于兼容性不好的浏览器,要加前缀:
width:-moz-calc(100% - (10px + 5px) * 2); width:-webkit-calc(100% - (10px + 5px) * 2); width:calc(100% - (10px + 5px) * 2); |
兼容性不好,至少安卓4.4还不是特别兼容。
之前的盒模型padding、border、都是外扩的。
在CSS3中新添加一个属性box-sizing:border-box;盒子最终的大小都是以width和height为准,padding和border不会影响盒子大小。
box-sizing:border-box; 盒子內减模式 |
div{ width: 200px; height: 200px; padding:10px 20px 30px 40px; border:10px solid #ccc; background: orange; }
此时真实的面积:280*260
div{ width: 200px; height: 200px; padding:10px 20px 30px 40px; border:10px solid #ccc; background: orange; box-sizing:border-box; }
加上內减属性后,此时padding和border是內减的,而不是外扩。
小题目:
|
两个p能否并排:
div{ width: 800px; height: 300px; border: 1px solid #000; } p:nth-child(1){ float: left; width: 500px; height: 300px; background: blue; padding: 21px 33px 44px 11px; box-sizing:border-box; → width:500px涵盖了padding和border了 border:3px solid red; border-right:4px solid black; } p:nth-child(2){ float: left; width: 300px; height: 300px; background: orange; padding: 14px 22px 17px 21px; box-sizing:border-box; → width:300px涵盖了padding和border了 border:5px solid red; border-right:4px solid black; }
小案例:响应布局
div{ width:80%; height:100px; margin:0 auto; background-color:#111;
参与评论
手机查看
返回顶部