javascript------>(此文转发)

JS控制div跳转到指定的位置的解决方案总结

总结一下自己在写这个需求遇到的问题,相信大家应该是经常遇到的。即要求滚轮滚动到指定的位置。先看下基本的解决方案。

1.给链接a加个#的方式来实现跳转。(锚点方法)这里直接贴下代码:

html页面:

?


1

2

3

4

5

6

7

8

<div id="container">

       <a href="#div1">div1</a>

       <a href="#div2">div2</a>

       <a href="#div3">div3</a>

</div>

   <div id="div1">div1</div>

   <div id="div2">div2</div>

   <div id="div3">div3</div>

 css样式:

?


1

2

3

4

5

6

7

8

9

div {

           height: 800px;

           width: 400px;

           border: 2px solid black;

       }

  #container{

           position: fixed;

           margin:50px  500px;

 }

  该锚点法,不需要任何的js代码,即可实现跳转的方法。缺点:点击链接url发生变化,刷新的话会有问题。此方法貌似只能在.html后缀的页面才能起作用,对于.cshtml页面不起作用。

2.用animate属性,当点击锚点后,页面滚动到相应的DIV。接着上面的代码,具体添加如下代码:

html页面:

?


1

2

3

4

5

6

7

8

<div id="container">

          <p id="p1">div1</p>

          <p id="p2">div2</p>

          <p id="p3">div3</p>

</div>

   <div id="div1">div1</div>

   <div id="div2">div2</div>

   <div id="div3">div3</div>

css样式页面同上,看下js代码如下:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.0.min.js"></script>

$(document).ready(function() {

    $("#p1").click(function() {

        $("html, body").animate({

            scrollTop: $("#div1").offset().top }, {duration: 500,easing: "swing"});

        return false;

    });

    $("#p2").click(function() {

        $("html, body").animate({

            scrollTop: $("#div2").offset().top }, {duration: 500,easing: "swing"});

        return false;

    });

    $("#p3").click(function() {

        $("html, body").animate({

            scrollTop: $("#div3").offset().top }, {duration: 500,easing: "swing"});

        return false;

    });

});

3.简单的window.scrollTo方法使用,这里不再详细说,看下用法。

即滚动到坐标为(100,500)的地方。比较单一,且没有缓慢的效果

?


1

2

3

function scrollWindow(){

    window.scrollTo(100,500);

}

4.用js的srollIntoView方法进行使用。这里贴下代码:

html页面:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<ul>

        <li><a href="javascript:;" data-tab="eat">吃饭</a></li>

        <li><a href="javascript:;" data-tab="sleep">睡觉</a></li>

        <li><a href="javascript:;" data-tab="walk">逛街</a></li>

 </ul>

<div >

    <div data-tab="eat" style="background:cyan; height:500px;">

        吃饭

    </div>

    <div data-tab="sleep" style="background:lightgreen;height:2000px;">

        睡觉

    </div>

    <div data-tab="walk" style="background:LightSalmon;height:1000px;">

        逛街

    </div>

</div>

js代码如下:

?


1

2

3

4

5

6

[].slice.call(document.querySelectorAll(‘a‘)).forEach(function(el){

           el.addEventListener(‘click‘, function(){

               var target = document.querySelector(‘div[data-tab=‘ + this.getAttribute(‘data-tab‘)+ ‘]‘ )

               target.scrollIntoView(true);

           })

 })

注意一个问题,object.scrollIntoView(bool),前面是对象,通常原生的获取对象都是下面的写法:

?


1

document.getElementById(‘#xxx‘ ).scrollIntoView(true);

那么如果用jquery来调用该方法的话,需要写成下面这样的:

?


1

$(‘#xxx‘)[0].scrollIntoView(true);

需要滚动的时候加一个定时器:记住定时器的使用规则是先关后开;

js部分:

?


1

2

3

4

5

6

7

    return cPageView.extend({

            pageid: 10320608681,

            hpageid: 10320608681,

            events: {

                "click .nav_list li ": "setHightLight",

            },

})

点击事件部分:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

//设置标签选中,并且滚动到相应的位置

          setHightLight: function (e) {

              var obj = $(e.currentTarget);

              var _tag = this.$el.find(‘.nav_list li‘);

              var $innerText = this.$el.find(‘.fsp_hd‘);

              var items = $(".fs_prd_wrap").find(‘.item‘);

              this.$el.find(‘.nav_list li‘).removeClass(‘current‘);

              var itemIndex = "";

              var objCurrent = [];

              obj.addClass(‘current‘);

              var scrollMove = function (scrollTo, time) {

                  var scrollFrom = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;

                  var count = 0;

                  var every = 10;

                  scrollTo = parseInt(scrollTo);

                  time /= every;

                  var interval = setInterval(function () {

                      count++;

                      document.documentElement.scrollTop = document.body.scrollTop = (scrollTo - scrollFrom) / time * count + scrollFrom;

                      if (count >= time) {

                          clearInterval(interval);

                      }

                  }, every);

              };

              for (var i = 0; i < items.length; i++) {

                  var self = this;

                  items[i].index = i;

                  if (obj.index() == items[i].index) {

                      items.each(function () {

                          var currentItem = $(this);

                          // items[i].scrollIntoView(false);         

                          scrollMove(items[i].offsetTop-75, 500);

                      });

                     

                     // console.log(items[i].index);

                  }

              }

          },

 看下效果如下所示:

       

在chrome下测试和真机测试,效果都还行,这个需求主要是,没法通过高度来控制完成,因为,我们这个中间的内容元素都是动态加载进来的,高度是变得

因此我通过控制它的index来控制,固定其div模块,距离顶部的高度top为75px,滚动单个的div模块,而不是整个的body一起滚动。

如果大家还有更好的方法,欢迎给我留言哈!

总结一下自己在写这个需求遇到的问题,相信大家应该是经常遇到的。即要求滚轮滚动到指定的位置。先看下基本的解决方案。

1.给链接a加个#的方式来实现跳转。(锚点方法)这里直接贴下代码:

html页面:

?


1

2

3

4

5

6

7

8

<div id="container">

       <a href="#div1">div1</a>

       <a href="#div2">div2</a>

       <a href="#div3">div3</a>

</div>

   <div id="div1">div1</div>

   <div id="div2">div2</div>

   <div id="div3">div3</div>

 css样式:

?


1

2

3

4

5

6

7

8

9

div {

           height: 800px;

           width: 400px;

           border: 2px solid black;

       }

  #container{

           position: fixed;

           margin:50px  500px;

 }

  该锚点法,不需要任何的js代码,即可实现跳转的方法。缺点:点击链接url发生变化,刷新的话会有问题。此方法貌似只能在.html后缀的页面才能起作用,对于.cshtml页面不起作用。

2.用animate属性,当点击锚点后,页面滚动到相应的DIV。接着上面的代码,具体添加如下代码:

html页面:

?


1

2

3

4

5

6

7

8

<div id="container">

          <p id="p1">div1</p>

          <p id="p2">div2</p>

          <p id="p3">div3</p>

</div>

   <div id="div1">div1</div>

   <div id="div2">div2</div>

   <div id="div3">div3</div>

css样式页面同上,看下js代码如下:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.0.min.js"></script>

$(document).ready(function() {

    $("#p1").click(function() {

        $("html, body").animate({

            scrollTop: $("#div1").offset().top }, {duration: 500,easing: "swing"});

        return false;

    });

    $("#p2").click(function() {

        $("html, body").animate({

            scrollTop: $("#div2").offset().top }, {duration: 500,easing: "swing"});

        return false;

    });

    $("#p3").click(function() {

        $("html, body").animate({

            scrollTop: $("#div3").offset().top }, {duration: 500,easing: "swing"});

        return false;

    });

});

3.简单的window.scrollTo方法使用,这里不再详细说,看下用法。

即滚动到坐标为(100,500)的地方。比较单一,且没有缓慢的效果

?


1

2

3

function scrollWindow(){

    window.scrollTo(100,500);

}

4.用js的srollIntoView方法进行使用。这里贴下代码:

html页面:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<ul>

        <li><a href="javascript:;" data-tab="eat">吃饭</a></li>

        <li><a href="javascript:;" data-tab="sleep">睡觉</a></li>

        <li><a href="javascript:;" data-tab="walk">逛街</a></li>

 </ul>

<div >

    <div data-tab="eat" style="background:cyan; height:500px;">

        吃饭

    </div>

    <div data-tab="sleep" style="background:lightgreen;height:2000px;">

        睡觉

    </div>

    <div data-tab="walk" style="background:LightSalmon;height:1000px;">

        逛街

    </div>

</div>

js代码如下:

?


1

2

3

4

5

6

[].slice.call(document.querySelectorAll(‘a‘)).forEach(function(el){

           el.addEventListener(‘click‘, function(){

               var target = document.querySelector(‘div[data-tab=‘ + this.getAttribute(‘data-tab‘)+ ‘]‘ )

               target.scrollIntoView(true);

           })

 })

注意一个问题,object.scrollIntoView(bool),前面是对象,通常原生的获取对象都是下面的写法:

?


1

document.getElementById(‘#xxx‘ ).scrollIntoView(true);

那么如果用jquery来调用该方法的话,需要写成下面这样的:

?


1

$(‘#xxx‘)[0].scrollIntoView(true);

5.如果需要缓慢的移动滚动可添加一个定时器。看下我们这个需求。先贴下代码:

js部分:

?


1

2

3

4

5

6

7

    return cPageView.extend({

            pageid: 10320608681,

            hpageid: 10320608681,

            events: {

                "click .nav_list li ": "setHightLight",

            },

})

点击事件部分:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

//设置标签选中,并且滚动到相应的位置

          setHightLight: function (e) {

              var obj = $(e.currentTarget);

              var _tag = this.$el.find(‘.nav_list li‘);

              var $innerText = this.$el.find(‘.fsp_hd‘);

              var items = $(".fs_prd_wrap").find(‘.item‘);

              this.$el.find(‘.nav_list li‘).removeClass(‘current‘);

              var itemIndex = "";

              var objCurrent = [];

              obj.addClass(‘current‘);

              var scrollMove = function (scrollTo, time) {

                  var scrollFrom = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;

                  var count = 0;

                  var every = 10;

                  scrollTo = parseInt(scrollTo);

                  time /= every;

                  var interval = setInterval(function () {

                      count++;

                      document.documentElement.scrollTop = document.body.scrollTop = (scrollTo - scrollFrom) / time * count + scrollFrom;

                      if (count >= time) {

                          clearInterval(interval);

                      }

                  }, every);

              };

              for (var i = 0; i < items.length; i++) {

                  var self = this;

                  items[i].index = i;

                  if (obj.index() == items[i].index) {

                      items.each(function () {

                          var currentItem = $(this);

                          // items[i].scrollIntoView(false);         

                          scrollMove(items[i].offsetTop-75, 500);

                      });

                     

                     // console.log(items[i].index);

                  }

              }

          },

 看下效果如下所示:

       

在chrome下测试和真机测试,效果都还行,这个需求主要是,没法通过高度来控制完成,因为,我们这个中间的内容元素都是动态加载进来的,高度是变得

因此我通过控制它的index来控制,固定其div模块,距离顶部的高度top为75px,滚动单个的div模块,而不是整个的body一起滚动。

如果大家还有更好的方法,欢迎给我留言哈!



  

时间: 2024-08-04 19:48:04

javascript------>(此文转发)的相关文章

js 的小效果----&gt;选项卡

js选项卡 <!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title> <style> #box1 {     width: 300px; height: 300px;  margin: 100px auto; border: #000 2px solid;   font-family: "微软雅黑&quo

Jquery:小知识;

Jquery:小知识: jQuery学习笔记(二):this相关问题及选择器 上一节的遗留问题,关于this的相关问题,先来解决一下. this的相关问题 this指代的是什么 这个应该是比较好理解的,this就是指代当前操作的DOM对象. 在jQuery中,this可以用于单个对象,也可以用于多个对象. $('btn').click(function(){ alert(this.innerHTML); // 单个对象,this指代当前id为btn的DOM对象 }); $('div').each

web 小知识

document.write和innerHTML的区别 document.write是直接写入到页面的内容流,如果在写之前没有调用document.open, 浏览器会自动调用open.每次写完关闭之后重新调用该函数,会导致页面被重写. innerHTML则是DOM页面元素的一个属性,代表该元素的html内容.你可以精确到某一个具体的元素来进行更改.如果想修改document的内容,则需要修改document.documentElement.innerElement. innerHTML将内容写

面向对象原则之一 依赖倒置原则

原文:面向对象原则之一 依赖倒置原则 前言 面向对象有人分为五大原则,分别为单一职责原则.开放封闭原则.依赖倒置原则.接口隔离原则.里氏替换原则. 也有人分为六大原则,分别为单一职责原则.开放封闭原则.依赖倒置原则.接口隔离原则.里氏替换原则.迪米特法则. 现在我们来介绍依赖倒置原则 依赖倒置原则 1)概念 a.高层模块不应该依赖于底层模块,两者应该依赖于其抽象. b.抽象不应该依赖具体实现,具体实现应该依赖抽象. 上面2点是依赖倒置原则的概念,也是核心.主要是说模块之间不要依赖具体实现,依赖接

面向对象原则之一 开放封闭原则(开闭原则)

原文:面向对象原则之一 开放封闭原则(开闭原则) 前言 面向对象有人分为五大原则,分别为单一职责原则.开放封闭原则.依赖倒置原则.接口隔离原则.里氏替换原则. 也有人分为六大原则,分别为单一职责原则.开放封闭原则.依赖倒置原则.接口隔离原则.里氏替换原则.迪米特法则. 现在我们来介绍开放封闭原则,也叫开闭原则 开闭原则 1)概念 官方说法是 软件实体(模块.类.函数等)应该可以扩展,但是不可以修改.也就是说软件对扩展开放,对修改关闭. 需要说明的是,对修改关闭不是说软件设计不能做修改,只是尽量不

【开发必看】你真的了解回流和重绘吗?

本文由云+社区发表 回流和重绘可以说是每一个web开发者都经常听到的两个词语,可是可能有很多人不是很清楚这两步具体做了什么事情.最近有空对其进行了一些研究,看了一些博客和书籍,整理了一些内容并且结合一些例子,写了这篇文章,希望可以帮助到大家. 浏览器的渲染过程 本文先从浏览器的渲染过程来从头到尾的讲解一下回流重绘,如果大家想直接看如何减少回流和重绘,优化性能,可以跳到后面.(这个渲染过程来自MDN) 浏览器渲染过程 添加描述 从上面这个图上,我们可以看到,浏览器渲染过程如下: 解析HTML,生成

确认过眼神,你就是我们要找的人!

究竟什么是DevOps? DevOps是一种软件开发方法,涉及软件在整个开发生命周期中的持续开发,持续测试,持续集成,持续部署和持续监控.它是一个自动化过程,允许快速,安全和高质量的软件开发和发布,同时保持所有利益相关者在一个循环中,这就是DevOps获得越来越多的优秀团队青睐的真正原因. 12月08日,平安云&行云联合中国DevOps社区共同出品的--深圳DevOps社区&平安云|行云 第七届Meetup 将于深圳盛大举办,届时将有来自平安&行云.Agilean等业界大咖为大家联

看懂此文,不再困惑于javascript中的事件绑定、事件冒泡、事件捕获和事件执行顺序

最近一个项目基于3维skyline平台,进行javascript二次开发.对skyline事件的设计真是无语至极,不堪折磨啊!抽空学习了下javascript和jquery的事件设计,收获颇大,总结此贴,和大家分享. (一)事件绑定的几种方式 javascript给DOM绑定事件处理函数总的来说有2种方式:在html文档中绑定.在js代码中绑定.下面的方式1.方式2属于在html中绑定事件,方式3.方式4和方式5属于在js代码中绑定事件,其中方法5是最推荐的做法. 方式1: HTML的DOM元素

5种你未必知道的JavaScript和CSS交互的方法(转发)

5种你未必知道的JavaScript和CSS交互的方法 10/08. 2014 随着浏览器不断的升级改进,CSS和JavaScript之间的界限越来越模糊.本来它们是负责着完全不同的功能,但最终,它们都属于网页前端技术,它们需要相互密切的合作.我们的网页中都有.js文件和.css文件,但这并不意味着CSS和js是独立不能交互的.下面要讲的这五种JavaScript和CSS共同合作的方法你也许未必知道! 用JavaScript获取伪元素(pseudo-element)属性 大家都知道如何通过一个元

javascript 中的时间戳转换时间 根据时间字符判断星期几 根据开始时间结束时间获取中间间隔时间 来自转发

//时间戳转换时间      function timedat(res){   //res 为传入的时间戳   例:1509091800000 var time = new Date(res); var y = time.getFullYear(); var m = time.getMonth()+1; var d = time.getDate(); return y+'-'+m+'-'+d;    //返回格式  "2017-10-27" 字符串    }; //根据时间判断星期几