移动端浏览器适配和高清方案

2023-11-28 10:57:36

浏览:55

评论:0

移动端浏览器适配经过漫长的迭代,经历了以下的技术方案。

设置viewport进行缩放


在html页面中,使用meta标签来设置viewport,以控制网页在不同设备上的缩放行为。

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

在上述代码中,width=device-width表示将viewport 的宽度设置为设备的宽度,以实现响应式布局。initial-scale=1.0表示初始缩放比例为 1.0,即不进行缩放。

你可以根据需要调整initial-scale的值来控制网页的初始缩放比例。例如,将其设置为initial-scale=1.2将使网页在加载时放大 20%。

请注意,不同的设备和浏览器可能对 viewport 设置有不同的支持和默认行为。

viewport的各个属性介绍如下:

属性 含义
width 设置layout viewport 的宽度,为一个正整数,或字符串"width-device"
initial-scale 设置页面的初始缩放值,为一个数字,可以带小数
maximum-sacle 允许用户的最大缩放值,为一个数字,可以带小数
user-scalable 是否允许用户进行缩放,值为"no"或"yes", no 代表不允许,yes代表允许
minimum-scale 允许用户的最小缩放值,为一个数字,可以带小数
height 设置layout viewport 的高度,这个属性对我们并不重要,很少使用

媒体查询


通过使用媒体查询,根据设备的屏幕尺寸、分辨率等媒体特性来调整布局和样式。比如bootstrap,或者jqueryUI,,这种方式维护成本高。

Rem 布局适配


rem是css3新引入的单位,是相对于html元素字体单位的一个相对单位,从本质上来说,它属于一个字体单位,用字体单位来布局,并不是太合适。lib-flexible+postcss-pxtorem,在相当长一段时间里,这两个插件搭配都是解决移动端布局的神器,lib-flexible是阿里手淘系开源的一个库,用于设置font-size,同时处理一些窗口缩放的问题。在pc端会有兼容性的问题,对移动端比较友好。

Vw 布局适配


vw和vh是viewport单位,它们是基于视窗(viewport)宽度和高度的相对单位。vw表示相对于视窗宽度的百分比,而vh表示相对于视窗高度的百分比。常用技术方案:postcss-px-to-viewport  需要考虑浏览器兼容性。

px + calc + clamp 布局适配


根据 CSS 的新特性:css变量、calc()函数、clamp()、@container函数实现

:root {
    --design-width: 750; // 设计宽度
    --viewport-width: 100vw; // vw宽度
    --min-viewport-width: 320px; // 最小宽度
    --max-viewport-width: 1440px; // 最大宽度
    --current-viewport-width: clamp( var(--min-viewport-width), var(--viewport-width), var(--max-viewport-width) ); // 当前宽度
    --width-ratio: calc(var(--current-viewport-width) / var(--design-width)); // 当前宽度/设计宽度
}
body {
    font-size: calc( 20 *  --width-ratio); 
}

推荐rem + vw 布局适配


  • 固定vieport,元素布局上使用rem单位
  • html元素的font-size使用vw + px fallback的形式 列如:京东
  • 当页面超过一定宽度时,根据media query设置font-size为px,优先级高于vw。
  • 限制页面宽度为1080px

移动端浏览器的高清问题


css中的1px并不等于设备的1px

移动端浏览器中,window对象有devicePixelRadio属性简称dpr,官方定为为:设备物理像素和独立像素px的比例。

DPR = 1,此时 1 物理像素 等于 1 独立像素。

DPR = 2,此时 1 物理像素等于 0.5 独立像素。 此时的 border-width: 1px,实际展示是2px。

DPR = 3,此时 1 物理像素等于 0.33 独立像素。此时的 border-width: 1px,实际展示是3px。

解决方案:

1、渐变实现 background-image: linear-gradient(to top, ,,,)

2、使用缩放实现 transform: scaleY(0.333)

3、使用图片实现 base64

4、使用 SVG 实现

5、嵌入 background url

6、border-image 低端机下支持度不好

以上都需要通过 CSS 的媒体查询来实现。

不同 DPR 下图片的高清解决方案


1、图片dpr高清适配目前常用的方案是使用媒体查询方式,替换url路径。

/* 针对高 DPR 屏幕的样式 */
@media (device-pixel-ratio: 2) {
}

2、或者使用js获取当前dpr,替换图片src。