悄悄上线:CSS @starting-style 新规则

2023-11-23 02:20

本文主要是介绍悄悄上线:CSS @starting-style 新规则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近 Chrome 117,CSS 又悄悄推出了一个新的的@规则,叫做@starting-style。从名称上来看,表示定义初始样式。那么,具体是做什么的?有什么用?一起了解一下吧

一、快速了解 @starting-style

通常做一个动画效果,你可能会考虑 transition 和 animation

相对于animationtransition使用更简单,但是有一定条件,需要有状态的改变,例如手动添加一个class

div{transform: scale(0)
}
div.show{transform: scale(1)
}

示意如下

image.png

但是,如果这个show是一开始就存在的,比如

<div class="show"></div>

这样在页面打开的时候,肯定也是没有过渡效果的,因为没有状态的变化。

在以前,我们可以换成用animation的方式,这样即使是一开始存在的,也能有动画效果,因为animation是可以自动运行的。

不过到了现在,我们可以用transition的方式来实现了,将上面的例子改写一下

div{transform: scale(1);transition: 1s;
}
@starting-style {div{transform: scale(0);}  
}

这里的@starting-style表示初始样式,相当于在渲染之前就有了一个初始状态,这样也就算有状态变化了

image.png

实际效果如下(每次刷新浏览器都有放大动画)

Kapture 2023-11-08 at 23.02.24.gif

这样,即使不手动添加状态也能触发过渡动效了,这就是@starting-style

二、元素添加时添加过渡

有时候,即使是手动添加class,也无法保证一定能触发过渡动效,比如新创建的元素

const div = document.createElement('div')
div.className = 'show' //过渡无效,直接就生效了
document.body.append(div)

这种情况下,transition就失效了,因为你在添加class的时候元素还未完全渲染。

要解决这个问题,之前也有几种方式

首先是定时器,添加一点点延时

settimeout(()=>{div.className = 'show'
},50)

还有一种方式,主动触发元素的渲染,强制重绘

div.clientWidth // 强制触发重绘
div.className = 'show'

另外,还可以用动画animation来代替,这样也能主动触发动画

.show{animation: ...
}

现在,使用@starting-style也能实现这样的效果

div.show{transition: 1s;
}
@starting-style {div{transform: scale(0);}  
}

下面是一个元素出现过渡效果

Kapture 2023-11-09 at 20.17.31.gif


你也可以访问以下链接查看实际效果(Chrome 117+)

  • CSS @style-rule (codepen.io)')点击预览

这让我想起了之前做过一个message效果,实现原理是这样的,如果页面上还没有 message元素,就先创建,然后添加show类名,让这个元素出现,这里就是通过强制触发重绘实现的

function showMessage(txt){this.timer && clearTimeout(this.timer);var oDiv = document.getElementById('messageInfo');if(!oDiv){oDiv = document.createElement('div');oDiv.className = 'messageInfo';oDiv.id = 'messageInfo';document.body.appendChild(oDiv);}oDiv.innerHTML = '<span>'+txt+'</span>';div.clientWidth; // 强制触发重绘oDiv.classList.add('show');this.timer = setTimeout(function(){oDiv.classList.remove('show');},2000)
}

效果如下,第一次创建的时候也有过渡效果

Kapture 2023-11-09 at 20.52.10.gif

有兴趣的可以回顾之前这篇4年前的文章:css3元素出现动画实例

三、让 display:none 也支持过渡

大家可能知道,当一个元素从display:none变成display:block时,是无法触发过渡效果的,即便有一些过渡属性

div{display: none;transition: 1s;transform: scale(0)
}
div.show{display: block;transform: scale(1)
}

像这种情况下没有过渡效果的,如下

Kapture 2023-11-09 at 22.49.54.gif

不过,现在有了@starting-style,也能轻易实现过渡效果,不管你有没有display:none

/*仅需添加一个初始状态*/
@starting-style {div{transform: scale(0);}  
}

效果如下

Kapture 2023-11-09 at 22.55.33.gif

遗憾的是,从display:block变为display:none是无法触发过渡效果的

另外,原生组件很多的隐藏和显示都是直接通过display:none实现的,例如dialog,可以直接添加@starting-style规则来实现打开动画,而无需改变默认 display

dialog{transition: 1s;
}
@starting-style {dialog{transform: scale(0);}  
}

效果如下

Kapture 2023-11-09 at 23.04.11.gif

你也可以访问以下链接查看实际效果(Chrome 117+)

  • CSS @style-rule display (codepen.io)')

四、总结一下

一个可以改变元素初始状态的新特性,你学到了吗?

  1. transition 需要有状态的改变才能触发过渡效果
  2. animation 无需状态改变,因为可以自动运行
  3. @starting-style 可以改变元素的初始状态,让元素在初次渲染时也有过渡效果
  4. @starting-style 可以在元素添加时直接添加过渡效果
  5. @starting-style 可以让 display:none 也支持过渡

不过像这样的 CSS 特性注定是冷门属性,主要是可替代性太强了,而且不知道什么时候才可以正式投入使用,现在就当提前了解吧。最后,如果觉得还不错,对你有帮助的话,欢迎点赞、收藏、转发 ❤❤❤

这篇关于悄悄上线:CSS @starting-style 新规则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

详解Vue如何使用xlsx库导出Excel文件

《详解Vue如何使用xlsx库导出Excel文件》第三方库xlsx提供了强大的功能来处理Excel文件,它可以简化导出Excel文件这个过程,本文将为大家详细介绍一下它的具体使用,需要的小伙伴可以了解... 目录1. 安装依赖2. 创建vue组件3. 解释代码在Vue.js项目中导出Excel文件,使用第三

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用

使用Vue.js报错:ReferenceError: “Vue is not defined“ 的原因与解决方案

《使用Vue.js报错:ReferenceError:“Vueisnotdefined“的原因与解决方案》在前端开发中,ReferenceError:Vueisnotdefined是一个常见... 目录一、错误描述二、错误成因分析三、解决方案1. 检查 vue.js 的引入方式2. 验证 npm 安装3.

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template