老师,我的问题是本节老师演示的宣传页项目的第二屏动画。

老师,我的问题是本节老师演示的宣传页项目的第二屏动画。

<!--screen-2部分 -->
		<div class="screen-2">
			<h2 class="screen-2__heading">优美的设计,更令人着迷</h2>
			<h3 class="screen-2__subheading">采用受欢迎的设计,让它更加出色。<br/>款式小巧、轻便手感更舒适。绚丽高清的显示屏,整个外观显得格外精致。</h3>
			<div class="screen-2__phone">
				<div class="screen-2__point screen-2__point_i_1">高清摄像</div>
				<div class="screen-2__point screen-2__point_custom_right screen-2__point_i_2">超薄机身</div>
				<div class="screen-2__point screen-2__point_custom_right screen-2__point_i_3">大屏显示</div>
			</div>
		</div>

这是老师写的第二屏的html,

/* 第二屏动画 */

.screen-2__subheading,
.screen-2__phone,
.screen-2__heading{
	transition:all 1s;
}
.screen-2__heading_animate_init{
	opacity: 0;
	transform: translate(0,-100%);
}
.screen-2__subheading_animate_init{
	opacity: 0;
	transform: translate(0,100%);
}
.screen-2__phone_animate_init{
	opacity: 0;
	transform: translate(0,50%);
}
.screen-2__phone_animate_done,
.screen-2__subheading_animate_done,
.screen-2__heading_animate_done{
	opacity: 1;
	transform: translate(0,0);
}
.screen-2__point{
	transition:all 1s 1s;
}
.screen-2__point_done{
	opacity: 1;
	transform:translate(0,0);
}
.screen-2__point_i_1_animate_init{
	opacity: 0;
	transform: translate(-100%,0);
}
.screen-2__point_i_2_animate_init,
.screen-2__point_i_3_animate_init{
	opacity: 0;
	transform: translate(100%,0);
}

这是老师写的第二屏的动画效果。

var screenAnimateElements = {
	'.screen-1' : [
		'.screen-1__heading',
		'.screen-1__phone',
		'.screen-1__shadow',
	],
	'.screen-2' : [
		'.screen-2__heading',
		'.screen-2__phone',
		'.screen-2__subheading',
		'.screen-2__point_i_1',
		'.screen-2__point_i_2',
		'.screen-2__point_i_3',
	],
	'.screen-3' : [
	'.screen-3__heading',
	'.screen-3__phone',
	'.screen-3__subheading',
	'.screen-3__features',
	],
	'.screen-4' : [
	'.screen-4__heading',
	'.screen-4__subheading',
	'.screen-4__type__item_i_1',
	'.screen-4__type__item_i_2',
	'.screen-4__type__item_i_3',
	'.screen-4__type__item_i_4',
	],
	'.screen-5' : [
	'.screen-5__heading',
	'.screen-5__bg',
	'.screen-5__subheading',
	]
};


function setScreenAnimate(screenCls){
	var screen = document.querySelector(screenCls)//获取当前屏的元素
	var animateElements = screenAnimateElements[screenCls]// 需要设置动画的元素
	var isSetAnimateClass = false;// 是否有初始化子元素的样式
	var isAnimateDone = false;//当前屏幕下所有子元素的状态是DONE?
	screen.onclick = function(){
		// 初始化样式,增加init
		if(isSetAnimateClass === false){
			for(var i=0;i<animateElements.length;i++){
				var element = document.querySelector(animateElements[i]);
				var baseCls = element.getAttribute('class');//animateElements[i].substr(1)这是为了去掉animateElements[i]元素中的点,
				element.setAttribute('class',baseCls+' '+animateElements[i].substr(1)+'_animate_init');
			}
			isSetAnimateClass =true;
			return ;
		}
		// 切换所有animateElements的init->done
		if(isAnimateDone === false){
			for(var i=0;i<animateElements.length;i++){
				var element = document.querySelector(animateElements[i]);
				var baseCls = element.getAttribute('class');
				element.setAttribute('class',baseCls.replace('_animate_init','_animate_done'));
			}
			isAnimateDone =true;// 重设属性
			return ;
		}
		// 切换所有animateElements的done->init 这是为了解决在动画完成后又没有动画的问题
		if(isAnimateDone === true){
			for(var i=0;i<animateElements.length;i++){
				var element = document.querySelector(animateElements[i]);
				var baseCls = element.getAttribute('class');
				element.setAttribute('class',baseCls.replace('_animate_done','_animate_init'));
			}
			isAnimateDone = false;
			return ;
		}
	}
}
for(k in screenAnimateElements){
		setScreenAnimate(k);
	}

这是老师写的js脚本。

我的问题是:为什么在第二屏的动画效果中,老师写“screen-2__point”动画的时候没有写"screen-2__point_animate_init, screen-2__point_animate_done",而是只写了“screen-2__point, screen-2__point_done”还不是"screen-2__point_animate_done"如果这样写和js脚本中定义的函数对不上啊?请老师解答。

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

你好同学,老师明白你的意思,这个就是因为screen-2__point的动画不是使用这个类名去做的,而是使用的上次老师说那的几个类名去做的动画。同学可以下载源码看看js代码,里面没有使用到screen-2__point这个类名,所以不会报错哦。

http://img1.sycdn.imooc.com//climg/5d3667d30001025c05270170.jpg

可以把screen-2__point_done注释了,去看看效果,是没有影响的

http://img1.sycdn.imooc.com//climg/5d3668280001e8a206410330.jpg

祝学习愉快,望采纳。

好帮手慕夭夭 2019-07-22 14:46:58

你好同学,.screen-2__point元素的动画是定义在如下类名中的:

http://img1.sycdn.imooc.com//climg/5d355ad1000192e909060109.jpg

因为几个元素显示的位置是不同的,所以给它们各自定义了不同的类名来设置动画哦。

如下在这几个元素上默认设置了位置

http://img1.sycdn.imooc.com//climg/5d355b600001964b03540261.jpg

添加动画时,只有改变它的位置即可,也就是只需要改变一个状态。所以代码中只定义了一个int来设置元素显示后面的位置,当从默认状态改变到init时,动画已经完成了,所以done没有用处,也就没有定义样式哦。

http://img1.sycdn.imooc.com//climg/5d355bcf000110db05940242.jpg

祝学习愉快,望采纳。

  • 提问者 慕斯0469344 #1
    老师,我理解你说的,但您解答的不是我描述的问题。我的问题是这两句代码".screen-2__point{ transition:all 1s 1s; } .screen-2__point_done{ opacity: 1; transform:translate(0,0); } 为什么直接写"screen-2__point_done"因为在js中函数的结尾是“_animate_done”而且程序还没报错?
    2019-07-22 16:07:27
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师