代码:

  1. (function ($) {
  2. "use strict";
  3. $.fn.pin = function (options) {
  4. var scrollY = 0, elements = [], disabled = false, $window = $(window);
  5.  
  6. options = options || {};
  7.  
  8. var recalculateLimits = function () {
  9. for (var i = 0, len = elements.length; i < len; i++) {
  10. var $this = elements[i];
  11.  
  12. if (options.minWidth && $window.width() <= options.minWidth) {
  13. if ($this.parent().is(".pin-wrapper")) { $this.unwrap(); }
  14. $this.css({ width: "", left: "", top: "", position: "" });
  15. if (options.activeClass) { $this.removeClass(options.activeClass); }
  16. disabled = true;
  17. continue;
  18. } else {
  19. disabled = false;
  20. }
  21.  
  22. var $container = options.containerSelector ? $this.closest(options.containerSelector) : $(document.body);
  23. var offset = $this.offset();
  24. var containerOffset = $container.offset();
  25. var parentOffset = $this.offsetParent().offset();
  26.  
  27. if (!$this.parent().is(".pin-wrapper")) {
  28. $this.wrap("<div class='pin-wrapper'>");
  29. }
  30.  
  31. var pad = $.extend({
  32. top: 0,
  33. bottom: 0
  34. }, options.padding || {});
  35.  
  36. $this.data("pin", {
  37. pad: pad,
  38. from: (options.containerSelector ? containerOffset.top : offset.top) - pad.top,
  39. to: containerOffset.top + $container.height() - $this.outerHeight() - pad.bottom,
  40. end: containerOffset.top + $container.height(),
  41. parentTop: parentOffset.top
  42. });
  43.  
  44. $this.css({ width: $this.outerWidth() });
  45. $this.parent().css("height", $this.outerHeight());
  46. }
  47. };
  48.  
  49. var onScroll = function () {
  50. if (disabled) { return; }
  51.  
  52. scrollY = $window.scrollTop();
  53.  
  54. var elmts = [];
  55. for (var i = 0, len = elements.length; i < len; i++) {
  56. var $this = $(elements[i]),
  57. data = $this.data("pin");
  58.  
  59. if (!data) { // Removed element
  60. continue;
  61. }
  62.  
  63. elmts.push($this);
  64.  
  65. var from = data.from - data.pad.bottom,
  66. to = data.to - data.pad.top;
  67.  
  68. if (from + $this.outerHeight() > data.end) {
  69. $this.css('position', '');
  70. continue;
  71. }
  72.  
  73. if (from < scrollY && to > scrollY) {
  74. !($this.css("position") == "fixed") && $this.css({
  75. left: $this.offset().left,
  76. top: data.pad.top
  77. }).css("position", "fixed");
  78. if (options.activeClass) { $this.addClass(options.activeClass); }
  79. } else if (scrollY >= to) {
  80. $this.css({
  81. left: "",
  82. top: to - data.parentTop + data.pad.top
  83. }).css("position", "absolute");
  84. if (options.activeClass) { $this.addClass(options.activeClass); }
  85. } else {
  86. $this.css({ position: "", top: "", left: "" });
  87. if (options.activeClass) { $this.removeClass(options.activeClass); }
  88. }
  89. }
  90. elements = elmts;
  91. };
  92.  
  93. var update = function () { recalculateLimits(); onScroll(); };
  94.  
  95. this.each(function () {
  96. var $this = $(this),
  97. data = $(this).data('pin') || {};
  98.  
  99. if (data && data.update) { return; }
  100. elements.push($this);
  101. $("img", this).one("load", recalculateLimits);
  102. data.update = update;
  103. $(this).data('pin', data);
  104. });
  105.  
  106. $window.scroll(onScroll);
  107. $window.resize(function () { recalculateLimits(); });
  108. recalculateLimits();
  109.  
  110. $window.load(update);
  111.  
  112. return this;
  113. };
  114. })(jQuery);

调用方法:

$("#fixdiv").pin();

注意如页面有动态生成的HTML,请在HTML生成之后调用 pin()

Jquery定位插件,固定元素在页面某个位置,不随滚动条滚动的更多相关文章

  1. 获取一个元素距离顶部的位置和window的滚动值

    获取一个元素距离顶部的位置: $(".box").offset().top; 获取window的滚动值: $(window).scrollTop();

  2. 获取元素在页面中位置 getBoundingClientRect()

    DOM 原生方法getBoundingClientRect()获取元素相对视口位置 DOMRect 对象包含了一组用于描述边框的只读属性--left.top.right和bottom,单位为像素.除了 ...

  3. 网站开发常用jQuery插件总结(12)固定元素插件scrolltofixed

    这个插件在前段时间用过一次,当时是改一个网站.要求顶部的菜单栏随着滚动条的滚动而固定.也大体写了一下,不过在文章中也只是提了一下,文章地址:jQuery插件固定元素位置. 在这篇文章中,再进行总结一下 ...

  4. FullPage.js-基于 jQuery 的插件全屏滚动插件

    fullPage.js 是一个基于 jQuery 的插件,它能够很方便.很轻松的制作出全屏网站.如今我们经常能见到全屏网站,尤其是国外网站.这些网站用几幅很大的图片或色块做背景,再添加一些简单的内容, ...

  5. jquery.validate插件在booststarp中的运用

    现在在网络上已经可以找到很多基于bootstarp的表单认证,但是验证的都不全面的,下载后,我们还要理解作者的思路然后进行修改添加,这种修改方式往往适合学习,时间很多的时候.但是我们很多时候是没有时间 ...

  6. appium+robotframework+python连接真机定位不到元素的问题处理

    这几天遇到了一个比较奇怪的问题,使用RF框架进行自动化测试的时候定位不到部分元素 并且这个元素的是有id的,更换了xpath定位也行不通,冥思苦想,加上谷歌百度,终于解决了 解决步骤如下: 1.定位问 ...

  7. jquery 禁止滚动条滚动,并且滚动条不消失,页面大小不闪动

    一,禁止滚动,滚动条不消失,页面大小不闪动 //禁止滚动条滚动 function unScroll() { var top = $(document).scrollTop(); $(document) ...

  8. 网站开发常用jQuery插件总结(13)定位插件scrollto

    一.scrollto插件功能 scrollto用于定位页面中元素的位置,并使滚动条滚动到当前元素. 二.scrollto官方地址 https://github.com/flesler/jquery.s ...

  9. 用 jQuery Masonry 插件创建瀑布流式的页面(转)

    瀑布流式的页面,最早我是在国外的一个叫 Pinterest 的网站上看到,这个网站爆发,后来国内的很多网站也使用了这种瀑布流方式来展示页面(我不太喜欢瀑布流这个名字). 我们可以使用 jQuery 的 ...

随机推荐

  1. Golang 中使用多维 map

    http://tnt.wicast.tk/2015/11/02/golang-multiple-dimension-map/ Golang 的 XML/JSON 解析库乍看使用起来很方便,只要构造一样 ...

  2. 如何使用动画和精灵表单 Cocos2d-x 2.1.4

            本文实践自 Ray Wenderlich.Tony Dahbura 的文章< How to Use Animations and Sprite Sheets in Cocos2D ...

  3. WordPress后台的文章、分类,媒体,页面,评论,链接等所有信息中显示ID并将ID设置为第一列

    WordPress后台默认是不显示文章.分类等信息ID的,查看起来非常不方便,不知道Wp团队出于什么原因默认不显示这个但可以使用Simply Show IDs插件来实现 不使用插件,其他网友的实现: ...

  4. 如何使用FF的Firebug组件中的net工具查看页面元素加载消耗时间

    1.安装FF的Firebug组件:点击FF的Tools的Add-ons菜单,输入Firebug关键字,并选择合适的版本Install. 2.安装完毕后地址栏右边会出现一个小虫图标,右边还有一个下拉箭头 ...

  5. nginx+tomcat+redis完成session共享(转载)

    转载:http://blog.csdn.net/grhlove123/article/details/48047735 tomcat7下基于redis的session共享所需jar包: http:// ...

  6. 新浪面试题:只允许使用++操作符实现加减乘除运算(c语言版)

    //假定a,b都是正整数,只允许使用++而不使用-,--,*,/操作符的情况下实现加减乘除运算 //使用++实现加法: int jiafa(int a,int b){ for (int i=0;i&l ...

  7. python手记(42)

    #!/usr/bin/env python #-*- coding: utf-8 -*- #code:myhaspl@qq.com import cv2 import numpy as np fn1= ...

  8. [Python]网络爬虫(八):糗事百科的网络爬虫(v0.2)源码及解析

    转自:http://blog.csdn.net/pleasecallmewhy/article/details/8932310 项目内容: 用Python写的糗事百科的网络爬虫. 使用方法: 新建一个 ...

  9. github下载源码的三种方式

      从github上下载源码的三种方式 CreationTime--2018年6月7日15点21分 Author:Marydon 1.情景展示 2.实现方式 方式一:直接点击"Downloa ...

  10. iOS-APP启动页加载广告

    概述 加载广告页, 展现跳过按钮实现倒计时功能, 并判断广告页面是否更新. 详细 代码下载:http://www.demodashi.com/demo/10698.html 目前市场上很多APP(如淘 ...