animation:'fadeSlideUpDown'没有效果

animation:'fadeSlideUpDown'没有效果

<!DOCTYPE html>

<html>

<head>

<title>mutao</title>

<link rel="stylesheet" type="text/css" href="css/base.css">

<style type="text/css">

.dropdown{

position: relative;

}

.dropdown-toggle{

position: relative;

z-index: 2;

}

.dropdown-arrow{

display: inline-block;            

background-repeat:  no-repeat;

vertical-align: middle;

}

.dropdown-layer{

z-index: 1;

display: none;

position: absolute;

overflow: hidden;

}

.dropdown-left{

left: 0;

right: auto;

}

.dropdown-right{

right: 0;

left: auto;

}


/*.menu .dropdown*/

/*剔除公共样式*/

.menu .dropdown-toggle{

display: block;

height: 100%;

padding: 0 16px 0 12px;

border-left: 1px solid #f3f5f7;

border-right: 1px solid #f3f5f7;

}

.dropdown-arrow{

width: 8px;

height: 6px;

/*background-image: url(./img/dropdown-arrow.png);*/

margin-left: 8px;

}

.dropdown-layer{

top: 100%;

background-color: #fff;

border: 1px solid #cdd0d4;

}

.menu-item{

display: block;

height: 30px;

line-height: 30px;

padding: 0 12px;

color: #4d555d;

/*不换行*/

white-space: nowrap;

}

.menu-item:hover{

background-color: #f3f5f7;

}

/*第二种方法:js移入移出,使用addClass*/

.menu-active .dropdown-toggle{

background-color:#fff;

border-color:#cdd0d4;

}

.menu-active .dropdown-arrow{

/*background-image:url(./img/dropdown-arrow-active.png);*/

}

/*第三种方法:直接用css hover*/

/*移入.dropdown:hover*/

/*对.dropdown-toggle设置效果*/

/*.menu.dropdown:hover .dropdown-toggle{

background-color:#fff;

border-color:#cdd0d4;

}

.menu.dropdown:hover .dropdown-arrow{

background-image:url(../img/dropdown-arrow-active.png);

}

.menu.dropdown:hover .dropdown-layer{

display: block;

}

*/



@font-face {

        font-family: "iconfont";

        src: url('font/iconfont.eot?t=1477124206');

        /* IE9*/

        src: url('font/iconfont.eot?t=1477124206#iefix') format('embedded-opentype'), /* IE6-IE8 */

        url('font/iconfont.woff?t=1477124206') format('woff'), /* chrome, firefox */

        url('font/iconfont.ttf?t=1477124206') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/

        url('font/iconfont.svg?t=1477124206#iconfont') format('svg');

        /* iOS 4.1- */

    }


    .icon {

        font-family: "iconfont" !important;

        font-size: 14px;

        font-style: normal;

        -webkit-font-smoothing: antialiased;

        -webkit-text-stroke-width: 0.2px;

        -moz-osx-font-smoothing: grayscale;

    }



/*包含-active的*/

[class*="-active"].dropdown-arrow{

-o-transform: rotate(180deg);

-ms-transform: rotate(180deg);

-moz-transform: rotate(180deg);

-webkit-transform: rotate(180deg);

transform: rotate(180deg);

}



.fadeout

{

visibility: hidden !important;

opacity: 0 !important;

}

.slideUpDownCollapse{

height: 0 !important;

padding-top: 0 !important;

padding-bottom: 0 !important;

}

.slideLeftRightCollapse{

width: 0 !important;

padding-left: 0 !important;

padding-right: 0 !important;

}

</style>

</head>

<body>

<div class="menu dropdown">


<div class="menu dropdown" data-active="menu">

<a href="###" target="_blank" class="dropdown-toggle">我的慕淘<i class="dropdown-arrow icon">&#xe609;</i></a>

<ul class="dropdown-layer dropdown-left">

<li><a href="###" target="_blank" class="menu-item">已买到的宝贝</a></li>

<li><a href="###" target="_blank" class="menu-item">我的足迹</a></li>

</ul>

</div>

<script type="text/javascript" src="https://code.jquery.com/jquery-3.4.1.min.js"></script>

<script type="text/javascript" src="js/transition2.js"></script>

<script type="text/javascript" src="js/showhide2.js"></script>

<script type="text/javascript" src="js/dropdown.js"></script>

<script type="text/javascript">

//插件的调用

$('.dropdown').dropdown();

</script>

</body>

</html>



// 创建一个局部作用域,避免暴露在全局作用域下

//封装一个模块

// 自我执行的匿名函数

(function($){

// 严格模式,写代码要求会更加严格规范

// 它的作用有:

// (1) 消除Javascript语法的一些不合理、不严谨之处,

// (2)消除代码运行的一些不安全之处,保证代码运行的安全;

// 比如:在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,全局变量必须显式声明。

'use strict';

//dropdown

// $('.dropdown').hover(function(){

// // 把$(this)缓存下来,防止后面获取多次

// var $this=$(this);

// $this.addClass($this.data('active')+'-active');

// },function(){

// var $this=$(this);

// $this.removeClass($this.data('active')+'-active');

// })


// 由上面的方法改造而成的公共方法,只需要在html设置不同的data-active

function dropdown(elem){

// 把参数转为jQuery对象

var $elem=$(elem),

$layer=$elem.find('.dropdown-layer'),

activeClass=$elem.data('active')+'-active';//提前拼接好


$layer.showHide({

css3:true,

js:true,

animation:'fadeSlideUpDown'

})

$elem.hover(function(){

$elem.addClass(activeClass);

$layer.showHide('show')

},function(){

$elem.removeClass(activeClass);

$layer.showHide('hide')

})

}

// 一般方法:调用dropdown函数

// 调用方法的参数为单数,这里获取到的是一个数组,所以需要设置索引,取出他的第一个

// dropdown($('.dropdown')[1])

// console.log($('.dropdown')[0])


// 方法一:当对多个html元素设置dropdown,可以用each遍历所有的dropdown

// $('.dropdown').each(function(){

// dropdown($(this))

// })



// 方法二:当对多个html元素设置dropdown,可以用jQuery的插件

// $.fn)是jQuery的原型对象,也就是prototype,extend()方法是jQuery中封装的方法,用于为jQuery的原型添加新的属性和方法,这些方法可以在jQuery实例对象上调用。

// 这段代码也就是在jQuery原型上添加定义的dropdown方法,然后哪个元素使用这个方法,调用这个方法即可:

$.fn.extend({

dropdown:function(){

//返回时遍历所有元素

return this.each(function(){

dropdown(this)

})

}

})

// //插件的调用

// $('.dropdown').dropdown();

})(jQuery)



(function($){

'use strict';


var transition=window.mt.transition;

// hiddenCallback:确定你是隐藏时的回调

function init(elem,hiddenCallback){

if(elem.is(':hidden')){

//hidden

elem.data('status','hidden')

if(typeof hiddenCallback==='function') hiddenCallback();

}else{

//shown

elem.data('status','shown')

}

}

function show(elem,callback){

if(elem.data('status')==='show') return;

if(elem.data('status')==='shown') return;

//动画开始触发show

elem.data('status','show').trigger('show')

callback();

}

function hide(elem,callback){

if(elem.data('status')==='hide') return;

if(elem.data('status')==='hidden') return;


elem.data('status','hide').trigger('hide')

callback();

}

var silent={

init:init,

show:function(elem){

show(elem,function(){

elem.show();

elem.data('status','shown').trigger('shown')

})

},

hide:function(elem){

hide(elem,function(){

elem.hide();

elem.data('status','hidden').trigger('hidden')

})

}

};

var css3={

fade:{

init:function(elem){

css3._init(elem,'fadeout')

},

show:function(elem){

css3._show(elem,'fadeout')

},

hide:function(elem){

css3._hide(elem,'fadeout')

}

},

slideUpDown:{

init:function(elem){

// 给元素设置与其相同的高度(当元素由子元素撑开时可用)

elem.height(elem.height())

css3._init(elem,'slideUpDownCollapse')

},

show:function(elem){

css3._show(elem,'slideUpDownCollapse')

},

hide:function(elem){

css3._hide(elem,'slideUpDownCollapse')

}

},

slideLeftRight:{

init:function(elem){

elem.width(elem.width)

css3._init(elem,'slideLeftRightCollapse')

},

show:function(elem){

css3._show(elem,'slideLeftRightCollapse')

},

hide:function(elem){

css3._hide(elem,"slideLeftRightCollapse")

}

},

fadeSlideUpDown:{

init:function(elem){

css3._init(elem,'slideUpDownCollapse fadeout')

},

show:function(elem){

css3._show(elem,'slideUpDownCollapse fadeout')

},

hide:function(elem){

css3._hide(elem,'slideUpDownCollapse fadeout')

}

},

fadeSlideLeftRight:{

init:function(elem){

css3._init(elem,'slideLeftRightCollapse fadeout')

},

show:function(elem){

css3._show(elem,'slideLeftRightCollapse fadeout')

},

hide:function(elem){

css3._hide(elem,'slideLeftRightCollapse fadeout')

}

}

};

css3._init=function(elem,className){

elem.addClass('transition');

init(elem,function(){

elem.addClass(className)

})

};

css3._show=function(elem,className){

show(elem,function(){

//动画结束触发shown

//off()移除之前的事件(当连续点击不同按钮,每个按钮的方法都会运行一遍,移除之后,再连续切换按钮,就会停止,不再执行后面的事件)

elem.off(transition.end).one(transition.end,function(){

elem.data('status','shown').trigger('shown')

});

elem.show();

setTimeout(function(){

elem.removeClass(className)

},20);

})

};

css3._hide=function(elem,className){

hide(elem,function(){

// 给动画绑定一个事件,当动画播放完就隐藏起来

elem.off(transition.end).one(transition.end,function(){

elem.hide();

elem.data('status','hidden').trigger('hidden')

})

elem.addClass(className)

})

}

var js={

fade:{

init:function(elem){

js._init(elem)

},

show:function(elem){

js._show(elem,'fadeIn')

},

hide:function(elem){

js._hide(elem,'fadeOut')

}

},

slideUpDown:{

init:function(elem){

js._init(elem)

},

show:function(elem){

js._show(elem,'slideDown')

console.log('slideUpDown-show')

},

hide:function(elem){

js._hide(elem,'slideUp')

console.log('slideUpDown-hide')


}

},

slideLeftRight:{

init:function(elem){

js._customInit(elem,{

'width':0,

'padding-left':0,

'padding-right':0

})

},

show:function(elem){

js._customShow(elem)

},

hide:function(elem){

js._customHide(elem,{

'width':0,

'padding-left':0,

'padding-right':0

})

}

},

fadeSlideUpDown:{

init:function(elem){

js._customInit(elem,{

'opacity':0,

'height':0,

'padding-top':0,

'padding-bottom':0

})

},

show:function(elem){

js._customShow(elem)

},

hide:function(elem){

js._customHide(elem,{

'opacity':0,

'height':0,

'padding-top':0,

'padding-bottom':0

})

}

},

fadeSlideLeftRight:{

init:function(elem){

js._customInit(elem,{

'opacity':0,

'width':0,

'padding-left':0,

'padding-right':0

})

},

show:function(elem){

js._customShow(elem)

},

hide:function(elem){

js._customHide(elem,{

'opacity':0,

'width':0,

'padding-left':0,

'padding-right':0

})

}

}};

js._init=function(elem,hiddenCallback){

// js操作动画的时候,不能用transition

elem.removeClass('transition')

init(elem,hiddenCallback)

}

js._customInit=function(elem,options){

var styles={};

for(var p in options){

styles[p]=elem.css(p)

}


elem.data('styles',styles)

js._init(elem,function(){

elem.css(options)

})

}

js._show=function(elem,mode){

show(elem,function(){

// 当动画结束,设置状态并触发shown

//stop()移除之前的事件(当连续点击不同按钮,每个按钮的方法都会运行一遍,移除之后,再连续切换按钮,就会停止,不再执行后面的事件)

elem.stop()[mode](function(){

elem.data('status','shown').trigger('shown');

});

})

}

js._customShow=function(elem){

show(elem,function(){

elem.show();

elem.stop().animate(elem.data('styles'),function(){

elem.data('status','shown').trigger('shown')

})

})

}

js._hide=function(elem,mode){

hide(elem,function(){

elem.stop()[mode](function(){

elem.data('status','hidden').trigger('hidden');

});

})

}

js._customHide=function(elem,options){

hide(elem,function(){

elem.stop().animate(options,function(){

// 动画执行完毕就隐藏起来

elem.hide();

elem.data('status','hidden').trigger('hidden')

})

})

}


//默认值

var defaults={

css3:false,

js:false,

animation:'fade'

};

// options:给元素设置的动画样式,当调用showHide时,传入一个对象,里面就是具体的动画效果

function showHide(elem,options){

var mode=null;

// 

if(options.css3&&transition.isSupport){

// 当传参错误时,执行defaults.animation

mode=css3[options.animation]||css3[defaults.animation]

}else if(options.js){

mode=js[options.animation]||js[defaults.animation]

}else{

mode=silent

}

mode.init(elem);

return{

// $.proxy方法主要是用来传参数的。

show:$.proxy(mode.show,this,elem),

hide:$.proxy(mode.hide,this,elem)

}

}


//插件的方式

//在jq原型上扩展一个方法,对外可以直接调用showHide

//方法中有一个参数

$.fn.extend({

showHide:function(option){

////将调用方法的元素进行循环遍历,有可能是多个元素

return this.each(function(){

// $this:elem

// 将循环的每一个元素赋值给$this变量

var $this=$(this),

// 检测传入的参数option是否是一个对象,如果是的话,和默认的参数default合并成一个对象,再赋值给options参数

options=$.extend({},defaults,typeof options==='object'&& option),

// 通过data方法获取showHide属性值

mode=$this.data('showHide');

if(!mode){

//使用data方法添加上showHide属性,属性值是调用showHide方法返回出来的一个对象,里面有两个方法

$this.data('showHide',mode=showHide($this,options))


}

//传入的参数是showHide()的方法名,那就执行这个方法

if(typeof mode[option]==='function'){

mode[option]();

}

})

}

})

window.mt=window.mt||{};

window.mt.showHide=showHide;


})(jQuery);



(function(){

//判断浏览器是否支持transition过渡

var transitionEndEventName={

transition:'transitionend',

MozTransition:'transitionend',

WebkitTransition:'webkitTransitionEnd',

OTransition:'oTransition otransition'

};

var transitionEnd='',

isSupport=false;

for(var name in transitionEndEventName){

if(document.body.style[name]!==undefined){

transitionEnd=transitionEndEventName[name]

isSupport=true;

}

break;

}

// 在全局作用域下暴露一个变量

window.mt=window.mt||{};

window.mt.transition={

end:transitionEnd,

isSupport:isSupport

}

})()


正在回答 回答被采纳积分+1

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

1回答
好帮手慕星星 2020-04-07 16:09:25

同学你好,代码中问题如下:

1、调用的时候需要传入需要的动画

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

2、showHide.js中

  • 进行合并的时候传入的参数是option,不是options

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

  • 下拉的效果需要在初始化的时候设置高度

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

3、样式中没有transition过渡效果,需要添加上

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

自己再修改测试下,祝学习愉快!

问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
2.组件化网页开发
  • 参与学习           人
  • 提交作业       1121    份
  • 解答问题       14456    个

本阶段在运用JS实现动态网页开发的基础上,带你深入理解企业开发核心思想,完成一个企业级网页的开发,体验前端工程师的成就感。

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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