不同设备屏幕尺寸和DPR适配

不同设备屏幕尺寸和DPR适配为什么需要适配很久以前的手机的 DPR 都是 1 这时候不需要做 DPR 适配 直接按照设计稿将页面画出来即可 但是自从技术的发展屏幕的升级出现了 DPR 为 2 为 3 甚至更高并且屏幕的尺寸也变得很多样化 这个时候如果不做适配会出一些问题 如图片模糊 不能实现真正的 1px 边框 同一个布局在不同尺寸下的表现不一致 如在 375 屏幕下是 100px 在 414 的屏幕下还是 100px 这就有问题了 应该等比放大才对 所以

为什么需要适配

一些基本概念

一个屏幕的DPR是根据屏幕的物理像素除以屏幕的设备独立像素(也叫密度无关像素)得来的(DPR = 物理像素 / 设备独立像素)。iphone6宽度的设备独立像素是375,宽度的物理像素是750,那么就意味着DPR是2。这就意味着需要四个物理像素来描绘一个设备独立像素,就像一个(请忽略边框)的形状。

设备独立像素又叫做密度无关像素,可以认为是系统中一个点,这个点可以是可以由程序使用的虚拟像素(如CSS的px),然后系统会将这个像素转换为物理像素,在屏幕的DPR为2的设备上CSS的1px就会转为4个物理像素

屏幕密度(PPI),通常是计算每英寸有多少个像素(设备独立像素),计算公式是:屏幕斜对角的像素数除以屏幕的英寸得出PPI的值。

对一开始适配问题做出一定程度的解释

根据上面DPR解释可以知道在DPR为2的屏幕上会使用四个设备像素来描述一个CSS像素。在这种情况下一张100*100的图片在页面上的尺寸也是100*100那么其实是200*200个物理像素来描绘这张图片,很明显图片的像素是不够的,这时候系统就会让剩下的像素就近取色,这样就造成了图片的模糊,想要图片不模糊要么提供一个200*200的图片,要么将页面上100*100的容器缩小到50*50。

在DPR为2的屏幕上高度的1px其实是由2个物理像素描绘的,所以该屏幕可以描绘的最小像素应该是0.5px,所以这个1px应该是0.5px才对。

怎么做适配

既然提出了问题那么就需要解决,解决方案主要来自手淘的flexibleJS,其原理就是适配不同屏幕尺寸主要用到了rem,而适配不同的DPR主要用到了

不同屏幕尺寸

<div class='container'>  
     div> <style> .container { 
       width: 1rem; /* (100px / 100)rem */ height: 1rem; /* (100px / 100)rem */ }  
      style> <script> document.querySelector('html').style = 'font-size: ' + document.documentElement.clientWidth / 750 /* 设计稿尺寸 */ * 100 /* 将1rem对应的font-size值放大 */) + 'px'  
       script> 

不同DPR

  1. 将整个页面的基础单位,也就是rem放大 DPR倍
  2. 使用meta name=“viewport” 将整个页面缩小到 1 / DPR

这样就可以保证一个物理像素对应一个逻辑像素,让整个画面看起来清晰很多。

function adapterHD (width = 750) { 
    const dpr = window.devicePixelRatio || 1 document.querySelector('meta[name="viewport"]').setAttribute("content", "width=device-width, initial-scale=" + 1 / dpr) const oneRem = Math.floor(document.documentElement.clientWidth / width * 100) document.querySelector('html').style = 'font-size: ' + (oneRem) + 'px' } 

因为首先设置了缩放,缩放后 documentElement.clientWidth就会放大 DPR倍,所以onRem没有显式乘以DPR。

到这里还有两个问题需要解决:

  1. html元素被设置font-size之后因为font-size属性可以继承,整个网站的font-size默认都会变的很大,所以需要在body元素上重置下font-size属性
  2. 因为默认的font-size需要乘以100,所以在CSS中我们需要将设计稿上的尺寸除以100并且转换成rem单位,这个事情开发者手动去做十分繁琐且容易出错,所以可以用下面提到的postcss插件完成

flexibleJS

在引用上文提到的手淘的flexibleJS之后会自动设置html的font-size为75px,这时候的主要问题就是怎么将设计稿(一般都是750*1334)中的各个px值转换为rem。可以自己手动算(比较麻烦),可以使用编辑器插件,使用postcss插件等详情见使用Flexible实现手淘H5页面的终端适配

参考

移动端H5页面高清多屏适配方案

使用Flexible实现手淘H5页面的终端适配

viewports剖析

再聊移动端页面的适配

移动端Web页面适配方案

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218585.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午11:54
下一篇 2026年3月17日 下午11:55


相关推荐

  • 中文提示词总被拒?用Dify给Gemini 2.0加个‘安全过滤层‘的实操方案

    中文提示词总被拒?用Dify给Gemini 2.0加个‘安全过滤层‘的实操方案

    2026年3月19日
    3
  • python 爬虫 美女_Python3爬取美女妹子图片

    python 爬虫 美女_Python3爬取美女妹子图片1.效果图先看效果图,哈哈哈,是不是很有学习的欲望了,开干。爬图的数量根据你输入的页数确定,纯洁的我只是适当的爬了几张学习技术。效果图2.爬取妹子图片准备工作Python3.xPycharm等随意一款编辑器os库、requests库、pyquery库2.1安装库2.1.1cmd安装方式打开cmd控制台打开cam控制台在控制台分别输入以下代码:pipinstallrequestspip…

    2025年11月17日
    5
  • 论记忆化搜索

    论记忆化搜索论记忆化搜索什么是记忆化搜索呢?搜索的低效在于没有能够很好地处理重叠子问题;动态规划虽然比较好地处理了重叠子问题,但是在有些拓扑关系比较复杂的题目面前,又显得无奈。记忆化搜索正是在这样的情况下产生的,它采用搜索的形式和动态规划中递推的思想将这两种方法有机地综合在一起,扬长避短,简单实用,在信息学中有着重要的作用。用一个公式简单地说:记忆化搜索=搜索的形式+动态规划的思想。以上的定义是抄的,

    2022年7月26日
    10
  • 赛罗终极形态_终极战斗仪

    赛罗终极形态_终极战斗仪实践是推广一个产品或技术的最好的方式,特别在IT行业让产品管理产品本事,就是一种很好的推广方式,例如DockerinDocker、k8sink8s,这些已经被大家普遍接受。所以我觉得spinnaker要想很好的推广开来,也需要类似的应用方案,我把它称为SpinnakerOnSpinnaker。架构图如下:最上面部分是主spinnaker,或者叫masterspinn…

    2025年7月22日
    5
  • 使用openstack搭建私有云[通俗易懂]

    使用openstack搭建私有云[通俗易懂]OpenStack部署一、环境准备1、网络环境主机IPcontroller10.0.0.51compute110.0.0.61修改hosts文件cat/etc/hosts10.0.0.51 controller10.0.0.61 compute1关闭selinux、firewalldcatenv_set.sh#!/bin/bashsystemctlstopfirewalldsystemctldisablefirewallds

    2022年7月15日
    34
  • 在线IEEE浮点二进制计算器工具「建议收藏」

    在线IEEE浮点二进制计算器工具「建议收藏」在线IEEE浮点二进制计算器工具在线IEEE浮点二进制计算器工具这是一个小计算器,旨在帮助您了解用于浮点计算的IEEE754标准。它是用JavaScript实现的,并且可以与Chrome和Firefox的最新桌面版本一起使用。我尚未在其他浏览器上进行过测试。如果您在左侧的三个框中之一中输入浮点数字,然后按Enter键,您将在右侧看到该数字的位模式。您可以输入使用通常在编程语言接受的语法,比如数字42,2.345,12E-3,等;您可以输入值NaN,Inf和-Inf直接;并且您还可以使用语法输入分

    2022年10月20日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号