前端开发入门到实战:通过 rem 和 vw 实现页面等比例缩放自适应

一、rem 和 vw 简介

1. rem

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

浏览器支持:Caniuse

示例

  • 若根元素?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

浏览器支持:Caniuse

  • 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(){
    adapt();
};
</script>
</body>
</html>

这里推荐一下我的前端学习交流圈:767273102 ,里面都是学习前端的从最基础的HTML+CSS+JS【炫酷特效,游戏,插件封装,设计模式】到移动端HTML5的项目实战的学习资料都有整理,送给每一位前端小伙伴。2019最新技术,与企业需求同步。好友都在里面学习交流,每天都会有大牛定时讲解前端技术!

学习前端,我们是认真的

原文地址:https://blog.51cto.com/14284898/2404484

时间: 2024-10-23 17:16:19

前端开发入门到实战:通过 rem 和 vw 实现页面等比例缩放自适应的相关文章

前端开发入门到实战:CSS中字体单位:px、em、rem和%

对于绘图和印刷而言,"单位"相当重要,然而在网页排版里,单位也是同样具有重要性,在CSS3普及以来,更支持了一些方便好用的单位(px.em.rem-等),这篇文章将整理这些常用的CSS单位,也帮助自己未来在使用上能更加得心应手. "网页"和"印刷"的单位若要把单位做区隔,最简单可以分为"网页"和"印刷"两大类,通常对于CSS来说只会应用到网页的样式,毕竟真正要做印刷,还是会倾向透过排版软件来进行设计. 网页

前端开发入门到实战:HTML5新增和废弃的标签

一.废弃的标签 以下的 HTML 4.01 元素在HTML5中已经被删除,虽然浏览器为了兼容性考虑都还支持这些标签,但建议使用新的替代标签,矛盾的是老浏览器对新标签的支持度又不够,视项目的受众对象而定了. 1.能用CSS代替的元素 这些元素包含basefont.big.center.font.s.strike.tt.u.这些元素纯粹是为页面展示用的,表现的内容应该由CSS完成. 2.frame框架 这些元素包含frameset.frame.noframes.HTML5中不支持frame框架,只支

前端开发入门到实战:css实现div垂直水平居中的2种常用方法

方法一: 利用vertical-align:middle进行垂直方向上的居中对齐,此方法需要满足的条件: 设置父元素的行高line-height等于父元素height的高度 子元素必须是行内块级元素display:inline-block; 子元素设置vertical-align:middle 此方法在开发中不能右浮动(不能靠右边) 下方是完整代码,可以新建一个HTML文件进行测试(绿色的盒子): <html> <head> <title>导航条</title&g

前端开发入门到实战:把HTML转成PDF的4个方案及实现

在本文中,我将展示如何使用 Node.js.Puppeteer.headless Chrome 和 Docker 从样式复杂的 React 页面生成 PDF 文档. 背景:几个月前,一个客户要求我们开发一个功能,用户可以得到 PDF 格式的 React 页面内容.该页面基本上是患者病例的报告和数据可视化结果,其中包含许多 SVG.另外还有一些特殊的请求来操纵布局,并对 HTML 元素进行一些重新排列.因此与原始的 React 页面相比,PDF 中应该有不同的样式和额外的内容. 由于这个任务比用简

前端开发入门到实战:计算一个页面内每个模块的曝光时间(停留时间)

产品希望看到投放出去的活动页,用户对其页面内的什么信息比较感兴趣,对什么信息完全不感兴趣.=> 计算页面内每模块的停留时间 第一次听到这个需求,我的大脑开始疯狂运转,然后想到了plan 1, plan 2, plan3...中间还有很多失败想法我已经忘记了,这里方案三是我最终采用的方法. 方案一:根据页面dom将页面分模块 var bodyChildrenLists = $('body').children() var bodyChildDomLsit = [] var initHeight =

前端开发入门到实战:HTML标签和JS中设置CSS3 var变量

一.HTML标签中设置CSS变量 如下: <div style="--color: #cd0000;"> <img src="mm.jpg" style="border: 10px solid var(--color);"> </div> 直接正常CSS语句一样在style属性中设置即可. 效果如下截图: 二.JS中设置CSS变量 如下,HTML示意: <div id="box">

前端开发入门到实战:CSS 页面滚动平滑

1. 这些年自己步子慢了 这些年自己在无障碍访问,SVG和Canvas这些偏小众的领域花了大量的学习精力,以至于很多前端新特性,新技术没能及时关注和了解,有CSS3领域的新属性,有JS领域的新API,包括全新的ES6/ES7语法等,相比以前的学习,步子确实慢了.比方说,本文要介绍的平滑滚动,无论是CSS还是JS,现代浏览器都提供了原生的属性或方法支持,而且差不多已经有一年时间,而我最近才知道,和数年前实时关注新技术的自己形成了明显的对比. 不过随着SVG和Canvas的基础越来越牢固,细节越来越

前端开发入门到实战:css实现修改浏览器自动填充表单的默认样式

当表单中存在input[password]的时候,采用submit方式提交.就会触发浏览器自动填充表单.比如chrome自动填充后,淡×××输入框代替了背景样式,看起来有些怪异. ?那么如何通过css实现取消浏览器自动填充表单的默认样式呢? 解决方法一: 当input文本框是纯色背景的,可以对input:-webkit-autofill使用足够大的纯色内阴影来覆盖input输入框的×××背景:如: input:-webkit-autofill { -webkit-box-shadow: 0 0

前端开发入门到实战:css 浮动布局,清除浮动

浮动的特性: (1)浮动元素有左浮动(float:left)和右浮动(float:right)两种 (2)浮动的元素会向左或向右浮动,碰到父元素边界.其他元素才停下来 (3)相邻浮动的块元素可以并在一起,超出父级宽度就换行 (4)浮动让行内元素或块元素自动转化为行内块元素(此时不会有行内块元素间隙问题) (5)浮动元素后面没有浮动的元素会占据浮动元素的位置,没有浮动的元素内的文字会避开浮动的元素,开成文字绕图的效果 (6)父元素如果没有设置尺寸(一般是高度不设置),父元素内整体浮动的元素无法撑开