jQuery - 动画元素定位

Posted

技术标签:

【中文标题】jQuery - 动画元素定位【英文标题】:jQuery - Animate Elements Positioning 【发布时间】:2015-01-09 19:24:33 【问题描述】:

如何让下面列出的 jQuery 正确地制作动画?

var search = $('.searchField');
var searchButton = $('.searchSubmit');

search.on('focus', function() 
    search.animate(
        'right':'auto',
        'left':'0'
    , 600);
    searchButton.animate(
        'right':'0',
        'left':'auto'
    , 600);
);
search.on('focusout', function() 
    search.animate(
        'right':'0',
        'left':'auto'
    , 600);
    searchButton.animate(
        'right':'auto',
        'left':'0'
    , 600);
);

理想情况下,我希望searchButton 从左到右,在:focus 上,与search 交换位置。我正在使用动画试图让这两个元素“滑入”它们的新位置,而不是让元素从一侧跳到另一侧。

目前,searchButton 不会在:focus 上向右移动,search 元素会跳转到左侧定位,而不是具有“滑动”效果。

For the live jsFiddle, click here.

【问题讨论】:

【参考方案1】:

我认为使用简单的 CSS 过渡是有意义的:

.searchField 
    /* ... */
    top: 0;
    right: 0;
    transition: all .6s ease;
    &:focus 
        /* ... */
        right: 50px;
        &+.searchSubmit 
            left: 100%;
            margin-left: -50px;
        
    

同样去掉</input>,输入元素是自闭标签:<input />

演示:http://jsfiddle.net/u97jkeq1/8/

【讨论】:

感谢<input /> 的提醒。这个解决方案很简单。 很好,我从来不知道将伪类放在选择器 &:active 中。 +1 @Billy 注意,这是 SASS,而不是纯 CSS :) 谢谢你让我知道,这会让我摸不着头脑【参考方案2】:

我使用 marginRight/marginLeft 来为它们设置动画,而不是使用右/左定位。

我喜欢你使用右/左定位,但在这种情况下,使用左边距更容易。如果您使用右/左定位,您还必须更新您的 css。

另一种选择是使用 javascript 设置一个类并使用 css 过渡来制作动画(就像你对不透明度所做的那样)。

search.on('focus', function() 
  search.animate(
    marginRight: "50"
  , 600);

  searchButton.animate(
    marginLeft: "450"
  , 600);
);

search.on('focusout', function() 
  search.animate(
    marginRight: "0"
  , 600);
  searchButton.animate(
    marginLeft: "0"
  , 600);
);

Updated jsFiddle

【讨论】:

【参考方案3】:

我实际上相信@dfsq 的答案更好,用 CSS 来做。但我想修复原始代码并让其他使用您的问题的人选择方法。

演示: JSFiddle

JS

var search = $('.searchField');
var searchButton = $('.searchSubmit');
var searchWidth = $('.searchField').innerWidth();
var searchButtonWidth = $('.searchSubmit').innerWidth();

var searchContainer = searchWidth + searchButtonWidth;

$('#search').css( width: searchContainer );

search.on('focus', function() 
    search.animate(
        'right':'auto',
        'left':'-10'
    , 400);
    searchButton.animate(
        'right':'0',
        'left':'400'
    , 400);
);
search.on('focusout', function() 
    search.animate(
        'right':'0',
        'left':'50'
    , 400);
    searchButton.animate(
        'right':'auto',
        'left':'0'
    , 400);
);

searchButton.mouseover(function() 
    $('.searchIcon').css('opacity', '0.5');
);
searchButton.mouseout(function() 
    $('.searchIcon').css('opacity', '1');
);

search.bind('keypress', function(event) 
    if (event.keyCode == 13) 
        searchButton.click();
    ;
);

searchButton.click(function() 
    search.val(''); 
);

【讨论】:

以上是关于jQuery - 动画元素定位的主要内容,如果未能解决你的问题,请参考以下文章

重新渲染 HTML 元素定位在 Javascript 幻灯片动画内的窗口调整大小

如何为 jQueryUI 定位元素设置动画

绝对定位元素可以做css3 动画吗

什么更快? CSS3 过渡还是 jQuery 动画?

css如何不改变原位置的使多个图片在原地动画

使用 CSS3 动画会破坏页面中所有元素的固定背景定位