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 相关文章推荐
javascript parseInt 大改造
Sep 27 Javascript
seajs中模块的解析规则详解和模块使用总结
Mar 12 Javascript
JS实现的5级联动Select下拉选择框实例
Aug 17 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
Oct 12 Javascript
理解JavaScript表单的基础知识
Jan 25 Javascript
jQuery通用的全局遍历方法$.each()用法实例
Jul 04 Javascript
AngularJs Modules详解及示例代码
Sep 01 Javascript
Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解
Sep 25 Javascript
微信小程序版翻牌小游戏
Jan 26 Javascript
vue实现菜单切换功能
May 08 Javascript
JavaScript实现PC端四格密码输入框功能
Feb 19 Javascript
让JavaScript代码更加精简的方法技巧
Jun 01 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
JS实现php的伪分页
2008/05/25 PHP
php使用socket post数据到其它web服务器的方法
2015/06/02 PHP
php获取文件后缀的9种方法
2016/03/22 PHP
php实现分页功能的详细实例方法
2019/09/29 PHP
PHP dirname功能及原理实例解析
2020/10/28 PHP
JQuery 引发两次$(document.ready)事件
2010/01/15 Javascript
jQuery 入门级学习笔记及源码
2010/01/22 Javascript
javascript new后的constructor属性
2010/08/05 Javascript
JS在TextArea光标位置插入文字并实现移动光标到文字末尾
2013/06/21 Javascript
Jquery中国地图热点效果-鼠标经过弹出提示层信息的简单实例
2014/02/12 Javascript
使用Node.js配合Nginx实现高负载网络
2015/06/28 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
2016/11/25 Javascript
WebSocket实现简单客服聊天系统
2017/05/12 Javascript
基于wordpress的ajax写法详解
2018/01/02 Javascript
在Vue组件上动态添加和删除属性方法
2018/02/23 Javascript
JavaScript判断数组类型的方法
2019/10/23 Javascript
JavaScript如何实现图片处理与合成
2020/05/29 Javascript
vue中watch的用法汇总
2020/12/28 Vue.js
Python Property属性的2种用法
2015/06/21 Python
总结python实现父类调用两种方法的不同
2017/01/15 Python
python selenium 弹出框处理的实现
2019/02/26 Python
python flask 如何修改默认端口号的方法步骤
2019/07/12 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
Python中random模块常用方法的使用教程
2020/10/04 Python
pycharm配置安装autopep8自动规范代码的实现
2021/03/02 Python
很酷的HTML5电子书翻页动画特效
2016/02/25 HTML / CSS
如何利用input事件来监听移动端的输入
2016/04/15 HTML / CSS
华三通信H3C面试题
2015/05/15 面试题
女儿十岁生日答谢词
2014/01/27 职场文书
护士进修自我鉴定
2014/02/07 职场文书
中药学专业毕业生推荐信
2014/07/10 职场文书
画展邀请函
2015/01/31 职场文书
高一作文之暖冬
2019/11/09 职场文书
Go遍历struct,map,slice的实现
2021/06/13 Golang
使用vue判断当前环境是安卓还是IOS
2022/04/12 Vue.js
CSS中使用grid布局实现一套模板多种布局
2022/07/15 HTML / CSS