新Viewport单位

news2024/12/29 14:15:47

本文为翻译
本文译者为 360 奇舞团前端开发工程师
原文标题:New Viewport Units
原文作者:Ahmad Shadeed
原文地址:https://ishadeed.com/article/new-viewport-units/

自 2012 年以来,我们一直在使用 CSS viewport 单位。它们对于帮助我们根据视口宽度或高度调整元素大小很有用。

然而,在移动设备上使用 vh 单位是有问题的。原因是视口大小不包括浏览器的地址栏 UI。

为了解决这个问题,我们现在有了新的视口单位。让我们在这篇文章中了解一下它们。

CSS Viewport单位

例如,当我们需要根据视口大小调整元素的大小时。视口单位为 vw、vh、vmin 和 vmax。

考虑下图:

5fa34db81831a609e5568e2120df59af.png

值 50vw 的意思是:给元素一个等于视口宽度 50% 的宽度。

问题

当使用 100vh 调整元素大小以占据移动端视口的全部高度时,它将大于顶部和底部栏之间的空间。这种情况会发生在滚动时缩小 UI 的浏览器中,例如 Android 上的 Safari 或 Chrome。

下图显示了每个移动浏览器的顶部和底部UI是如何不同的。

edb5c4a36bbabb53e0bef73a6874a9d0.png b2d4eb021c1a752307b2dfccb7e8e342.png

假设我们有一个充满整个屏幕的加载视图。

/* 我知道我们可以使用bottom: 0代替height: 100vh,但这里是故意突出这个问题。 */
.loading-wrapper {
  position: fixed;
  left: 0;
  right: 0;
  top: 0;
  height: 100vh;
  display: grid;
  place-items: center;
}

考虑下图:

7f4b8763d6e65c5fdba505c10e89f599.png

加载图标在 CSS 中居中,但从视觉上看,它看起来稍微位于底部。为什么会发生这种情况?

00f8c0c6f1a314d0c47f2e0bbdcc488e.png

对于浏览器来说,height: 100vh 意味着元素将填充视口高度,但它不会动态的计算值。这意味着底部地址栏和工具栏不会被计算。

因此,我们期望 100vh 等于从视口顶部到地址栏 UI 顶部。

6528e49c628fdd45c2e0b6e4f7b83284.png

当我们向下滚动时,地址栏 UI 将缩小其尺寸。这很好,因为它为用户提供了更多的垂直空间来浏览页面。与此同时,它也在某种程度上破坏了 UI。

在下图中,当地址栏可见时,垂直空间的中心不符合预期。滚动时,看起来不错。

a0b50cb47929a79ee8304f1a4f029557.png

注意我是如何突出显示不可见区域的。当向下滚动时,它变得可见。如何在CSS中处理这个问题?

小、大和动态视口单位

为了解决这个问题,CSS 工作组同意采用一组新的单位:svh、lvh 和 dvh。它们分别代表小视口、大视口和动态视口。

bd20d9be224189d03dc83e0ebf9c4b7c.png

小视口

svh 表示地址栏 UI 尚未缩小尺寸时的视口高度。

38d7635d648dab415a93d081d679844d.png

大视口

lvh 表示地址栏 UI 缩小尺寸后的视口高度。

018b918134de308f96df0301efcd8755.png

动态视口

从名字上看,这个单位是动态的。这意味着它将根据地址栏 UI 是否缩小而使用小的、中间的和大的单位。

6fe1fd9b206b9fba8a2b892b97600a00.png

在初始滚动期间,动态视口单位将随着浏览器 UI 的收缩而改变。这是一个展示动态视口变化的视频:

3f4491c783e9b05e9fcd3594ec21c082.gif

用例和示例

具有粘性页眉和页脚的弹窗

141925cbdeddc069e932877d3ad8d7a7.png

在这个例子中,我们有一个带有粘性页眉和页脚的弹窗。如果内容足够长,中间部分应该滚动。

考虑以下 CSS:

.modal {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: 100vh;
}

使用 100vh 将使弹窗的底部部分不可见。在示例中,这意味着页脚将不可见,这将破坏用户体验。

以下是 iOS 上传统和新视口单位的表现:

679ec8949ca21ace230135af4f1b7cc5.png

..加上 Android 上的 Chrome 和 Firefox:

1d8e5adc8847a1c8d7ba7d51006c08da.png

为了解决这个问题,我们可以使用 svh 或 dvh 单位。

这是一个视频,显示了 dvh 和 vh 之间的差异。

b499b2e317c477780db7f7222fbc76f0.gif

主页横幅

a7adf24c55c102e8036efd5bddb123ed.png

这是一种常见的情况,我们需要使主页横幅的高度等于整个视口高度减去标题高度。在这种情况下,使用传统的 vh 在 iOS Safari、Firefox 和 Android 版 Chrome 等会在滚动时缩小 UI 的浏览器中会失败。

首先,我们需要确保标题高度是固定的。我为此使用了 min-height。

:root {
  --header-height: 60px;
}

.site-header {
  position: sticky;
  top: 0;
  min-height: var(--header-height, initial);
}

之后,我将 min-height 添加到主页横幅并使用 calc()。

.hero {
  min-height: calc(100svh - var(--header-height));
}

使用 vh 时,装饰元素(紫色)根本不可见。事实上,如果你仔细观察,你会发现它模糊的显示在 iOS Safari 中的地址栏 UI 下方,而在 Android 浏览器中则被裁剪掉了。

以下是 Safari iOS 上 svh 和 vh 的比较。

c6ed8e8457aa3c09c970d45de78b2dca.png

..加上 Android 上的 Chrome 和 Firefox:

d9413877ef2a1809afb8e599fd708f8e.png

请观看以下视频并找出使用 svh 和 vh 之间的区别。

9b4a6a49c5067bd2d350cdf75688b73c.gif

在这种情况下,使用svh就可以解决问题。

是否可以将 Dvh 设置为默认单位?

起初,答案是“是的,为什么不呢?”。然后我想,dvh 值会随着你滚动而改变,所以当它用于诸如 font-size 之类的东西时,可能会产生一种令人困惑的体验。

h1 {
  font-size: calc(1rem + 5dvh);
}
7db6d985e48a3522d2a740d66cb7d7b8.png

观看以下视频,注意地址栏 UI 缩小后字体大小如何变化:

89700da6bc59f4e17fe6aa5392420b39.gif

Demo

小心使用 Dvh 视口单位

动态视口单位可能会影响页面的性能,因为浏览器需要花费大量工作来重新计算用户向上或向下滚动的样式。

我没有机会进行密集的性能测试,但使用时我会小心。我希望我能有时间在这里更新这一点。

新视口单位有用的其他地方

这些新的视口单位可能不仅仅适用于移动浏览器。事实上,你现在可以在电视上浏览网页。谁知道电视上会出现哪种浏览器,其 UI 会在滚动时发生变化,从而调整视口的大小?

例如,以下是在 Android TV 上查看的主页横幅示例:

c6faedba1879a9340d940f5522324bc0.png

效果很好,即是动态 UI 也能继续生效。

- END -

关于奇舞团

奇舞团是 360 集团最大的大前端团队,代表集团参与 W3C 和 ECMA 会员(TC39)工作。奇舞团非常重视人才培养,有工程师、讲师、翻译官、业务接口人、团队 Leader 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。

f50e3e34ff1b532040b5e5f30d06057a.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RGB简单人脸活体检测(Liveness Detection)

参考: https://github.com/minivision-ai/Silent-Face-Anti-Spoofing(主要这个库) https://github.com/computervisioneng/face-attendance-system(使用案例) ##概念: 活体检测是指针对人脸识别过程中的人脸…

TSDB - VictoriaMetrics 技术原理浅析

一、前言 在监控领域,通常需要指标存储组件TSDB,目前开源的TSDB组件比较多,各个组件性能、高可用性、维护成本等等各有差异。本文不分析选型问题,重点讲解VictoriaMetrics(后面简称为vm)。 有兴趣的朋友建议…

Linux中常用的一些shell命令

很多的时候我们知道有一个命令,但不知道它的详细用法,可以来搜索下。但有些时候压根不知道有这个命令,比如vimdiff和diff这两个命令,知道人就比较少。 本节内容主要汇总一下Linux中常用的一些shell命令。 1. 文件和目录操作 ls …

win11安装MySQL5.7.43的问题清单

文章目录 1、win11查看自己电脑有没有安装mysql法1法2 2、完全清除之前安装的mysql3、 mysql的安装法1法2 4、遇到的一些问题1) ‘mysql‘不是内部或外部命令,也不是可运行的程序或批处理文件2) 忘记mysql的密码3)mysql启动不了:本地计算机上的MySQL服务启动后停止4…

机器学习深度学习——torch.nn模块

机器学习&&深度学习——torch.nn模块 卷积层池化层激活函数循环层全连接层 torch.nn模块包含着torch已经准备好的层,方便使用者调用构建网络。 卷积层 卷积就是输入和卷积核之间的内积运算,如下图: 容易发现,卷积神经网…

汽车养护店服务难题,看帕凝怎样解决?

中国汽车市场庞大,入户已然成为标配,加之新能源汽车近些年高增量,更促进了行业增长。而汽车后市场也迎来了一系列变化,客户服务前后路径需完善,商家们应该如何数字化经营呢? 接下来让我们看看【帕凝汽车养…

提升内功之模拟实现库函数atoi

本文包含知识点: 库函数atoi的使用和模拟实现枚举常量的运用fgets代替gets函数读取字符串isspace isdigit库函数的使用 一、库函数atoi的介绍与使用atoi的介绍atoi的使用细节 二、库函数atoi的模拟实现 一、库函数atoi的介绍与使用 atoi的介绍 函数介绍 头文件——…

密码学学习笔记(十七 ):Edwards曲线数字签名算法 - edDSA

Edwards曲线数字签名算法(Edwards-curve Digital Signature Alogorithm, edDSA)由Daniel J. Bernstein等人在2011年提出,它是一种使用基于扭曲爱德华兹曲线的Schnorr签名变体的数字签名方案。 EdDSA的一个特殊之处在于,该方案不要求每次签名都是用全新的…

Spring项目如何创建?Bean对象是如何存储的?

博主简介:想进大厂的打工人博主主页:xyk:所属专栏: JavaEE进阶 目录 文章目录 一、创建Spring项目 1.1 创建Maven项目 2.2 配置国内源 二、Bean对象的存储和读取 2.1 添加spring配置文件 2.2 创建Bean对象 2.3 读取Bean对象 2.3.1 得到spring上下文对象…

前端技术Vue学习笔记--001

前端技术Vue学习笔记 文章目录 前端技术Vue学习笔记1、Vue2和Vue3比较2、Vue简介3、Vue快速上手4、插值表达式{{}}5、Vue响应式特性6、Vue指令6.1、v-html指令6.2、v-show指令和v-if指令6.3、v-else指令和v-else-if指令6.4、v-on指令6.4.1、v-on指令基础6.4.2、v-on调用传参 6.…

生命的样子

bbc纪录片《王朝》第一季就让我颇为震撼,第二季拖到现在才看,不过好在看了《晚酌de流派》之后,现在对待上好的游戏和视频都要颇有仪式感的情况下食用,夜深人静,配着暖灯,一杯茶,伴随大卫爱登堡的…

Lesson2——时间复杂度与空间复杂度

前言: 一个物品的好坏,我们可以通过体验、口碑、销量等因素判断。那一个算法的好坏我们怎么判断呢? 目录: 1. 算法的效率 2. 时间复杂度 3. 空间复杂度 4. 常见时间复杂度以及复杂度oj练习 一、算法的效率 1、如何衡量一个算…

react-draft-wysiwyg富文本编辑器

在React项目中使用 yarn add react-draft-wysiwyg draft-js or npm i react-draft-wysiwyg draft-js推荐在项目中单独创建一个富文本编辑器组件 import { Editor } from "react-draft-wysiwyg"; import { EditorState, convertToRaw, ContentState } from draft-js…

12、动手学深度学习——循环神经网络从零实现+Pytorch内置函数实现:代码详解

1、基础知识 参考文章:8.4. 循环神经网络 2、从零开始实现 本节将上述描述, 从头开始基于循环神经网络实现字符级语言模型。 这样的模型将在H.G.Wells的时光机器数据集上训练。 首先, 我们先读取数据集。 %matplotlib inline import math…

陆拾柒- 如何通过数据影响决策(二)

是否曾感觉自己已经很努力了,但却一直被人说表现的比以前差了。 虽然古语有云“眼见为实”,但着眼之处很有可能是错的。 一、某咖啡店近期销量 7月17日准备要开大会时,负责小程序渠道的同事看到7月17日趋势下跌之后,就开始想办法…

fatal: unable to connect to github.com:github.com[0:20.205.243.166]: errno=Unknown error

git:fatal: unable to connect to github.com:github.com[0:20.205.243.166]: errnoUnknown error 在 bash 执行命令 git clone 时 报 : fatal: unable to connect to github.com:github.com[0: 20.205.243.166]: errnoUnknown error 发生此错误是因为 g…

【C++】string类的模拟实现(增删查改,比大小,运算符重载)

文章目录 1.1大框架1.2基本函数:2.成员函数2.0构造函数2.05析构函数2.09拷贝构造函数补充:预留存储空间(reserve) 2.1增加字符(push_back,append,s)push_backappends 2. 删除字符&am…

SpringCloud-Alibaba之Seata处理分布式事务

一ID三组件模型 Transaction ID XID 全局唯一的事务ID Transaction Coordinator(TC) 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚 Transaction Manager™ 控制全局事务的边界,负责开启一个全局事务,…

Java当中的深拷贝和浅拷贝

文章目录 一、前提二、浅拷贝1. BeanUtils实现浅拷贝 三、深拷贝1. 实现Cloneable接口并重写clone()方法:2. 使用序列化与反序列化: 一、前提 在计算机的内存中,每个对象都被赋予一个地址,该地址指向对象在内存中存储的位置。当我…

超详细图文教程:3DS Max 中创建低多边形游戏长剑模型

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 在此,由两部分组成的教程的第一部分中,我将向您展示如何: 对剑柄进行建模剑的护手模型剑刃建模 1. 如何制作剑柄 步骤 1 在本教程中使用正交视图。要更改视图&#x…