WEB页面实现等比例缩放自适应 - 通过 rem 和 vw 实现

简介: rem 是相对长度单位,是指相对于根元素(即html元素)font-size(字号大小)的倍数。


一、rem 和 vw 简介



1. rem


rem 是相对长度单位,是指相对于根元素(即html元素)font-size(字号大小)的倍数。


image.png


示例

  • 若根元素 font-size 为 12px
html {
    font-size: 12px;
}
h1 { 
    font-size: 2rem;  /* 2 × 12px = 24px */
} 
p {
    font-size: 1.5rem;   /* 1.5 × 12px = 18px */
}
div {
    width: 10rem;  /* 10 × 12px = 120px */
}
  • 若根元素 font-size 为 16px
html {
    font-size: 16px;
}
h1 { 
    font-size: 2rem;  /* 2 × 16px = 32px */
} 
p {
    font-size: 1.5rem;   /* 1.5 × 16px = 24px */
}
div {
    width: 10rem;  /* 10 × 16px = 160px */
}


2. vw


vw 是相对长度单位,相对于浏览器窗口的宽度,浏览器窗口宽度被均分为100个单位的vw


image.png

  • Opera Mini不支持该属性


示例

  • 当浏览器窗口宽度为320px时,1vw = 3.2px
p {
    font-size: 5vw;   /* 5 × 3.2px = 16px */
}
div {
    width: 20vw;  /* 20 × 3.2px = 64px*/
}
  • 当浏览器窗口宽度为375px时,1vw = 3.75px
p {
    font-size: 5vw;   /* 5 × 3.75px = 18.75px */
}
div {
    width: 20vw;  /* 20 × 3.75px = 75px*/
}


二、rem 和 vw 结合实现WEB页面等比例缩放自适应



1. 选择基准窗口宽度及


示例:

以 iPhone 6/7/8/X 的屏幕宽度 375px 作为基准窗口宽度;

以 15px 最为 html 元素的 font-size,即rem单位的基本长度。

html {
    font-size: 15px;
}
h1 { 
    font-size: 2rem;  /* 2 × 15px = 30px */
} 
p {
    font-size: 1.2rem;   /* 1.2 × 15px = 18px */
}
div {
    width: 10rem;  /* 10 × 15px = 150px*/
}
注意: html 元素的 font-size 不宜过大,也不宜过小。当 font-size 过大时,以其为基准的 rem 数值会出现精度丢失,造成较大的误差。当 font-size 过小时,由于很多主流浏览器 font-size 不能小于12px,当 font-size 小于12px 时,会以 12px 展示。此时,rem 单位会以 12px 为基准进行计算,页面就会整个跑偏。


2. 将 html 元素的 font-size 替换为使用 vw 表示


窗口宽度:375px

=> 1vw  = 3.75px
=> 15px = ( 15 / 3.75 )vw = 4vw

因此, html 元素的 font-size 可以替换为 4vw

html {
    font-size: 4vw;
}
h1 { 
    font-size: 2rem;  /* 2 × 4vw × 3.75px = 30px */
} 
p {
    font-size: 1.2rem;   /* 1.2 × 4vw × 3.75px = 18px */
}
div {
    width: 10rem;  /* 10 × 4vw × 3.75px = 150px*/
}

当窗口宽度调整为320px时

1vw = 3.2px
4vw = 4 × 3.2px = 12.8px
html {
    font-size: 4vw;
}
h1 { 
    font-size: 2rem;  /* 2 × 4vw × 3.2px = 25.6px */
} 
p {
    font-size: 1.2rem;   /* 1.2 × 4vw × 3.2px = 15.36px */
}
div {
    width: 10rem;  /* 10 × 4vw × 3.2px = 128px*/
}

可见,此时所有以rem为单位的字号和长度都会随着屏幕宽度的放大和缩小而进行等比例缩放。

重要的事情说第二遍注意: html 元素的 font-size 不宜过大,也不宜过小。当 font-size 过大时,以其为基准的 rem 数值会出现精度丢失,造成较大的误差。当 font-size 过小时,由于很多主流浏览器 font-size 不能小于12px,当 font-size 小于12px 时,会以 12px 展示。此时,rem 单位会以 12px 为基准进行计算,页面就会整个跑偏。


3. 为页面设置最大宽度和最小宽度


当页面小于300px时,不再等比例缩小,当页面大于500px时,不再等比例放大


窗口宽度300px时

1vw  = 3px
4vw = 4 × 3px = 12px


窗口宽度500px时

1vw  = 5px
4vw = 4 × 5px = 20px
@media screen and (max-width: 300px) {
    html {
        width: 300px;
        font-size: 12px;
    }
}
@media screen and (min-width: 500px) {
    html {
        width: 500px;
        font-size: 20px;
        margin: 0 auto;  /* 让窗口水平居中展示 */
    }
}


三、根据浏览器宽度切换PC和WAP页面


1. 当页面宽度大于阈值时,自动切换到PC页面,当小于阈值时,切换回WAP页面


WAP页面

<!DOCTYPE html>
<html lang="en">
<head>
    <title>WAP页面</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
</head>
<body id="wap">
    我是WAP页面
<script src="https://mat1.gtimg.com/libs/jquery2/2.2.0/jquery.js"></script>
<script>
function adapt() {
    var agent;
    var clientWidth = document.body.clientWidth;
    console.log(clientWidth);
    if (clientWidth < 800) {
        agent = 'wap';
    } else {
        agent = 'pc'
    }
    if ($('body').attr('id') !== agent) {
        location.href = 'pc.html';
    }
}
adapt();
window.onresize = function(){
    adapt();
};
</script>
</body>
</html>

PC页面

<!DOCTYPE html>
<html lang="en">
<head>
    <title>我是PC页面</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
</head>
<body id="pc">
    我是PC页面
<script src="https://mat1.gtimg.com/libs/jquery2/2.2.0/jquery.js"></script>
<script>
function adapt() {
    var agent;
    var clientWidth = document.body.clientWidth;
    console.log(clientWidth);
    if (clientWidth < 800) {
        agent = 'wap';
    } else {
        agent = 'pc'
    }
    if ($('body').attr('id') !== agent) {
        location.href = 'wap.html';
    }
}
adapt();
window.onresize = function(){
相关文章
|
2月前
|
编解码 前端开发 JavaScript
使用 CSS 打印样式为 Web 页面设置专业的打印机效果
使用 CSS 打印样式为 Web 页面设置专业的打印机效果
80 2
|
3月前
|
存储
在 Web 中判断页面是不是刷新
【9月更文挑战第10天】在Web开发中,判断页面是否刷新有多种方法:1) 监听`popstate`事件,检测用户是否通过历史记录访问页面;2) 记录并比较页面加载时间戳,若相差极小,则可能为刷新;3) 利用本地存储设置特定值,若该值不存在或不符合预期,则页面可能被刷新。然而,这些方法并非绝对准确。
231 3
|
4月前
|
开发框架 前端开发 Java
【前端学java】SpringBootWeb极速入门-实现一个简单的web页面01
【8月更文挑战第12天】SpringBootWeb极速入门-实现一个简单的web页面01
82 3
html,web页面朗读文字,朗读中文,朗读英文
html,web页面朗读文字,朗读中文,朗读英文
|
4月前
|
数据处理 开发者 UED
FastAPI 的模板引擎简直太神奇啦!这就是构建动态 Web 页面的终极秘籍,快来一探究竟!
【8月更文挑战第31天】FastAPI 是一款高性能异步 Web 框架,可通过集成模板引擎(如 Jinja2 或 Mako)实现动态页面渲染。使用模板引擎可分离页面结构与数据,简化代码并提升可维护性。此外,它还提供丰富的语法支持,如循环和条件判断,从而增强页面展示效果及开发效率。通过简单的配置步骤,即可在 FastAPI 中启用模板引擎,显著改善用户体验。
436 1
|
4月前
|
XML JavaScript 测试技术
Web自动化测试框架(基础篇)--HTML页面元素和DOM对象
本文为Web自动化测试入门指南,介绍了HTML页面元素和DOM对象的基础知识,以及如何使用Python中的Selenium WebDriver进行元素定位、操作和等待机制,旨在帮助初学者理解Web自动化测试中的关键概念和操作技巧。
57 1
|
3月前
|
数据处理 Python
Django视图:构建动态Web页面的核心技术
Django视图:构建动态Web页面的核心技术
|
4月前
【Azure 应用服务】Web.config中设置域名访问限制,IP地址限制访问特定的页面资源 (Rewrite)
【Azure 应用服务】Web.config中设置域名访问限制,IP地址限制访问特定的页面资源 (Rewrite)
|
4月前
|
开发框架 前端开发 API
使用代码生成工具快速开发应用-结合后端Web API提供接口和前端页面快速生成,实现通用的业务编码规则管理
使用代码生成工具快速开发应用-结合后端Web API提供接口和前端页面快速生成,实现通用的业务编码规则管理
|
6月前
|
缓存 JavaScript 前端开发
程序员必知:广告等第三方应用嵌入到web页面方案之使用js片段
程序员必知:广告等第三方应用嵌入到web页面方案之使用js片段
82 0