Loading [MathJax]/jax/element/mml/optable/GreekAndCoptic.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >震惊!CSS 竟然能获取视口尺寸?

震惊!CSS 竟然能获取视口尺寸?

作者头像
Cell
发布于 2024-12-07 04:17:01
发布于 2024-12-07 04:17:01
2170
举报
文章被收录于专栏:Cell的前端专栏Cell的前端专栏

在这篇文章中,我们将探讨如何使用 CSS 获取视口尺寸,并展示一个简单的实现示例。

1 效果

调整浏览器窗口大小,你会发现视口的宽度和高度会实时更新(旧浏览器可能不支持)。

重要的是,这个效果是纯 CSS 实现的,不需要 JavaScript,真的震惊了!

2 实现原理

  1. 定义 CSS 自定义属性(@property--vw--vh,分别表示视口的宽度和高度。
  2. 使用 tan()atan2() 函数计算视口的宽度和高度。
  3. 使用 countercounter-reset 属性将计算结果显示在页面上。

2.1 计算视口尺寸

我们可以使用 vw 和 vh 获取浏览器视口尺寸,但是这是相对单位,所以需要转换为 px 才行。我们先利用自定义属性把相对单位转成 px,然后最关键的一步是巧妙地利用了三角函数 来实现这个转换。

2.2 三角函数

在三角函数中, 表示一个角度 的正切值,它等于对边(opposite)与邻边(adjacent)的比值。反过来, 表示一个数值 的反正切值,它返回一个角度 ,使得 ,因此得到公式:

CSS 中的 tan()atan2() 函数可以用来计算正切值和反正切值。

tan() 函数的语法如下:

1 2 3 4 5 6 7 8 9 10 11 12

/* 单个 <angle> 值 */ width: calc(100px * tan(45deg)); width: calc(100px * tan(0.125turn)); width: calc(100px * tan(0.785398163rad)); /* 单个 <number> 值 */ width: calc(100px * tan(0.5773502)); width: calc(100px * tan(1.732 – 1)); /* 其他值 */ width: calc(100px * tan(pi / 3)); width: calc(100px * tan(e));

atan2() 函数接受两个参数,对于所给两值 xy,函数 atan2(y, x) 计算并返回正半横轴与从原点到点 (x, y) 的射线的夹角。函数的语法如下:

1 2 3 4 5 6 7 8 9 10 11 12

/* 两个 <number> 值 */ transform: rotate(atan2(3, 2)); /* 两个 <dimension> 值 */ transform: rotate(atan2(1rem, -0.5rem)); /* 两个 <percentage> 值 */ transform: rotate(atan2(20%, -30%)); /* 其他值 */ transform: rotate(atan2(pi, 45)); transform: rotate(atan2(e, 30));

3 代码示例

以下是完整的 HTML 和 CSS 代码,你也可以在我的 html-demo 中查看。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>CSS Viewport Size</title> <style> /* 自定义属性是为了把 vw 和 vh 转成 px */ @property --vw { syntax: '<length>'; inherits: true; initial-value: 100vw; } @property --vh { syntax: '<length>'; inherits: true; initial-value: 100vh; } /* 核心公式: tan(θ) = opposite / adjacent θ = arctan(opposite / adjacent) tan(arctan(a)) = a */ :root { --width: tan(atan2(var(--vw), 1px)); --height: tan(atan2(var(--vh), 1px)); } body::before { content: counter(width) ' X ' counter(height); counter-reset: width var(--width) height var(--height); display: block; font-size: 150px; font-weight: 900; position: fixed; width: fit-content; height: fit-content; inset: 0; margin: auto; } </style> </head> <body> </body> </html>

4 兼容性

主要是 countercounter-reset 属性的兼容性问题,看漫山红遍,层林尽染。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-062,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
现代 CSS 解决方案:CSS 原生支持的三角函数
在 CSS 中,存在许多数学函数,这些函数能够通过简单的计算操作来生成某些属性值,例如
Sb_Coco
2023/05/27
4690
现代 CSS 解决方案:CSS 原生支持的三角函数
现代 CSS 解决方案:数学函数 Round
在 CSS 中,存在许多数学函数,这些函数能够通过简单的计算操作来生成某些属性值,例如在现代 CSS 解决方案:CSS 数学函数一文中,我们详细介绍了
Sb_Coco
2023/09/06
4090
现代 CSS 解决方案:数学函数 Round
css3中的函数,你曾用几个?
css3在切图中占有半壁江山的位置,所谓人靠衣装,马靠鞍,一个网站好不好看除了设计本身,合理的布局以及完美css布局会让视觉更上一层楼
Maic
2023/09/11
2260
css3中的函数,你曾用几个?
现代 CSS 解决方案:CSS 数学函数
本文,将具体介绍其中的 CSS 数学函数(Math functions)中,已经被浏览器大规模支持的 4 个:
Sb_Coco
2022/05/12
1.2K0
现代 CSS 解决方案:CSS 数学函数
震惊!CSS 也能实现碰撞检测?
我们只实现了,小球与边界之间的碰撞反应。不过这里,也并非碰撞检测,我们只需要设置好单个方向的运动动画,并且设置 animation-direction: alternate; 即可!
Sb_Coco
2023/08/25
3200
震惊!CSS 也能实现碰撞检测?
CSS 中calc()的完整指南(一)
CSS tricks上有一系列的完整指南文章,我后面会翻译这些内容,更新不会一下子完成,而是会分成几个,防止自己因看到文章过长而放弃翻译。
前端开发博客
2020/11/04
6900
解决CSS垂直居中的几种方法(基于绝对定位,基于视口单位,Flexbox方法)
      在CSS中对元素进行水平居中是非常简单的:如果它是一个行内元素,就对它的父元素应用 text-align: center ;如果它是一个块级元素,就对它自身应用 margin: auto。然而如果要对一个元素进行垂直居中,可能光是想想就令人头皮发麻了。   多年以来,垂直居中已经成为了CSS领域的圣杯,它同样也是前端开发圈内广为流传的笑话。原因在于它同时具备以下几条特征:               1)它是极其常见的需求。               2)从理论上来看,它似乎极其简单。    
李文杨
2018/03/27
1.8K0
解决CSS垂直居中的几种方法(基于绝对定位,基于视口单位,Flexbox方法)
现代 CSS 指南 -- at-rule 规则扫盲
这里表示的是与屏幕宽度相关的样式设置,上面的代码表示当屏幕宽度大于 900px 时,内部的样式代码块才能生效。
Sb_Coco
2022/11/14
1.2K0
现代 CSS 指南 -- at-rule 规则扫盲
25个每个开发人员都应该知道的CSS 技巧
CSS(层叠样式表)是 Web 开发人员必不可少的工具,可让你精确地设置 HTML 元素的样式。但是,掌握 CSS 不仅仅需要了解基础知识。以下 25 个 CSS 技巧可以让您的生活更轻松,代码更简洁。
winty
2024/06/13
2040
25个每个开发人员都应该知道的CSS 技巧
CSS Functions && CSS Variables
calc()用于对数值作计算,单位包括长宽(px、vw等)、频率(Hz等)、角度(deg、rad、turn等)、时间(s、ms)、小数和整数。
gojam
2019/05/14
1.1K0
CSS Viewport 单位,很多人还不知道使用它来快速布局!
CSS Viewport units(视口单位)在过去几年已经出现了,随着时间的推移,越来越多的开发人员开始使用它们。它们的好处在于为我们提供了一种不需要使用J avaScript 就能以动态的方式调整大小的方法。而且,如果它失效,也有很多备用方案。
前端小智@大迁世界
2020/07/03
3.3K0
CSS Viewport 单位,很多人还不知道使用它来快速布局!
Amazing!巧用 CSS 视差实现酷炫交互动效
本文将介绍利用 CSS 实现滚动视差效果的一个小技巧,并且,利用这个技巧来制作一些有意思的交互特效。
Sb_Coco
2022/04/28
8280
Amazing!巧用 CSS 视差实现酷炫交互动效
CSS3新特性应用之结构与布局
一、自适应内部元素 利用width的新特性min-content实现 width新特性值介绍: fill-available,自动填充盒子模型中剩余的宽度,包含margin、padding、border尺寸,他让非block元素也可实现宽度100%; max-content:假设容器有足够的宽度,足够的空间,此时,所占据的宽度就是max-content,与display为inline不一样,max-content就像white-space:nowrap一样,不会换行的。 min-content:采用内部
sam dragon
2018/01/17
1.6K0
如何提升CSS技术?8个硬核技巧带你迅速提升CSS技术
整个分享过程不搞那些乱七八糟的环境搭建。既然只玩CSS,那只有html文件和css文件就足够了。另外还需一个浏览器Chrome和一个编辑器VSCode。
睡魔的谎言
2020/12/22
2.3K0
8个硬核技巧带你迅速提升CSS技术
笔者选择了一些常用甚至有些小册都未提及到的干货作为分享内容,相信这些内容能帮助同学们在短期内提升CSS编码素质,实现一些看似只能由JS才能实现的效果。
javascript艺术
2021/05/28
2.8K0
8个硬核技巧带你迅速提升CSS技术
相对于视口的CSS自适应单位vw和vh
而在移动端,它涉及3个视口:Layout Viewport(布局视口),Visual Viewport(视觉视口),Ideal Viewport(理想视口)。
Jean
2021/10/18
1.6K0
相对于视口的CSS自适应单位vw和vh
IT课程 CSS基础 021_值类型、单位、大小、颜色
在CSS中,长度单位用于表示尺寸和距离,可以应用于各种属性,如宽度、高度、边距、填充等。
zhaoJian.Net
2024/04/03
1200
css变量制作心动的果冻效果(css变量)
CSS自定义属性也被称为CSS变量。变量就是拥有合法标识符和合法的值,可以被使用在任意的地方。通过var()函数使用变量。
微芒不朽
2022/04/28
1.5K0
巧用 CSS 实现炫彩三角边框动画
最近有个小伙伴问我,在某个网站看到一个使用 SVG 实现的炫彩三角边框动画,问能否使用 CSS 实现:
Sb_Coco
2022/03/10
1.1K0
巧用 CSS 实现炫彩三角边框动画
【CSS】378- [译]44个 CSS 精选知识点
一个周五的晚上,闲来无事整理下自己的 github(经常做收藏党),今天打算都过一遍,发现一个 star很高的项目,里面有大量的 CSS 片段,而且标题很诱人,然后又花了将近1个小时从头到尾过了一遍,其中一些是我们常用的一些知识点,另外也包含一些比较新的属性的应用,知识点挺多的,为了让大家看起来更方便些,然后又花了点(很长很长)时间翻译成中文。
pingan8787
2019/10/15
5.5K0
【CSS】378- [译]44个 CSS 精选知识点
推荐阅读
相关推荐
现代 CSS 解决方案:CSS 原生支持的三角函数
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文