【问题标题】:jQuery .animate() forces style "overflow:hidden"jQuery .animate() 强制样式“溢出:隐藏”
【发布时间】:2011-03-22 17:44:46
【问题描述】:

jQuery 的.animate() 在触发时强制使用overflow: hidden 样式,这会弄乱我的动画元素,因为我有另一个元素挂在它外面,位置为负。有没有办法避免这种情况?

【问题讨论】:

  • 你可以使用 $('element').animate().css('overflow', 'visible');对于一些测试,你能发布一些代码吗?
  • 这行得通,因为 .animate() 在启动时只设置一次溢出!谢谢 =)
  • 天哪,我只花了大约四个小时试图解决这个问题。是的!!!
  • @tkone 我知道那种感觉,兄弟。

标签: jquery css


【解决方案1】:

使用$('element').animate().css('overflow', 'visible'); 时,如果已经为元素指定了overflow-xoverflow-y,则可能会导致问题。

在这些情况下使用$('element').animate().css('overflow', '');,它只是删除溢出属性并保持overflow-xoverflow-y 不变。

【讨论】:

    【解决方案2】:

    我的首选答案是使用$.Animation.prefilterHere is a jsfiddle.net example.

    设置前置过滤器:

    jQuery.Animation.prefilter(function(element, properties, options) {
      if (options.overrideOverflow) {
        jQuery(element).css("overflow", options.overrideOverflow);
      }
    });
    

    那就用吧

    $(myDiv).animate(
      { height: newHeight},
      {
        duration: 500, 
        overrideOverflow: "visible" // Replace "visible" with your desired overflow value
      }
    );
    

    请注意,您不能使用选项名称 overflow,因为 jQuery 在内部使用它。

    虽然这个特性在 jQuery 中已经存在了一段时间,但文档似乎并不完整。但是draft documentation is available

    另见https://github.com/jquery/api.jquery.com/issues/256

    【讨论】:

    • 这是一种简洁的方法。我没有深入了解 jQuery.Animation 对象上可用的方法。感谢您指出。
    【解决方案3】:

    完美的“鹰”(2 个帖子)。如果我没有看到你的回复,我敢打赌,我会搜索几个小时。

    “Eagle”发布了解决此问题的正确方法。

    所有其他解决方案都只是技巧。这是正确的方法(重申),这就是为什么他们在使用“动画”类时为您提供所有选项。

    以下是一些可用的设置(来自文档,https://api.jquery.com/animate/)。我需要“完成”设置来在动画完成时执行操作。

        duration (default: 400)
        easing (default: swing)
        queue (default: true)
        specialEasing
        step
        progress
        complete
        start
        done
        fail
        always
    

    这将使动画处理变得更加容易,无论是否需要,我都会使用这种格式,用于将来的所有动画。

    【讨论】:

    • 这不是答案。将其发布为评论!但是,您提到的答案是我眼中最大的黑客。您在动画的每一步都添加了溢出:可见,这是完全不需要的,因为您只需设置一次。此外,jquery 正在删除溢出:动画完成时隐藏本身,因此您不必自己这样做。
    【解决方案4】:

    这些解决方案中的任何一个都对我有用,但我找到了诀窍:

    $(myDiv).animate(
       { height: newHeight},
       { duration: 500, 
         queue: false, 
         easing: 'easeOutExpo', 
    
         step: function() {
           $(myDiv).css("overflow","visible");
         }
       }
    );
    

    在动画的每个步骤中强制 css。希望对您有所帮助。

    【讨论】:

      【解决方案5】:

      你可以通过:

      function(e){$('#something').css('overflowY', 'scroll');}

      到 .animate() 选项参数,作为动画“完成”时运行的函数,如下所示:

      $('#something').animate({
                          width: '100px',
                          height: '100px',
                          overflowY: 'scroll !important' //doesn't work
                      }, { duration: 500, queue: false, complete: function(e){$('#something').css('overflowY', 'scroll');} } );
      

      【讨论】:

      • 这有什么帮助?隐藏发生在动画期间,而不是之后
      • 我得说这个解决方案对我有更好的帮助。它让我在动画之后保持滚动,我只是在动画中添加了相同的东西,所以滚动总是在那里。谢谢!
      【解决方案6】:

      另一种方法是在css中将元素声明为!important

      例如。

      .somediv {
        overflow: visible !important;
      }
      

      【讨论】:

      • @ScottGreenfield 不在 Chrome 17.0 中
      • @ScottGreenfield - 这是不正确的。 ! important 优先于内联样式。
      • w3.org/TR/CSS2/cascade.html#cascading-order 作者重要的样式声明会覆盖普通的样式声明,无论特异性如何,内联样式具有最高的特异性,但不会优先于声明为重要的样式。
      【解决方案7】:

      这是源代码:

        if ( isElement && ( p === "height" || p === "width" ) ) {
          // Make sure that nothing sneaks out
          // Record all 3 overflow attributes because IE does not
          // change the overflow attribute when overflowX and
          // overflowY are set to the same value
          opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
        ...
        ...
        ...
        }
      
      if ( opt.overflow != null ) {
        this.style.overflow = "hidden";
      }
      

      您可以根据需要将其注释掉,或者按照之前的建议直接使用 $('element').animate().css('overflow', 'visible');

      将溢出设置为隐藏的原因是,正在动画的元素中的元素将在动画时包含在元素中。例如,如果您减小元素的宽度,则其内容可能会尝试拉长并从底部“掉出”。

      这在上面的源代码中通过注释进行了解释:

      // 确保没有东西溜出去

      希望能为你解释。

      【讨论】:

        猜你喜欢
        • 2018-04-29
        • 2011-06-15
        • 1970-01-01
        • 2017-07-09
        • 2013-10-17
        • 1970-01-01
        • 1970-01-01
        • 2021-09-03
        • 1970-01-01
        相关资源
        最近更新 更多