jquerycsscss-transitionsfadeinfadeout

How to animate elements move with css3 transitions after hiding some element


Is it possible to animate elements move with css3 transitions after hiding some element using jQuery's .fadeOut()?

I found some kind of solution here (see "It works for grids, too" section):

However my case is more like this: 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>

I have floating div elements and after some element is hidden, it would be nice if other elements were animated. Is it possible?


Solution

  • You could do something like this which uses a CSS class toggled by a little JavaScript and CSS transitions to do what you're looking for instead of using jQuery.

    // The relevant CSS
    .item {
        // Your original code here
        transition: 0.5s ease-in-out;
    }
    .hide {
        width: 0;
        height: 0;
        opacity: 0;
        margin: 0;
        padding: 0;
    }
    
    // The JavaScript
    const items = document.getElementsByClassName('item');
    for(let i = 0; i < items.length; i++) {
        items[i].addEventListener("click", function() {
            items[i].classList.toggle('hide');
        });
    };
    
    function addBack() {
        for(let i = 0; i < items.length; i++) {
            items[i].classList.remove('hide');
        }
    }
    

    I also took out your buttons and added an "Add all elements back" button:

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

    If you're already using jQuery somewhere else in your project I also made this jQuery version. Here is the JavaScript for that:

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

    Also, you don't need IDs for any of this, so they can be taken out if you so please.