前端开发中的大屏布局方案:使用 rem 单位与动态设置 html 的 font-size

使用 rem 单位与动态设置 html 的 font-size

前言

随着设备尺寸的多样化,网页需要能够在不同大小的屏幕上提供良好的用户体验。传统的布局方式(如使用 px)在不同分辨率下可能会导致布局失真。为了解决这个问题,我们可以通过动态设置 html 元素的 font-size 并使用 rem 单位来构建响应式布局。

先看效果

前端开发中的大屏布局方案:使用 rem 单位与动态设置 html 的 font-size

rem 单位简介

remCSS 中的一个相对单位,全称为 "root em"。它代表的是根元素(通常是 <html> 元素)的字体大小。这意味着如果 <html>font-size 设置为 16px,则 1rem 就等于 16px

使 flexible.js用动态设置 htmlfont-size

动态设置html根字体的大小和body字体大小,使用flexible.js将为1920*1080的设计稿分为24等份,每一份80px,即1920/24=80,即1rem = 80px,24rem = 1920px,将bodyfontSize设置为12px。 在窗口大小改变时调用refreshRem 函数,计算屏幕宽度,并根据宽度计算出 rem 的基准值。

flexible.js完整代码


;(function(win, lib) {var doc = win.document;var docEl = doc.documentElement;var metaEl = doc.querySelector('meta[name="viewport"]');var flexibleEl = doc.querySelector('meta[name="flexible"]');var dpr = 0;var scale = 0;var tid;var flexible = lib.flexible || (lib.flexible = {});if (metaEl) {console.warn('将根据已有的meta标签来设置缩放比例');var match = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/);if (match) {scale = parseFloat(match[1]);dpr = parseInt(1 / scale);}} else if (flexibleEl) {var content = flexibleEl.getAttribute('content');if (content) {var initialDpr = content.match(/initial\-dpr=([\d\.]+)/);var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/);if (initialDpr) {dpr = parseFloat(initialDpr[1]);scale = parseFloat((1 / dpr).toFixed(2));}if (maximumDpr) {dpr = parseFloat(maximumDpr[1]);scale = parseFloat((1 / dpr).toFixed(2));}}}if (!dpr && !scale) {var isAndroid = win.navigator.appVersion.match(/android/gi);var isIPhone = win.navigator.appVersion.match(/iphone/gi);var devicePixelRatio = win.devicePixelRatio;if (isIPhone) {// iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {dpr = 3;} else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){dpr = 2;} else {dpr = 1;}} else {// 其他设备下,仍旧使用1倍的方案dpr = 1;}scale = 1 / dpr;}docEl.setAttribute('data-dpr', dpr);if (!metaEl) {metaEl = doc.createElement('meta');metaEl.setAttribute('name', 'viewport');metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');if (docEl.firstElementChild) {docEl.firstElementChild.appendChild(metaEl);} else {var wrap = doc.createElement('div');wrap.appendChild(metaEl);doc.write(wrap.innerHTML);}}function refreshRem(){var width = docEl.getBoundingClientRect().width;if (width / dpr > 540) {width = 540 * dpr;width = width * dpr;}var rem = width / 24;docEl.style.fontSize = 80 + 'px';flexible.rem = win.rem = rem;}win.addEventListener('resize', function() {clearTimeout(tid);tid = setTimeout(refreshRem, 300);}, false);win.addEventListener('pageshow', function(e) {if (e.persisted) {clearTimeout(tid);tid = setTimeout(refreshRem, 300);}}, false);if (doc.readyState === 'complete') {doc.body.style.fontSize = 12 * dpr + 'px';} else {doc.addEventListener('DOMContentLoaded', function(e) {doc.body.style.fontSize = 12 * dpr + 'px';}, false);}refreshRem();flexible.dpr = win.dpr = dpr;flexible.refreshRem = refreshRem;flexible.rem2px = function(d) {var val = parseFloat(d) * this.rem;if (typeof d === 'string' && d.match(/rem$/)) {val += 'px';}return val;}flexible.px2rem = function(d) {var val = parseFloat(d) / this.rem;if (typeof d === 'string' && d.match(/px$/)) {val += 'rem';}return val;}})(window, window['lib'] || (window['lib'] = {}));

flexible.js代码解释

初始化变量:

win: 当前窗口对象 (window)
doc: 当前文档对象 (document)
docEl: 文档的 <html> 元素。
metaEl: 查找 <meta name="viewport"> 元素。
flexibleEl: 查找 <meta name="flexible"> 元素。
dpr: 设备像素比 (Device Pixel Ratio)
scale: 缩放比例。
tid: 用于存储定时器的标识符。
flexible: 一个对象,用于封装与 rem 相关的方法和属性。

确定设备像素比和缩放比例:

首先检查是否存在 <meta name="viewport"> <meta name="flexible"> 元素,如果有,则根据这些元素的内容来确定dprscale
如果不存在上述元素,则根据设备类型和像素比来确定 dpr scale
对于iOS设备(iPhone),根据设备像素比选择合适的 dpr 值。
对于非iOS设备,默认使用 dpr = 1

设置<html>元素的 data-dpr 属性:

该属性用来存储设备的像素比。

创建或更新 <meta> 标签:

如果没有<meta name="viewport">元素,则创建一个新的<meta>标签并设置 initial-scalemaximum-scaleminimum-scale user-scalable
如果已有 <meta name="viewport"> 元素,则不创建新的。

定义 refreshRem 函数:

计算屏幕宽度,并根据宽度计算出rem的基准值。
设置<html>元素的 font-size
更新flexible.remwindow.rem的值。

监听窗口大小变化:

在窗口大小改变时调用refreshRem函数,但会先清除之前的定时器以避免重复调用。
同样,在 pageshow 事件中也做了类似处理,这是为了支持页面缓存时的重加载。

初始化设置:

如果文档加载完成,立即设置<body>的字体大小。
如果文档还在加载中,等待 DOMContentLoaded 事件触发后再设置 <body> 的字体大小。

执行 refreshRem 函数:

页面加载完毕后立即调用 refreshRem 函数。

封装方法:

flexible.dpr: 存储设备像素比。
flexible.refreshRem: 提供一个公共方法来手动刷新 rem 的值。
flexible.rem2px: 提供从rempx 的转换。
flexible.px2rem: 提供从pxrem的转换。
代码的核心在于动态调整 <html> 元素的 font-size,以适应不同的屏幕尺寸,使得基于 rem 单位的布局能够响应式地适应各种屏幕尺寸。同时,它还提供了工具方法来方便地在rempx 之间进行转换。

flexible.js的使用

main.js中引入即可,如下图:
前端开发中的大屏布局方案:使用 rem 单位与动态设置 html 的 font-size

设置<meta name="viewport">标签

<meta name="viewport"> 标签是用于控制网页在移动设备上的显示方式。这个标签告诉浏览器如何控制页面的缩放和尺寸。设置如下:

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">

解释:
width=device-width: 设置视口的宽度为设备的宽度。这意味着网页的宽度将与设备的屏幕宽度相同。这对于响应式设计非常重要,因为它确保了网页能在不同尺寸的屏幕上正确展示。
initial-scale=1: 设置初始的缩放比例为 1,这意味着页面将以 1:1 的比例加载,即实际尺寸显示,不会有任何缩放。
maximum-scale=1: 设置最大缩放比例为 1,意味着用户不能放大页面超过原始大小。
minimum-scale=1: 设置最小缩放比例为 1,意味着用户不能缩小页面小于原始大小。
user-scalable=no: 禁止用户手动缩放页面。这意味着即使用户尝试使用双指捏合手势来缩放页面,也不会生效。

vscode下载px转rem插件并配置

配置pxtorem插件 Root Font Size80px
前端开发中的大屏布局方案:使用 rem 单位与动态设置 html 的 font-size
前端开发中的大屏布局方案:使用 rem 单位与动态设置 html 的 font-size

上面配置完成,效果如下

前端开发中的大屏布局方案:使用 rem 单位与动态设置 html 的 font-size

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/407701.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【UE5】基于摄像机距离逐渐剔除角色

效果 步骤 1. 新建一个工程&#xff0c;在内容浏览器中添加第三人称游戏内容包 2. 找到第三人称角色的材质实例“MI_Quinn_01”并打开 找到材质实例的父项材质“M_Mannequin” 打开材质“M_Mannequin” 在材质图表中添加如下节点 此时运行效果如文章开头所示。 参考视频&#…

flutter 中 ssl 双向证书校验

SSL 证书&#xff1a; 在处理 https 请求的时候&#xff0c;通常可以使用 中间人攻击的方式 获取 https 请求以及响应参数。应为通常我们是 SSL 单向认证&#xff0c;服务器并没有验证我们的客户端的证书。为了防止这种中间人攻击的情况。我么可以通过 ssl 双向认证的方式。即…

创意无限,尽在掌握:热门视频剪辑软件一览

我们记录生活、分享故事、传播信息用视频的频率越来越高了。而这些视频往往都是通过剪辑之后才能展示出当前的效果。那这次我们就来探索剪辑视频的时候都会用到什么工具吧。 1.福昕视频剪辑 连接直达>>https://www.pdf365.cn/foxit-clip/ 这是一款专为追求高效与创意…

【React】为什么Hooks不能出现在判断中

前言 在 React 中&#xff0c;Hooks 不能写在条件语句中&#xff0c;如下面这段代码点击button后则会报错。 import { useEffect, useState } from "react"export default () > {const [count, setCount] useState(0)if (count > 0) {useEffect(() > {co…

2-74 基于matlab的图像k-means聚类GUI

基于matlab的图像k-means聚类GUI&#xff0c;可对彩色图像进行Kmeans和meanshift进行聚类分析&#xff0c;生成最后的聚类图像以及聚类中心的迭代轨迹。程序已调通&#xff0c;可直接运行。 2-74 matlab GUI - 小红书 (xiaohongshu.com)

iOS 通知

iOS 通知分为本地推送和远程推送两类 一. 本地推送使用流程 1. 注册通知 //请求通知权限 UNUserNotificationCenter *center [UNUserNotificationCenter currentNotificationCenter];[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizati…

Java方法的使用

目录 一&#xff1a;方法概念及使用 1.1什么是方法 1.2 方法定义 1.3 方法调用的执行过程 1.4 实参和形参的关系(重要) 1.5 没有返回值的方法 二&#xff1a;方法重载 2.1 为什么需要方法重载 2.2 方法重载概念 2.3 方法签名 三. 递归 3.1递归的概念 3.2 递归执行过…

Unity 资源 之 Photon Inventory 2 (Game Creator 2)

免费获取资源&#xff1a; 有2种方式可免费获取资源&#xff1a; 在后台回复**“UnityAssetStore**“ 或 ”Unity资源”。在Unity官方地址&#xff1a;https://assetstore.unity.com/publisher-sale &#xff0c;兑换码&#xff1a;NINJUTSUGAMES 【本周限定】 关注我每周&a…

配置PXE预启动执行环境:Kickstart自动化无人值守安装

文章目录 实现 Kickstart 无人值守安装1. 安装Kickstart和配置应答文件&#xff08;图形化界面&#xff09;2. 配置 PXE 菜单支持 Kickstart 无人值守安装3. 验证 Kickstart 无人值守安装4. 拓展&#xff1a;命令行配置应答文件&#xff08;命令行界面&#xff09; 实现 Kickst…

校友会系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;校友管理&#xff0c;生活模块管理&#xff0c;兼职信息管理&#xff0c;表白墙管理&#xff0c;我的收藏管理&#xff0c;校友论坛&#xff0c;系统管理 微信端账号功能包括&…

如何用3个月零基础入门网络安全?_网络安全零基础怎么学习

前 言 写这篇教程的初衷是很多朋友都想了解如何入门/转行网络安全&#xff0c;实现自己的“黑客梦”。文章的宗旨是&#xff1a; 1.指出一些自学的误区 2.提供客观可行的学习表 3.推荐我认为适合小白学习的资源.大佬绕道哈&#xff01; →点击获取网络安全资料攻略← 一、自学…

【图形学】TA之路-基于Unity Shader编程之初体验

学习shader之前你必须知道的事情&#xff1a; Unity开发引擎、Direct3D、Shader他们之间的关系 Direct3D 是一个底层图形 API&#xff0c;它直接与 GPU &#xff08;显卡&#xff09;交互&#xff0c;提供了访问硬件加速功能的接口。Unity 开发引擎&#xff0c;它封装了很多底…

Python酷库之旅-第三方库Pandas(094)

目录 一、用法精讲 401、pandas.Series.to_string方法 401-1、语法 401-2、参数 401-3、功能 401-4、返回值 401-5、说明 401-6、用法 401-6-1、数据准备 401-6-2、代码示例 401-6-3、结果输出 402、pandas.Series.to_clipboard方法 402-1、语法 402-2、参数 40…

⼆⼿⻋交易系统架构分析

二手车交易系统架构分析涉及多个层面&#xff0c;包括技术选型、系统模块、数据库设计、用户界面及安全性等。以下是对二手车交易系统架构的综合分析&#xff1a; 技术选型&#xff1a;系统通常采用B/S架构模式&#xff0c;前后端分离&#xff0c;前端使用微信小程序开发工具&…

搭建自己的金融数据源和量化分析平台(七):定时更新上市公司所属行业门类及大类

0x00 前言 由于此前从深交所下载的股票信息中只有行业门类信息&#xff0c;没有行业大类信息&#xff0c;导致后续解析三大报表和量化选股的时候无法进行&#xff1a; 可以看到深交所的股票是没有大类信息的。 再看看上交所的保险股&#xff1a; 因此需要将深交所股票的所属…

Spring + Boot + Cloud + JDK8 + Elasticsearch 单节点 模式下实现全文检索高亮-分页显示 快速入门案例

1. 安装elasticsearchik分词器插件 sudo wget https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-8.13.4.zip sudo mkdir -p ./es_plugins/analysis-ik sudo mkdir ./es_data sudo unzip elasticsearch-analysis-ik-8.13.4.zip -d ./es_plugins/a…

市盈率的概念

写篇有关市盈率的【不务正业】的内容。 重要公式 市盈率 官方的定义 平均市盈率&#xff1d;∑(收盘价发行数量)/∑(每股收益发行数量)&#xff0c;统计时剔除亏损及暂停上市的上市公司。 静态市盈率 滚动市盈率&#xff08;TTM&#xff09; 股票市盈率的意义 如果某股票有较…

海运整箱成本与拼箱成本对比 | 国际贸易服务平台 | 箱讯科技

整箱和拼箱 在集装箱运输业务中&#xff0c;我们把一个集装箱、一个出口人、一个收货人、一个目的港&#xff0c;满足这“四个一”条件的货物叫做整箱货&#xff0c;而把一个集装箱、出口人、收货人和目的港这三项之中只要有一项是在两个或两个以上的出口运输货物&#xff0c;就…

Linux网络环境搭建,开发板网线直连电脑网口,电脑WIFI上网

开发板网线直连电脑网口&#xff08;电脑自带&#xff0c;一般有PCI&#xff0c;不是USB网卡&#xff09;&#xff0c;电脑WIFI上网 因为电脑是 WiFi 上网&#xff0c;所以需要添加一个网络适配器并设置成 NAT 模式&#xff0c;供虚拟机上网。 设置双网卡&#xff0c;注意双网卡…

蓝队技能-应急响应篇钓鱼攻击邮件与文件EML还原蠕虫分析线索定性

知识点&#xff1a; 1、应急响应-钓鱼邮件-定性&排查 2、应急响应-恶意文件-应急&分析一、演示案例-蓝队技能-钓鱼攻击-邮件&附件&分析&排查 如何分析邮件安全性&#xff1a; 1、看发信人地址 2、看发信内容信息 3、看发信内容附件 4、看邮件原文源码…