📱 H5页面不同屏幕适配:纯CSS方案

阿轩的BUG
文章191
评论56
标签101
站点日志
作者总数:1位
置顶文章:0篇
标签总数:101条
文章总数:196篇
评论总数:56条
微语总数:201条
运行天数:2315天
最近更新:2026-07-28
文章标签
最新评论
Sherlock
2025-08-21
不是应该打包成apk文件吗,怎么突然就运行编译了,下一步呢
老金er
2025-05-25
人生设计非常必要,在信息化发达的今天,周围大部分人依然只能过着人生工程模式生活,长时间生活洗礼后,尽管“人生工程”已经不再适合很多人,他们也无法做出任何改变,人生设计给我们提供了新的思路,值得尝试
赏帮赚
2025-05-25
职场太多的尔虞我诈
三笑
2024-08-16
emlog6.0.1可以升级支持吗?
pony
2024-07-08
这篇文章提供了一种新的人生规划方法——"人生设计",它借鉴了产品设计的理念,鼓励人们以创造性和探索性的方式思考和规划自己的生活。以下是对这篇文章的几个评价维度: 创新性:将产品设计的理念应用于人生规划是一个新颖的视角,为人们提供了一种跳出传统生活轨迹,探索个性化生活路径的方法。 实用性:文章不仅提出了理念,还详细介绍了具体的实施步骤,包括自我评估、制定计划、原型设计和实践选择等,具有很强的操作性。 启发性:通过强调好奇心、不断尝试、重新定义问题等心态,文章鼓励人们打破常规,勇于探索未知,这对于激发个人潜能和创造力具有积极作用。 适应性:"人生设计"理念适用于不同人生阶段和不同背景的人,无论是希望从头开始的人,还是已经取得一定成就但希望探索新方向的人,都可以从中获得启发。 情感共鸣:文章对许多人对传统生活轨迹的不满和对改变的渴望进行了深刻的洞察,能够引起读者的共鸣。 可持续性:人生设计强调的是一个持续迭代和试错的过程,这与现实生活的发展规律相吻合,有助于人们在不断变化的环境中做出适应性调整。 教育意义:作为一种人生规划方法,"人生设计"可以作为教育的一部分,帮助年轻人更早地学会自我探索和规划,为未来的生活和职业发展打下基础。 局限性:尽管"人生设计"提供了一种新的思考框架,但它可能需要个人具备一定的自我认知和反思能力,对于一些缺乏自我探索经验的人来说,可能需要额外的指导和支持。 总体来说,这篇文章提供了一种有价值的人生规划方法,对于那些渴望改变、寻求个性化生活的人来说,是一种有益的参考和指导。
首页实用干货 🌋

UI给出的设计稿,一般是以iphone6屏幕大小为准,也就是宽高为375 667,激进一些的还会使用414 736的设计稿。在其他不同尺寸的屏幕上适配的问题也就由此诞生,一般新搭建的项目都要处理这个问题。

常见方案

目前市面上比较常见的有两种方案:rem方案、viewport方案

  1. rem方案
    通过计算屏幕宽度比,对html标签设置font-size为px,子元素都使用rem标识
<script type="text/javascript">
  !(function e () {
      var t = document.documentElement,
          n = Math.min(t.clientWidth, 500) / 4.14;
      t.style.fontSize = n + 'px';
      var i = parseFloat(window.getComputedStyle(t).fontSize);
      n !== i && ((n = (n * n) / i), (t.style.fontSize = n + 'px')),
          (window.__REAL_FONT_SIZE__ = n),
          window.addEventListener('resize', e);
  })();
</script>

缺点:rem单位会可能会出现精度的兼容性问题,可能出现1px未对齐的问题,即半像素问题

  1. viewport方案

通过更改viewport的 initial-scale=1.0, maximum-scale=1.0 属性控制缩放

优点:不会出现像素不对齐的问题
缺点:视窗缩放时,相当于渲染出了一个大尺寸页面进行缩放,会占用webview内存,影响性能

<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no"/>
<script>;+(function () { 
    function resize() {
      var viewport = document.querySelector('meta[name=viewport]');
      viewport.content = viewport.content.replace(/(initial-scale=)[^,]*/i, '$1'.concat(screen.width / 818))
   }
   // 动态调整视口宽度至设计稿宽度 
   window.addEventListener('resize', function () { setTimeout(resize, 300) });
   resize() 
})()
</script>

观察发现:这两种方案,都需要借助JS实现页面的屏幕适配,有点像补丁代码,对于代码洁癖的人,肯定想除之而后快,所以就想着实现一种纯CSS方案来实现布局适配

纯CSS方案

该方案与第一种方案类似,不过不是通过JS来控制根节点的fontSize,而是引入新的单位vw来实现。通过设置根节点单位为vw,实现根节点在不同尺寸屏幕下的相同占比;子节点使用单位rem,实现根据根节点大小变化调整对应大小。

vw字面意思是视窗宽度,将整个视窗划分为100vw,所以vw类似百分比,该方案正是利用这个特性实现不同屏幕下的布局适配。

根据设计稿可知, 375px = 100vw

如果将根节点fontSize设置为100px,所以,根节点html

fontSize=100px * 100vw/375px = 26.66666667vw

为了兼容不支持vw的机型,可以先设置px,再用vw进行覆盖,具体如下:

html {
    font-size: 100PX; // 大写的PX,不会被postcss-pxtorem转化为rem
    font-size: 26.66666667vw;
}

子节点通过插件postcss-pxtorem,在webpack构建时,会把实际写样式时用的px转换为rem,具体配置如下:

'postcss-pxtorem': {
    rootValue: 100,
    propList: ['*'],
    selectorBlackList: ['__vconsole']
}

总结

该方案让CSS和JS各司其职,代码也比较整洁。该方案已经被应用于多个公司级营销活动页面、多个移动端项目,未暴漏发现严重的兼容问题。

上一篇
💡 正确介绍自己的项目经验 再也不为面试发愁了
下一篇
🤡 服务器拒绝了我的ssh免密登录