js上下视差滚动简单实现代码


Posted in Javascript onMarch 07, 2017

前言: 项目中让实现一个简单的上下视差滚动,就是当页面滑动到某一固定位置时,让上下两页面出现叠加效果,恢复时,展开恢复。

功能技术实现方式:元素定位,鼠标事件

思路1:

一开始想着设置滚动条监听事件,当到固定位置时下方元素设置relative属性(这样可保证不改变其原有样式而且可以实现元素位置的调整),于是就诞生出一下代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title></title>
  </head>
  <style>
    body{
      margin: 0;
      padding: 0;
    }
    .div1{
      width: 100%;
      height: 500px;
      background: #FF0000;
      position: fixed;
      top: 0;
      left: 0;
    }
    .div2{
      width: 100%;
      margin-top: 500px;
      height: 1000px;
      background: #22B0FC;
      position: relative;
      z-index: 2;;
    }
  </style>
  <body>
    <div class="div1">1111111</div>
    <div class="div2">22222222222222</div>
  </body>
  <script src="jquery-1.8.3.min.js"></script>
  <script>
    $(document).ready(function () { 
      $(window).scroll(function () {
        var scrollTop=$(window).scrollTop();
        //$(window).scrollTop()这个方法是当前滚动条滚动的距离
        //$(window).height()获取当前窗体的高度
        //$(document).height()获取当前文档的高度
        $('.div2').css('top',-scrollTop);
      });
    });
  </script>
</html>

问题:运行以上代码就会发现有一个很明显的bug,虽然大体功能已经实现了,但是因为relative的元素不管如何移动,还是会占有原本的位置。然而我们的期望是,滚动条到达让下方元素底部时就不应该滑动了,如何解决呢?

思路2:

我思考了良久,但是仍然没发现可以让元素既不占位置,又不改变自身样式,所以我大胆放弃relative,选择absolute定位,这个就需要我们自己做样式的调整,具体代码如下:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title></title>
  </head>
  <style>
    body{
      margin: 0;
      padding: 0;
    }
    .clearfix:after {
       content: '';
       display: block;
       clear: both;
      }
    .div1{
      width: 100%;
      margin: 0 auto;
      height: 500px;
      background: bisque;
      position: fixed;
      top: 0;
      left: 0;
    }
    .div1 div{
      width: 1200px;
      margin: 0 auto;
      height: 500px;
      background: #FF0000;
    }
    .div2{
      width: 1200px;
      margin: 0 auto;
      height: 1500px;
      background: #22B0FC;
      z-index: 20000;;
      margin-top: 500px;
    }
  </style>
  <body>
    <div class="div1 clearfix">
      <div>111111111111111111111111111111111111111</div>
    </div>
    <div class="div2">22222222222222</div>
  </body>
  <script src="jquery-1.8.3.min.js"></script>
  <script>
    var div2Height=Number($('.div2').offsetTop);
      var clientHeight=Number($(document).clientHeight);
      var totalHeight=div2Height-clientHeight;
      var objOffset=$('.div2').offset().top;
      var objOffsetLf=$('.div2').offset().left;
      $(document).ready(function () { //本人习惯这样写了
      $(window).scroll(function () {
        var scrollTop=$(window).scrollTop();
        var objHeight=objOffset-scrollTop;
        console.log(scrollTop);
         if(scrollTop>=0){
          $('.div2').css({'left':objOffsetLf,'top':objHeight,'position':'absolute','margin-top':'0px'});
        }else{
          $('.div2').css({'position':'static','margin-top':'500px'});
        }
      });
    });
  </script>
</html>

注意:①上半部分元素的位置需要保持不动②下半部分确保层级要高于上半部分③本代码针对的是上半部分固定,如果想让其跟着动,需要确保下半部分滚动速度要大于上半部分

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js以对象为索引的关联数组
Jul 04 Javascript
深入理解JavaScript系列(1) 编写高质量JavaScript代码的基本要点
Jan 15 Javascript
jquery slibings选取同级其他元素的实现代码
Nov 15 Javascript
基于jquery的simpleValidate简易验证插件
Jan 31 Javascript
javascript实现playfair和hill密码算法
Dec 07 Javascript
javascript实现框架高度随内容改变的方法
Jul 23 Javascript
7个去伪存真的JavaScript面试题
Jan 07 Javascript
JavaScript严格模式下关于this的几种指向详解
Jul 12 Javascript
Bootstrap table使用方法记录
Aug 23 Javascript
Js利用Canvas实现图片压缩功能
Sep 13 Javascript
关于axios不能使用Vue.use()浅析
Jan 12 Javascript
用JS创建一个录屏功能
Nov 11 Javascript
js实现下一页页码效果
Mar 07 #Javascript
原生JS中slice()方法和splice()区别
Mar 06 #Javascript
浅析vue component 组件使用
Mar 06 #Javascript
js常用的继承--组合式继承
Mar 06 #Javascript
VUE开发一个图片轮播的组件示例代码
Mar 06 #Javascript
canvas仿iwatch时钟效果
Mar 06 #Javascript
jQuery滚动监听实现商城楼梯式导航效果
Mar 06 #Javascript
You might like
PHP实现删除非站内外部链接实例代码
2014/06/17 PHP
PHP使用内置dir类实现目录遍历删除
2015/03/31 PHP
php面向对象与面向过程两种方法给图片添加文字水印
2015/08/26 PHP
PHP count()函数讲解
2019/02/03 PHP
由浅到深了解JavaScript类
2006/09/08 Javascript
对YUI扩展的Gird组件 Part-1
2007/03/10 Javascript
用JS实现的一个include函数
2007/07/21 Javascript
Iframe 自适应高度并实时监控高度变化的js代码
2009/10/30 Javascript
button没写type=button会导致点击时提交
2014/03/06 Javascript
Javascript中实现trim()函数的两种方法
2015/02/04 Javascript
jQuery通过扩展实现抖动效果的方法
2015/03/11 Javascript
jQuery+PHP实现可编辑表格字段内容并实时保存
2015/10/09 Javascript
jQuery技巧之让任何组件都支持类似DOM的事件管理
2016/04/05 Javascript
angular源码学习第一篇 setupModuleLoader方法
2016/10/20 Javascript
解决vue js IOS H5focus无法自动弹出键盘的问题
2018/08/30 Javascript
微信小程序静默登录的实现代码
2020/01/08 Javascript
JavaScript实现简单的计算器
2020/01/16 Javascript
JavaScript对象原型链原理详解
2020/02/05 Javascript
[03:41]2018完美盛典-《Fight With Us》
2018/12/16 DOTA
python正则表达式抓取成语网站
2013/11/20 Python
python中正则表达式的使用详解
2014/10/17 Python
python基于xmlrpc实现二进制文件传输的方法
2015/06/02 Python
Python3.7实现中控考勤机自动连接
2018/08/28 Python
django DRF图片路径问题的解决方法
2018/09/10 Python
python实现字符串完美拆分split()的方法
2019/07/16 Python
pandas.DataFrame.drop_duplicates 用法介绍
2020/07/06 Python
python中封包建立过程实例
2021/02/18 Python
英国家庭珠宝商:T. H. Baker
2018/02/08 全球购物
枚举与#define宏的区别
2014/04/30 面试题
创建精神文明单位实施方案
2014/03/08 职场文书
党员服务承诺书
2014/05/28 职场文书
大学新闻系自荐书
2014/05/31 职场文书
2016三严三实专题教育活动心得体会
2016/01/06 职场文书
小学数学教学反思范文
2016/02/16 职场文书
Python实现简单的猜单词
2021/06/15 Python
详解Python中下划线的5种含义
2021/07/15 Python