当前位置: 首页 > Web前端 > CSS

页面适配,该用px还是rem

时间:2023-03-30 14:41:05 CSS

css中有很多单位,%、px、em、rem,还有较新的vw、vh等,每个单位都有特定的用途。例如,当需要设置一个矩形的纵横比为16:9,适应屏幕宽度时,很难使用除%以外的其他单位。所以并没有说某个单位是错的,某个单位是最好的。本文所说的页面适配是指相同的布局,在不同尺寸的屏幕上如何缩放、控制间距、宽高、字体大小等大小。页面适配的方式有很多种:使用px,结合MediaQuery进行逐步适配;使用%,按百分比自适应布局;使用rem,结合html元素的font-size根据屏幕宽度适配;使用vw,vh,直接根据视口的宽高适配。在这些大前提下,还需要对一些小细节进行微调。例如,在使用px时,可能需要在小屏幕上对某个容器进行transform:scale(.8),使其适当缩小。使用rem时,需要固定页面左右间距为10px等可能是个案。有的同学可能要炸了,你不说话有什么区别?是的,我的意思和开篇一样,谈某一个单位的好坏是没有意义的。我们最关心的是:在什么场景、什么单元最适合使用。不想自欺欺人,直接罗列一些我觉得比较实用的方法。这些是我根据自己多年的开发经验和大量研究得出的结论:在视觉稿中需要固定大小的元素上使用px。例如,1px的线条,4px的圆角边框。在字体大小、(大多数)间距上使用rem。谨慎使用它们。为什么我的标题没有提到%、vw和vh?这些都是按比例改编的,只是参考对象不一样。%是对父容器的引用,vw和vh是对视口的引用。他们的使用场景很固定,比如上面提到的16:9的容器,除了用%,还有没有更合适的方式呢?此外,1vw=视口宽度的1%。所以当你确实需要适配视口的大小时,使用这个单元,而且使用场景比较固定。接下来,我将详细介绍这三个结论的由来。为什么要谨慎使用em?em会叠加计算。这种机制下太容易出错了,因为你不知道这个css具体指定的字体大小。//HTMLabcdefabc//CSSspan{font-size:1.5em;}实际效果是这样的:首先要搞清楚em的计算原理,它是根据当前元素的字体大小按比例计算的。outerspan的字体大小是16px(浏览器默认值),所以1.5em之后是24px。由于继承了字号,继承了innerspan的字号为24px,1.5em后变成了36px。所以,即使你想使用em,也尽量不要用在继承的属性(font-size)上,除非你真的知道自己在做什么!例如,如果你想根据字体大小自动调整字符间距,你可以这样做:.content{font-size:1rem;letter-spacing:.03em;}但是再想一想,letter-spacing是由.content的字体大小决定的,而它是由html的字体大小决定的。那为什么letter-spacing不直接用rem呢?remvs.pxpx是我更喜欢的单位,简单直接。但在理性的驱使下,还是需要合理考虑使用场景。px的性质决定了它只能用于固定尺寸。也就是说,如果视觉设计者规定,边框宽度必须是2px。那样的话就没有讨论的必要了。除了固定大小的px,其他大部分情况下都可以使用rem。现在考虑一个实际的开发场景。一般来说,开发前都有一个视觉稿。两种情况:1、假设视觉稿是根据iPhone6、iPhone6+等尺寸制作的,那么可以根据MediaQuery进行适配。2.设计师只给你一个模型的视觉稿。以iPhone6为例,750x1334,2倍屏转换后为375x667。第一种情况不讨论。适配了MediaQuery断点之后,其实是在处理第二种情况。第二个意思是你需要根据宽度为375px的手稿进行扩展以适应任意宽度的屏幕。(页面的高度跟业务有关,不用着急,宽度一定要固定)接下来得到视觉稿如下:测量后主要参数如下:页面间距10px文字间距10px,字体size16pxAheight100pxBheight50px,topspacing30pxsoon会写HTML结构和CSS。A.第一段

B.第二段
body{padding:10px;背景:#f6f0ee;}.box{填充:10px;字体大小:16px;颜色:#fff;box-sizing:border-box;}.??box-1{height:100px;背景:#1daedc;}.box-2{margin-top:30px;高度:50px;背景:#ddbe97;}完全符合要求。然后视觉开始提要求,在大屏幕上要放大字体和间距。这时候的一个选择就是问设计师适配什么样的屏幕,字体大小是多少,间距是多少。从技术上讲,它是通过媒体查询进行微调的。@media(min-width:414px){//这里不要写,根据视觉要求量化即可}另一种方案可以反过来做。首先,使用rem作为字体大小、容器高度和外间距的单位。那么代码可以改成:html{font-size:16px;}.box{font-size:1rem;}.box-1{height:6.25rem;}.box-2{margin-top:1.875rem;height:3.125rem;}其他样式规则不变,当前结果等同于上一个。如果加点魔法,通过MediaQuery改变iPhone6+的html字体大小,其他元素的属性会自动改变。@media(min-width:414px){html{字体大小:17.664px;}}17.664=414*16/375。由此可以得到html的font-size计算公式:fontSize=deviceWidth*16/375;前提是你的html有这个meta属性:至于为什么是16px,这个后面会介绍。所以rem有一个明显的优势,它可以用少量的代码解决大部分问题。如果还有一些细节不尽如人意,再用MediaQuery微调。这种主观上的“好看”和“不好看”不一定能自动解决。关于rem兼容性。桌面端仅在IE9+中支持。vw与vh相同。所以如果要考虑IE8的兼容性,那只能用px了。至于移动端,支持不错,可以用于生产环境。如何设置html的font-size由于(大多数)浏览器默认的font-size是16px,所以一般把html的font-size规范化为16px比较合适。也可以参考这篇文章。为了您以后的参考,我列出了一些常用的媒体查询断点(基于iPhone6)。@mediaonlyscreenand(min-width:320px){html{font-size:13.65px;}}@mediaonlyscreenand(min-width:360px){html{font-size:15.36px;}}@mediaonlyscreenand(min-width:375px){html{font-size:16px;}}@mediaonlyscreenand(min-width:390px){html{font-size:16.64px;}}@mediaonlyscreenand(min-width:414px){html{font-size:17.664px;}}@mediascreenand(min-width:640px){html{font-size:27.31px;}}你可能还在看在一些文章中,建议将html字体大小设置为62.5%。html{font-size:62.5%;}因为刚刚提到浏览器默认的字体大小是16px,按百分比换算后等于10px,所以css中的rem是相对于10px计算的,很方便并且可以通过这种方式计算相对于浏览器设置更改文本大小。那么为什么要使用百分比呢?由于可访问性和浏览器设置。对有些用户来说,可能在手机或浏览器的设置中调大了手机的字体大小,意味着对方阅读文字很吃力,只好放大。把html的字体大小设置成百分比是很贴心的,页面的字体大小会根据手机设置改变。在手机上设置默认字体大小是很常见的,所以如果是充满人性化的排版,我觉得用百分比是非常高尚的。不仅从视觉上考虑美感,更做到了“顾客至上”四个字。好了,回到现实。只有国外那些对Accessibility要求比较高的国家才会真正去实现这些。但是国内的话,说实话,更注重外表的美感。没有一家Internet公司的页面与屏幕阅读器兼容,也很少与键盘快捷键兼容。画的很长,即使看到62.5%的情况,有些间距不合理,做的不是很好,尤其是文案放在图片上,对字体大小不敏感全部。如果起点不是为了用户的视觉接受度,那就不要用62.5%;想做就要考虑比例,不要半途而废。另外,针对本节开头使用16px的情况,这里再给大家一招(我研究过没有人这样用,只是灵光一现)。使用媒体查询有什么缺点?是一个分段函数,同一套方案会应用到宽度在[320,360)区间的屏幕上。最完美的应该是线性函数,怎么做到的?很简单,用vw就可以了。html{font-size:4.266667vw;}将之前6个冗长的MediaQuery替换为1行代码,不错。如何提高rem的可读性我们来说说最后一个话题。当你知道怎么设置html的font-size的时候,你一定想问,难道我每次写代码都要除法计算rem的值吗?我相信稍微“现代”的开发人员都会使用CSS预处理。基于这个工具,事情就好办了。以LESS为例,两步操作如下://1.根据iPhone6的视觉稿,基本字号为16px,可以设置一个LESS变量。@px:16rem;//2.LESS内置除法自动计算。比如使用16px的字号,可以写成16/@px,最后会计算为1rem。.example{字体大小:16/@px;边距:20/@px0;padding:20/@px10/@px;}总结本文介绍了rem的适配方法以及如何设置font-size,如何更快的写入rem的值。本文没有任何类似“PHP是最好的语言”的指导。这是我根据自己的经验和观察得出的结论。如果我错了,请纠正我。页面适配是一项非常精细的工作。或许你已经有了非常熟练的开发方法,那就留着吧。如果没有,您不妨参考这篇文章。