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

推荐订阅源

雷峰网
雷峰网
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
宝玉的分享
宝玉的分享
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
T
Tailwind CSS Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
博客园_首页
博客园 - 三生石上(FineUI控件)
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
量子位
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
人人都是产品经理
人人都是产品经理
美团技术团队
小众软件
小众软件
Jina AI
Jina AI
S
SegmentFault 最新的问题
博客园 - Franky
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com

张鑫旭-鑫空间-鑫生活

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 transition-behavior让display none也有动画效果 « 张鑫...
张鑫旭,zhangxinxu · 2024-06-30 · via 张鑫旭-鑫空间-鑫生活

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

水果西瓜封面占位图

一、现状描述

有一个元素设置了display:none隐藏,然后使用JS让其实现的时候,希望同时有透明度变化的动画效果,使用transition属性是无效的。

如下代码示意:

<div id="element" class="element">占位内容</div>
.element {
  display: none;
  opacity: 0;
  transition: .2s;
}
.element.active {
  display: block;
  opacity: 1;
}
// 让元素显示
element.classList.add('active');

此时元素是突然显示,而不是有透明度动画。

在之前,有两种方法:

  1. 元素先显示,透明度保持0,然后在下一个渲染绘制执行设置透明度为1.
  2. 使用CSS animation动画,代码参见:
    .element.active {
      display: block;
      animation: fadeIn .2s both;
    }
    @keyframes {
      from { opacity: 0; }
      to { opacity: 1; }
    }

不过上面两种方法都比较麻烦,不如直接一个transition属性来的方便。

那有没有什么办法让元素从display:none到display:block变化的时候,也有动画效果呢?

可以,最近各个现代浏览器支持了一个新的 CSS 属性名为transition-behavior,可以实现这样的需求。

二、transition-behavior属性的语法和作用

语法如下:

transition-behavior: allow-discrete;
transition-behavior: normal;

其中:

  • allow-discrete表示允许离散的CSS属性也支持transition过渡效果,其中,最具代表性的离散CSS属性莫过于display属性了。
  • normal就是之前的transition过渡表现,除了visibility这个我一直都认为是离散CSS的属性之外,其余离散CSS都没有过渡效果。,

使用案例

仅使用transition属性,实现元素从 display:inline ↔ none 的过渡效果。

HTML如下所示:

<button id="trigger">图片显示与隐藏</button>
<img id="target" src="1.jpg" />

通过toggle hidden属性实现显隐变化:

trigger.onclick = function () {
    target.toggleAttribute('hidden');	
};

OK,最关键的CSS来了,很简单,几行代码就可以了:

img {
    transition: .25s allow-discrete;
    opacity: 1;
}

img[hidden] {
    opacity: 0;
}

此时,点击按钮让图片隐藏的时候,就可以看到图片淡出的效果了,如下GIF动图所示:

图片隐藏动画示意

酷啊~

当然,上面的CSS代码也可以分开书写:

transition-duration: .25s;
transition-behavior: allow-discrete;

然而,再次点击按钮,希望其淡出显示的时候,却没有任何动画效果

问题分析与解决

为何设置transition-behavior:allow-discrete可以让动画display:none在过渡时长结束之后才执行,因此,opacity的过渡动画可以肉眼可见。

但是从display:nonedisplay:block的显示是突然的,在浏览器的渲染绘制层面,元素display计算值变成block和opacity设为1是在同一个渲染帧完成的,由于没有起始opacity,所以看不到动画效果。

那有没有什么办法让元素display显示的时候也有过渡效果呢?

还真有,可以使用全新的@starting-style规则,专门解决此类问题的。

三、使用@starting-style规则声明过渡起点

@starting-style顾名思义就是声明起始样式,专门用在transition过渡效果中。

例如上面的例子,要想让元素display显示的时候有淡出效果,很简单,再加三行代码就可以了:

img {
    transition: .25s allow-discrete;
    opacity: 1;
    @starting-style {
      opacity: 0;
    }
}

或者不使用CSS嵌套语法,这样写也是可以的:

img {
  transition: .25s allow-discrete;
  opacity: 1;
}
@starting-style {
  img {
    opacity: 0;
  }
}

此时,我们再点击按钮让图片显示,就可以看到图片是透明度动画显示的,如下MP4视频录屏所示(不动点击播放):

眼见为实,您可以狠狠地点击这里:CSS transition-behavior和@starting-style实现淡入淡出demo

不仅可以看到淡入淡出效果,还可以看到上面展示的仅淡出效果。

四、CSS越来越强了

本文要介绍的其实就2个东西,一个是transition-behavior:allow-discrete可以让元素display:none也可以有淡出效果,另外一个是@starting-style规则,可以让元素不再是display:none可以有淡入效果。

在实际的Web开发中,popover浮层和dialog对话框显隐的时候,都是基于display计算值实现的。

现在,有了transition-behavior@starting-style规则,这些原生HTML元素的交互效果就可以更上一层楼,算是弥补了长久以来的不足,非常棒,CSS果然是越来越强了。

继续学习,保持不懈。

顺便帮忙下,谢啦~

谢啦

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

(本篇完)