【问题标题】:How to animate elements move with css3 transitions after hiding some element隐藏某些元素后如何使用css3过渡动画元素移动
【发布时间】:2013-08-24 06:26:32
【问题描述】:

在使用 jQuery 的 .fadeOut() 隐藏某些元素后,是否可以通过 css3 转换为元素移动动画?

我找到了某种解决方案 here(请参阅“它也适用于网格”部分):

但是我的情况更像这样: http://jsfiddle.net/CUzNx/5/

<div class="container">
    <div id="item1" class="item">Test1</div>
    <div id="item2" class="item">Test2</div>
    <div id="item3" class="item">Test3</div>
    <div id="item4" class="item">Test4</div>
    <div id="item5" class="item">Test5</div>
    <div id="item6" class="item">Test6</div>
    <div id="item7" class="item">Test7</div>
</div>

<div style="clear:both">
<button onclick="$('#item1').fadeOut();">
   Hide first
</button>
<button onclick="$('#item1').fadeIn();">
   Show first
</button>
</div>

我有浮动的 div 元素,在隐藏某些元素后,如果其他元素被动画化就好了。有可能吗?

【问题讨论】:

    标签: jquery css css-transitions fadein fadeout


    【解决方案1】:

    您可以使用 something like this,它使用一个由一些 JavaScript 和 CSS 转换切换的 CSS 类来执行您正在寻找的事情,而不是使用 jQuery。

    // The relevant CSS
    .item {
        // Your original code here
        -webkit-transition: all .5s ease-in-out;
        -moz-transition: all .5s ease-in-out;
        -o-transition: all .5s ease-in-out;
        transition: all .5s ease-in-out;
    }
    .hide {
        width: 0;
        height: 0;
        opacity: 0;
        margin: 0;
        padding: 0;
    }
    
    // The JavaScript
    var items = document.getElementsByClassName('item');
    for(var i = 0; i < items.length; i ++) {
        items[i].onclick = function() {
            this.classList.toggle('hide');
        }
    };
    
    function addBack() {
        for(var i = 0; i < items.length; i ++) {
            items[i].classList.remove('hide');
        }
    }
    

    我还取出了您的按钮并添加了一个“添加所有元素”按钮:

    <button onclick='addBack()'>Add all elements back</button>
    

    如果您已经在项目的其他地方使用了 jQuery,我还创建了 this jQuery version。这是用于此的 JavaScript:

    function addBack() {
        $('.item').each(function() {
            $(this).removeClass('hide');
        });
    }
    
    $('.item').on('click', function() {
        $(this).toggleClass('hide');
    });
    

    此外,您不需要任何身份证件,因此如果您愿意,可以将其取出。

    【讨论】:

    • 谢谢,这正是我所需要的。附带说明一下,我使用 Bootstrap 并且已经引入了“隐藏”类,因此需要一些时间来弄清楚为什么该解决方案最初不起作用。
    【解决方案2】:

    一种方法是将要删除的 div 替换为占位符,然后为占位符和原始内容设置动画。

    使用这个 sn-p:Positioning an element over another element with jQuery

    您的代码可以更改为类似这样(我使用单击该项目来触发此处的删除):

    Demo

    CSS

    div { box-sizing: border-box; }
    
    .item, .placeholder {
        float: left;
        width: 100px;
        height: 100px;
        border: 1px solid black;
        margin: 5px;
        position: relative;
        background: white;
        -webkit-transition: all 1s ease;
    }
    
    .placeholder {
        opacity: 0;
        border: 0px;
    }
    
    .item.hide {
        border: 1px solid rgba(0,0,0,0);
        margin: 0px;
        top: 500px;
        opacity: 0;
        overflow: hidden;
        z-index: -1;
    }
    
    .placeholder.hide {
        width: 0;
        height: 0;
        margin: 0;
        border: 0;
    }
    

    脚本

    $('.item').on('click', function(evt) {
        var $this = $(this);
        var $new  = $($this.clone());
    
        $new.addClass('placeholder');
        $this.replaceWith($new);
    
        $this.positionOn($new);
        $this.appendTo($('body'));
    
        setTimeout(function() {
            $this.css({top: '', left: ''});
            $this.addClass('hide');
            $new.addClass('hide');  
        }, 0);
    });
    

    片段来自: Positioning an element over another element with jQuery

    // Reference: http://snippets.aktagon.com/snippets/310-positioning-an-element-over-another-element-with-jquery
    $.fn.positionOn = function(element, align) {
      return this.each(function() {
        var target   = $(this);
        var position = element.position();
    
        var x      = position.left; 
        var y      = position.top;
    
        if(align == 'right') {
          x -= (target.outerWidth() - element.outerWidth());
        } else if(align == 'center') {
          x -= target.outerWidth() / 2 - element.outerWidth() / 2;
        }
    
        target.css({
          position: 'absolute',
          zIndex:   5000,
          top:      y, 
          left:     x
        });
      });
    };
    

    现在,您的旧 div 会在网格崩溃时进行动画处理。

    如果您愿意在代码中添加另一个库,请查看Masonry/Isotope by Metafizzy。它们被设计用来做这种事情。

    【讨论】:

      【解决方案3】:

      您不需要 CSS 过渡。只需使用.hide() 而不是.fadeout()

      <button onclick="$('#item1').hide(400);">
          Hide first
      </button>
      

      请看这里:https://jsfiddle.net/st1o8ngp/

      【讨论】:

      • 虽然这可能适用于某些情况,但添加回隐藏元素的行为是根本不同的
      猜你喜欢
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      • 2015-09-16
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 2014-08-21
      相关资源
      最近更新 更多