jQuery scrollFix滚动定位插件


Posted in Javascript onApril 01, 2015

当用户向上或向下滚动页面到一定位置时,目标元素开始固定定位(position:fixed),当回滚到原位置时目标元素恢复到原状态,可以定制触发滚动相对屏幕位置和触发滚动方向,兼容IE6

【插件参数】

$(".target_element").scrollFix( [ "top" | "bottom" | length(可以为负,表示相对bottom), [ "top" | "bottom" ] ]);

第一个参数: 可选,默认为"top",当目标元素到了屏幕相对的位置时开始触发固定,可以填一个数值,如100,-200 ,负值表示相对于屏幕下方

第一个参数: 可选,默认为"top",表示触发固定的滚动方向,"top"表示从上向下滚动时触发,"bottom"表示从下向上滚动时触发

【下载插件】scrollFix(3water.com).rar

<script type="text/javascript" src="jquery-1.7.2.min.js"></script>

<script type="text/javascript" src="scrollFix.js"></script>

<p><span style="color: #808000;">【代码示例】</span></p>

<div class="d">

<div class="demo" style="background: #ff6000;">$("#a").scrollFix(-200);

<div>滚动到距离下面200px时开始固定,默认从上到下触发</div>

</div>

 </div>

<div class="d">

<div class="demo" style="background: #82BF00;">$("#b").scrollFix(200,"bottom");

<div>滚动到距离上面200px时开始固定,指定"bottom"从下到上触发</div>

</div>

 </div>

<div class="d">

<div class="demo" style="background: #0C9CAE;">$("#c").scrollFix("top","top");

<div>滚动到距离上面0时开始固定,指定"top"从上到下触发</div>

</div>

 </div>

<div class="d">

<div class="demo" style="background: #478FCE;">$("#d").scrollFix("bottom","top");

<div>滚动到距离下面0时开始固定,指定"bottom"从下到上触发</div>

</div>

</div>

实现代码:
<script type="text/javascript">// <![CDATA[

window.onload=function(){

  $(".demo:eq(0)").scrollFix(-200);

  $(".demo:eq(1)").scrollFix(200,"bottom");

  $(".demo:eq(2)").scrollFix("top","top");

  $(".demo:eq(3)").scrollFix("bottom","bottom");

}

// ]]></script>

核心代码:

;(function($) {
 jQuery.fn.scrollFix = function(height, dir) {
  height = height || 0;
  height = height == "top" ? 0 : height;
  return this.each(function() {
   if (height == "bottom") {
    height = document.documentElement.clientHeight - this.scrollHeight;
   } else if (height < 0) {
    height = document.documentElement.clientHeight - this.scrollHeight + height;
   }
   var that = $(this),
    oldHeight = false,
    p, r, l = that.offset().left;
   dir = dir == "bottom" ? dir : "top"; //默认滚动方向向下
   if (window.XMLHttpRequest) { //非ie6用fixed


    function getHeight() { //>=0表示上面的滚动高度大于等于目标高度
     return (document.documentElement.scrollTop || document.body.scrollTop) + height - that.offset().top;
    }
    $(window).scroll(function() {
     if (oldHeight === false) {
      if ((getHeight() >= 0 && dir == "top") || (getHeight() <= 0 && dir == "bottom")) {
       oldHeight = that.offset().top - height;
       that.css({
        position: "fixed",
        top: height,
        left: l
       });
      }
     } else {
      if (dir == "top" && (document.documentElement.scrollTop || document.body.scrollTop) < oldHeight) {
       that.css({
        position: "static"
       });
       oldHeight = false;
      } else if (dir == "bottom" && (document.documentElement.scrollTop || document.body.scrollTop) > oldHeight) {
       that.css({
        position: "static"
       });
       oldHeight = false;
      }
     }
    });
   } else { //for ie6
    $(window).scroll(function() {
     if (oldHeight === false) { //恢复前只执行一次,减少reflow
      if ((getHeight() >= 0 && dir == "top") || (getHeight() <= 0 && dir == "bottom")) {
       oldHeight = that.offset().top - height;
       r = document.createElement("span");
       p = that[0].parentNode;
       p.replaceChild(r, that[0]);
       document.body.appendChild(that[0]);
       that[0].style.position = "absolute";
      }
     } else if ((dir == "top" && (document.documentElement.scrollTop || document.body.scrollTop) < oldHeight) || (dir == "bottom" && (document.documentElement.scrollTop || document.body.scrollTop) > oldHeight)) { //结束
      that[0].style.position = "static";
      p.replaceChild(that[0], r);
      r = null;
      oldHeight = false;
     } else { //滚动
      that.css({
       left: l,
       top: height + document.documentElement.scrollTop
      })
     }
    });
   }
  });
 };
})(jQuery);
Javascript 相关文章推荐
将HTML自动转为JS代码
Jun 26 Javascript
Ucren Virtual Desktop V2.0
Nov 07 Javascript
JavaScript中具名函数的多种调用方式总结
Nov 08 Javascript
jquery.ajax之beforeSend方法使用介绍
Dec 08 Javascript
jquery实现兼容IE8的异步上传文件
Jun 15 Javascript
jQuery按需加载轮播图(web前端性能优化)
Feb 17 Javascript
bootstrap日期插件daterangepicker使用详解
Oct 19 Javascript
浅谈ElementUI中switch回调函数change的参数问题
Aug 24 Javascript
简单谈谈javascript高级特性
Sep 04 Javascript
JavaScript获取页面元素的常用方法详解
Sep 28 Javascript
vue开发移动端底部导航条功能
Apr 08 Javascript
vue 限制input只能输入正数的操作
Aug 05 Javascript
JS动态修改iframe高度和宽度的方法
Apr 01 #Javascript
JS获取iframe中longdesc属性的方法
Apr 01 #Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
Apr 01 #Javascript
JS去除iframe滚动条的方法
Apr 01 #Javascript
JS动态修改iframe内嵌网页地址的方法
Apr 01 #Javascript
JS获得图片alt信息的方法
Apr 01 #Javascript
JS实现动态给图片添加边框的方法
Apr 01 #Javascript
You might like
鸡肋的PHP单例模式应用详解
2013/06/03 PHP
win7+apache+php+mysql环境配置操作详解
2013/06/10 PHP
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
php动态添加url查询参数的方法
2015/04/14 PHP
EasyUi tabs的高度与宽度根据IE窗口的变化自适应代码
2010/10/26 Javascript
jQuery实现强制cookie过期方法汇总
2015/05/22 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
2015/08/06 Javascript
jquery实现标题字体变换的滑动门菜单效果
2015/09/07 Javascript
jQuery组件easyui基本布局实现代码
2016/08/25 Javascript
Javascript中引用类型传递的知识点小结
2017/03/06 Javascript
详解基于vue-cli配置移动端自适应
2018/01/13 Javascript
npm 常用命令详解(小结)
2019/01/17 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
2020/07/27 Javascript
[23:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
酷! 程序员用Python带你玩转冲顶大会
2018/01/17 Python
flask中使用蓝图将路由分开写在不同文件实例解析
2018/01/19 Python
python和opencv实现抠图
2018/07/18 Python
python高效过滤出文件夹下指定文件名结尾的文件实例
2018/10/21 Python
浅谈python实现Google翻译PDF,解决换行的问题
2018/11/28 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
2018/12/03 Python
Numpy之random函数使用学习
2019/01/29 Python
numpy:np.newaxis 实现将行向量转换成列向量
2019/11/30 Python
python实现名片管理器的示例代码
2019/12/17 Python
python GUI模拟实现计算器
2020/06/22 Python
详解CSS3的opacity属性设置透明效果的用法
2016/05/09 HTML / CSS
html5 canvas简单封装一个echarts实现不了的饼图
2018/06/12 HTML / CSS
大学生职业生涯规划书范文
2014/01/14 职场文书
八年级数学教学反思
2014/01/31 职场文书
最新奶茶店创业计划书范文
2014/02/08 职场文书
优秀医生事迹材料
2014/02/12 职场文书
《果园机器人》教学反思
2014/04/13 职场文书
师范生求职自荐信
2014/06/14 职场文书
人事专员岗位职责说明书
2014/07/30 职场文书
通用员工手册范本
2015/05/14 职场文书
vscode中使用npm安装babel的方法
2021/08/02 Javascript
Ruby使用Mysql2连接操作MySQL
2022/04/19 Ruby