吸顶效果插件

function Topfixed(options){
    var opts = $.extend({
        id:'#topFixed',
        fixedClass:'top-fixed'
    },options);

    var fixed = $(opts.id);//获取吸顶目标ID对象
    var marginBottom = parseInt(fixed.css('marginBottom')) || 0;//吸顶目标的下边距
    //var blank = document.createElement('div');//创建空div
    var blank = $('<div></div>');//两种创建空DIV的方式
    var height = parseInt(fixed.outerHeight()+marginBottom-2);//目标元素的高度+下边距
    var scrolltop = $(window).scrollTop();//获取滚动条的滑动距离
    var fixedClass = opts.fixedClass;//获取默认的类名,与$(opts.id)不同,$(opts.id)获取的是对象;opts.fixedClass获取的是名称
    fixed.after(blank);//在吸顶目标外面的后面加空DIV
    $(blank).css({
        "height":height//空DIV的高度=目标ID元素的高度+下边距
    }).hide();//将空DIV隐藏,即正常时不显示
    this.init = function(){
        _show();
        $(window).scroll(function(){
            scrolltop = $(window).scrollTop();
            _show();
        });
    }
    function _show(){

        if(scrolltop>47){//滚动条滚过的长度大于吸顶元素距离top的长度。47怎么得到的?
            fixed.addClass(fixedClass);//目标吸顶元素增加类:fixedClass,该类在common.less中做了定义
            $(blank).show();//显示出空DIV,由于position的缘故,空div相当于占位符,放在了吸顶目标的下面。
        }else{
            fixed.removeClass(fixedClass);
            $(blank).hide();
        }
    }
}

html文件中对应的调用是:(注意使用的时候要修改47)

<script type="text/javascript" src="js/topfixed.js"></script>
<script>
    new Topfixed().init();
</script>

css文件对应的top-fixed为:

top-fixed{
        position: fixed;
        top: 0;
        left: 0;
        z-index: 100;
        width: 100%;
        .top-con{
            margin: 0 20px;
            border-bottom: 1px solid #ccc;
        }
    }

 增加浏览器大小变化,吸顶元素的相对位移不变:

function Topfixed(options){
    var opts = $.extend({
        id:'#box',
        fixedClass:'top-fixed',
        prevClass:'oa-plane'//吸顶元素相邻元素,用来作为参考系,确定浏览器变化时也能够使吸顶元素的位置正确
    },options);
    var fixed = $(opts.id);//获取吸顶目标ID对象
    var marginBottom = parseInt(fixed.css('marginBottom')) || 0;//吸顶目标的下边距
    //var blank = document.createElement('div');//创建空div
    var blank = $('<div></div>');//两种创建空DIV的方式
    var height = parseInt(fixed.outerHeight()+marginBottom-2);//目标元素的高度+下边距
    var scrolltop = $(window).scrollTop();//获取滚动条的滑动距离
    var fixedClass = opts.fixedClass;//获取默认的类名,与$(opts.id)不同,$(opts.id)获取的是对象;opts.fixedClass获取的是名称
    var fixedTop=fixed.offset().top;
    var fixedLeft=fixed.offset().left;
    var prevClass=opts.prevClass;
    fixed.after(blank);//在吸顶目标外面的后面加空DIV
    $(blank).css({
        "height":height//空DIV的高度=目标ID元素的高度+下边距
    }).hide();//将空DIV隐藏,即正常时不显示
    function _show(){
        var prevLeft3=$('.'+prevClass).offset().left;
        fixed.css('left',prevLeft3);
        if(scrolltop>fixedTop){//滚动条滚过的长度大于吸顶元素距离top的长度。47怎么得到的?
            fixed.addClass(fixedClass);//目标吸顶元素增加类:fixedClass,该类在common.less中做了定义
            $(blank).show();//显示出空DIV,由于position的缘故,空div相当于占位符,放在了吸顶目标的下面。
        }else{
            fixed.removeClass(fixedClass);
            $(blank).hide();
        }
        $(window).resize(function() {
            var prevLeft2=$('.'+prevClass).offset().left;
            fixed.css('left',prevLeft2);  
        });
    }
    this.init = function(){
        _show();
        $(window).scroll(function(){
            scrolltop = $(window).scrollTop(); 
            _show();
        });
    }

}

 js文件调用方式:

require('./topfixed.js')
    new Topfixed({
        id:'#topFixed'
    }).init();

改动,增加参考元素有个偏移量,比如吸顶元素没有上下元素可以参考,只有左侧元素可以参考:

function Topfixed(options){
    var opts = $.extend({
        id:'#box',
        fixedClass:'top-fixed',
        prevClass:'oa-plane',//吸顶元素相邻元素,用来作为参考系,确定浏览器变化时也能够使吸顶元素的位置正确
        offsetLeft:0
    },options);
    var fixed = $(opts.id);//获取吸顶目标ID对象
    var marginBottom = parseInt(fixed.css('marginBottom')) || 0;//吸顶目标的下边距
    //var blank = document.createElement('div');//创建空div
    var blank = $('<div></div>');//两种创建空DIV的方式
    var height = parseInt(fixed.outerHeight()+marginBottom-2);//目标元素的高度+下边距
    var scrolltop = $(window).scrollTop();//获取滚动条的滑动距离
    var fixedClass = opts.fixedClass;//获取默认的类名,与$(opts.id)不同,$(opts.id)获取的是对象;opts.fixedClass获取的是名称
    var fixedTop=fixed.offset().top;
    var fixedLeft=fixed.offset().left;
    var prevClass=opts.prevClass;
    var offsetLeft=opts.offsetLeft;
    fixed.after(blank);//在吸顶目标外面的后面加空DIV
    $(blank).css({
        "height":height//空DIV的高度=目标ID元素的高度+下边距
    }).hide();//将空DIV隐藏,即正常时不显示
    function _show(){
        var prevLeft3=$('.'+prevClass).offset().left+offsetLeft+'px';
        fixed.css('left',prevLeft3);
        if(scrolltop>fixedTop){//滚动条滚过的长度大于吸顶元素距离top的长度。47怎么得到的?
            fixed.addClass(fixedClass);//目标吸顶元素增加类:fixedClass,该类在common.less中做了定义
            $(blank).show();//显示出空DIV,由于position的缘故,空div相当于占位符,放在了吸顶目标的下面。
        }else{
            fixed.removeClass(fixedClass);
            $(blank).hide();
        }
        $(window).resize(function() {
            var prevLeft2=$('.'+prevClass).offset().left+offsetLeft+'px';
            fixed.css('left',prevLeft2);  
        });
    }
    this.init = function(){
        _show();
        $(window).scroll(function(){
            scrolltop = $(window).scrollTop(); 
            _show();
        });
    }

}

对应的调用代码:

require('./topfixed.js')
    new Topfixed({
        id:'#topFixed'
    }).init();
    new Topfixed({
        id:'#topFixed2',
        fixedClass:'fixed-box',
        prevClass:'oa-s',
        offsetLeft:930
    }).init();

 修改后,增加吸顶元素在距离浏览器上边距多高时,开始发生吸顶效果,startTop默认为0;

function Topfixed(options){
    var opts = $.extend({
        id:'#box',
        fixedClass:'top-fixed',
        prevClass:'oa-plane',//吸顶元素相邻元素,用来作为参考系,确定浏览器变化时也能够使吸顶元素的位置正确
        offsetLeft:0,//设置吸顶元素距离参考元素左侧的距离
        offsetTop:0,//吸顶后,吸顶元素距离顶部的距离(一般用于上下同时两个元素吸顶,第二个元素要留下第一个吸顶元素的高度)
        startTop:0//设置什么在什么距离时开始吸顶
    },options);
    var fixed = $(opts.id);//获取吸顶目标ID对象
    var marginBottom = parseInt(fixed.css('marginBottom')) || 0;//吸顶目标的下边距
    //var blank = document.createElement('div');//创建空div
    var blank = $('<div></div>');//两种创建空DIV的方式
    var height = parseInt(fixed.outerHeight()+marginBottom-2);//目标元素的高度+下边距
    var scrolltop = $(window).scrollTop();//获取滚动条的滑动距离
    var fixedClass = opts.fixedClass;//获取默认的类名,与$(opts.id)不同,$(opts.id)获取的是对象;opts.fixedClass获取的是名称
    var startTop=opts.startTop;
    var fixedTop=fixed.offset().top-startTop;
    var fixedLeft=fixed.offset().left;
    var prevClass=opts.prevClass;
    var offsetLeft=opts.offsetLeft;
    var offsetTop=opts.offsetTop;
    fixed.after(blank);//在吸顶目标外面的后面加空DIV
    $(blank).css({
        "height":height//空DIV的高度=目标ID元素的高度+下边距
    }).hide();//将空DIV隐藏,即正常时不显示
    function _show(){
        var prevLeft3=$('.'+prevClass).offset().left+offsetLeft+'px';
        var prevTop3=offsetTop+'px';
        fixed.css('left',prevLeft3);
        fixed.css('top',prevTop3);
        if(scrolltop>fixedTop){//滚动条滚过的长度大于吸顶元素距离top的长度。47怎么得到的?
            fixed.addClass(fixedClass);//目标吸顶元素增加类:fixedClass,该类在common.less中做了定义
            $(blank).show();//显示出空DIV,由于position的缘故,空div相当于占位符,放在了吸顶目标的下面。
        }else{
            fixed.removeClass(fixedClass);
            $(blank).hide();
        }
        $(window).resize(function() {
            var prevLeft2=$('.'+prevClass).offset().left+offsetLeft+'px';
            var prevTop2=offsetTop+'px';
            fixed.css('left',prevLeft2); 
            fixed.css('top',prevTop2); 
        });
    }
    this.init = function(){
        _show();
        $(window).scroll(function(){
            scrolltop = $(window).scrollTop(); 
            _show();
        });
    }

}

调用方式:

require('./topfixed.js')
    new Topfixed({
        id:'#topFixed'
    }).init();
    new Topfixed({
        id:'#topFixed2',
        fixedClass:'fixed-box',
        prevClass:'oa-s',
        offsetLeft:930
    }).init();
    new Topfixed({
        id:'#topFixed3',
        fixedClass:'fixed-box-3',
        startTop:74,
        offsetTop:74
    }).init();

效果如下:

蓝色导航区域在吸顶时要和筛选条件一起吸顶,所以距离上端为筛选条件的高度时发生吸顶。

 修改完善:增加了判断吸顶元素是否需要设置空div来作为占位符的选择:(参数是flag,当flag=true时增加空div作为占位符;当flag=false时不需要设置空div作为占位符)

function Topfixed(options){
    var opts = $.extend({
        id:'#box',
        fixedClass:'top-fixed',
        prevClass:'oa-plane',//吸顶元素相邻元素,用来作为参考系,确定浏览器变化时也能够使吸顶元素的位置正确
        offsetLeft:0,//设置吸顶元素距离参考元素左侧的距离
        offsetTop:0,//吸顶后,吸顶元素距离顶部的距离(一般用于上下同时两个元素吸顶,第二个元素要留下第一个吸顶元素的高度)
        startTop:0,//设置什么在什么距离时开始吸顶
        flag:true//如果要吸顶的元素下面有内容,则flag为true,增加空div来作为占位符,如果吸顶元素下面没有内容,则不需要使用占位符,则flag为false
    },options);
    var fixed = $(opts.id);//获取吸顶目标ID对象
    var marginBottom = parseInt(fixed.css('marginBottom')) || 0;//吸顶目标的下边距
    //var blank = document.createElement('div');//创建空div
    var blank = $('<div></div>');//两种创建空DIV的方式
    var height = parseInt(fixed.outerHeight()+marginBottom-2);//目标元素的高度+下边距
    var scrolltop = $(window).scrollTop();//获取滚动条的滑动距离
    var fixedClass = opts.fixedClass;//获取默认的类名,与$(opts.id)不同,$(opts.id)获取的是对象;opts.fixedClass获取的是名称
    var startTop=opts.startTop;
    var fixedTop=fixed.offset().top-startTop;
    var fixedLeft=fixed.offset().left;
    var prevClass=opts.prevClass;
    var offsetLeft=opts.offsetLeft;
    var offsetTop=opts.offsetTop;
    var flag=opts.flag;
    if(flag){
        fixed.after(blank);//在吸顶目标外面的后面加空DIV
    }
    $(blank).css({
        "height":height//空DIV的高度=目标ID元素的高度+下边距
    }).hide();//将空DIV隐藏,即正常时不显示
    function _show(){
        var prevLeft3=$('.'+prevClass).offset().left+offsetLeft+'px';
        var prevTop3=offsetTop+'px';
        fixed.css('left',prevLeft3);
        fixed.css('top',prevTop3);
        if(scrolltop>fixedTop){//滚动条滚过的长度大于吸顶元素距离top的长度。47怎么得到的?
            fixed.addClass(fixedClass);//目标吸顶元素增加类:fixedClass,该类在common.less中做了定义
            $(blank).show();//显示出空DIV,由于position的缘故,空div相当于占位符,放在了吸顶目标的下面。
        }else{
            fixed.removeClass(fixedClass);
            $(blank).hide();
        }
        $(window).resize(function() {
            var prevLeft2=$('.'+prevClass).offset().left+offsetLeft+'px';
            var prevTop2=offsetTop+'px';
            fixed.css('left',prevLeft2); 
            fixed.css('top',prevTop2); 
        });
    }
    this.init = function(){
        _show();
        $(window).scroll(function(){
            scrolltop = $(window).scrollTop(); 
            _show();
        });
    }

}

 

posted @ 2016-08-29 17:06  小猪冒泡  阅读(790)  评论(0编辑  收藏  举报