jQuery.stickUp插件重构
$(document).on('scroll', function() {
varscroll = parseInt($(document).scrollTop());
if (menuSize != null) {
for (var i = 0; i < menuSize; i++) {
contentTop[i] = $('#' + content[i] + '').offset().top; function bottomView(i) {
contentView = $('#' + content[i] + '').height() * .4;
testView = contentTop[i] - contentView;
//console.log(varscroll);
if (varscroll > testView) {
$('.' + itemClass).removeClass(itemHover);
$('.' + itemClass + ':eq(' + i + ')').addClass(itemHover);
} else if (varscroll < 50) {
$('.' + itemClass).removeClass(itemHover);
$('.' + itemClass + ':eq(0)').addClass(itemHover);
}
}
if (scrollDir == 'down' && varscroll > contentTop[i] - 50 && varscroll < contentTop[i] + 50) {
$('.' + itemClass).removeClass(itemHover);
$('.' + itemClass + ':eq(' + i + ')').addClass(itemHover);
}
if (scrollDir == 'up') {
bottomView(i);
}
}
} if (vartop < varscroll + topMargin) {
$('.stuckMenu').addClass('isStuck');
$('.stuckMenu').next().closest('div').css({
'margin-top': stickyHeight + stickyMarginB + currentMarginT + 'px'
}, 10);
$('.stuckMenu').css("position", "fixed");
$('.isStuck').css({
top: '0px'
}, 10, function() { });
}; if (varscroll + topMargin < vartop) {
$('.stuckMenu').removeClass('isStuck');
$('.stuckMenu').next().closest('div').css({
'margin-top': currentMarginT + 'px'
}, 10);
$('.stuckMenu').css("position", "relative");
}; });
- 它只支持最后一次调用(因为是使用闭包实现的变量存储,但每次init都基于同样一套变量)
- 存在一些未经声明的变量调用(即全局变量,这可是很不好的编程习惯啊)
- 存在一些不必要的函数声明,导致一些不必要的性能损耗(比如上述代码中的bottomView函数)
- 不支持回调函数,无法支持比较复杂的应用
- 单页网站时,在页面滚动到parts参数指定的块时,会给对应的菜单块加itemHover类(请参考http://lirancohen.github.io/stickUp/),parts是一个额外指定的参数,而parts中每一个id对应的菜单项又是基于parts参数的顺序的,这是一种不稳定结构(语文老师死得早,凑合着看吧
var Context = function() {},
_ctxList = {},
lastScrollTop = 0;
Context.prototype = {
dataProperty: 'data-menu',
selector: '',
itemClass: '',
itemHover: '',
jqDom: null,
menuItems: [],
region: 'top',
height: 0,
parentMarginTop: 0,
top: 0,
marginTop: 0,
marginBottom: 0,
beforeStick: null,
afterStick: null,
beforeUnstick: null,
afterUnstick: null
};
onScroll: function(scrollDir, varscroll) {
var contentView = null,
testView = null,
_me = this; // 计算并给适当元素添加 itemHover 类
if ( !! _me.menuItems && _me.menuItems.length > 0) {
var offset = null,
contentTop = 0,
tmp_menuTarget = null;
for (var i = 0; i < _me.menuItems.length; i++) {
tmp_menuTarget = $('#' + $(_me.menuItems[i]).attr(_me.dataProperty));
offset = tmp_menuTarget.offset();
contentTop = !! offset ? offset.top : 0; // 之前這裡定義了一個bottomView
// 会在每次执行这个地方的时候都去创建一个函数
// 实际上是很没必要的性能损耗,所以这里将代码移动下面
if (scrollDir == 'down' &&
varscroll > contentTop - 50 &&
varscroll < contentTop + 50) {
_me.jqDom.find('.' + _me.itemClass).removeClass(_me.itemHover);
_me.jqDom.find('.' + _me.itemClass + ':eq(' + i + ')').addClass(_me.itemHover);
}
if (scrollDir == 'up') {
// 这里就是原来的bottomView代码
contentView = tmp_menuTarget.height() * 0.4;
testView = contentTop - contentView;
if (varscroll > testView) {
_me.jqDom.find('.' + _me.itemClass).removeClass(_me.itemHover);
_me.jqDom.find('.' + _me.itemClass + ':eq(' + i + ')').addClass(_me.itemHover);
} else if (varscroll < 50) {
_me.jqDom.find('.' + _me.itemClass).removeClass(_me.itemHover);
_me.jqDom.find('.' + _me.itemClass + ':eq(0)').addClass(_me.itemHover);
}
}
}
} // 固定菜单栏目,使之固定(fixed)
if (_me.top < varscroll + _me.marginTop) {
if ( !! _me.beforeStick) _me.beforeStick.call(_me);
_me.jqDom.addClass('isStuck');
if ( !! _me.afterStick) _me.afterStick.call(_me);
_me.jqDom.next().closest('div').css({
'margin-top': _me.height + _me.marginBottom + _me.parentMarginTop + 'px'
}, 10);
_me.jqDom.css("position", "fixed");
_me.jqDom.css({
top: '0px'
}, 10);
}; // 菜單欄目,使之不固定(relative)
if (varscroll + _me.marginTop < _me.top) {
if ( !! _me.beforeUnstick) _me.beforeUnstick.call(_me);
_me.jqDom.removeClass('isStuck');
if ( !! _me.afterUnstick) _me.afterUnstick.call(_me);
_me.jqDom.next().closest('div').css({
'margin-top': _me.parentMarginTop + 'px'
}, 10);
_me.jqDom.css("position", "relative");
};
}
最后附上源码:https://github.com/VanMess/stickUp
jQuery.stickUp插件重构的更多相关文章
- PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
XHTML 首先将jquery库和相关ui插件,以及css导入.一共引用三个 jquery ,jquery_ui.js,jquery-ui.css 三个文件,不同版本小哥可能稍有差异(最后注意ajax ...
- 深入学习jQuery自定义插件
原文地址:jQuery自定义插件学习 1.定义插件的方法 对象级别的插件扩展,即为jQuery类的实例增加方法, 调用:$(选择器).函数名(参数); $(‘#id’).myPlugin(o ...
- [jQuery]jQuery DataTables插件自定义Ajax分页实现
前言 昨天在博客园的博问上帮一位园友解决了一个问题,我觉得有必要记录一下,万一有人也遇上了呢. 问题描述 园友是做前端的,产品经理要求他使用jQuery DataTables插件显示一个列表,要实现分 ...
- 使用jQuery.form插件,实现完美的表单异步提交
传送门:异步编程系列目录…… 时间真快,转眼一个月快结束了,一个月没写博客了!手开始生了,怎么开始呢…… 示例下载:使用jQuery.form插件,实现完美的表单异步提交.rar 月份的尾巴,今天的主 ...
- 为jQuery写插件
很多场合,我们都会调用jQuery的插件去完成某个功能,比如slider. 如下图,做一个div,通过“$( "#slider" ).slider();”的方式直接将div变成sl ...
- bootstrap-简洁实用的jQuery手风琴插件
前端 <html lang="zh"> <head> <meta charset="UTF-8"> <meta htt ...
- 推荐15款响应式的 jQuery Lightbox 插件
利用现代 Web 技术,网络变得越来越轻巧与.模态框是突出展现内容的重要形式,能够让用户聚焦到重要的内容上去.在这个列表中,我们编制了15款响应式的 jQuery 灯箱库,这将有助于开发人员创建和设计 ...
- Chocolat.js – 响应式的 jQuery Lightbox 插件
Chocolat.js 使您能够显示一个或多个图像在同一页面上.给用户展示一组图片缩略图,可以显示全页或块.Chocolat.js 可以很好地处理所有主要的浏览器.它在下面这些浏览器测试通过:IE7+ ...
- 让网站动起来!12款优秀的 jQuery 动画插件推荐
如今,大多数设计师和开发人员被要客户要求开发动态的网站.创造视觉震撼和醒目的动态网站是艰巨的任务,因为它需要大量的努力和创造力.在网络上有大量的工具和插件可用于创建网站动画.许多开发人员正在使用 HT ...
随机推荐
- 集线器hub、交换机switch、路由器router 的区别
原文链接:http://blog.csdn.net/thq0201/article/details/7782319 首先说HUB,也就是集线器.它的作用可以简单的理解为将一些机器连接起来组成一个局域网 ...
- 微信公众平台应用开发:方法、技巧与案例--柳峰,Java语言版本
他本人的博客:http://blog.csdn.net/lyq8479 作者简介: 刘运强,网名“柳峰”,资深微信公众平台应用开发工程师,国内微信公众平台应用开发的先驱之一,项目经验丰富.他还是一位资 ...
- Python Tomcat Script(多实例)
之前书写过 Tomcat 单实例的 Python 脚本,本次增加 Tomcat 多实例的操作脚本. 1:准备 安装所需 Python 插件 A方法: pip install argparse B方法: ...
- Redis系列(二)—— 数据类型及其使用
Redis数据类型及其使用 参考:http://www.cnblogs.com/jackluo/p/3173436.html Redis支持五种数据类型:string(字符串),hash(哈希),li ...
- Syslog-ng
一.简介 与 syslog相比 ,syslog-ng 具有众多高级的功能:更好的网络支持,更加方便的配置,集中式的网络日志存储,并且更具有弹性.比如,使用syslogd时,所有的iptables日志与 ...
- NOIP2007 T1奖学金 解题报告-S.B.S.
洛谷P1093 题目描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分从高到低排序,如果两个同学总分相同, ...
- 【C#】SQL数据库助手类2.0(自用)
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...
- 推荐——Monkey《大话 app 测试——Android、iOS 应用测试指南》
<大话移动——Android与iOS应用测试指南> 京东可以预购啦!http://item.jd.com/11495028.html 当当网:http://product.dangdang ...
- Treap(树堆):随机平衡二叉树实现
本文是根据郭家宝的文章<Treap的原理及实现>写的. #include<stdio.h> #include<string.h> #include<stdli ...
- 云盘WEB资料下载链接
入门三板斧:http://www.cnblogs.com/jikey/p/3613082.html 入门看这个:http://pan.baidu.com/s/1pJqJvAV 入门JS视频:http: ...