首页>前端教程>CSS教程

移动端适配最好的方案

曾经用flexible.js通过js动态计算html的font-size的方式已经不可取了。

经过很多项目测试,发现最好的方式还是calc()结合vw、rem是最可取的最新方案。

有了vw单位,再配合calc()函数进行计算,无须使用任何JavaScript代码,就可以实现基于设备宽度的移动端布局适配方案。

例如,希望375px~414px的宽度区间的根字号大小时16px~18px,就可以这样设置:

html{
    font-size:16px;
}
@media screen and (min-width:375px){
    html{
        /* 375px宽度使用16px基准尺寸,414px宽度时根字号大小正好是18px*/
        font-size:calc(16px + 2 * (100vw - 375px) / 39);
    }
}
@media screen and (min-width:414px){
    html{
        /* 屏幕宽度从414px到1000px,根字号大小累积增加4px */
        font-size: calc(18px + 4 * (100vw - 414px) / 586);
    }
}
@media screen and (min-width:1000px) {
    /* 屏幕宽度从1000px往后每增加100px,根字号大小就增加0.5px */
    html{
        font-size: calc(22px + 5 * (100vw - 1000px) / 1000);
    }
    /* 也可以设置为固定值 */
    /* html{
    	font-size: 22px;
	} */
}

这样,无论手机的宽度是多少,都可以有一个合适的根字号大小。

此时,只需要把视觉稿对应的px尺寸使用rem表示就可以了。几乎页面上所有元素的尺寸都可以用rem表示,当然1px这种可以考虑用px。毕竟rem计算出来的值都会有精度的问题。

这段代码的优点是兼容性非常强,尺寸有弹性,纯CSS驱动,同时在宽屏下布局尺寸不至于过大(1000px宽度屏幕下的字号是22px,使用JavaScript计算,字号可能是三四十大小,尺寸太大)。

随着越来越多浏览器支持clamp()函数,也可以用更加精简的语法:

html{
    font-size: 16px;
    font-size: clamp(16px, calc(16px + 2 * (100vw - 375px) / 39) , 22px);
}

rem单位布局方法不是万能的,首先渲染尺寸并不总是整数,非整数尺寸偶尔会带来一些渲染的问题,比如SVG图标尺寸不是整数的时候,边缘可能会出现奇怪的间隙,又如,需要精确知道若干个列表的高度之和的时候,如果列表的高度不是整数,则最终的高度和实际的渲染高度会有误差,在这些场景下,可以将对应元素的rem单位改成px单位进行表示,再结合media queries响应式进行微调。

点赞


2
保存到:

相关文章

发表评论:

◎请发表你卖萌撒娇或一针见血的评论,严禁小广告。

Top