CSS魔法!如何将任意CSS类型转换为数值?

在 CSS 中有各式各样的类型值,例如 1rem、10vw、100cqw等等,这些相对值给与了 CSS 强大的适应能力。但有时候,我们还需要知道这些相对值所对应的真实值,也就是px值,比如在移动端,我们经常会设置这样的根字号:

:root{font-size: max(12px, min( 12px + (100vw - 320px) / 55 * 4, 20px ));
}
p{font-size: 2rem;
}

那么,p此时的真实px值应该是多少呢?

在以往,我们只能通过 JS去获取,但是现在,仅仅凭 CSS也能做到,一起了解一下吧!

一、CSS 三角函数

从理论上来讲,将一个长度除以1px就应该得到具体的数值,相当于将这个长度以1px被分成了多少份。

2rem / 1px

但是,大家可能都知道,calc在进行除法运算时,除数是不能带单位的。

calc(2rem / 1px) /*不合法*/

不排除浏览器以后会支持。

不过现在终于迎来了转机,在 Chrome 111中,CSS 新增了一系列三角函数。

  • sin()[1]:正弦
  • cos()[2]:余弦
  • tan()[3]:正切
  • asin()[4]:反正弦
  • acos()[5]:反余弦
  • atan()[6]:反正切
  • atan2()[7]:反正切

这里我们不聊三角函数的作用,只是作为一个桥梁中转一下。

关于「正切函数」,这里简单回顾一下高中数学

在「直角三角形」中,其中一个锐角的「对边」和「临边」的比值就是这个角的「正切值」,「反正切」就是通过两条直角边反向去求出该角的「弧度值」,示意如下:

这些函数本身没什么特别的,业界通用,但有一个非常例外,那就是atan2,它和atan作用是一样的,都是反正切函数。唯一的区别是,atan2支持两个值

前端中的 atan 就是数学中的 arctan。

atan2(y, x)

例如:

transform: rotate(atan2(3, 2));
/*等同于*/
transform: rotate(atan(1.5));

看似好像没啥意义,直接用tan不就好了?

transform: rotate(atan2(3/2));

和JS不同的是,CSS 中还能「支持单位」,如下:

transform: rotate(atan2(1rem, 20px));
/*等同于?*/

这就不得了了,如果此时的1rem是16px,那么浏览器会根据1rem的真实长度和20px做对比,相当于让两个带单位的长度做除法运算。

也就是说,y/x的值可以得到两个CSS长度之间的真实比值,而无需额外转换。

然后,通过正切函数tan将括号里面的值解析出来。

tan(atan2(1rem, 20px)) /*.8*/

这一点其实在 JS 中也可以验证一下,只是 CSS 可以带单位的值。

如果将后面的值设置为1px,就相当于把任意长度按照1px进行切分,也就得到了任意长度的px数值,如下:

tan(atan2(1rem, 1px)) /*16*/

有了这个不带单位的绝对值,我们就可以做很多事情了,下面举几个例子。

二、CSS 获取当前字号

回到文章开头的问题,如何通过 CSS 获取当前字号呢?

根据上一节的原理,只要通过tan() 和 atan2()就可以将任意长度转换为数值了。

:root{font-size: max(12px, min( 12px + (100vw - 320px) / 55 * 4, 20px ));
}
body{--px-font: tan(atan2(1rem, 1px));
}

这样--px-font就得到了真实的px数值。

然后,我们还可以借助 CSS计数器,将这个数字渲染到页面。

body::after{counter-reset: font var(--px-font);content: "当前根字号:" counter(font);
}

结果...效果如下:

好像不太对?貌似是浏览器的 bug,这种情况下忽略了tan(atan2(1rem, 1px))中的1rem单位。

要修复这个问题其实很容易,需要通过@property定义一个CSS变量,类型为长度,然后将需要计算的值赋给这个变量,如下:

@property --font {syntax: "<length>";initial-value: 1px;inherits: false;
}
:root{font-size: max(12px, min( 12px + (100vw - 320px) / 55 * 4, 20px ));
}
body::after{--font: 1rem; /*定义好的CSS变量*/--px-font: tan(atan2(var(--font), 1px));counter-reset: font var(--px-font);content: "当前根字号:" counter(font);
}

这样就正常了,在改变屏幕尺寸时会自动渲染出当前字号。

你也可以访问在线链接

  • CSS font-size (juejin.cn)[8]
  • CSS font-size (codepen.io)[9]

三、实时显示容器尺寸

CSS容器查询中出现了几个新的尺寸单位。这里只介绍下面两种。

关于容器查询,可以参考这篇文章:介绍2022最期待且已正式支持的CSS container容器查询 « 张鑫旭-鑫空间-鑫生活 (zhangxinxu.com),本文并不涉及具体容器查询语句。

  • 「cqw」 容器查询宽度(Container Query Width)占比。「1cqw等于容器宽度的1%」。假设容器宽度是1000px,则此时1cqw对应的计算值就是10px。
  • 「cqh」 容器查询高度(Container Query Height)占比。「1cqh等于容器高度的1%」。

利用前面的技巧,可以将cqw、cqh这些单位转换为具体的px值。

假设有这样一个容器。

.box{display: grid;place-content: center;width: 200px;height: 200px;background-color: #fff;
}

为了使容器尺寸生效,必须声明容器类型。

.box{/**/container-type: size;
}

然后用同样的技巧,在伪元素中通过计数器将宽高渲染出来。

.box::before{--w: 100cqw;--h: 100cqh;--px-width: tan(atan2(var(--w), 1px));--px-height: tan(atan2(var(--h), 1px));counter-reset: w var(--px-width) h var(--px-height);content: counter(w) " x " counter(h);
}

别忘了修复 bug。

@property --w {syntax: "<length>";initial-value: 100px;inherits: false;
}
@property --h {syntax: "<length>";initial-value: 100px;inherits: false;
}

效果如下,完全没有任何 JS。

你也可以访问在线链接

  • CSS resize (juejin.cn)[10]
  • CSS resize (codepen.io)[11]

四、自适应文本的头像

下面看一个自适应文本的头像,当文本较多时,会自动缩放,让文本可以完整展示,如下

原理其实是通过容器尺寸的映射关系来动态设置文本大小,关键实现如下:

.avator-container span {font-size: calc( 24px - 10cqw );
}

但是,通过文字大小来缩放有一个限制,在PC上,一般会有最小字号限制(通常是12号),所以更好的方式应该是通过scale来实现。

现在,我们可以通过上面的技巧,将容器尺寸转换成scale能够识别的数值,通过文本宽度和容器尺寸的比值来确实缩放比例,关键实现如下:

.avator-container span {--w: 100cqw;--scale: tan(atan2(30px, var(--w)));transform: scale(var(--scale));
}

这样就得到了完全自适应尺寸的文本头像了。

完整代码可以访问在线链接

  • CSS auto text avator (juejin.cn)[12]
  • CSS avator auto scale (codepen.io)[13]

五、总结一下

以上就是本文的全部内容了,介绍了一个非常巧妙并且有用的 CSS 小技巧,下面总结一下

  • CSS 有很多类型的尺寸,这些尺寸给与了 CSS 强大的适应能力。
  • 从理论上讲,将一个长度除以 1px 就可以得到具体的数值,但是calc不支持。
  • CSS 反正切函数 atan2(y,x) 支持两个参数,并且还支持带CSS单位。
  • 通过 tan(atan2(y,x))可以得到y/x的比值,如果x是1px,可以得到y的实际px值。
  • 利用这个技巧,可以将任意类型值转换为数值。
  • 纯数值可以在各个地方都可以使用了,比如scale(var(--n)),如果需要 px,直接calc(var(--n) * 1px )。

参考资料:

[1]sin(): https://developer.mozilla.org/zh-CN/docs/Web/CSS/sin。

[2]cos(): https://developer.mozilla.org/zh-CN/docs/Web/CSS/cos。

[3]tan(): https://developer.mozilla.org/zh-CN/docs/Web/CSS/tan。

[4]asin(): https://developer.mozilla.org/zh-CN/docs/Web/CSS/asin。

[5]acos(): https://developer.mozilla.org/zh-CN/docs/Web/CSS/acos。

[6]atan(): https://developer.mozilla.org/zh-CN/docs/Web/CSS/atan。

[7]atan2(): https://developer.mozilla.org/zh-CN/docs/Web/CSS/atan2。

[8]CSS font-size (juejin.cn): https://code.juejin.cn/pen/7289041195483791416。

[9]CSS font-size (codepen.io): https://codepen.io/xboxyan/pen/XWoObZX。

[10]CSS resize (juejin.cn): https://code.juejin.cn/pen/7289046442864279591。

[11]CSS resize (codepen.io): https://codepen.io/xboxyan/pen/MWZLYZz。

[12]CSS auto text avator (juejin.cn): https://code.juejin.cn/pen/7289095309752270906。

[13]CSS avator auto scale (codepen.io): https://codepen.io/xboxyan/pen/qBLLexW。

来源:前端侦探

最后,推荐一款应用开发神器

扯个嗓子!关于目前低代码在技术领域很活跃!

低代码是什么?一组数字技术工具平台,能基于图形化拖拽、参数化配置等更为高效的方式,实现快速构建、数据编排、连接生态、中台服务等。通过少量代码或不用代码实现数字化转型中的场景应用创新。它能缓解甚至解决庞大的市场需求与传统的开发生产力引发的供需关系矛盾问题,是数字化转型过程中降本增效趋势下的产物。

这边介绍一款好用的低代码平台——JNPF快速开发平台。近年在市场表现和产品竞争力方面表现较为突出,采的是最新主流前后分离框架(SpringBoot+Mybatis-plus+Ant-Design+Vue3。代码生成器依赖性低,灵活的扩展能力,可灵活实现二次开发。

以JNPF为代表的企业级低代码平台为了支撑更高技术要求的应用开发,从数据库建模、Web API构建到页面设计,与传统软件开发几乎没有差异,只是通过低代码可视化模式,减少了构建“增删改查”功能的重复劳动,还没有了解过低代码的伙伴可以尝试了解一下。

应用:https://www.jnpfsoft.com/?csdn

有了它,开发人员在开发过程中就可以轻松上手,充分利用传统开发模式下积累的经验。所以低代码平台对于程序员来说,有着很大帮助。

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

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

相关文章

简单了解一下:Node全局对象和事件监听和触发

Node的全局对象&#xff0c;就是整个应用都能引用的对象。Node本身内置了多个全局变量、全局对象和全局函数。 全局变量有两个&#xff1a;__filename和__dirname&#xff0c; __filename&#xff1a;表示当前正在执行的脚本文件名&#xff1b; __dirname&#xff1a;当前脚本…

【公益案例展】广碳所——恒生电子基于区块链技术打造区域性碳中和登记系统...

‍ 恒生电子公益案例 本项目案例由恒生电子投递并参与数据猿与上海大数据联盟联合推出的 #榜样的力量# 《2023中国数据智能产业最具社会责任感企业》榜单/奖项”评选。 ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 全球气候变暖、温室效应明显、二氧化碳排放增多&#…

CSS之Flex布局的详细解析

Flex布局 目标&#xff1a;熟练使用 Flex 完成结构化布局 01-标准流 标准流也叫文档流&#xff0c;指的是标签在页面中默认的排布规则&#xff0c;例如&#xff1a;块元素独占一行&#xff0c;行内元素可以一行显示多个。 02-浮动 基本使用 作用&#xff1a;让块元素水平排列…

Excel提高工作效率常用功能

定位快捷键使用 CtrlG或者F5 根据不同类别插入空行 例&#xff1a;以下表&#xff0c;以部门为单位&#xff0c;每个部门后插入空白行 部门姓名出勤基本工资岗位津贴公体加班绩效基数工龄应发合计财务部姓名73115002101710财务部姓名11116006003401502363财务部姓名5271000…

新年学新语言Go之四

一、前言 任何编程语言都有类型系统&#xff0c;类型系统解决了数据的存取问题&#xff0c;它决定了使用这个类型需要开辟内存空间大小以及数据是如何存放的&#xff0c;也解决如何读出数据&#xff0c;因为在内存中相同二进制值不同类型的含义是不一样的&#xff0c;关于Go基…

微信小程序仿苹果负一屏由弱到强的高斯模糊

进入下面小程序可以体验效果&#xff0c;然后进入更多。查看模糊效果 一、创建小程序组件 二、代码 wxml: <view class"topBar-15"></view> <view class"topBar-14"></view> <view class"topBar-13"></view&…

【C++】C++的类型转换

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C学习 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【C】C智…

微信小程序的OA会议之首页搭建

目录 一.小程序的布局 1.1. flex是什么 1.2. flex布局 1.3.总体布局 二.轮播图 2.1. 组件 2.2. 数据请求 2.3. 页面 三.首页 2.1. 视图 2.2.数据 2.3. 样式 好啦今天就到这里了&#xff0c;希望能帮到你哦&#xff01;&#xff01;&#xff01; 一.小程序的布局 …

基于 Debian 稳定分支发行版的Zephix 7 发布

导读Zephix 是一个基于 Debian 稳定版的实时 Linux 操作系统。它可以完全从可移动媒介上运行&#xff0c;而不触及用户系统磁盘上存储的任何文件。 Zephix 是一个基于 Debian 稳定版的实时 Linux 操作系统。它可以完全从可移动媒介上运行&#xff0c;而不触及用户系统磁盘上存…

PHP-FFMpeg 操作音视频

✨ 目录 &#x1f388; 安装PHP-FFMpeg&#x1f388; 视频中提取一张图片&#x1f388; 视频中提取多张图片&#x1f388; 调整视频大小&#x1f388; 视频添加水印&#x1f388; 生成音频波形&#x1f388; 音频转换&#x1f388; 给音频添加元数据&#x1f388; 拼接多个音视…

微前端四:qiankun在开发中遇到的问题

在qiankun开发中会遇到很多问题&#xff0c;上一篇微前端三&#xff1a;qiankun 协作开发和上线部署其实也是在解决一些经常遇到的问题&#xff0c;下面的两点也算是比较经典的了 1、子应用图片路径问题 2、基座是Vue2.0 element ui 配合 子应用 Vue3.0 element plus 导致的样…

Linux-git

文章目录 git简介git常用命令配置初始化仓库将文件添加到暂存区将暂存区文件加入版本库对比工作区某文件和暂存区中的区别将暂存区的文件移除但git仍管理将文件移除暂存区并且git不再管理查看版本库切换到之前的版本恢复文件持久化 云端将本地的项目推送到远程仓库将远程仓库的…

weapp-tailwindcss for uni-app 样式条件编译语法插件

weapp-tailwindcss for uni-app 样式条件编译语法插件 版本需求 2.10.0 weapp-tailwindcss for uni-app 样式条件编译语法插件 这是什么玩意?如何使用 tailwind.config.js 注册postcss 插件注册 uni-app vite vue3uni-app vue2 配置完成 配置项 这是什么玩意? 在 uni-app …

[1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

测评介绍 本期测评试用一下1Panel这款面板。1Panel是国内飞致云旗下开源产品。整个界面简洁清爽&#xff0c;后端使用GO开发&#xff0c;前端使用VUE的Element-Plus作为UI框架&#xff0c;整个面板的管理都是基于docker的&#xff0c;想法很先进。官方还提供了视频的使用教程&…

vue使用pdf-dist实现pdf预览以及水印

vue使用pdf-dist实现pdf预览以及水印 一.使用pdf-dist插件将PDF文件转换为一张张canvas图片 npm install pdf-dist二.页面引入插件 const pdfJS require("pdfjs-dist"); pdfJS.GlobalWorkerOptions.workerSrc require("pdfjs-dist/build/pdf.worker.entry&…

ubuntu18.04 LTS卸载qtcreator-10.0.2

之前通过命令&#xff0c;通过.run文件&#xff0c;安装了Qt Creator 默认安装路径是/opt/ 卸载 在安装路径下&#xff0c;可以看到QtCreatorUninstaller文件 命令行运行该执行文件&#xff0c;会弹出卸载窗口&#xff0c;记得勾选下面的“仅卸载”

el-upload实现上传文件夹

背景&#xff1a;如图一所示&#xff0c;最下面有一个黄色上传文件按钮&#xff0c;为手动上传而且上传区域有上传文件和上传文件夹的区分 所以需要在点击了上传文件夹做特殊处理使得el-upload可以上传文件夹 一、template区域 <el-uploadclass"upload-file"dra…

小程序:uniapp解决主包体积过大的问题

已经分包但还是体积过大 运行时勾选“运行时是否压缩代码”进行压缩 在manifest.json配置&#xff08;开启分包优化&#xff09; "mp-weixin" : {"optimization" : {"subPackages" : true}//.... },在app.json配置&#xff08;设置组件按需注入…

客户端post请求,服务器收到{}数据解决方法

当我们发起登录请求时&#xff0c;后台接收到的为{}数据 原因&#xff1a;传送过去的对象格式不对 解决方案&#xff1a; 引入qs npm install qs 在data中格式化数据 const res await axios({url:http://127.0.0.1:3000/post,method:post,data:Qs.stringify({username:te…

华为智选SF5,AITO问界的车怎么样

#华为智选 #赛力斯SF5 #aito问界m5 #aito问界m7 #华为汽车 华为的车&#xff0c;后杠焊两点&#xff0c;拉车的时候&#xff0c;拖车钩断了&#xff0c;后杠拉出来了&#xff0c;这质量可以吗&#xff1f;是否应该全部召回&#xff1f;M5&#xff0c;M7是不是也这样&#xff1f…