恒星.js - 为垂直滚动网站配置偏移/对齐元素



我已经找到并正在尝试使用一个名为stellar.js的插件。它主要用于为网站创建视差效果,但是,我不是在追求这种效果 - 我追求它提供的其他效果:

Stellar.js最强大的功能是它对齐元素的方式。

所有元素将返回到其原始位置,当它们 偏移父项与屏幕边缘相遇 - 加上或减去您自己的边缘 可选偏移量。

偏移定位的示例:http://markdalgleish.com/projects/stellar.js/#show-offsets 。当您滚动到div 上时,它会捕捉/重新对齐到浏览器的边缘。我正在尝试让它适用于垂直网站。

我没有太多的运气 - 由于我对Javascript和jQuery的新手知识。我以为这只是将水平线切换到垂直线的情况。

以前有没有人玩过这个插件,或者将其用于类似的场景,并得到了任何提示?

所有

代码的jsFiddle:http://jsfiddle.net/2SH2T/

还有Javascript代码:

var STELLARJS = {
    init: function() {
        var self = this;
        $(function(){
            self.$sections = $('div.section').each(function(index){
                $(this).data('sectionIndex', index);
            });
            self.highlightSyntax();
            self.handleEvents();
            self.debugOffsets.init();
            self.debugOffsetParents.init();
            self.initParallax();
        });
    },
    initParallax: function() {
        var isHomePage = $('body').hasClass('home'),
            $main = $('div.main');
        if (isHomePage) {
            $main.height($main.height() + $(window).height() - 1000);
        }
        if ($.browser.msie) {
            $('body').removeAttr('data-stellar-background-ratio').append('<div class="ie-bg" />');
        }
        $(window).stellar({
            horizontalOffset: !isHomePage,
            verticalScrolling: 40
        });
    },
    highlightSyntax: function() {
        $('pre').addClass('prettyprint');
        if (window.prettyPrint !== undefined) prettyPrint();
    },
    handleEvents: function() {
        var self = this,
            //Debounce function from Underscore.js
            debounce = function(func, wait) {
                var timeout;
                return function() {
                    var context = this, args = arguments;
                    var later = function() {
                        timeout = null;
                        func.apply(context, args);
                    };
                    clearTimeout(timeout);
                    timeout = setTimeout(later, wait);
                }
            },
            handleScroll = function() {
                var scrollTop = $(window).scrollTop(),
                    sectionIndex = Math.round((scrollTop - 40) / self.$sections.first().outerHeight()),
                    $activeSection = self.$sections.eq(sectionIndex);
                if ($activeSection.length === 0) {
                    $activeSection = self.$sections.last();
                }
                if ($activeSection.length === 0) return;
                $(window).unbind('scroll.stellarsite');
                if (scrollLeft === 0) {
                    $(window).unbind('scroll.stellarsite').bind('scroll.stellarsite', debounce(handleScroll, 500));
                } else {
                    $('html,body').animate({
                        scrollLeft: $activeSection.offset().left - 40
                    }, 600, 'easeInOutExpo', function() {
                        setTimeout(function(){
                            $(window).unbind('scroll.stellarsite').bind('scroll.stellarsite', debounce(handleScroll, 500));
                        }, 10);
                    });
                }
                $(window).bind('mousewheel', function(){
                    $('html,body').stop(true, true);
                });
                $(document).bind('keydown', function(e){
                    var key = e.which;
                    if (key === 37 || key === 39) {
                        $('html,body').stop(true, true);
                    }
                });
            };
        if (window.location.href.indexOf('#show-offset-parents-default') === -1) {
            $(window).bind('scroll.stellarsite', debounce(handleScroll, 500));
        }
    },
    debugOffsets: {
        init: function() {
            this.$debug = $('#debugOffsets');
            if (window.location.href.indexOf('#show-offsets') > -1) {
                this.show();
            }
        },
        show: function() {
            this.$debug.fadeIn();
            $('body').addClass('debugOffsets');
            $('h2').append('<div class="debug-h2-label">Offset Parent (All parallax elements align when this meets the offsets)</div>');
        },
        hide: function() {
            this.debug.fadeOut;
            $('body').removeClass('debugOffsets');
        }
    },
    debugOffsetParents: {
        init: function() {
            this.$debug = $('#debugOffsets');
            if (window.location.href.indexOf('#show-offset-parents-default') > -1) {
                this.removeOffsetParents();
            }
            if (window.location.href.indexOf('#show-offset-parents') > -1) {
                this.show();
            }            
        },
        show: function() {
            this.$debug.fadeIn();
            $('body').addClass('debugOffsetParents');
            $('h2').append('<div class="debug-h2-label">New Offset Parent (All parallax elements align when this meets the offsets)</div>');
            $('h2').each(function(){
                $(this).find('div.constellation:last').append('<div class="debug-constellation-label">Default Offset Parents</div>');
            });
            $('body').addClass('debug');
        },
        removeOffsetParents: function() {
            $('body').addClass('debugOffsetParentsDefault');
            $('h2[data-stellar-offset-parent]').removeAttr('data-stellar-offset-parent');
        }
    }
};
STELLARJS.init();

在搜索了一段时间的好解决方案后,我找到了这个jQuery插件 - Snappoint!

https://github.com/robspangler/jquery-snappoint

我修改了原始代码,并想出了与 stellarjs.com 完全相同的效果。相反,它是垂直:)

一看:http://jsfiddle.net/E4uVD/38/

我想

我已经实现了您用下面的代码描述的内容。 这是一个JsFiddle:http://jsfiddle.net/E4uVD/7/

JQuery:

$(function(){
    var _top = $(window).scrollTop();
    var individualDivHeight = 300;
    $(window).mousedown(function() {
        $('html, body').stop();
    });
    $(window).mouseup(function(){
        var _cur_top = $(window).scrollTop();
        var totalHeight = $('#container').height();
        var posToScroll = Math.round(_cur_top / individualDivHeight) * individualDivHeight;
        $('html, body').stop().animate({scrollTop: posToScroll}, 2000);
    });
});

.HTML:

<div id="container">
    <div class="box">300px</div>
    <div class="box">300px</div>
    <div class="box">300px</div>
    <div class="box">300px</div>
    <div class="box">300px</div>
    <div class="box">300px</div>
    <div class="box">300px</div>
    <div class="box">300px</div>
    <div class="box">300px</div>
    <div class="box">300px</div>
</div>

.CSS:

body {
    height:2000px;
}
.box
{
    color: #fff;
    height: 300px;
    width: 300px;
    border: 1px solid white;
}
#container {
    height:3000px;
    width:300px;
    background-color:blue;
}

最新更新