基于视窗单位的排版

2024-06-16 04:58
文章标签 视窗 排版 单位

本文主要是介绍基于视窗单位的排版,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是视窗单位?

现在CSS中有关于视窗单位的可用种类主要有四种,他们是:

  • vw:视窗宽度的百分比

  • vh:视窗高度的百分比

  • vmin:当前较小的vwvh

  • vmax:当前较大的vwvh

在这种情况下,视窗,指的是浏览器屏幕。1vw就意味着1%的浏览器的宽度。100vw将意味着整个浏览器宽度。


视窗单位的好处在于当视窗大小改变时,他们会自动的重新计算其大小。当重新加载页面,调整页面大小或改变页面方向时就会发生此现象。

因为视窗单位可以自动的重新计算,这让创建一个始终占据四分之一页面的组件变得十分轻松。

.component {  width: 50vw;height: 50vh;background: rgba(255, 0, 0, 0.25)}

上面图像显示的就是视窗单位的缩影。现在让我们回归到这篇文章之中。

使用视窗单位进行排版

这里还有一个为什么要考虑使用视窗单位进行排版的原因 - 根据客户端的浏览器,视窗单位会自动重新计算。这就意味着我们不需要显式声明媒体查询的字体大小。

让我们用一个例子清楚地说明这一点。

考虑下面的代码,我在800px处将font-size的大小由16px 更改为 20px

// Note: CSS are all written in SCSShtml {font-size: 16px;  @media (min-width: 800px) {font-size: 20px;}
}

当你看着这段代码时,你可以在800px视窗时,立马告诉font-size将大小由16px更改为20px。这是我们为了良好的视觉效果经常做的事情。

但是,偶尔你也会遇到这种情况,在两个断点处你不得不额外增加一个媒体查询以便在不同的设备上,排版依旧保持良好。

html {font-size: 16px;  @media (min-width: 600px) {font-size: 18px;}  @media (min-width: 800px) {font-size: 20px;}
}

虽然我们可以指定多个媒体查询并相应设置多个字体大小,但是这通常矫枉过正,所以我们坚持三到四种尺寸大小。

但是不指定多个媒体查询或者多个字体大小,你如何在不同情况下拥有相同效果呢?

这时候视窗单位就要发挥它的作用了,在视窗单位中设置font-size属性,你就可以很容易的获取一样的效果。

请考虑下面代码的结果:

html { font-size: 3vw; }

是不是很神奇?

不过,正如你可以看到的,视窗单位太适应屏幕大小的改变

如果你也将字体大小设置为3vw,在一个屏幕宽度为320px的设备(移动)上,你得到的文本大小将为10px。这时字体过小而不适合阅读。另一方面,在一个屏幕宽度为1440px的设备(笔记本电脑)上,你得到的字体大小将为43px,这时,字体又太大了。

现在,我们给出了一个有趣的挑战 - 驯服视窗字体的大小。

值得庆幸的是,这里有一个简单的方法可以实现。我们可以设置一个最小的字体大小,然后在一个小视窗中通过多次使用calc()属性缩放字体

就像下面代码所示:

html { font-size: calc(18px + 0.25vw) }

这是不是看起来很酷?我第一次发现这种方法是在Mike Riethmuller的如何精确的控制响应式排版这篇文章之中。

不幸的是,我同时也意识到这种方法并不适用于所有的浏览器。比如,Mac上的Safari(当然Mike说尽管Windows适用)。

修补不足的方法十分简单。我们在vw上可以结合使用百分比,以便Safari也可以实现字体缩放:

html { font-size: calc(112.5% + 0.5vw) }

Shwweeeeeet!在我们的代码中是否可以真的一起摆脱em,rem和媒体查询的使用?关于这一点,我迫不急切的想要知道答案!

我不得不克服的下一个挑战是尝试在视窗单位中用其他的排版元素(h1-h6)设置字体大小。

在视窗单位中设置其他的排版元素

我尝试做的第一件事就是创建一个字体大小为 body 文本大小两倍的<h1>元素。结果证实并不可以直接这么做:(

我试着将<html>中的font-size大小相乘于2,我发现这比本来的字体大小大了很多:

html { font-size: calc(112.5% + 0.25vw) }h1 { font-size: calc((112.5% + 0.25vw) * 2); }


发生这种情况的原因在于,在计算<h1>时我使用了基于百分比的font-size。当我继承<html>中的font-size重新计算<h1>中的font-size时就会变得十分有效。

这时,如果我们添加一些数字就会变得容易想象一些。

比方说你现在的视窗大小为800px。默认的font-size大小为16px

  • <html>112.5%计算出的font-size大小为18px(112.5/100 * 16px)

  • 0.25vw计算出的值相等于2px(800px * 0.25 ÷ 100)

  • <html>中计算的font-size大小为20px (18px + 2px)

到目前为止HTML计算是不是很好?太棒了!

我们将采用同样的方式来解决<h1>的计算。这一次要特别注意112.5%的计算。

  • <h1>112.5%计算出来相当于22.5pxfont-size大小(112.5/100 * 20px)

  • 0.25vw相当于2px(800px * 0.25 ÷ 100)

  • <h1>font-size大小为49px((22.5px + 2px) * 2)

不幸的是,我们要寻找的正确的<h1>大小为bodyfont-size大小的两倍或者说是40px。他们是不同的 :(

这里有两种方式可以解决这个问题,因为我们知道错误的引起是由于<h1>继承了<html>font-size大小

第一种解决的方法是在<h1>中将112.5%设置为100%:

h1 { font-size: calc((100% + 0.25vw) * 2) }

第二种方法就是确保在元素之间不继承字体的大小。

h1 { font-size: calc((100% + 0.25vw) * 2) }p { font-size: calc((100% + 0.25vw)) }

这两种解决方式都看起来十分变态。因此我不断寻找更好的解决方法。

最终最好的方式就是恢复使用 rem 和 em。为什么要放弃发现的新单位呢?

html { font-size: calc(112.5% + 0.25vw) }h1 { font-size: 2em; }


既然我们谈到了字体缩放问题,你可能会产生另外一个问题:"使用视窗单位时,垂直规律和模块化会变得怎么样呢?"

好,让我们下面来谈谈他们。

视窗单位与垂直规律和模块化

这是比较容易回答的。

你有没有注意到视窗单位仅仅适用于设置<html>元素?其余一切还是使用remem来设置。

这意味着你仍然可以以同样的方式使用emrem单位去创建垂直规律和模块化,就像我之前在我所知道的响应式排版一文中所说的。

什么都没有改变!:)

Oh。在我们结束这篇文章之前还有一件事。

还有一个更大的我不得不克服的问题。就是我之前曾经提出的一个疑问:"在视窗大小为800px的情况下你如何计算vw使排版的单位大小为20px?"

这是一个很长的问题,化简为一个单词就是精度。换句话说,我怎样才可以更精确的使用我想要的字体大小呢?

精度

其实,Mike已经帮我解决了这个问题。现在我只需要解释一下这个公式的工作原理。

让我们说说你想要的结果...

  • 当视窗大小为600px时,font-size大小为18px

  • 当视窗大小为1000px时,font-size大小为22px

首先,我们不得不将font-size(18px)转化为百分比。第一部分的计算是这样子的:calc(18/16 * 100%)(或者简单的calc(112.5%))

接下来计算vw的数量。这部分的计算略微有点麻烦。

你可以通过考虑font-size(22-18)的差值来计算vw的值,除以视窗的宽度(1000-600),之后乘以100vw - smaller-viewport-width (100vw - 600px)。

组合在一起就是:

html {  font-size: calc(112.5% + 4 * (100vw - 600px) / 400) }

刚开始的时候这可能有点复杂,但是一旦你知道其中的组成,你就可以简化为Sass中的mixin。

Indrek Paas已经将上面公式转化为一个简单的Sass mixin。这里我很开心可以使用百分比而不是像素。

超级精度

这里,你如何实现在不同的断点,获取你想要的视窗单位,从而实现不同的缩放比率。

这里有一个解决方案;

html {font-size: 100%;// Scales by 1px for every 100px from 600px to 1000px  @media (min-width: 600px) {font-size: calc(112.5% + 4 * (100vw - 600px) / 400)}// Scales by 0.5px for every 100px from 1000px to 2000px  @media (min-width: 1000px) {font-size: calc(137.5% + 5 * (100vw - 1000px) / 1000)}
}

嘿,但是在现实中你不可能使用不同的比率进行缩放!这就意味着你会使用下面这个更加可为的方法:

html {font-size: 100%;  // Scales by 1px for every 100px from 600px onwards@media (min-width: 600px) {font-size: calc(112.5% + 4 * (100vw - 600px) / 400)}  // Sets font-size to 22px after a viewport of 1000px@media (min-width: 1000px) {font-size: calc(137.5%)}
}
本文根据 @Zell 的《 Viewport Unit Based Typography 》所译,整个译文带有我们自己的理解与思想,如果译得不好或有不对之处还请同行朋友指点。如需转载此译文,需注明英文出处: http://zellwk.com/blog/viewport-based-typography/

这篇关于基于视窗单位的排版的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1065509

相关文章

poj 1981 单位圆套最多点

题意: 给n(300)个点,用单位圆去套他们,问最多能套多少个点。 解析: 点击打开链接 直接当作单位圆套最多点的模板吧,用极脚来排序。 代码: #pragma comment(linker, "/STACK:1677721600")#include <map>#include <set>#include <cmath>#include <queue>

单位权中误差 详细介绍

单位权中误差(Unit Weight Error, UWE)是用于描述测量数据不确定性的一个统计量,特别是在地理信息系统(GIS)、导航和定位系统中。它主要用于评估和比较不同测量系统或算法的精度。以下是对单位权中误差的详细介绍: 1. 基本概念 单位权中误差(UWE): 定义:单位权中误差表示每个观测值(测量值)在估算中的标准误差。它是误差的一个统计量,主要用于评估测量系统的精度。单位:通常

[项目][CMP][直接向堆申请页为单位的大块内存]详细讲解

目录 1.系统调用 1.系统调用 Windows和Linux下如何直接向堆申请页为单位的大块内存: VirtualAllocbrk和mmap // 直接去堆上按页申请空间static inline void *SystemAlloc(size_t kpage){#ifdef _WIN32void *ptr = VirtualAlloc(0, kpage << 13,

搜狗浏览器打开CSDN博客排版错乱问题解决

之前发生过几次,不知道什么原因。 今天一直用着好好的,打开一个csdn连接,显示404,博文被删除了,于是就用百度快照打开试试,百度快照打开显示的排版很乱也没找到有用信息。 后面再浏览CSDN博客就排版错乱,显示一个大大二维码图片。 尝试删除IE缓存无效,使用谷歌浏览是好的。 基本锁定就是搜狗缓存导致的,于是找如何删除搜狗缓存   清除后恢复正常

HarmonyOS】ArkTS学习之基于TextTimer的简易计时器的elapsedTime最小时间单位问题

本文旨在纪录自己对TextTimer使用过程的疑惑问题 我在查看教程时候,发现很多博客在onTimer(event: (utc: number, elapsedTime: number) => void) 这里提到elapsedTime:计时器经过的时间,单位为毫秒。我不清楚是否为版本问题。 在我查看version11和version10的api时候,说的都是设置格式的最小单位。 经过个人检验的

【CSS】尺寸单位

在 CSS 中,常见的尺寸单位有以下几种: 像素(px): 这是最常用的绝对单位。例如 width: 200px; 表示宽度为 200 像素。像素是固定的尺寸,不会随着屏幕分辨率或设备的不同而变化。 备注: 在不同的设备上,px 对应的物理尺寸并不固定。 对于电脑显示器,px 通常与屏幕的物理像素相对应,但这也会受到屏幕分辨率和缩放设置的影响。例如,在标准分辨率(通常为 96 DPI 左右

存储单位,有更不伦不类的定义吗?

看到一本书中关于存储单位的定义: 存储单位是一种计量单位,指在某一领域以一个特定量或标准作为一个记录(计数)点,再以此点的某个倍数去定义另一个点,而这个点的代名词就是计数单位或存储单位。 甚至在百度百科中对“存储单位”的定义也是跟上面一模一样。百度百科中还给出了出处: 不知这出处是真是假?难道给大学生看的内容都要表述得这么高大上才行吗? 其实单位这个词咱从小学到大,可能让你解释你解释不

redis 实现单位时间内错误记录 时间到key值就被清除------最近脑子不好使觉得还是写个博客试试

直接在客户端操作的, 所以需要redis的简单命令  去对比JAVA客户端jedis的命令就行   添加---set     格式 set  key  value  EX time(秒)   如果这个time不添加的话 ,那默认就是 永久 获取--get    格式 get key  ---查看剩余时间    格式 TTL key ---实现key实现自增: inrc key

前端百科---Web聊天排版

当页面需要进行展示对话聊天信息时,好的布局会让人赏心悦目.下面直接看demo: <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title><style type="text/css">html, body, div, img, span {padding: 0;margin: 0

Newman生成测试报告排版混乱

问题:样式文件错误 解决方法:修改bootstrap样式文件的路径 <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.3.1/css/bootstrap.min.css">