Вход Регистрация
Файл: tyde/www/web/js/components/sticky.js
Строк: 355
<?php
/*! UIkit 2.24.3 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
(function(addon) {

    var 
component;

    if (
window.UIkit) {
        
component addon(UIkit);
    }

    if (
typeof define == "function" && define.amd) {
        
define("uikit-sticky", ["uikit"], function(){
            return 
component || addon(UIkit);
        });
    }

})(function(
UI){

    
"use strict";

    var 
$win         UI.$win,
        
$doc         UI.$doc,
        
sticked      = [],
        
direction    1;

    
UI.component('sticky', {

        
defaults: {
            
top          0,
            
bottom       0,
            
animation    '',
            
clsinit      'uk-sticky-init',
            
clsactive    'uk-active',
            
clsinactive  '',
            
getWidthFrom '',
            
showup      false,
            
boundary     false,
            
media        false,
            
target       false,
            
disabled     false
        
},

        
boot: function() {

            
// should be more efficient than using $win.scroll(checkscrollposition):
            
UI.$doc.on('scrolling.uk.document', function(edata) {
                if (!
data || !data.dir) return;
                
direction data.dir.y;
                
checkscrollposition();
            });

            
UI.$win.on('resize orientationchange'UI.Utils.debounce(function() {

                if (!
sticked.length) return;

                for (var 
0sticked.lengthi++) {
                    
sticked[i].reset(true);
                    
//sticked[i].self.computeWrapper();
                
}

                
checkscrollposition();
            }, 
100));

            
// init code
            
UI.ready(function(context) {

                
setTimeout(function(){

                    
UI.$("[data-uk-sticky]"context).each(function(){

                        var 
$ele UI.$(this);

                        if(!
$ele.data("sticky")) {
                            
UI.sticky($eleUI.Utils.options($ele.attr('data-uk-sticky')));
                        }
                    });

                    
checkscrollposition();
                }, 
0);
            });
        },

        
init: function() {

            var 
wrapper  UI.$('<div class="uk-sticky-placeholder"></div>'), boundary this.options.boundaryboundtoparent;

            
this.wrapper this.element.css('margin'0).wrap(wrapper).parent();

            
this.computeWrapper();

            if (
boundary) {

                if (
boundary === true || boundary[0] === '!') {

                    
boundary      boundary === true this.wrapper.parent() : this.wrapper.closest(boundary.substr(1));
                    
boundtoparent true;

                } else if (
typeof boundary === "string") {
                    
boundary UI.$(boundary);
                }
            }

            
this.sticky = {
                
self          this,
                
options       this.options,
                
element       this.element,
                
currentTop    null,
                
wrapper       this.wrapper,
                
init          false,
                
getWidthFrom  UI.$(this.options.getWidthFrom || this.wrapper),
                
boundary      boundary,
                
boundtoparent boundtoparent,
                
top           0,
                
calcTop       : function() {

                    var 
top this.options.top;

                    
// dynamic top parameter
                    
if (this.options.top && typeof(this.options.top) == 'string') {

                        
// e.g. 50vh
                        
if (this.options.top.match(/^(-|)(d+)vh$/)) {
                            
top window.innerHeight parseInt(this.options.top10)/100;
                        
// e.g. #elementId, or .class-1,class-2,.class-3 (first found is used)
                        
} else {

                            var 
topElement UI.$(this.options.top).first();

                            if (
topElement.length && topElement.is(':visible')) {
                                
top = -* ((topElement.offset().top topElement.outerHeight()) - this.wrapper.offset().top);
                            }
                        }

                    }

                    
this.top top;
                },

                
reset: function(force) {

                    
this.calcTop();

                    var 
finalize = function() {
                        
this.element.css({"position":"""top":"""width":"""left":"""margin":"0"});
                        
this.element.removeClass([this.options.animation'uk-animation-reverse'this.options.clsactive].join(' '));
                        
this.element.addClass(this.options.clsinactive);
                        
this.element.trigger('inactive.uk.sticky');

                        
this.currentTop null;
                        
this.animate    false;
                    }.
bind(this);


                    if (!
force && this.options.animation && UI.support.animation && !UI.Utils.isInView(this.wrapper)) {

                        
this.animate true;

                        
this.element.removeClass(this.options.animation).one(UI.support.animation.end, function(){
                            
finalize();
                        }).
width(); // force redraw

                        
this.element.addClass(this.options.animation+' '+'uk-animation-reverse');
                    } else {
                        
finalize();
                    }
                },

                
check: function() {

                    if (
this.options.disabled) {
                        return 
false;
                    }

                    if (
this.options.media) {

                        switch(
typeof(this.options.media)) {
                            case 
'number':
                                if (
window.innerWidth this.options.media) {
                                    return 
false;
                                }
                                break;
                            case 
'string':
                                if (
window.matchMedia && !window.matchMedia(this.options.media).matches) {
                                    return 
false;
                                }
                                break;
                        }
                    }

                    var 
scrollTop      $win.scrollTop(),
                        
documentHeight $doc.height(),
                        
dwh            documentHeight window.innerHeight,
                        
extra          = (scrollTop dwh) ? dwh scrollTop 0,
                        
elementTop     this.wrapper.offset().top,
                        
etse           elementTop this.top extra,
                        
active         = (scrollTop  >= etse);

                    if (
active && this.options.showup) {

                        
// set inactiv if scrolling down
                        
if (direction == 1) {
                            
active false;
                        }

                        
// set inactive when wrapper is still in view
                        
if (direction == -&& !this.element.hasClass(this.options.clsactive) && UI.Utils.isInView(this.wrapper)) {
                            
active false;
                        }
                    }

                    return 
active;
                }
            };

            
this.sticky.calcTop();

            
sticked.push(this.sticky);
        },

        
update: function() {
            
checkscrollposition(this.sticky);
        },

        
enable: function() {
            
this.options.disabled false;
            
this.update();
        },

        
disable: function(force) {
            
this.options.disabled true;
            
this.sticky.reset(force);
        },

        
computeWrapper: function() {

            
this.wrapper.css({
                
'height' : ['absolute','fixed'].indexOf(this.element.css('position')) == -this.element.outerHeight() : '',
                
'float'  this.element.css('float') != 'none' this.element.css('float') : '',
                
'margin' this.element.css('margin')
            });

            if (
this.element.css('position') == 'fixed') {
                
this.element.css({
                    
widththis.sticky.getWidthFrom.length this.sticky.getWidthFrom.width() : this.element.width()
                });
            }
        }
    });

    function 
checkscrollposition(direction) {

        var 
stickies arguments.length arguments sticked;

        if (!
stickies.length || $win.scrollTop() < 0) return;

        var 
scrollTop       $win.scrollTop(),
            
documentHeight  $doc.height(),
            
windowHeight    $win.height(),
            
dwh             documentHeight windowHeight,
            
extra           = (scrollTop dwh) ? dwh scrollTop 0,
            
newTopcontainerBottomstickyHeightsticky;

        for (var 
0stickies.lengthi++) {

            
sticky stickies[i];

            if (!
sticky.element.is(":visible") || sticky.animate) {
                continue;
            }

            if (!
sticky.check()) {

                if (
sticky.currentTop !== null) {
                    
sticky.reset();
                }

            } else {

                if (
sticky.top 0) {
                    
newTop 0;
                } else {
                    
stickyHeight sticky.element.outerHeight();
                    
newTop documentHeight stickyHeight sticky.top sticky.options.bottom scrollTop extra;
                    
newTop newTop newTop sticky.top sticky.top;
                }

                if (
sticky.boundary && sticky.boundary.length) {

                    var 
bTop sticky.boundary.offset().top;

                    if (
sticky.boundtoparent) {
                        
containerBottom documentHeight - (bTop sticky.boundary.outerHeight()) + parseInt(sticky.boundary.css('padding-bottom'));
                    } else {
                        
containerBottom documentHeight bTop parseInt(sticky.boundary.css('margin-top'));
                    }

                    
newTop = (scrollTop stickyHeight) > (documentHeight containerBottom - (sticky.top sticky.top)) ? (documentHeight containerBottom) - (scrollTop stickyHeight) : newTop;
                }


                if (
sticky.currentTop != newTop) {

                    
sticky.element.css({
                        
position "fixed",
                        
top      newTop,
                        
width    sticky.getWidthFrom.length sticky.getWidthFrom.width() : sticky.element.width(),
                        
left     sticky.wrapper.offset().left
                    
});

                    if (!
sticky.init) {

                        
sticky.element.addClass(sticky.options.clsinit);

                        if (
location.hash && scrollTop && sticky.options.target) {

                            var 
$target UI.$(location.hash);

                            if (
$target.length) {

                                
setTimeout((function($targetsticky){

                                    return function() {

                                        
sticky.element.width(); // force redraw

                                        
var offset       $target.offset(),
                                            
maxoffset    offset.top $target.outerHeight(),
                                            
stickyOffset sticky.element.offset(),
                                            
stickyHeight sticky.element.outerHeight(),
                                            
stickyMaxOffset stickyOffset.top stickyHeight;

                                        if (
stickyOffset.top maxoffset && offset.top stickyMaxOffset) {
                                            
scrollTop offset.top stickyHeight sticky.options.target;
                                            
window.scrollTo(0scrollTop);
                                        }
                                    };

                                })(
$targetsticky), 0);
                            }
                        }
                    }

                    
sticky.element.addClass(sticky.options.clsactive).removeClass(sticky.options.clsinactive);
                    
sticky.element.trigger('active.uk.sticky');
                    
sticky.element.css('margin''');

                    if (
sticky.options.animation && sticky.init && !UI.Utils.isInView(sticky.wrapper)) {
                        
sticky.element.addClass(sticky.options.animation);
                    }

                    
sticky.currentTop newTop;
                }
            }

            
sticky.init true;
        }
    }

    return 
UI.sticky;
});
?>
Онлайн: 0
Реклама