如何根据数据属性播放greensock timeline max
How to play greensock timeline max based on a data attribute
目前我在 greensock 论坛上没有得到答案。我有一个搜索栏,当点击 body 的任何地方时,它应该通过点击一个图标展开并再次关闭,但仅当搜索栏展开时。
当我打开搜索栏时,我遇到了关闭动画的两个问题:
(1) 当我点击 body 元素时,关闭动画正在重置,而关闭动画是 运行。
(2) 即使搜索栏未展开,关闭动画也会运行。
我试图通过为不同状态(打开,true/false)的容器添加数据属性来解决这个问题,但不知何故它没有按预期工作。我的代码有没有逻辑错误?
(function($) {
var $irpsearch = $('#irp-newssearch-container'),
$irpsearchinput = $('#irp-searchform-input'),
$search_icon = $('.irp-news-search-icon'),
$btn_container = $('.irp-filter-buttons'),
$filter_btn = $('.filter-btn'),
$search_seperator = $('.irp-search-seperator')
$body = $('body');
var openSearchAnimation = new TimelineMax({
paused: true
})
openSearchAnimation
.staggerTo($filter_btn, .5, {scale: 0.7 ,opacity: 0,ease: Back.easeInOut},-0.1)
.set($btn_container,{'display': 'none'})
.to($search_seperator, .3, {opacity: 0, ease: Expo.easeOut}, '-=0.6')
.to($search_icon, .5, {backgroundColor:"#ffffff", ease: Power0.easeNone}, '-=1.0')
.to($irpsearch, 1.0, {width: '100%', ease: Power3.easeOut}, '-=0.1');
openSearch = function () {
$irpsearch.data('open', true);
openSearchAnimation.play();
$irpsearchinput.focus();
return false;
},
closeSearch = function() {
$irpsearch.data('open', false);
openSearchAnimation.reverse(0);
}
/*$irpsearchinput.on('click', function(e) {
e.stopPropagation();
});*/
$irpsearch.on('click', function(e) {
e.stopPropagation();
if (!$irpsearch.data('open')) {
openSearch();
/* HTML Click */
$body.off('click').on('click', function(e) {
closeSearch();
});
/* Escape Hide */
$( document ).on( 'keydown', function ( e ) {
if ( e.keyCode === 27 ) { // ESC
closeSearch();
}
});
} else {
if ($irpsearchinput.val() === '') {
closeSearch();
return false;
}
}
});
})(jQuery)
Codepen 来说明问题:
https://codepen.io/anon/pen/YQqQWm
我已经更改了一些内容,希望这就是您要找的内容。
主要区别在于我们现在使用 .one(...)
而不是 .on(...)
来绑定我们的事件。这意味着事件只会被执行一次然后被销毁,我们不必跟踪状态。
当网站加载时,我们绑定 $irpsearchinput.one('focus', ...)
。
当 input
获得焦点时将执行该事件。
在函数 openSearch
中,我们绑定 $ripsearchinput.one('blur', ...)
(在 input
失去焦点时执行),在函数 closeSearch
中,我们再次绑定 $irpsearchinput.one('focus', ...)
。
最后,我们确保当您按下 ESC
时,input
会失去焦点(从而触发 blur
绑定。
这是您的 fork 支笔。
目前我在 greensock 论坛上没有得到答案。我有一个搜索栏,当点击 body 的任何地方时,它应该通过点击一个图标展开并再次关闭,但仅当搜索栏展开时。
当我打开搜索栏时,我遇到了关闭动画的两个问题:
(1) 当我点击 body 元素时,关闭动画正在重置,而关闭动画是 运行。
(2) 即使搜索栏未展开,关闭动画也会运行。
我试图通过为不同状态(打开,true/false)的容器添加数据属性来解决这个问题,但不知何故它没有按预期工作。我的代码有没有逻辑错误?
(function($) {
var $irpsearch = $('#irp-newssearch-container'),
$irpsearchinput = $('#irp-searchform-input'),
$search_icon = $('.irp-news-search-icon'),
$btn_container = $('.irp-filter-buttons'),
$filter_btn = $('.filter-btn'),
$search_seperator = $('.irp-search-seperator')
$body = $('body');
var openSearchAnimation = new TimelineMax({
paused: true
})
openSearchAnimation
.staggerTo($filter_btn, .5, {scale: 0.7 ,opacity: 0,ease: Back.easeInOut},-0.1)
.set($btn_container,{'display': 'none'})
.to($search_seperator, .3, {opacity: 0, ease: Expo.easeOut}, '-=0.6')
.to($search_icon, .5, {backgroundColor:"#ffffff", ease: Power0.easeNone}, '-=1.0')
.to($irpsearch, 1.0, {width: '100%', ease: Power3.easeOut}, '-=0.1');
openSearch = function () {
$irpsearch.data('open', true);
openSearchAnimation.play();
$irpsearchinput.focus();
return false;
},
closeSearch = function() {
$irpsearch.data('open', false);
openSearchAnimation.reverse(0);
}
/*$irpsearchinput.on('click', function(e) {
e.stopPropagation();
});*/
$irpsearch.on('click', function(e) {
e.stopPropagation();
if (!$irpsearch.data('open')) {
openSearch();
/* HTML Click */
$body.off('click').on('click', function(e) {
closeSearch();
});
/* Escape Hide */
$( document ).on( 'keydown', function ( e ) {
if ( e.keyCode === 27 ) { // ESC
closeSearch();
}
});
} else {
if ($irpsearchinput.val() === '') {
closeSearch();
return false;
}
}
});
})(jQuery)
Codepen 来说明问题: https://codepen.io/anon/pen/YQqQWm
我已经更改了一些内容,希望这就是您要找的内容。
主要区别在于我们现在使用 .one(...)
而不是 .on(...)
来绑定我们的事件。这意味着事件只会被执行一次然后被销毁,我们不必跟踪状态。
当网站加载时,我们绑定 $irpsearchinput.one('focus', ...)
。
当 input
获得焦点时将执行该事件。
在函数 openSearch
中,我们绑定 $ripsearchinput.one('blur', ...)
(在 input
失去焦点时执行),在函数 closeSearch
中,我们再次绑定 $irpsearchinput.one('focus', ...)
。
最后,我们确保当您按下 ESC
时,input
会失去焦点(从而触发 blur
绑定。
这是您的 fork 支笔。