MrQ
MrQ

Reputation: 347

How to hide elements (with smooth transition) by class with javascript?

I have a group of divs that share the same class (optionsclass). The display is set to block. When a user clicks them the following javascript function is executed the display is changed to none.

function hideBlockElementsByClass(className)
{
    var elements = document.getElementsByClassName(className);
    for(i in elements)
    {
        elements[i].style.display = "none";
    }
}

The transition between display block and none is quite rough and I would like to make a smoother transition. What's the best strategy to accomplish this?

Upvotes: 2

Views: 15568

Answers (5)

Lelik
Lelik

Reputation: 37

You can combine CSS transitioning with your Javascript events:

const block=document.querySelector('.block');

block.addEventListener('click',function(){
this.classList.add('hidden');
})
.container{
  position:retlative
}
.block{
  transition: visibility 0.2s linear,opacity 0.3s linear;
  cursor:pointer;
}
.hidden{
  position: absolute;
  top:0;
  left: 0;
  opacity: 0;
  visibility:hidden;
  }
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
  </head>
  <body>
      <div class='container'>
        <div class='block' title='click me'>
        click me
        </div>
      </div>
   </body> 
</html>  

Upvotes: 0

Vicky Gonsalves
Vicky Gonsalves

Reputation: 11707

try this in plain javascript:(Will work on IE10, chrome, firefox, safari, android, ios)

<script>
       function hideBlockElementsByClass(className) {
            var elements = document.getElementsByClassName(className);
            console.log(elements.length)
            for (var i = 0; i < elements.length; i++) {
                (function (a) {
                    elements[a].addEventListener('webkitTransitionEnd', function () {
                        elements[a].style.display = "none";
                    }, false);
                    elements[a].addEventListener('mozTransitionEnd', function () {
                        elements[a].style.display = "none";
                    }, false);
                    elements[a].addEventListener('oTransitionEnd', function () {
                        elements[a].style.display = "none";
                    }, false);
                    elements[a].addEventListener('transitionend', function () {
                        elements[a].style.display = "none";
                    }, false);
                })(i);
                elements[i].style.webkitTransitionDuration = "1s";
                elements[i].style.mozTransitionDuration = "1s";
                elements[i].style.oTransitionDuration = "1s";
                elements[i].style.transitionDuration = "1s";
                elements[i].style.opacity = "0";
            }
        }
    </script>

Upvotes: 0

Ankit Tyagi
Ankit Tyagi

Reputation: 2375

Use CSS3 :

.className { 
 opacity: 0; 
 visibility: hidden;
 -webkit-transition: visibility 0.2s linear,
 opacity 0.2s linear;
 -moz-transition: visibility 0.2s linear,
 opacity 0.2s linear;
 -o-transition: visibility 0.2s linear,
 opacity 0.2s linear; 
}

.className:hover { 
visibility: visible; 
opacity: 1; 
}

Upvotes: 6

Timmetje
Timmetje

Reputation: 7694

While Sridhar gives a nice CSS3 solution and other mention Jquery.

Here you can find a pure javascript/CSS solution:

https://codereview.stackexchange.com/questions/7315/fade-in-and-fade-out-in-pure-javascript

Upvotes: 1

Sridhar R
Sridhar R

Reputation: 20408

Try this method

HTML

<div class = "image"  onclick = "eff()"></div>

CSS

    .transition {
        -moz-transition: 2s width;
        width: 150px;
        height: 100px;

    }

Script

function eff() {
    var k = document.getElementsByClassName("image"); 
    k[0].className = "transition";
}

Upvotes: 0

Related Questions