锚链接加楼梯效果(同时支持移动端)

1、pc网页右侧经常会有楼梯效果,页面滑动到一定高度,楼梯出来,同时点击相应的楼层页面滑动到对应的位子,并且在不点击的时候,只是滑动液面的话,滑动到相应的楼层,左侧的楼梯相应的楼梯要高亮显示。(有的顶部也有这样的效果 ,原理一样方法也是一样的)。

2、说先html,css代码为

 1 左侧或顶部楼层代码。左侧或者顶部由 position 控制,这个不影响。注意高亮显示的class是给 a 的父级。不参与楼梯的 class 属性是给 a 的。不能混淆。
 2 <ul id="nav_one">
 3     <li class="current"><a href="#section-1">Section 1</a></li>
 4     <li><a href="#section-2">Section 2</a></li>
 5     <li><a href="#section-3">Section 3</a></li>
 6     <li><a href="#section-4">Section 4</a></li>
 7     <li><a href="#section-5">Section 5</a></li>
 8     <li><a href="index.html" class="external">查看演示一</a></li>
 9 </ul>
10 
11 
12 对应页面楼层
13 <div class="section" id="section-1"></div>
14 <div class="section" id="section-2"></div>
15 <div class="section" id="section-3"></div>
16 <div class="section" id="section-4"></div>
17 <div class="section" id="section-5"></div>
18 
19 
20 
21 css代码为 主要是有fixed属性并且有top值。同时支持开始的时候不是fixed在页面滑动到一定的高度时候nav变为fixed.
22 #nav{left:20px;position:fixed;98px;top:0;}
23 
24 高亮显示代码
25 #nav .current a{background:#909090;color:#ededed;}
26 
27 js调用代码
28 
29 //filter代表 例如 楼层有一个是 返回顶部 这个在华东的时候不参与在内的。external这个属性一定是要给 a 的。不能给 a 的父级 ,否则会报错。调用方法的时候,是给楼层调用,不是给页面对应的区域调用。
30 
31 $(document).ready(function(){
32 
33     $('#nav').onePageNav({
34 
35         filter: ':not(.external)',
36 
37         scrollThreshold: 0.25
38 
39     });
40 
41 });

3、在页面上引入的js 有两个

1 <script type="text/javascript" src="js/jquery.js"></script>
2 
3 <script type="text/javascript" src="js/jquery.scrollTo.js"></script>
4 
5 <script type="text/javascript" src="js/jquery.nav.min.js"></script>
 1 /**
 2  * jQuery.ScrollTo.js.
 3  */
 4 ;
 5 (function(d) { var k = d.scrollTo = function(a, i, e) { d(window).scrollTo(a, i, e) };
 6     k.defaults = { axis: 'xy', duration: parseFloat(d.fn.jquery) >= 1.3 ? 0 : 1 };
 7     k.window = function(a) { return d(window)._scrollable() };
 8     d.fn._scrollable = function() { return this.map(function() { var a = this,
 9                 i = !a.nodeName || d.inArray(a.nodeName.toLowerCase(), ['iframe', '#document', 'html', 'body']) != -1; if(!i) return a; var e = (a.contentWindow || a).document || a.ownerDocument || a; return d.browser.safari || e.compatMode == 'BackCompat' ? e.body : e.documentElement }) };
10     d.fn.scrollTo = function(n, j, b) { if(typeof j == 'object') { b = j;
11             j = 0 } if(typeof b == 'function') b = { onAfter: b }; if(n == 'max') n = 9e9;
12         b = d.extend({}, k.defaults, b);
13         j = j || b.speed || b.duration;
14         b.queue = b.queue && b.axis.length > 1; if(b.queue) j /= 2;
15         b.offset = p(b.offset);
16         b.over = p(b.over); return this._scrollable().each(function() { var q = this,
17                 r = d(q),
18                 f = n,
19                 s, g = {},
20                 u = r.is('html,body'); switch(typeof f) {
21                 case 'number':
22                 case 'string':
23                     if(/^([+-]=)?d+(.d+)?(px|%)?$/.test(f)) { f = p(f); break } f = d(f, this);
24                 case 'object':
25                     if(f.is || f.style) s = (f = d(f)).offset() } d.each(b.axis.split(''), function(a, i) { var e = i == 'x' ? 'Left' : 'Top',
26                     h = e.toLowerCase(),
27                     c = 'scroll' + e,
28                     l = q[c],
29                     m = k.max(q, i); if(s) { g[c] = s[h] + (u ? 0 : l - r.offset()[h]); if(b.margin) { g[c] -= parseInt(f.css('margin' + e)) || 0;
30                         g[c] -= parseInt(f.css('border' + e + 'Width')) || 0 } g[c] += b.offset[h] || 0; if(b.over[h]) g[c] += f[i == 'x' ? 'width' : 'height']() * b.over[h] } else { var o = f[h];
31                     g[c] = o.slice && o.slice(-1) == '%' ? parseFloat(o) / 100 * m : o } if(/^d+$/.test(g[c])) g[c] = g[c] <= 0 ? 0 : Math.min(g[c], m); if(!a && b.queue) { if(l != g[c]) t(b.onAfterFirst);
32                     delete g[c] } });
33             t(b.onAfter);
34 
35             function t(a) { r.animate(g, j, b.easing, a && function() { a.call(this, n, b) }) } }).end() };
36     k.max = function(a, i) { var e = i == 'x' ? 'Width' : 'Height',
37             h = 'scroll' + e; if(!d(a).is('html,body')) return a[h] - d(a)[e.toLowerCase()](); var c = 'client' + e,
38             l = a.ownerDocument.documentElement,
39             m = a.ownerDocument.body; return Math.max(l[h], m[h]) - Math.min(l[c], m[c]) };
40 
41     function p(a) { return typeof a == 'object' ? a : { top: a, left: a } } })(jQuery);
  1 /*
  2  * jQuery.nav.js
  3  
  4  */
  5 ;(function($) {
  6   $.fn.onePageNav = function(options) {
  7     var opts = $.extend({}, $.fn.onePageNav.defaults, options),
  8         onePageNav = {};
  9     
 10     onePageNav.sections = {};
 11     
 12     onePageNav.bindNav = function($el, $this, o) {
 13       var $par = $el.parent(),
 14           newLoc = $el.attr('href'),
 15           $win = $(window);
 16 
 17       if(!$par.hasClass(o.currentClass)) {
 18         if(o.begin) {
 19           o.begin();
 20         }
 21         onePageNav.adjustNav($this, $par, o.currentClass);
 22         $win.unbind('.onePageNav');
 23         $.scrollTo(newLoc, o.scrollSpeed, {
 24           easing: o.easing,
 25           offset: {
 26             top: -o.scrollOffset
 27           },
 28           onAfter: function() {
 29             if(o.changeHash) {
 30               window.location.hash = newLoc;
 31             }
 32             $win.bind('scroll.onePageNav', function() {
 33               onePageNav.scrollChange($this, o);
 34             });
 35             if(o.end) {
 36               o.end();
 37             }
 38           }
 39         });
 40       }
 41     };
 42     
 43     onePageNav.adjustNav = function($this, $el, curClass) {
 44       $this.find('.'+curClass).removeClass(curClass);
 45       $el.addClass(curClass);
 46     };
 47     
 48     onePageNav.getPositions = function($this, o) {
 49       var $nav = $this.find('a');
 50       
 51       if(o.filter !== '') {
 52         $nav = $nav.filter(o.filter);
 53       }
 54       
 55       $nav.each(function() {
 56         var linkHref = $(this).attr('href'),
 57             divPos = $(linkHref).offset(),
 58             topPos = divPos.top;
 59             
 60         onePageNav.sections[linkHref.substr(1)] = Math.round(topPos) - o.scrollOffset;
 61       });
 62     };
 63     
 64     onePageNav.getSection = function(windowPos, o) {
 65       var returnValue = '',
 66           windowHeight = Math.round($(window).height() * o.scrollThreshold);
 67       
 68       for(var section in onePageNav.sections) {
 69         if((onePageNav.sections[section] - windowHeight) < windowPos) {
 70           returnValue = section;
 71         }
 72       }
 73       return returnValue;
 74     };
 75     
 76     onePageNav.scrollChange = function($this, o) {
 77       onePageNav.getPositions($this, o);
 78       
 79       var windowTop = $(window).scrollTop(),
 80           position = onePageNav.getSection(windowTop, o);
 81           
 82       if(position !== '') {
 83         onePageNav.adjustNav($this,$this.find('a[href=#'+position+']').parent(), o.currentClass);
 84       }
 85     };
 86     
 87     onePageNav.init = function($this, o) {
 88       var didScroll = false,
 89           $nav = $this.find('a');
 90       
 91       if(o.filter !== '') {
 92         $nav = $nav.filter(o.filter);
 93       }
 94 
 95       $nav.bind('click', function(e) {
 96         onePageNav.bindNav($(this), $this, o);
 97         e.preventDefault();
 98       });
 99     
100       onePageNav.getPositions($this, o);
101     
102       $(window).bind('scroll.onePageNav', function() {
103         didScroll = true;
104       });
105 
106       setInterval(function() {
107         if(didScroll) {
108           didScroll = false;
109           onePageNav.scrollChange($this, o);
110         }
111       }, 250);
112     };
113     
114     return this.each(function() {
115       var $this = $(this),
116           o = $.meta ? $.extend({}, opts, $this.data()) : opts;
117       
118       onePageNav.init($this, o);
119     
120     });
121   };
122 
123   // default options
124   $.fn.onePageNav.defaults = {
125     currentClass: 'current',
126     changeHash: false,
127     easing: 'swing',
128     filter: '',
129     scrollSpeed: 750,
130     scrollOffset: 0,
131     scrollThreshold: 0.5,
132     begin: false,
133     end: false
134   };
135 
136 })(jQuery);
原文地址:https://www.cnblogs.com/haonanZhang/p/6431275.html