(function($){
    
    $.fn.transitionHeight = function(){
        
        var element = $(this);
        var height = element.height();
        
        element.off('transitionend', transitionEnded).css({'height':height});
        
        requestAnimationFrame(function(){

            element.css({
                'transition':'none',
                'height':''
            });
            
            var newHeight = element.height();
                
            if(newHeight == height){

                element.css({
                    'transition':'',
                });

            }else{

                element.css({
                    'height':height,
                    'visibility':'inherit'
                });

                requestAnimationFrame(function(){
                    element.css({
                        'height':newHeight,
                        'transition':'',
                        'visibility':''
                    }).on('transitionend', transitionEnded);
                });
                
            }
            
        });
        
        return element;
        
    }
    
    function transitionEnded(event){
        if(event.target == this){
            var element = $(this);
            element.off('transitionend', transitionEnded);
            element.css({
                'height':''
            });
            $('body').css({'overflow-anchor': ''});
        }
    }

}(jQuery));