V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
darasion
V2EX  ›  问与答

怎样让元素平滑 (没有跳动) 滑动?

  •  
  •   darasion · 2011-03-31 20:53:40 +08:00 · 5056 次点击
    这是一个创建于 5004 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用 jQuery 的 slideDown/fadeIn 等效果函数时,经常遇到显示出来的东西跳了一下,然后才开始滑动。

    比如要把 display:none; 的一个东西显示出来:
    $('#xxx').slideDown();


    记得哪里写到过,好像用的是css的技巧。
    4 条回复    1970-01-01 08:00:00 +08:00
    darasion
        1
    darasion  
    OP
       2011-04-01 14:57:32 +08:00
    自问自答吧。

    经过一番研究,大概找到了这样一个原因:
    slideDown() 动作的终值是元素高度,这个高度不包括很多元素的 margin ,如果设置了margin-top或 margin-bottom的话,动作最后的跳动就会很厉害。去掉后就好多了。


    另外,滑动动画的另外一种形式是利用 margin-top 。从负值高度起始,运动到0; 外部框架的overflow设置为hidden,这个办法滑动元素内部没有缩放隐藏动作,跳动最小,视觉上感觉最舒服。Google 实时搜索就是这样做的。
    sparklo
        2
    sparklo  
       2011-04-01 16:37:05 +08:00
    我也碰到过这样的问题. 像你说的,slideDown() 动作的终值是元素高度. 我的经验是问题的本质在于你需要指定你要slide的这个element的高度(by pixel),和margin无关. 需要的话这个值可以hard code也可以在page load的时候动态获得. 这似乎是jquery独有的问题, stackoverflow上有很多讨论.

    这篇有详解: http://jqueryfordesigners.com/slidedown-animation-jump-revisited/
    darasion
        3
    darasion  
    OP
       2011-04-01 17:14:16 +08:00
    @sparklo 哦。谢谢。我再研究一下。
    darasion
        4
    darasion  
    OP
       2011-04-01 19:46:36 +08:00
    明白大概了。

    读了一下jQuery作者的书《Pro JavaScript Techniques》,有关获得尺寸的算法,确实都是按照标准来的。所以都没有把 margin 算在内,去掉所有margin就好了。

    另外还发现另外一个影响尺寸计算不一样的地方,就是如果 css hack里边用到的 height:1% 存在,也会出现高度计算错误,动画跳动会很大。


    另外这个问题相关:
    http://stackoverflow.com/questions/1335461/jquery-slide-is-jumpy
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5551 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 02:40 · PVG 10:40 · LAX 18:40 · JFK 21:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.