惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Apple Machine Learning Research
Apple Machine Learning Research
Last Week in AI
Last Week in AI
Blog — PlanetScale
Blog — PlanetScale
V
Visual Studio Blog
月光博客
月光博客
博客园 - 三生石上(FineUI控件)
博客园 - Franky
IT之家
IT之家
博客园 - 叶小钗
Engineering at Meta
Engineering at Meta
The GitHub Blog
The GitHub Blog
雷峰网
雷峰网
腾讯CDC
博客园 - 聂微东
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
人人都是产品经理
人人都是产品经理
MongoDB | Blog
MongoDB | Blog
大猫的无限游戏
大猫的无限游戏
Martin Fowler
Martin Fowler
宝玉的分享
宝玉的分享
博客园_首页
G
Google Developers Blog

张鑫旭-鑫空间-鑫生活

1分钟速度了解text-align match-parent声明 « 张鑫旭-鑫空间-鑫生活 光标的形状也能设置了,就是CSS caret-shape属性 « 张鑫旭-鑫空间-鑫生活 pretext与文字四面环绕效果的实现 « 张鑫旭-鑫空间-鑫生活 JSON.rawJSON方法的作用是什么? « 张鑫旭-鑫空间-鑫生活 如何使用CSS判断鼠标从哪个方向进入元素? « 张鑫旭-鑫空间-鑫生活 借助mediabunny纯JS实现视频水印、剪裁、合成等功能 « 张鑫旭-鑫空间-鑫生活 务必谨慎使用JS WeakRef弱引用 « 张鑫旭-鑫空间-鑫生活 CSS六边形头像的实现与蜂巢布局 « 张鑫旭-鑫空间-鑫生活 CSS corner-shape与背景底纹技术 « 张鑫旭-鑫空间-鑫生活 浅学WebTransport API:下一代Web双向通信技术 « 张鑫旭-鑫空间-鑫生活 HTML dialog元素新支持了closedBy属性 « 张鑫旭-鑫空间-鑫生活 HTML interestfor属性与悬停popover交互效果 « 张鑫旭-鑫空间-鑫生活 CSS3模拟window7炫酷界面效果展示 « 张鑫旭-鑫空间-鑫生活 图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活 纯js无图片无外链CSS图片幻灯片播放插件 « 张鑫旭-鑫空间-鑫生活 CSS border三角、圆角图形生成技术简介 « 张鑫旭-鑫空间-鑫生活 CSS “渐进增强”在web制作中常见应用举例 « 张鑫旭-鑫空间-鑫生活 让IE6/IE7/IE8浏览器支持CSS3属性 « 张鑫旭-鑫空间-鑫生活 jQuery – 高亮动态显示页面HTML代码插件 « 张鑫旭-鑫空间-鑫生活 翻译 – 逐渐消失的Flash网站 « 张鑫旭-鑫空间-鑫生活 CSS reset的重新审视 – 避免样式重置 « 张鑫旭-鑫空间-鑫生活 新浪微博插入话题后部分文字选中的js实现 « 张鑫旭-鑫空间-鑫生活 JavaScript实现http地址自动检测并添加URL链接 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变背景(gradient)效果 « 张鑫旭-鑫空间-鑫生活 CSS content内容生成技术以及应用 « 张鑫旭-鑫空间-鑫生活 CSS gradient渐变之webkit核心浏览器下的使用 « 张鑫旭-鑫空间-鑫生活 CSS渐变之CSS3 gradient在Firefox3.6下的使用 « 张鑫旭-鑫空间-鑫生活 区分IE8/IE7/IE6及其他浏览器-CSS “\9″hack « 张鑫旭-鑫空间-鑫生活 CSS实现跨浏览器兼容性的盒阴影效果 « 张鑫旭-鑫空间-鑫生活 CSS3&HTML5各浏览器支持情况一览表 « 张鑫旭-鑫空间-鑫生活
这啥?CSS calc-size和interpolate-size,真学不动了 « 张鑫旭...
张鑫旭,zhangxinxu · 2024-11-14 · via 张鑫旭-鑫空间-鑫生活

by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=11424
本文可全文转载,独立域名个人网站无需授权,但需要保留原作者、出处以及文中链接,任何网站均可摘要聚合,商用请联系授权。

水果动画封面占位图

就算每周学习一个前端新特性,我发现我都来不及学习。

都没有时间钓鱼了,苦啊。

这不,又出了个啥calc-size()函数和interpolate-size属性。

没关系,我还学得动,快扶我起来。

扶我起来

一、非固定尺寸也能动画

calc-size()函数和interpolate-size属性的设计初衷是一致的,就是可以让width、height等尺寸相关的属性即使值是auto,也能有transition过渡动画效果。

最具代表性的就是height:auto的过渡动画实现。

例如:

<button onClick="this.classList.toggle('active');">点击我</button>
<p>
    <img src="html-book.jpeg" width="256" />
</p>
p {
    height: 0;
    transition: height .25s;
    overflow: hidden;
}
.active + p {
    height: auto;
    height: calc-size(auto, size);
}

此时,在Chrome 129及其以上版本浏览器下,点击按钮,就可以看到图片以切片动画的形式呈现了,如下GIF动图所示:

height:auto动画

眼见为实,您可以狠狠地点击这里:CSS calc-size()实现height:auto动画demo

补充于2026年2月27日

calc-size()还有个衍生作用,可以让clamp()函数支持auto等关键字。

是这样的。

如果我们直接在clamp()函数中使用auto是不合法的。

.box {
  /* 以下代码无效 */
  width: clamp(200px, auto, 400px);
}

但是使用calc-size()函数,我们就可以李代桃僵。

.box {
  /* 以下代码有效 */
  width: calc-size(auto,clamp(200px, size, 400px));
  /* 等同于 clamp(200px, auto, 400px) */
}

其他一些使用示意:

.box {
  width: calc-size(max-content, clamp(size, 70%, 600px)); 
  /* 等同于 clamp(max-content, 70%, 600px) */
  width: calc-size(max-content, clamp(300px, 80%, 2 * size)); 
  /* 等同于 clamp(300px, 80%, 2 * max-content) */
  width: calc-size(min-content, clamp(size + 50px, 100% - 40px, 700px));
  /* 等同于 clamp(min-content + 50px, 100% - 40px, 700px) */
  width: calc-size(max-content, clamp(size, 80%, 2 * size))
  /* 等同于 clamp(max-content, 80%, 2 * max-content) */
}

二、interpolate-size用法更简单

其实,要让height:auto支持transition过渡动画,还有个更简单的方法,就是在祖先容器上设置:

interpolate-size: allow-keywords;

interpolate是插入,篡改的意思,连起来表示尺寸插值变化允许关键字。

例如,我们狠一点,直接在根元素上是设置:

:root {
  interpolate-size: allow-keywords;
}

那么,页面上,所有的元素都能触发height:auto的过渡动画效果,无需专门的calc-size()设置。

换句话说,calc-size()函数是专门单独设置,而interpolate-size是全局批量设置。

元素设置了calc-size()值,浏览器会自动设置其interpolate-size属性的计算值是allow-keywords

interpolate-size语法

语法示意:

interpolate-size: allow-keywords;
interpolate-size: numeric-only;

其中,值numeric-only就是默认的差值计算规则,表示仅数值类型的属性值才运行差值计算。

来看一个使用案例,这次我们使用宽度示意,相关的HTML和CSS代码如下:

<button onClick="this.classList.toggle('active');">点击我</button>
<figure>
    <img src="html-book.jpeg" width="256" />
</figure>
figure {
    width: 320px;
    padding: 1em;
    transition: width .25s;
    interpolate-size: allow-keywords;
    background: deepskyblue;
}
.active + figure {
    width: fit-content;
}

效果参见如下GIF录屏:

宽度fit-content过渡动画

眼见为实,您可以狠狠地点击这里:CSS interpolate-size实现width:fit-content动画demo

三、calc-size的语法

calc-size()函数支持的能力还挺丰富的,使用参考:

/* 单值设置 */
calc-size(auto, size)
calc-size(fit-content, size)

/* 执行计算 */
calc-size(min-content, size + 100px)
calc-size(max-content, size - 80em)
calc-size(fit-content, size / 2)

/* 函数计算 */
calc-size(auto, round(up, size, 50px))

关键字size表示函数第一个关键字值对应的计算尺寸,如果是图片,则表示图片的原始尺寸。

例如,希望点击图片缩略图,图片以动画形式放大到原始尺寸的1/2,那么就不需要JavaScript代码参与了,使用示意:

<img 
  src="1.jpg" 
  onClick="this.classList.toggle('active');" 
/>
img {
    transition: .3s;
    width: 128px;
}
img.active {
    width: calc-size(fit-content, size / 2);
}

MP4录屏效果参见(不动点击播放):

眼见为实,您可以狠狠地点击这里:CSS calc-size()实现图片原始尺寸放大demo

另外,这里出现的round()函数还是挺实用的,参见不久前我撰写的这篇文章:“时隔两年,Chrome也支持round等CSS数学函数了

四、并非适用所有CSS属性

需要注意的是,无论是calc-size()函数还是interpolate-size属性,都只适用于与尺寸相关的些CSS属性。

举个例子,一个block水平元素,默认margin:0,然后设置margin:auto让其居中,希望有动画,那么下面的用法是无效的:

.element {
    margin: calc-size(auto, size);
}

控制台显示不合法,如下截图所示:

margin使用calc-size属性无效

五、温故知新display:none动画

之前transition动画的两个痛点,一个是height:auto,另外一个就是display:none

display:none其实也有专门的新特性解决此痛点,是CSS transition-behavior属性和@starting-style规则。

感兴趣的可以访问这篇文章:“CSS transition-behavior让display none也有动画效果

之前height:auto动画实现

一种是使用足够大的max-height值,这个是最老的方法了。

后来是使用Grid布局中的fr单位特性实现,原理就是0fr→1fr,案例示意:

<button onClick="this.classList.toggle('active');">点击我</button>
<figure>
    <img src="html-book.jpeg" width="256" />
</figure>
figure {
    display: grid;
    grid-template-rows: 0fr;
    transition: .25s;
    overflow: hidden;
}
figure img {
    min-height: 0;
}
.active + figure {
    grid-template-rows: 1fr;
}

GIF效果截图:

height:auto动画

眼见为实,您可以狠狠地点击这里:CSS Grid fr单位实现height:auto动画demo

六、兼容性及碎碎念

calc-size()函数和interpolate-size属性都是从Chrome 129版本开始支持的:

calc-size兼容性截图

不过并不影响我们的使用,毕竟是渐进增强特性。

一看时间,还早,再扯点其他东西吧。

文字版博客现在看得人越来越少了,HTML新书出版之后,算是有了点先功夫,就弄了个抖音账号,名叫“张鑫旭本人”,唉,老人家,后知后觉,没有提前把名称占好位置。

张鑫旭本人

目前每周更新2~3个视频的节奏,全是与前端开发相关的,偶然也会讲下人文,八卦相关的东西。

欢迎关注哈!

另外,用了6年的云数据库到期了,不续了,6年前前端大热,网站流量巅峰,不堪重负,于是将数据库独立出去了,1年千把块钱。

现在的访问量也就巅峰时候的1/10,我一看数据库的资源占用,奶奶个熊,CPU只用了1%~2%,严重浪费。

所以,趁这次到期,又和之前一样,直接在云服务器上使用本地数据库,好家伙,这页面加载速度,明显快多了,秒开,云服务器压力也不大,省钱了,开心。

好,就这么多吧,感谢阅读,欢迎,圣女为你点赞。

圣女

本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址:https://www.zhangxinxu.com/wordpress/?p=11424

(本篇完)