-
Notifications
You must be signed in to change notification settings - Fork 2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
CSS @property,让不可能变可能 #109
Comments
赞 |
👍 |
牛 |
牛的呀 |
感谢大佬 |
赞 |
涨知识了 |
赞 |
这也太🐂🍺了吧 |
太秀了 学到了 |
大佬 想问下 有俩元素 A, B 没有 任何关系 既不是兄弟也不是子集 , 请问 有方法可以通过变量触发 a:hover 改变b 里使用的对应的变量吗, 我测试普通的 跟这种 都不行 或者有其他办法吗 只使用css的情况下 |
CSS魔法一般的存在 |
Open
大神请教一下,css的无限旋转动画中,如果突然改变转速则元素经常会跳回最初位置重新转,不知道有没有啥好办法让改变速度时接着原来旋转的位置继续转呢? |
学到了 |
赞赞赞! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
本文主要讲讲 CSS 非常新的一个特性,CSS @Property,它的出现,极大的增强的 CSS 的能力!
根据 MDN -- CSS Property,@Property CSS at-rule 是 CSS Houdini API 的一部分, 它允许开发者显式地定义他们的 CSS 自定义属性,允许进行属性类型检查、设定默认值以及定义该自定义属性是否可以被继承。
CSS Property
如何使用呢?我们将通过一些简单的例子快速上手,并且着重介绍它在 CSS 动画中起到的关键性的作用,对 CSS 动画带来的巨大提升。示例
正常而言,我们定义和使用一个 CSS 自定义属性的方法是这样的:
而有了
@property
规则之后,我们还可以像下述代码这样去定义个 CSS 自定义属性:简单解读下:
@property --property-name
中的--property-name
就是自定义属性的名称,定义后可在 CSS 中通过var(--property-name)
进行引用其中,
@property
规则中的 syntax 和 inherits 描述符是必需的。当然,在 JavaScript 内定义的写法也很简单,顺便一提:
支持的 syntax 语法类型
syntax
支持的语法类型非常丰富,基本涵盖了所有你能想到的类型。syntax 中的
+
、#
、|
符号定义的 CSS
@property
变量的 syntax 语法接受一些特殊的类型定义。syntax: '<color#>'
:接受逗号分隔的颜色值列表syntax: '<length+>'
:接受以空格分隔的长度值列表syntax: '<length | length+>'
:接受单个长度或者以空格分隔的长度值列表OK,铺垫了这么多,那么为什么要使用这么麻烦的语法定义 CSS 自定义属性呢?CSS Houdini 定义的自定义变量的优势在哪里?下面我们一一娓娓道来。
使用
color
syntax 语法类型作用于渐变我们来看这样一个例子,我们有这样一个渐变的图案:
我们改造下上述代码,改为使用 CSS 自定义属性:
得到的还是同样的一个渐变图:
我们再加上一个过渡效果:
看看鼠标 Hover 的时候,会发生什么:
虽然我们设定了 1s 的过渡动画
transition: 1s background
,但是很可惜,CSS 是不支持背景渐变色的直接过渡变化的,我们得到的只是两帧之间的直接变化。使用 CSS @Property 进行改造
OK,接下来我们就使用本文的主角,使用 Houdini API 中的 CSS 自定义属性替换原本的 CSS 自定义属性。
简单进行改造一下,使用
color
syntax 语法类型:我们使用了
@property
语法,定义了两个 CSS Houdini 自定义变量--houdini-colorA
和--houdini-colorB
,在 hover 变化的时候,改变这两个颜色。需要关注的是,我们设定的过渡语句
transition: 1s --houdini-colorA, 1s --houdini-colorB
,在这里,我们是针对 CSS Houdini 自定义变量设定过渡,而不是针对background
设定过渡动画,再看看这次的效果:Wow,成功了,渐变色的变化从两帧的逐帧动画变成了补间动画,实现了从一个渐变色过渡到另外一个渐变色的效果!而这,都得益于 CSS Houdini 自定义变量的强大能力!
CodePen Demo -- CSS Houdini 自定义变量实现渐变色过渡动画
使用 CSS @Property 实现渐变背景色过渡动画
在上述的 DEMO 中,我们利用了 CSS Houdini 自定义变量,将原本定义在
background
的过渡效果嫁接到了color
之上,而 CSS 是支持一个颜色变换到另外一个颜色的,这样,我们巧妙的实现了渐变背景色的过渡动画。在之前我们有讨论过在 CSS 中有多少种方式可以实现渐变背景色过渡动画 -- 巧妙地制作背景色渐变动画!,到今天,我们又多了一种实现的方式!
完整的代码可以戳这里:
CodePen Demo -- CSS Houdini 自定义变量实现渐变色过渡动画2
conic-gradient 配合 CSS @Property 实现饼图动画
OK,上面我们演示了
syntax
为color
语法类型的情况。在文章一开头,我们还列举了非常多的syntax
类型。下面我们尝试下其他的类型,使用
percentage
百分比类型或者angle
角度类型,实现一个饼图的 hover 动画。如果我们还是使用传统的写法,利用角向渐变实现不同角度的饼图:
将会得到这样一种效果,由于
conic-gradient
也是不支持过渡动画的,得到的是一帧向另外一帧的直接变化:好,使用 CSS Houdini 自定义变量改造一下:
看看改造后的效果:
CodePode Demo -- conic-gradient 配合 CSS @property 实现饼图动画
以往使用纯 CSS 非常复杂才能实现的效果,如今可以轻松的达成,不得不感慨
CSS @property
强大的能力!syntax 的 | 符号
顺便演示一下定义 Houdini 自定义变量时 syntax 的一些稍微复杂点的用法。
在
conic-gradient
中,我们可以使用百分比也可以使用角度作为关键字,上述的 DEMO 也可以改造成这样:表示,我们的自定义属性即可以是一个百分比值,也可以是一个角度值。
除了
|
符号外,还有+
和#
号分别表示接受以空格分隔、和以逗号分隔的属性,感兴趣的可以自行尝试。使用
length
类型作用于一些长度变化掌握了上述的技巧,我们就可以利用 Houdini 自定义变量的这个能力,去填补修复以前无法直接过渡动画的一些效果了。
过去,我们想实现这样一个文字下划线的 Hover 效果:
因为
text-underline-offset
不支持过渡动画,得到的结果如下:使用 Houdini 自定义变量改造,化腐朽为神奇:
可以得到丝滑的过渡效果:
CodePen Demo - Underlines hover transition(Chrome solution with Houdini)
实战一下,使用 CSS @Property 配合 background 实现屏保动画
嗯,因为 CSS @Property 的存在,让以前需要非常多 CSS 代码的工作,一下子变得简单了起来。
我们尝试利用
CSS @property
配合 background,简单的实现一个屏保动画。我们利用
background
可以简单的得到这样一个图形,代码如下:效果如下,还算可以的静态背景图:
在往常,我们想让它动起来,其实是需要费一定的功夫的,而现在,通过
CSS @property
,对我们希望进行动画的一些元素细节进行改造,可以得到非常不错的动画效果:效果如下(因为 Gif 上传大小限制,加快了速率,截取了其中一部分,简单做个示意):
整体的效果还是挺不错的,完整的 Demo 你可以戳这里:
CodePen Demo -- CSS @property PureCSS Wrapper
参考文献:
最后
好了,本文到此结束,介绍了 CSS Houdini API 中的 CSS @Property 部分,并且利用它实现了一些以往无法简单实现的动画效果,希望对你有帮助 :)
更多精彩 CSS 技术文章汇总在我的 Github -- iCSS ,持续更新,欢迎点个 star 订阅收藏。
如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。
The text was updated successfully, but these errors were encountered: