jQuery滚屏插件XSwitch.js

1、需要有基本的HTML结构

<div style="margin-top: 124px;" id="container" data-XSwitch>
    <div class="sections">
        <div class="main_about_product common_height section" ></div>
         <div class="main_product_trait common_height section" ></div>
         <div class="marin_system_show common_height section" ></div>
         <div class="marin_system_show common_height section" ></div>
        <div class="main_footer common_height section relative"></div>
    </div>
</div>    

2、引入需要的样式

@charset "UTF-8";
 /*简单reset*/
        * {
            margin: 0;
            padding: 0;
        }
        /*必须,关系到单个page能否全屏显示*/
        html,
        body {
            height: 100%;
            overflow: hidden;
        }
        /*以下样式用来设置slider样式,可自行修改*/
        .pages {
            display:none;
            position:fixed;
            right: 10px;
            top: 49%;
            list-style: none;
        }
        .pages li {
            width: 8px;
            height: 8px;
            border-radius: 10%;
            background: #2aff00;
            margin: 8px 0px 0px 7px;
        }
        .pages li.active {
            margin-left: 0;
            width: 14px;
            height: 14px;
            border: 4px solid #2aff00;
            background: none;
        }
        #container,.sections,.section {
            /*必须,兼容,在浏览器不支持transform属性时,通过改变top/left完成滑动动画*/
            position: relative;
            /*必须,关系到单个page能否全屏显示*/
            height: 100%;
        }
        .section {
            /*有背景图时必须,关系到背景图能够全屏显示*/
            background-size: cover;
            background-position: 50% 50%;
        }

3、引入滚屏插件XSwitch.js

(function ($) {
    $.fn.XSwitch = function (options) {
        return this.each(function () {
            var _this = $(this),
                instance = _this.data('XSwitch');

            if (!instance) {
                instance = new XSwitch(_this, options);
                _this.data('XSwitch', instance);
            }

            if ($.type(options) === 'string') {
                return instance[options]();
            }
        });
    }

    $.fn.XSwitch.defaults = {
        selectors: {
            sections: '.sections',
            section: '.section',
            page: '.pages',
            active: '.active'
        },
        index: 0,
        easing: 'ease',
        duration: 500,
        loop: false,
        pagination: true,
        keyboard: true,
        direction: 'vertical',
        callback: ''
    }


    var _prefix = (function (temp) {
        var aPrefix = ['webkit', 'moz', 'o', 'ms'],
            props = '';
        for (var i = 0, len = aPrefix.length; i < len; i ++) {
            props = aPrefix[i] + 'Transition';
            if (temp.style[props] !== undefined) {
                return '-' + aPrefix[i].toLowerCase() + '-';
            }
            return false;
        }
    })(document.createElement('div'));

    var XSwitch = (function () {
        function XSwitch(element, options) {

            this.settings = $.extend(true, $.fn.XSwitch.defaults, options);
            this.element = element;
            this.init();
        }
        XSwitch.prototype = {

            init: function () {
                var _this = this;
                this.selectors = this.settings.selectors;

                this.sections = this.element.find(this.selectors.sections);
                this.section = this.sections.find(this.selectors.section);


                this.direction = this.settings.direction === 'vertical' ? true : false;

                this.pagesCount = this.pagesCount();

                this.index = (this.settings.index >=0 && this.settings.index < this.pagesCount) ? this.settings.index : 0;

                this.canScroll = true;


                if (!this.direction) {
                    _initLayout(_this);
                }

                if (this.settings.pagination) {
                    _initPaging(_this);
                }

                _initEvent(_this);
            },

            pagesCount: function () {
                return this.section.size();
            },

            switchLength: function () {
                return this.duration ? this.element.height() : this.element.width();
            },

            prve: function () {
                var _this = this;

                if (this.index > 0) {
                    this.index --;
                } else if (this.settings.loop) {
                    this.index = this.pagesCount - 1;
                }
                _scrollPage(_this);
            },

            next: function () {
                var _this = this;
                if (this.index < this.pagesCount) {
                    this.index ++;
                } else if (this.settings.loop) {
                    this.index = 0;
                }
                _scrollPage(_this);
            }
        };

        function _initLayout(_this) {
            var width = (_this.pagesCount * 100) + '%',
                cellWidth = (100 / _this.pagesCount).toFixed(2) + '%';

            _this.sections.width(width);
            _this.section.width(cellWidth).css('float', 'left');
        }

        function _initPaging(_this) {

            var pagesClass = _this.selectors.page.substring(1),
                pageHtml = '<ul class="' + pagesClass + '">';
            _this.activeClass = _this.selectors.active.substring(1);

            for (var i = 0, len = _this.pagesCount; i < len; i ++) {
                pageHtml += '<li></li>';
            }
            pageHtml += '</ul>';

            _this.element.append(pageHtml);
            var pages = _this.element.find(_this.selectors.page);
            _this.pageItem = pages.find('li');
            _this.pageItem.eq(_this.index).addClass(_this.activeClass);
            if (_this.direction) {
                pages.addClass('vertical');
            } else {
                pages.addClass('horizontal');
            }
        }

        function _initEvent(_this) {

            _this.element.on('click', _this.selectors.page + ' li', function () {
                _this.index = $(this).index();
                _scrollPage(_this);
            });

            _this.element.on('mousewheel DOMMouseScroll', function (e) {

                if (!_this.canScroll) {
                    return;
                }

                var delta = -e.originalEvent.detail || -e.originalEvent.deltaY || e.originalEvent.wheelDelta;

                if (delta > 0 && (_this.index && !_this.settings.loop || _this.settings.loop)) {
                    _this.prve();
                } else if (delta < 0 && (_this.index < (_this.pagesCount - 1) && !_this.settings.loop || _this.settings.loop)) {
                    _this.next();
                }
            });

            if (_this.settings.keyboard) {
                $(window).on('keydown', function (e) {
                    var keyCode = e.keyCode;
                    if (keyCode === 37 || keyCode === 38) {
                        _this.prve();
                    } else if (keyCode === 39 || keyCode === 40) {
                        _this.next();
                    }
                });
            }

            $(window).resize(function () {
                var currentLength = _this.switchLength(),
                    offset = _this.settings.direction ? _this.section.eq(_this.index).offset().top : _this.section.eq(_this.index).offset().left;

                if (Math.abs(offset) > currentLength / 2 && _this.index < (_this.pagesCount - 1)) {
                    _this.index ++;
                }
                if (_this.index) {
                    _scrollPage(_this);
                }
            });
                        if(index ==0){
                            _this.index = 0;
                        }else if(index == 1 || index == 2){
                            _this.index = index + 1;
                        }
                        _scrollPage(_this);
                    });
            });

            _this.sections.on('transitionend webkitTransitionEnd oTransitionEnd otransitionend', function () {
                _this.canScroll = true;
                if (_this.settings.callback && type(_this.settings.callback) === 'function') {
                    _this.settings.callback();
                }
            });
            
        }

        function _scrollPage(_this) {
            var dest = _this.section.eq(_this.index).position();
            if (!dest) {
                return;
            }
            _this.canScroll = false;
            if (_prefix) {
                _this.sections.css(_prefix + 'transition', 'all ' + _this.settings.duration + 'ms ' + _this.settings.easing);
                var translate = _this.direction ? 'translateY(-' + dest.top + 'px)' : 'translateX(-' + dest.left + 'px)';
                _this.sections.css(_prefix + 'transform', translate);
            } else {
                var animateCss = _this.direction ? {top: -dest.top} : {left: -dest.left};
                _this.sections.animate(animateCss, _this.settings.duration, function () {
                    _this.canScroll = true;
                    if (_this.settings.callback && type(_this.settings.callback) === 'function') {
                        _this.settings.callback();
                    }
                });
            }
            
            var screenIndex = _this.index;
            if(screenIndex ==0){
                $('.header_tab_content li:eq('+ (screenIndex)+')').addClass("textColor_blue bottom_line");
                $('.header_tab_content li:eq('+ (screenIndex)+')').siblings().removeClass("textColor_blue bottom_line");
            }else if(screenIndex == 1 || screenIndex == 2 || screenIndex == 3){
                $('.header_tab_content li:eq('+ (screenIndex - 1)+')').addClass("textColor_blue bottom_line");
                $('.header_tab_content li:eq('+ (screenIndex-1)+')').siblings().removeClass("textColor_blue bottom_line");
            }

            if (_this.settings.pagination) {
                _this.pageItem.eq(_this.index).addClass(_this.activeClass).siblings('li').removeClass(_this.activeClass);
            }
        }
        
     
        return XSwitch;
    })();

})(jQuery);

$(function () {
    $('[data-XSwitch]').XSwitch();
})

4、通过给div#container添加属性data-XSwitch调用,插件将会使用默认配置

5、若每个屏的高度刚好是整个屏幕高度,则不需要强制对每个屏幕设置高度。因为遇到的页面还有一个头部,使得高度没有沾满整个屏幕。需要手动给每个屏设置高度

$(document).ready(function() {
    setCommonHgt();
});
/*设置每屏高度一致*/
function setCommonHgt() {
    var windowHgt = $(document.body).outerHeight(true);
    var headerHgt = $('.main_header').height();
    var commonHgt = windowHgt - headerHgt;
    $('.common_height').css('height', commonHgt);
}

$(function() {
    // 添加监控页面窗口变化的方法
    $(window).resize(function() {
        location.reload();
        setCommonHgt();
    });
    
});
原文地址:https://www.cnblogs.com/zhaomeizi/p/8478846.html