mirror of https://github.com/lxndrblz/anatole.git

Alexander Bilz
09.04.2020 02e9faedfc6e2ee701fd768a73e35c5642942adb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/*
 * jQuery appear plugin
 *
 * Copyright (c) 2012 Andrey Sidorov
 * licensed under MIT license.
 *
 * https://github.com/morr/jquery.appear/
 *
 * Version: 0.4
 */
(function ($) {
    var selectors = [];
 
    var check_binded = false;
    var check_lock = false;
    var defaults = {
        interval: 250,
        force_process: false
    };
    var $window = $(window);
 
    var $prior_appeared = [];
 
    function appeared(selector) {
        return $(selector).filter(function () {
            return $(this).is(':appeared');
        });
    }
 
    function process() {
        check_lock = false;
        for (var index = 0, selectorsLength = selectors.length; index < selectorsLength; index++) {
            var $appeared = appeared(selectors[index]);
 
            $appeared.trigger('appear', [$appeared]);
 
            if ($prior_appeared[index]) {
                var $disappeared = $prior_appeared[index].not($appeared);
                $disappeared.trigger('disappear', [$disappeared]);
            }
            $prior_appeared[index] = $appeared;
        }
    }
 
    function add_selector(selector) {
        selectors.push(selector);
        $prior_appeared.push();
    }
 
    // ":appeared" custom filter
    $.expr.pseudos.appeared = $.expr.createPseudo(function (arg) {
        return function (element) {
            var $element = $(element);
            if (!$element.is(':visible')) {
                return false;
            }
 
            var window_left = $window.scrollLeft();
            var window_top = $window.scrollTop();
            var offset = $element.offset();
            var left = offset.left;
            var top = offset.top;
 
            if (top + $element.height() >= window_top &&
                top - ($element.data('appear-top-offset') || 0) <= window_top + $window.height() &&
                left + $element.width() >= window_left &&
                left - ($element.data('appear-left-offset') || 0) <= window_left + $window.width()) {
                return true;
            } else {
                return false;
            }
        };
    });
 
    $.fn.extend({
        // watching for element's appearance in browser viewport
        appear: function (selector, options) {
            $.appear(this, options);
            return this;
        }
    });
 
    $.extend({
        appear: function (selector, options) {
            var opts = $.extend({}, defaults, options || {});
 
            if (!check_binded) {
                var on_check = function () {
                    if (check_lock) {
                        return;
                    }
                    check_lock = true;
 
                    setTimeout(process, opts.interval);
                };
 
                $(window).scroll(on_check).resize(on_check);
                check_binded = true;
            }
 
            if (opts.force_process) {
                setTimeout(process, opts.interval);
            }
 
            add_selector(selector);
        },
        // force elements's appearance check
        force_appear: function () {
            if (check_binded) {
                process();
                return true;
            }
            return false;
        }
    });
})(function () {
    if (typeof module !== 'undefined') {
        // Node
        return require('jquery');
    } else {
        return jQuery;
    }
}());