整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

必看!这9部奥斯卡动画短片,时间短、画面干净,赶紧安

必看!这9部奥斯卡动画短片,时间短、画面干净,赶紧安排


个被无限拉长的春节假期里,有一个群体绝对不能忽视。


他们天性活泼,有旺盛的精力,处在快速成长阶段……


你坐得住,他们可不让你坐得住。


全国家长都懂:娃不疯,我先疯。


虽然,看电视伤眼睛的道理谁都懂,但已经到了第二个14天,再不拿出动画片来封印深兽,恐怕真的要疯!


▲今年奥斯卡获奖的最佳动画短片《发之恋》


既然总归要看的,不如看点真正的好片子!


时长合理,对眼睛有一定保护;没有恐怖画面,不会增加晚上哄睡的负担;绿色环保,杜绝少儿不宜


于是我们从历届20多部奥斯卡提名和获奖的动画短片中,选出了含金量最高的9部,推荐给大家!


这是一辆开往幼儿园的车,孩子们,上车!



*这些影片的在线观看链接,我也都整理好了,都是网上能够找到的相对高清的版本,复制链接用浏览器打开就行了。


关键词 :亲情 坚持



片长:7分钟

获奖:第92届奥斯卡金像奖 最佳动画短片

观看地址:复制链接用浏览器打开

https://www.iqiyi.com/v_19rvqwgjds.html


这部短片算是在上周奥斯卡中爆冷夺得最佳动画短片,故事很简单,讲的是一位爸爸第一次给女儿扎辫子的故事。


这是重要的一天,小女孩Zuri准备打扮美美的,可是一头蓬松爆炸的头发,却难倒了她。



自己尝试失败后,决定向爸爸求助,这段与魔法怪兽拼死搏斗的画面特别有趣,像极了爸爸们给女儿梳头的样子,相信很多爸爸会有共鸣感。



一番搏斗后,爸爸还是败了,打算用帽子压住头发了事。最后,被妈妈的话鼓舞的爸爸,决定再次尝试。



这一次,他们成功了!



画面一转到病房,妈妈因为生病治疗,剃光了头发。不过收到女儿送她的画,决定勇敢面对。


短片没有过多的隐喻和猎奇画风,特别贴近生活,却演绎出一个打动人心的故事。同时也传达给我们一个信念:前路或许艰辛,但你终会到达,只要一点努力,加上满满的爱。


关键词:成长 独立 勇敢



片长:6分03秒

获奖:第89届奥斯卡金像奖 最佳动画短片

观看地址:复制链接用浏览器打开

https://v.qq.com/x/cover/mzc00200k549l9q/l3044jlpfzr.html


这部动画,我一度以为是纪录片,特效真的太逼真,每一幅画面都美的可以截图当桌面。



短短6分钟,无对白,无字幕,一个简单的故事,却描绘出一个关于成长的真谛。


一只小鹬张大嘴巴等妈妈喂食,妈妈却一直呼唤它来海边自己觅食。



不曾想还没吃到东西,就被浪潮打湿,回到家里瑟瑟发抖,拒绝再去。妈妈却没有因此心软,而是一再的鼓励它。



再次出海的小鹬遇上了小寄居蟹,学着它们躲进沙子躲避浪潮,却发现了完全不一样的景观,也打开了新世界大门。



最后看到小鹬不再害怕,肆意在海滩上觅食的样子,真的会忍俊不禁。



小鹬的成长就像我们每个人的的缩影,父母适时的放手,才能让孩子更好地成长。亲人的鼓励、好友的扶持,终会让你战胜恐惧,成为更好的自己。


必须说一下,小鹬真的萌翻了!老母亲和小宝贝双双被击中!


关键词:母爱 家庭 放手



片长:8分钟

获奖:第91届奥斯卡金像奖 最佳动画短片

观看地址:复制链接用浏览器打开

https://www.iqiyi.com/v_19rqtkymnw.html


这是一部中国风的动画,短短8分钟就能让人了解到中国人的脾气、习惯以及中国式家庭的亲情关系。



故事很简单,一个包子有了生命,这位妈妈把它当成孩子一样抚养长大,包宝宝渐渐长大,渴望独立,有自己的生活,但她却无法接受。



最终矛盾爆发,妈妈一口把它吞下了。看到这里时,我吓了一大跳,还好,故事并没有结束,原来这一切都是妈妈的噩梦。



其实想想,这是我们很多人经历过的故事。父母对孩子过分保护、不愿放手的心态,这种以爱之名养育子女,却也可能将子女吞噬。



这部动画孩子看会觉得很可爱软萌,但我更想推荐给爸爸妈妈们看,在养育孩子的同时,给与孩子足够的空间和自由,不正是我们新一代爸妈该学习的吗?


关键词:勇气 责任 守护



片长:8分钟

获奖:第91届奥斯卡最佳动画短片(提名)

观看地址:复制链接用浏览器打开

https://www.iqiyi.com/v_19rqtkymnw.html


这是一部治愈系动画短片,画风可爱,历险的故事很精彩,出镜了非常多小动物,很适合宝贝看。


短片开始就是惊心动魄,Bilby为了食物一路奔跑逃窜,一下就感觉到它生存环境的恶劣。



找食物的途中,Bilby遇到了一直呆萌的幼鸟,本想一走了之,却心生怜悯,带着它开始逃亡之路。随之是接踵而来的各种危险,眼镜蛇、蝎子、食人鱼、鳄鱼......


最终逃到了一处悬崖之上,结果又被老鹰抓走,Bilby再起鼓起勇气去解救它。最后,幼鸟长大了,两只动物成了好朋友,相互陪伴。



正因为一开始就看到Bilby生存的恶劣,它之后的善良举动才更显得珍贵。我们人也一样,虽然平凡弱小,可当我们有了想要守护的东西,就会变得勇敢无惧。父母与孩子,何尝不是如此呢?


关键词:友情 治愈 成长



片长:9分钟

获奖:第92届奥斯卡金像奖 最佳动画短片(提名)

观看地址:复制链接用浏览器打开

https://v.qq.com/x/cover/mzc00200k549l9q/l3044jlpfzr.html


特别暖心的一部动画短片,讲述一只流浪猫Kit与斗牛犬Bull从生疏防备到亲密无间的故事。



虽然是二维动画,却体现了皮克斯一贯的高水准。细节的刻画特别棒,尤其是小猫的动作、神态,捕捉的特别好。


一点声响就被吓到,将Kit是一只流浪猫,生性胆小,极其没有安全感的状态展示出来。



而bull呢,看起来有人照顾,其实一直在遭受主人的虐待。


两只小动物,从充斥着敌意,相互试探,到后来发现彼此内心的善意。这段故事,特别适合孩子从中领会什么是友谊?


▲虽然很恐惧,仍会帮Bull舔伤口给它安慰。


更让我感动的是,它们在遭受了那么多伤害后,仍选择对世界抱以善良的心。最终,它们也“被温柔以待”,找到了好主人。



我想这也是我们想让孩子明白的:只要心怀善念,虽然历经苦难,世界终将还你爱与温暖。


关键词:人际关系 幽默



片长:3分钟

获奖:第74届奥斯卡金像奖 最佳动画短片

观看地址:复制链接用浏览器打开

https://www.iqiyi.com/w_19s0kqcg75.html


皮克斯出品,延续了一贯轻松搞笑的风格。


一群小鸟聚在电线上叽叽喳喳吵个不停,不速之客大鸟的到来,打破了原来的平衡。


小鸟们突然团结起来一致对外,打算把大鸟排挤出去,可成功在即之时,意外发生了。



小鸟们因为惯性被弹到天空中,羽毛全部脱落得光秃秃,只好躲到大鸟身后了。



短片只有3分钟,却像是一出幽默的小品。一群小鸟和一只大鸟斗智斗勇,动作和表情都非常夸张,非常适合小龄宝贝看。

大人可以感受影片背后映射的某些社会现象,孩子比较难理解,但可以问孩子一些简单的问题,比如小鸟们的行为是对是错呢?怎样对待大鸟更好呢?


关键词:阅读 想象力



片长:15分钟

获奖:2012年奥斯卡金像奖最佳动画短片奖

观看地址:复制链接用浏览器打开

https://www.iqiyi.com/v_19rrh6izps.html#curid=226621500_0d52db7c805aee21d30fc41fc2ebf428


如果要提到在绘本界最有名的一部动画短片,那一定非《神奇飞书》莫属,因为这是一部关于“书”的动画,也是一部献给爱书者的短片。


在一个平静的小镇,一个男子正坐在阳台上阅读,他的身边堆满了书。突然狂风大作,所有的东西就连书上的文字都被吹走。



当男子四处游荡时,他跟着一本书来到了一栋满是书的房子,从此留在这里,与书相伴。



短片里藏着很多细节,可以和孩子多看几遍,一起发现。


富有想象力,无论是被风吹起的字幕,还是躺在巨大的书籍睡觉,最让孩子惊喜,还是里面各种飞翔的书,每一本书都有生命。



有段“救活”一本书的情节,用各种方法抢救,但唯一的方法,是打开它,阅读它。


所以,告诉孩子们,去阅读吧!只有书本传递的力量与快乐,才是永恒的,才能让原本黑白的世界变成彩色。


关键词:陪伴 信任 包容



片长:5分49秒

获奖:第82届奥斯卡入围最佳动画提名的附赠短片

观看地址:复制链接用浏览器打开

https://v.qq.com/x/page/o0642zh1spq.html


这是皮克斯2009《飞屋环游记》的加映短片,画面呆萌可爱,动画人物的表情非常生动,是宝贝们会爱的款!


讲述了一个很奇幻的故事,“孩子”是由天空中有生命的云朵们创造的,由送子鹳将他们送到不同的家。



有一朵乌云Gus,和其他云不同,它制造的孩子都是那些攻击性很强的孩子,比如,牙齿锋利的鳄鱼宝宝、有着硬角的山羊宝宝、浑身是刺的刺猬宝宝...看的时候,还真有点心疼送子鹳Peck。


就在我们以为遍体鳞伤的Peck受不了,选择了离开,却没想到它只是去穿了一套防护套装,继续回到Gus身边,这一幕真的超暖心。



Gus和Peck之间的关系,很让人感动。每个人或许都会有与世界格格不入的棱角,就像这些制造出来的“危险”。可是留在你身边的人,不管是朋友家人,还是爱人,总会给你信任和包容。



总之,这真的是一部可爱有趣又令人动容的动画。


关键词:付出 陪伴 克制



片长:6分钟

获奖:第87届奥斯卡金像奖 最佳动画短片

观看地址:复制链接用浏览器打开

https://v.qq.com/x/cover/76wjn5jwry03mhu/w0015u0o190.html?ptag=360kan.cartoon.free


通过小狗温斯顿的视角,来讲述了男主人的爱情故事。


整片的主线可是温斯顿的食物,从最初狗粮,到后来的牛排、炸肉饼、煎蛋...温斯顿的可谓是登上了狗生巅峰啊!和男主人一块儿度过了一段天堂般的美食岁月。

▲看它吃东西我都要馋了


直到男主人邂逅了生命中的另一半,温斯顿的伙食每况愈下,直到男主人失恋了...


令人意想不到的是,竟然是温斯顿拯救了男主人的爱情,而它最后又是怎样再次享受上各种美食的,看完你肯定会笑出来。


且不说一只狗的“美食盛宴”里吃出了爱情和人生,光是整部短片展现的欢乐,就值得和孩子一起看一次,相信最后你也会喜欢上这只贪吃的小狗!


愿你们度过一段特别的亲子时光~



当然啦,给宝贝看动画也要注意控制时间。


美国儿科学会建议:18个月以下的婴幼儿最好不要看电视;18个月至2岁的孩子每天的屏幕时间也不能超过1小时,爸爸妈妈们一定要严格执行哦。


最后,也想和大家聊一下动画这种艺术创作。


李安曾说过:一部好的电影,改变一个人看待世界的方式


好的动画,同样如此。它超越想象的边界,在潜移默化中,不仅能让人看到丰富多彩的世界,更有着催人向上的作用。


那好的动画又是怎样的呢?我想除了蕴含童趣、诙谐幽默又不乏写实,更重要的是,它一定是由爱和真诚善良所组成。


在这些动画中,始终不会离开“爱”的主题,这是我们所需要的,也是想我们想教给孩子的:不管在任何时刻,都要保持爱的力量!

么是Canvas

<canvas> 是HTML中的一个元素,它可被用来通过 JavaScript(Canvas API 或 WebGL API)绘制图形及图形动画。

Canvas API 提供了一个通过 JavaScriptHTML<canvas> 元素来绘制图形的方式。它可以用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面。

<canvas>标签本身没有绘图能力,它仅仅是图形的容器。在HTML,一般通过Javascript语言来完成实际的操作。

创建HTML页面并添加绘图容器

本文通过Javascript操作Canvas制作一个简单的显示当前时间的动画时钟,了解和学习简单的canvas用法,仅以抛砖引玉。

首先创建一个HTML文件,为了方便管理,使用一个div标签包裹两个canvas标签,并加上一些简单的css样式。

<!doctype html>
<html lang="zh-cn">
<head><title>Canvas绘制动画时钟</title>
<style>
html,body{margin:0;padding:0}
#clockWrap {
	position: relative;
}
canvas {
	position: absolute;
}
#clock-ui {
	z-index: 2;
}
#clock-plate {
	z-index: 1;
}
</style>
</head>
<body>
  <div id="clockWrap">
  <canvas id="clock-plate"></canvas>
  <canvas id="clock-ui"></canvas>
</div>
<script></script>
</body></html>

本示例中使用了两个canvas标签(为什么使用两个,一个不是更简单吗?),一个用于绘制钟面,一个根据当前时间实时显示和更新时针、分针和秒针的动态指向。好了,话不多说,开干。

绘制钟面刻度

一个简单的时钟,可以分为钟面上的刻度和指针。其中刻度和12个数字是固定的,我们可以将它们绘制在当作背景的canvas上(示例中id为clock-plate的canvas)。

(1)要使用canvas,首先必须通过容器获取渲染上下文:

var $=function(id){return document.querySelector(id);}//这个函数只是为了方便获取dom元素
const canvasbg=$("#clock-plate"),
      canvas=$("#clock-ui"),
      ctx=canvasbg.getContext("2d"),//背景容器上下文
      ctxUI=canvas.getContext("2d");//指针容器上下文,后面代码要用
//定义画布宽度和高度,时钟圆直径,并设置画布大小
const oW=1000,oH=800,cW=400,r=cW/2,oX=oW/2,oY=oH/2;
canvas.width=oW;
canvas.height=oH;
canvasbg.width=oW;
canvasbg.height=oH;

(2)画钟的边框,为了好看,这里画两个圈:

 //画出时钟外圆框
  ctx.lineWidth=12;
	ctx.beginPath();
	ctx.arc(oX, oY, r+14, 0, 2 * Math.PI);
	ctx.stroke();
	ctx.closePath();
	ctx.lineWidth=8;
	//画出时钟内圆框(刻度圈)
	ctx.beginPath();
	ctx.arc(oX, oY, r, 0, 2 * Math.PI);
	ctx.stroke();
	ctx.closePath();
	ctx.beginPath();

边框效果图

(3)绘制刻度线和数字,可以利用三角函数计算出每个刻度的坐标:

利用三角函数计算刻度线的坐标位置

钟面上有12个大格,从正上方12开始,它们的度数分别是270,300,330,0,30,60,90,120,150,180,210,240。然后利用JS的Math.sin和Math.cos分别计算出各大格的坐标。注意:js中Math.sin()和Math.cos()的参数不是角度数弧度。可以使用Math.PI/180*角度来转化,比如将30度转换成弧度=Math.PI/180*30

//绘制钟表中心点
	ctx.beginPath();
	ctx.arc(oX, oY, 8, 0, 2 * Math.PI);//圆心
	ctx.fill();
	ctx.closePath();
	//设置刻度线粗细度
	ctx.lineWidth=3;
	//设置钟面12个数字的字体、大小和对齐方式
	ctx.font="30px serif";
	ctx.textAlign="center";
	ctx.textBaseline="middle";
	var kdx,kdy;
	//绘制12个大刻度和12个数字
	//为方便计算,先定义了0-11这12个刻度对应的度数,也可以直接定义对应的弧度。
	const hd=Math.PI/180,degr=[270,300,330,0,30,60,90,120,150,180,210,240];
	for(var i=0;i<12;i++){
		kdx=oX+Math.cos(hd*degr[i])*(r-3);
		kdy=oY+Math.sin(hd*degr[i])*(r-3);
		ctx.beginPath();
		ctx.arc(kdx, kdy, 6, 0, 2 * Math.PI);//画圆形大刻度
		ctx.fill();
    //绘制刻度对应的数字
		ctx.strokeText(i==0? 12 : i,oX+Math.cos(hd*degr[i])*(r-24),oY+Math.sin(hd*degr[i])*(r-24));
		ctx.closePath();
	}
	
	//绘制小刻度
	ctx.lineWidth=2;
	for(var i=0;i<60;i++){
		if(i % 5==0) continue;//跳过与刻度重叠的刻度
		x0=Math.cos(hd*i*6);
		y0=Math.sin(hd*i*6);
		ctx.beginPath();
		ctx.moveTo(oX+x0*(r-10), oY+y0*(r-10)); 
		ctx.lineTo(oX+x0*r, oY+y0*r); //画短刻度线
		ctx.stroke(); 
		ctx.closePath();
	}

效果如图:

钟面效果图

(4)根据当前时间绘制指针

习惯上,时针粗短,分针略粗而长,秒针细长。为加大区别,示例中秒针细长并且绘制成红色。

function drawHp(i){//绘制时针
	const x0=Math.cos(hd*i*30),y0=Math.sin(hd*i*30);
	drawPointer(oX,oY,oX+x0*(r-90),oY+y0*(r-90),10,"#000000");
}
function drawMp(i){//绘制分针
	const x0=Math.cos(hd*i*6),y0=Math.sin(hd*i*6);
	drawPointer(oX,oY,oX+x0*(r-60),oY+y0*(r-60),5,"#000000");
}
function drawSp(i){//绘制秒针
	const x0=Math.cos(hd*i*6),y0=Math.sin(hd*i*6);
	drawPointer(oX,oY,oX+x0*(r-20),oY+y0*(r-20),2,"#FF0000");
}
//抽取出绘制三种指针时共同的部分,注意指针绘制在渲染上下文ctxUI中
function drawPointer(ox,oy,tx,ty,width,color){
	ctxUI.strokeStyle=color;
	ctxUI.lineCap="round";
	ctxUI.lineWidth=width;
	ctxUI.beginPath();
	ctxUI.moveTo(ox, oy);
	ctxUI.lineTo(tx,ty);
	ctxUI.stroke();
	ctxUI.closePath();
}

现在已经有了绘制三种指针的方法,参数是当前时间的时、分和秒,将根据它们的值确定指针的坐标。不过,因为使用的是默认的convas坐标体系,0值实际指向3的位置,需要小小的修正一下。

window.requestAnimationFrame(function fn(){
		var d=new Date();
		ctxUI.clearRect(0,0,oW,oH);
		//度数从0开始,而0在3刻度(15分/秒位置),修正为全值减15,如果小于0则修正回来
    var hour=d.getHours(),minute=d.getMinutes()-15,second=d.getSeconds()-15;
		hour=hour>11? hour-15 : hour-3;
		drawHp(hour>=0? hour : 12+hour);
		drawMp(minute>=0? minute : 60+minute);
		drawSp(second>=0? second : 60+second);
		window.requestAnimationFrame(fn);
});

接下来,调用window.requestAnimationFrame,在其中绘制并更新指标的位置。看看效果如何:

指针绘制情况与实际时间相符

貌似效果有了,截图时电脑上的时间是10时17分,指针绘制上,时针指向10时,分针指向17。嗯,感觉有点别扭?对了,时针和分针怎么是端端正正地指向它们的整时整分刻度上呢?实际钟表上时针和分针是展示动态进度的,此时时针应该越过10时的位置才对。没关系,我们在绘制时针和分针时别点东西,让它的角度值加上分针和秒针的值试试。

//修改后的绘制三种指针的方法
function drawHp(i,f,m){//绘制时针,参数:时,分,秒
	const x0=Math.cos(hd*(i+(f/60)+(m/600))*30),y0=Math.sin(hd*(i+(f/60)+(m/600))*30);
	drawPointer(oX,oY,oX+x0*(r-90),oY+y0*(r-90),10,"#000000");
}
function drawMp(i,f){//绘制分针,参数,分,秒
	const x0=Math.cos(hd*(i+(f/60))*6),y0=Math.sin(hd*(i+(f/60))*6);
	drawPointer(oX,oY,oX+x0*(r-60),oY+y0*(r-60),5,"#000000");
}
function drawSp(i){//绘制秒针
	const x0=Math.cos(hd*i*6),y0=Math.sin(hd*i*6);
	drawPointer(oX,oY,oX+x0*(r-20),oY+y0*(r-20),2,"#FF0000");
}

再来看看效果,嗯,立竿见影呀:

指针指向更合理了

到此为止,canvas绘制一个简易时钟就完成了。下面继续优化一下。刚才使用requestAnimationFrame方法即时更新绘制情况。这个方法与刷新率有关,看看mdn上面怎么说的:

window.requestAnimationFrame() 方法会告诉浏览器你希望执行一个动画。它要求浏览器在下一次重绘之前,调用用户提供的回调函数。

对回调函数的调用频率通常与显示器的刷新率相匹配。虽然 75hz、120hz 和 144hz 也被广泛使用,但是最常见的刷新率还是 60hz(每秒 60 个周期/帧)。为了提高性能和电池寿命,大多数浏览器都会暂停在后台选项卡或者隐藏的 <iframe> 中运行的 requestAnimationFrame()。

本示例中,更新指针的位置并不需要很高的刷新频率,可以通过节流进行一下优化:

var fps=5, fpsInterval=1000 / fps,lastTime=new Date().getTime(); //记录上次执行的时间
function runStep() {
    requestAnimationFrame(runStep);
    var d=new Date(),now=d.getTime()
    var elapsed=now - lastTime;
    if (elapsed > fpsInterval) {
				ctxUI.clearRect(0,0,oW,oH);
        lastTime=now - (elapsed % fpsInterval); 
			//度数从0开始,而0在3刻度(15分/秒位置),修正为全值-15,如果小于0则用60减回
        var hour=d.getHours(),minute=d.getMinutes()-15,second=d.getSeconds()-15;//console.log(d.getSeconds(),second);
        hour=hour>11? hour-15 : hour-3;
        drawHp(hour>=0? hour : 12+hour,minute+15,second+15);
        drawMp(minute>=0? minute : 60+minute,second+15);
        drawSp(second>=0? second : 60+second);
    }
}
runStep();

当然,实现时钟的方法是很多,比如可以使用画布的旋转(rotate方法)来实现指针的动态转动等等。

完整HTML+JS源码:

现代网页设计中,动画和过渡是提升用户体验的重要手段。通过使用 CSS,我们可以在不影响页面性能的前提下,实现平滑和吸引人的视觉效果。本文将介绍 CSS 动画和过渡的基础知识,并通过几个例子展示如何在你的网站中应用它们。

CSS 过渡(Transitions)

CSS 过渡允许你在 CSS 属性值之间创建平滑的动画效果。当一个元素的属性值改变时,过渡效果会在一定时间内平滑地过渡到新的属性值。

基本语法

transition: property duration timing-function delay;
  • property:指定要添加过渡效果的 CSS 属性。
  • duration:过渡效果的持续时间。
  • timing-function:定义速度曲线的函数。
  • delay:过渡效果的延迟时间。

例子 1:鼠标悬停放大图片

img:hover {
  transform: scale(1.2);
  transition: transform 0.3s ease-in-out;
}

这个例子中,当鼠标悬停在图片上时,图片会在0.3秒内放大到原来的1.2倍大小,过渡效果为ease-in-out。

CSS 动画(Animations)

CSS 动画提供了更强大的控制,允许你创建复杂的动画序列,通过定义关键帧(keyframes)来控制动画的中间状态。

基本语法

@keyframes animation-name {
  from {
    /* 初始状态 */
  }
  to {
    /* 结束状态 */
  }
}

或者使用百分比来定义多个关键帧:

@keyframes animation-name {
  0% { /* 初始状态 */ }
  50% { /* 中间状态 */ }
  100% { /* 结束状态 */ }
}

例子 2:无限旋转图标

@keyframes spin {
  from { transform: rotate(0deg); }
  to { transform: rotate(360deg); }
}

.icon-spin {
  animation: spin 2s linear infinite;
}

这个例子创建了一个名为spin的动画,使得图标无限期地旋转。

实战例子

接下来,我们将通过几个实战例子来展示 CSS 动画和过渡的具体应用。

例子 3:按钮点击波纹效果

.button {
  position: relative;
  overflow: hidden;
  transition: background-color 0.3s;
}

.button:after {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 5px;
  height: 5px;
  background: rgba(255, 255, 255, 0.7);
  opacity: 0;
  border-radius: 100%;
  transform: scale(1, 1) translate(-50%);
  transform-origin: 50% 50%;
}

.button:active:after {
  width: 300px;
  height: 300px;
  opacity: 1;
  transition: width 0.5s, height 0.5s, opacity 0s 0.5s;
}

在这个例子中,当按钮被点击时,会产生一个波纹效果,模拟水波纹扩散。

例子 4:淡入淡出切换效果

.fade-in {
  animation: fadeIn 1s ease-in-out;
}

@keyframes fadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}

.fade-out {
  animation: fadeOut 1s ease-in-out;
}

@keyframes fadeOut {
  from { opacity: 1; }
  to { opacity: 0; }
}

这个例子中定义了两个动画,一个用于元素的淡入,另一个用于元素的淡出。

示例

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS Animation and Transition Example</title>
<style>
  body {
    font-family: 'Arial', sans-serif;
    margin: 0;
    padding: 0;
    background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab);
    background-size: 400% 400%;
    animation: gradientBG 15s ease infinite;
    display: flex;
    justify-content: center;
    align-items: center;
    flex-direction: column;
    min-height: 100vh;
  }

  @keyframes gradientBG {
    0% { background-position: 0% 50%; }
    50% { background-position: 100% 50%; }
    100% { background-position: 0% 50%; }
  }

  .logo {
    font-size: 2em;
    color: #007bff;
    margin-bottom: 20px;
    animation: spin 3s linear infinite;
  }

  .scrolling-text {
    margin: 20px 0;
    background-color: #333;
    color: #fff;
    padding: 10px;
    white-space: nowrap;
    overflow: hidden;
    position: relative;
  }

  .scrolling-text p {
    position: absolute;
    width: 100%;
    height: 100%;
    margin: 0;
    line-height: 50px;
    text-align: center;
    /* Starting position */
    transform: translateX(100%);
    /* Apply animation to this element */
    animation: scroll-text 10s linear infinite;
  }

  @keyframes scroll-text {
    0% { transform: translateX(100%); }
    100% { transform: translateX(-100%); }
  }

  .interactive-card {
    background-color: #fff;
    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
    padding: 20px;
    margin: 20px;
    border-radius: 10px;
    transition: transform 0.3s ease, box-shadow 0.3s ease;
  }

  .interactive-card:hover {
    transform: translateY(-10px);
    box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
  }

  .color-block {
    width: 100px;
    height: 100px;
    background-color: #17a2b8;
    margin: 20px;
    border-radius: 50%;
    transition: background-color 0.5s ease, transform 0.5s ease;
  }

  .color-block:hover {
    background-color: #28a745;
    transform: rotate(180deg);
  }
</style>
</head>
<body>

<div class="logo">
  <i class="fas fa-sync-alt"></i> Animated Logo
</div>

<div class="scrolling-text">
  <p>This text scrolls infinitely. Pay attention to how it moves smoothly from right to left.</p>
</div>

<div class="interactive-card">
  <h3>Interactive Card</h3>
  <p>Hover over this card to see it move. It's a simple yet effective way to add interactivity to your design.</p>
</div>

<div class="color-block"></div>

</body>
</html>

  • .logo 类定义了一个徽标,它具有字体大小和颜色,并应用了一个名为 spin 的关键帧动画,使徽标无限旋转。
  • .scrolling-text 类定义了一个包含滚动文本的容器,设置了背景颜色、文字颜色和内边距。
  • .scrolling-text p 选择器定义了滚动文本的样式,包括动画 scroll-text,使文本从右向左无限滚动。
  • .interactive-card 类定义了一个交互式卡片,它具有背景颜色、阴影、内边距和圆角。当鼠标悬停时,它会向上移动并增加阴影,这是通过 transition 属性实现的。
  • .color-block 类定义了一个颜色块,设置了宽度、高度、背景颜色和圆角。当鼠标悬停时,它的背景颜色会改变,并且会旋转 180 度。
  • body 的背景被设置为一个线性渐变,包含四种颜色。通过 background-size 属性,我们扩大了背景尺寸,这样动画在运行时会有更多的空间进行颜色的过渡。
  • @keyframes gradientBG 关键帧动画被创建来改变背景的位置,从而在不同的颜色之间产生平滑过渡的效果。
  • 该动画被设置为无限循环,并且每次循环持续 15 秒,通过 ease 时间函数来平滑过渡。

结语

CSS 动画和过渡是前端开发者的强大工具,它们可以在不牺牲性能的情况下为用户提供流畅、引人注目的界面交互。通过掌握这些技术,你可以创造出更加动态和生动的网页体验。记住,动画应该用来增强用户体验,而不是分散用户的注意力,适量而恰当地使用动画效果是关键。