天给大家带来了四个线条进行环绕的加载中的效果,我放大了给你们看看,但是你们可以看到,每个线条的旋转动作是一个圆形。
下面是代码区域,我使用的是vivo试图容器,里面包含了第二个试图容器,里面有五个vivo试图容器,前面这四个代表着四根线条,线条下面是文字。主要的是css代码区域,我使用的是开发工具是s plus x,是开发uniap的。
先给大家解释一下代码部分。
·首先是第一个vivo式图容器,使用弹性布局集中对齐,顶部距离进行相反像素的设置。
·第二个又是图中签,也是进行绝对定位,集中对齐相对定位等。
·下面就是h三,文字是白色,大家可以看到知道。
·这是第一个线条,设置了一个宽度、高度、边框、透明度、圆角、绝对定位。主要是第一根线条的动作是个动画,进行了应用旋转动画,无限循环。边框颜色为了粉色,大家可以看到粉色,因为为什么这么细?大家可以看到因为在防木人状态下设置了一个一的边框,线条的宽度是一,所以是细的。
·第二个就是第一个线条动画,它引用是哪个动画?就是下面设置一个旋转角度和结束的旋转角度形成一个圆形,从五十到一百一,再从五十到四百七,大家可以看一下形成这么个动画。
·下面第二根线条、第三根线条、第四根线条基本上都是一样的动画,所以大家只需要把第一根线条的写法知道就行了。
·下面的其实位置的变化而已和颜色大家可以看到,其他地方基本上没有太多的区别,就是美国旋转的角度是不一样的。第一个旋转角度是四百七,第二个是三百八,然后是九十,然后是六百三,就这不一样,价格方都是一样的。
感兴趣的同学可以找我唠嗑进行获取元代码,进行二十四的编写也可以,也可以自己去手动去学。
喜欢的可以点赞收藏一下,本期就讲到这。
用户正在浏览网站网页时,为了更好的用户体验,经常会使用 加载中 文字或者动画来表示正在 加载数据 或 执行某项操作。而使用动画不仅能够吸引用户的注意力,同时也能够传达信息"系统正在工作中",需要一些时间来完成任务。本文将详细介绍如何通过 CSS 创建一个 加载中 动画效果。
首先是HTML代码,定义了一个类名container的<div>容器:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS Animation</title>
<link rel="stylesheet" href="./index.css">
</head>
<body>
<div class="container">
<div class="loader" style="--r: 1">
<span style="--i: 1"></span>
<span style="--i: 2"></span>
<span style="--i: 3"></span>
<span style="--i: 4"></span>
<span style="--i: 5"></span>
<span style="--i: 6"></span>
<span style="--i: 7"></span>
<span style="--i: 8"></span>
<span style="--i: 9"></span>
<span style="--i: 10"></span>
<span style="--i: 11"></span>
<span style="--i: 12"></span>
<span style="--i: 13"></span>
<span style="--i: 14"></span>
<span style="--i: 15"></span>
<span style="--i: 16"></span>
<span style="--i: 17"></span>
<span style="--i: 18"></span>
<span style="--i: 19"></span>
<span style="--i: 20"></span>
</div>
<div class="loader" style="--r: 2">
<span style="--i: 1"></span>
<span style="--i: 2"></span>
<span style="--i: 3"></span>
<span style="--i: 4"></span>
<span style="--i: 5"></span>
<span style="--i: 6"></span>
<span style="--i: 7"></span>
<span style="--i: 8"></span>
<span style="--i: 9"></span>
<span style="--i: 10"></span>
<span style="--i: 11"></span>
<span style="--i: 12"></span>
<span style="--i: 13"></span>
<span style="--i: 14"></span>
<span style="--i: 15"></span>
<span style="--i: 16"></span>
<span style="--i: 17"></span>
<span style="--i: 18"></span>
<span style="--i: 19"></span>
<span style="--i: 20"></span>
</div>
<div class="loader" style="--r: 3">
<span style="--i: 1"></span>
<span style="--i: 2"></span>
<span style="--i: 3"></span>
<span style="--i: 4"></span>
<span style="--i: 5"></span>
<span style="--i: 6"></span>
<span style="--i: 7"></span>
<span style="--i: 8"></span>
<span style="--i: 9"></span>
<span style="--i: 10"></span>
<span style="--i: 11"></span>
<span style="--i: 12"></span>
<span style="--i: 13"></span>
<span style="--i: 14"></span>
<span style="--i: 15"></span>
<span style="--i: 16"></span>
<span style="--i: 17"></span>
<span style="--i: 18"></span>
<span style="--i: 19"></span>
<span style="--i: 20"></span>
</div>
<div class="loader" style="--r: 4">
<span style="--i: 1"></span>
<span style="--i: 2"></span>
<span style="--i: 3"></span>
<span style="--i: 4"></span>
<span style="--i: 5"></span>
<span style="--i: 6"></span>
<span style="--i: 7"></span>
<span style="--i: 8"></span>
<span style="--i: 9"></span>
<span style="--i: 10"></span>
<span style="--i: 11"></span>
<span style="--i: 12"></span>
<span style="--i: 13"></span>
<span style="--i: 14"></span>
<span style="--i: 15"></span>
<span style="--i: 16"></span>
<span style="--i: 17"></span>
<span style="--i: 18"></span>
<span style="--i: 19"></span>
<span style="--i: 20"></span>
</div>
</div>
</body>
</html>
接下来看CSS代码,重置全局样式后,给.container元素定义了水平垂直居中布局,然后使用filter样式属性来应用色相旋转(hue-rotate)滤镜,将背景色调整为90度的色相。因此,子元素的任何颜色同样会添加滤镜。
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.container {
min-height: 100vh;
background-color: #042104;
filter: hue-rotate(90deg);
display: flex;
justify-content: center;
align-items: center;
}
.loader {
position: relative;
transform: rotate(calc(var(--r) * 45deg));
}
.loader span {
position: absolute;
top: 0;
left: -200px;
width: 200px;
height: 2px;
transform-origin: right;
transform: rotate(calc(var(--i) * 18deg));
}
.loader span::before {
content: "";
display: block;
width: 15px;
height: 15px;
background-color: #00ff0a;
border-radius: 15px;
box-shadow: 0 0 10px #00ff0a,
0 0 20px #00ff0a,
0 0 40px #00ff0a,
0 0 60px #00ff0a,
0 0 80px #00ff0a, 0 0 100px #00ff0a;
animation: animate 5s linear infinite;
animation-delay: calc(-0.5s * var(--i));
}
@keyframes animate {
0% {
transform: translateX(200px) scale(1);
opacity: 0;
}
10% {
opacity: 1;
}
80% {
opacity: 1;
}
100% {
transform: translateX(0) scale(0);
opacity: 1;
}
}
@media screen and (max-width: 576px) {
.container .loader {
scale: .6;
}
}
此外,通过animation属性和@keyframes规则,定义了名为animate的关键帧动画。该动画在5秒内线性地进行,无限循环播放。动画的每个关键帧设置了不同的变换效果,包括 平移、缩放和透明度 变化。根据时间的进展,加载器的形状和位置会发生变化,从而创造出动态的效果。
关于减少长时间等待的焦虑感,相关 加载中 动画效果的文章。
通过本篇文章的详细介绍,相信能够帮助你更好地使用CSS来创建一个loading加载中动画,从而理解掌握和应用这个效果。你可以根据自己的需求调整大小、颜色和持续时间等参数,创建符合你网页风格的加载中动画。加载中动画不仅能够提供视觉上的反馈,告诉用户系统正在工作中,还能够改善用户体验,减少长时间等待的焦虑感。
作者:掘一
链接:https://juejin.cn/post/7296404570949173298
最新的Chrome 115中,令人无比期待的CSS 滚动驱动动画(CSS scroll-driven animations)终于正式支持了~有了它,几乎以前任何需要JS监听滚动的交互都可以纯 CSS 实现了,就是这么强大,一起了解一下吧
直接介绍 API 可能不太感兴趣,这里先通过一个最直观的例子感受一下。
下面是一个页面进度指示器,进度随着页面的滚动而变化
页面很简单,很多内容和一个进度条
<div class="progress"></div>
...很多内容
进度条是fixed定位
.progress{
position: fixed;
top: 0;
left: 0;
right: 0;
height: 10px;
background-color: #F44336;
transform-origin: 0 50%;
}
然后给这个进度条添加一个动画,表示进度从0到100%
@keyframes grow-progress {
from { transform: scaleX(0); }
to { transform: scaleX(1); }
}
接着给这个进度条绑定动画
.progress{
animation: grow-progress 3s linear;
}
刷新页面,可以看到进度条在3s内从0增长到了100%
显然这种动画没什么意义,我们需要在滚动时才触发,并且滚动多少,动画就播放多少。
注意:动画时长不能为0,因为为0表示动画不执行,所以必须写上一个任意非零时间,或者直接为auto
最后,加上最核心的一段,也就是今天的主角animation-timeline
.progress{
/*...*/
animation-timeline: scroll();
}
这样进度条就乖乖的跟随页面滚动而变化了(注意Chrome 115+)
完整代码可以访问:
是不是非常简单?是不是非常神奇?如果你感兴趣,可以接着往下看
大家可能知道,传统 JS 监听滚动有一些问题,如下
因此,为了解决滚动卡顿的问题,CSS 滚动驱动动画应运而生。那么,什么是 CSS 滚动驱动动画?
默认情况下,动画是随着时间的流逝而播放的。
CSS 滚动驱动动画指的是将动画的执行过程由页面滚动进行接管,也就是这种情况下,动画只会跟随页面滚动的变化而变化,也就是滚动多少,动画就执行多少,时间不再起作用。
如何改变动画的时间线呢? 那就需要用到这个核心概念了:animation-timeline,表示动画时间线(或者叫时间轴),用于控制 CSS 动画进度的时间线,是必不可少的一个属性。
默认值是auto,也是就传统的时间线。下面是它一些关键词
/* 关键词 */
animation-timeline: none;
animation-timeline: auto;
/* 命名时间线 */
animation-timeline: --timeline_name;
/* 滚动时间线 */
animation-timeline: scroll();
animation-timeline: scroll(scroller axis);
/* 视图时间线 */
animation-timeline: view();
animation-timeline: view(axis inset);
是不是有点混乱?不要慌,实际滚动场景千千万,这里可以分为两大类:一类是滚动进度时间线,也就是上面的关键词scroll(),还有一类是视图进度时间线,也就是关键词view()。
两者形式对应两种不同的应用场景,这是什么意思呢?下面一一介绍
滚动进度时间线(scroll progress timeline)。表示页面或者容器滚动,将滚动进度映射到动画进度上。起始滚动位置代表 0% 进度,结束滚动位置代表 100% 进度,下面是一个可视化演示
在上面的进度条例子中,我们用到的就是scroll progress timeline,因为我们监听的就是页面的滚动
cssanimation-timeline: scroll();
这里的scroll()是一个简写,可以传递两个参数,分别是<scroller>和<axis>
<scroller>表示滚动容器,支持以下几个关键值
<axios>表示滚动方向,支持以下几个关键值
/* 无参数 */
animation-timeline: scroll();
/* 设置滚动容器 */
animation-timeline: scroll(nearest); /* 默认 */
animation-timeline: scroll(root);
animation-timeline: scroll(self);
/* 设置滚动方向 */
animation-timeline: scroll(block); /* 默认 */
animation-timeline: scroll(inline);
animation-timeline: scroll(y);
animation-timeline: scroll(x);
/* 同时设置 */
animation-timeline: scroll(block nearest); /* 默认 */
animation-timeline: scroll(inline root);
animation-timeline: scroll(x self);
因此,如果需要监听横向滚动,可以这样
animation-timeline: scroll(inline);
不知大家发现没,前面的滚动容器只有三个关键词,并不能通过#id方式任意指定滚动容器,真的能满足所有需求吗?
当然不行!有时候结构稍微复杂一点,自动查找就不适用了,并且这里的最近祖先滚动容器还受到绝对定位的影响,因此,我们还需要手动去指定滚动容器。
官方的解决方式是创建一个带有名称的时间线,具体做法是,在滚动容器上添加一个属性scroll-timeline-name,这个属性值必须以--开头,就像 CSS 变量一样,还可以通过scroll-timeline-axis设置滚动方向,此时的animation-timeline就不用默认的scroll()了,而是改用前面设置的变量,示意如下
@keyframes animate-it { … }
/*滚动容器*/
.scroller {
scroll-timeline-name: --my-scroller;
scroll-timeline-axis: inline;
}
.scroller .subject {
animation: animate-it linear;
animation-timeline: --my-scroller;
}
这里的scroll-timeline-axis和scroll-timeline-name还可以简写成一个属性scroll-timeline
scroll-timeline-name: --my-scroller;
scroll-timeline-axis: inline;
/**可简写为**/
scroll-timeline: --my-scroller inline;
下面来看一个横向滚动的例子,刚好可以把上面的几个新概念都用上。
布局还是类似,只是放在了一个可以横向滚动的容器中
<main>
<div class="progress"></div>
...很多内容...
</main>
给main设置横向滚动,.progress设置fixed定位,还有动画和上个例子一样
main{
display: flex;
overflow: scroll;
}
.progress{
position: fixed;
top: 0;
left: 0;
right: 0;
height: 10px;
background-color: #F44336;
transform-origin: 0 50%;
animation:grow-progress 3s linear;
}
@keyframes grow-progress {
from { transform: scaleX(0); }
to { transform: scaleX(1); }
}
由于这里main才是滚动容器,并不是页面,而.progress是fixed定位,如果直接用scroll(nearest)获取到的就是页面根容器,并不是main,所以这里需要用命名scroll-timeline,实现如下
main{
/**/
scroll-timeline: --scrollcontainer inline;
}
.progress{
/**/
animation-timeline: --scrollcontainer;
}
这样就可以将横向滚动进度一一映射到动画上了,而且不受结构限制,非常自由
完整代码可以查看:
视图进度时间线(view progress timeline)。这个名字有些难以理解,其实表示的是一个元素出现在页面视野范围内的进度,也就是关注的是元素自身位置。元素刚刚出现之前代表 0% 进度,元素完全离开之后代表 100% 进度,下面是一个可视化演示
这个概念非常像JS中的Intersection_Observer_API,也就交叉观察者,可以监测到元素在可视区的情况,因此,在这种场景中,无需关注滚动容器是哪个,只用处理自身就行了。
和前面的scroll progress time语法类似,也有一个快捷语法
animation-timeline: view()
由于无需关注滚动容器,所以它的参数也不一样,分别是<axios>和<inset>
<axios>表示滚动方向,支持以下几个关键值
<inset>表示调整元素的视区范围,有点类似scroll-padding,支持两个值,表示开始和结束两个范围。
animation-timeline: view(auto); /* 默认值 */
animation-timeline: view(20%);
animation-timeline: view(200px);
animation-timeline: view(20% 40%);
animation-timeline: view(20% 200px);
animation-timeline: view(100px 200px);
animation-timeline: view(auto 200px);
这里的<inset>还可以用view-timeline-inset单独来表示,不过需要注意的是,这种用法要使用命名的view progress time,如下
scroll-timeline: --my-scroller block;
view-timeline-inset: 20% 200px;
animation-timeline: --my-scroller;
下面来看一个例子,有一个列表
<div>欢</div>
<div>迎</div>
<div>关</div>
<div>注</div>
<div>前</div>
<div>端</div>
<div>侦</div>
...
简单修饰后效果如下
现在,我们添加一个淡入和缩放的动画
@keyframes appear {
from {
opacity: 0;
transform: scaleX(0);
}
to {
opacity: 1;
transform: scaleX(1);
}
}
然后通过animation-time绑定在每个元素上,因为我们想做一个元素进入的动画,所以要用到view progress timeline
div{
/**/
animation: appear 1s linear both;
animation-timeline: view();
}
可以得到这样的效果
效果是出来了,不过好像有点太过了,太夸张了,可以看到,每个元素在滚动出现到离开的过程中都完整的执行了我们定义的动画。那么,有没有办法让这个范围变小一点呢?默认的范围如下
当然也是可以的,这里就需要用到view的第二个参数<inset>了,比如设置40% 0表示调整视区范围,相当于将滚动容器上边距减少了 40%,当滚动到视区上面40%的时候就完成了动画(默认是滚动到0%,也就是完全离开的时候)
div{
/**/
animation-timeline: view(40% 0);
}
还可以更加激进一点,设置成100%,相当于元素一旦完全进入,动画就执行完成了,这样元素出现动画会更加和谐
div{
/**/
animation-timeline: view(100% 0);
}
此时的动画范围就更小了,如下
效果如下,是不是感觉没那么夸张了呢
完整代码可以查看:
默认情况下,动画会根据滚动区间范围一一映射,就比如第一个滚动指示器的例子,滚动多少,指示器的进度就走多少。
但有时候,我们并不需要完整的区间,比如这个例子,右下角的返回顶部按钮
像这种情况下,我们其实只需要前面滚动一定距离就可以让返回按钮完全出现了,对应关系应该是这样
那么,如何截取一定的滚动区间呢?这就要涉及一个新的属性,叫做animation-range,也就是“动画范围”。
这里也要分两种场景,也就是前面提到的滚动进度时间线和视图进度时间线
首先来看scroll()场景,由于只是滚动容器的监听,因此比较简单,直接设置范围就行了
animation-range: normal; /* 等价于 normal normal */
animation-range: 20%; /* 等价于 20% normal */
animation-range: 100px; /* 等价于 100px normal */
比如上面这个返回顶部的例子,动画其实很简单,就是一个向上的位移动画
@keyframes back-progress {
from { transform: translateY(150%); }
to { transform: translateY(0%); }
}
如果仅仅添加一个滚动时间轴
.back{
/**/
animation: back-progress 1s linear forwards;
animation-timeline: scroll();
}
那么,这个返回按钮就像滚动进度条那样,慢慢的出来,直到滚动到最底部才完全出来,效果如下
这时只需要在[0, 固定距离]的范围内出现就好了,表示只在这个区间范围内触发动画,关键代码如下
.back{
/**/
animation: back-progress 1s linear forwards;
animation-timeline: scroll();
animation-range: 0 100px;
}
这样就实现了滚动100px时自动出现的返回顶部按钮,100px后按钮会一直显示
完整代码可以查看:
还有一个头部吸顶的例子,原理也是类似的,如下
头部是一个高度和字号不断变小的动画,然后需要设置一下animation-range,关键实现如下
@keyframes header {
to {
height: 60px;
font-size: 30px;
}
}
.header{
/**/
animation: header 1s linear forwards;
animation-timeline: scroll();
animation-range: 0 calc(100vh - 60px);
}
完整代码可以查看:
再来看看view()场景。由于涉及到元素和可视区域的交叉,情况稍微复杂一些,如下
animation-range: cover; /* 等价于 cover 0% cover 100% */
animation-range: contain; /* 等价于 contain 0% contain 100% */
animation-range: cover 20%; /* 等价于 cover 20% cover 100% */
animation-range: contain 100px; /* 等价于 contain 100px cover 100% */
animation-range: normal 25%;
animation-range: 25% normal;
animation-range: 25% 50%;
animation-range: entry exit; /* 等价于 entry 0% exit 100% */
animation-range: cover cover 200px; /* 等价于 cover 0% cover 200px */
animation-range: entry 10% exit; /* 等价于 entry 10% exit 100% */
animation-range: 10% exit 90%;
animation-range: entry 10% 90%;
有以下关键词
下面做了一个示意图,表示各自的范围区间
如果还是不太清楚,可以用下面这个工具去对比各自的差异
比如前面的列表进入时的动画,之前是用view(100% 0)实现的,大家有没有发现,这个效果其实和entry的示意效果一样的?
如果用animation-range就很好理解了,这里需要进入动画,所以可以直接用entry
div{
animation: appear 1s linear forwords;
animation-timeline: view();
animation-range: entry; /*只在进入过程中生效*/
}
同样可以实现相同的效果。
除此之外还可以同时设置进入和离开两种动画,这就需要定义两个动画,然后分别给两个动画定义动画区间,关键实现如下
div{
animation: appear 1s linear forwards,
disappear 1s linear forwards;
animation-timeline: view();
animation-range: entry,exit; /*进入过程执行appear,离开过程执行disappear*/
}
/*出现动画*/
@keyframes appear {
0% {
opacity: 0;
transform: scaleX(0);
}
100% {
opacity: 1;
transform: scaleX(1);
}
}
/*离开*/
@keyframes disappear {
100% {
opacity: 0;
transform: scaleX(0);
}
0% {
opacity: 1;
transform: scaleX(1);
}
}
这样就得到一个进入和离开均存在动画的滚动列表
完整代码可以查看:
另外,还可以将animation-range合并到同一个动画中,在关键帧前面加上entry这些关键词,这样就无需指定animation-range中了,示意代码如下
div{
animation: animate-in-and-out 1s linear forwards;
animation-timeline: view();
}
@keyframes animate-in-and-out {
entry 0% {
opacity: 0;
transform: scaleX(0);
}
entry 100% {
opacity: 1;
transform: scaleX(1);
}
exit 100% {
opacity: 0;
transform: scaleX(0);
}
exit 0% {
opacity: 1;
transform: scaleX(1);
}
}
除了以上一些案例外,CSS 滚动驱动动画还能做更多有趣的事情,这里推荐一个网站
比如这个 Cover Flow 效果
还有下面的卡片堆叠效果
总的来说,CSS 滚动驱动动画为以后的交互带来了无限可能,下面用一张图总结一下
原文链接:https://juejin.cn/post/7259026189904805944
*请认真填写需求信息,我们会在24小时内与您取得联系。