bs_lib-8.x-1.0-alpha3/js/scroll-to-top.js
js/scroll-to-top.js
/** * @file * Scroll to top JS. */ (function ($) { 'use strict'; /** * bsLibScrollToTop behaviour. * * JS logic partially inspired by https://github.com/CodyHouse/back-to-top * project. */ Drupal.behaviors.bsLibScrollToTop = { attach: function (context, settings) { var scrolling = false, $html = $('html'), $body = $('body'); $(once('bs-lib-scroll-to-top', '.bs-lib-scroll-to-top', context)).each(function () { var $this = $(this), offset = $this.data('offset'), offsetOpacity = $this.data('offset_opacity'), offsetTop = null, opacity = false, $positionFixedDisableElement = $($this.data('position_fixed_disable_element')), parentTop = null, isFixed = $this.hasClass('bs-lib-scroll-to-top--fixed'); if ($positionFixedDisableElement.length == 0) { $positionFixedDisableElement = false; } function checkScrollToTop() { var windowTop = window.scrollY || document.documentElement.scrollTop; if (windowTop >= offset) { $this.addClass('bs-lib-scroll-to-top--show'); if (windowTop < offsetOpacity) { if (!opacity) { opacity = true; $this.addClass('bs-lib-scroll-to-top--fade-out'); } } else if (opacity) { opacity = false; $this.removeClass('bs-lib-scroll-to-top--fade-out'); } // Disabled fixed positioning when target element is reached. if ($positionFixedDisableElement) { offsetTop = $this.offset().top; parentTop = $positionFixedDisableElement.offset().top; if (isFixed && offsetTop >= parentTop) { isFixed = false; $this.removeClass('bs-lib-scroll-to-top--fixed'); } else if (!isFixed && offsetTop + $this.get(0).getBoundingClientRect().height > windowTop + window.innerHeight) { isFixed = true; $this.addClass('bs-lib-scroll-to-top--fixed'); } } } else { opacity = false; $this.removeClass('bs-lib-scroll-to-top--show bs-lib-scroll-to-top--fade-out'); } scrolling = false; } if (isFixed) { // Update scroll to top visibility on scrolling. window.addEventListener('scroll', function() { if (!scrolling) { scrolling = true; (!window.requestAnimationFrame) ? setTimeout(checkScrollToTop, 250) : window.requestAnimationFrame(checkScrollToTop); } }); checkScrollToTop(); } $this.click(function () { // https://stackoverflow.com/a/26681608 var $root = $html.scrollTop() ? $html : $body; $root.animate({ scrollTop: 0 }, $this.data('duration'), $this.data('easing')); return false; }); }); } }; })(jQuery);