-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjquery.backtop.js
147 lines (127 loc) · 4.02 KB
/
jquery.backtop.js
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/**
* 回到顶部的jquery扩展。
* 最简单的使用方法
* $backtop.backtop({
mainBody: $('.content')
});
$backtop是回到顶部的dom对象
$('.content')是容纳页面内容的dom元素
*
* @author yongxin.pan
* @version 1.0.0
* @create time 2013-07-10
*/
(function($) {
$.fn.backtop = function(opts) {
this.each(function() {
init.call(this, opts);
});
return this;
};
var init = function(opts) {
var $el = $(this),
$win = $(window);
var options = $.extend({}, {
mainBody: null, //参照的页面的宽度,用来自适应窗口的大小
offset: null, //设置回到顶部的位置,不传也行
scrollTop: 400 //默认当鼠标滚动400像素点时候就出现回到顶部的标签
}, opts || {}),
isIE6 = $.browser.msie && $.browser.version < 7, //判断是否是ie6
defaultBacktopTop = $win.height() + 700, //默认距离顶部的距离
hasShow = false, //默认还没显示
timer = null;
var _showBacktop = function(top) {
$el.stop(true).animate({
top: top + 'px'
}, 'slow');
};
var _setLeft = function() {
var mainBodyW = options.mainBody.width(),
backtopW = $el.width(),
winW = $win.width();
$el[0].style.right = null;
var leastWidth = options.offset && options.offset.left ? (options.offset.left + backtopW) : (mainBodyW + options.mainBody.offset().left + backtopW * 1.618);
if (leastWidth > winW) {
// if (mainBodyW > winW) {
$el[0].style.left = null;
$el.css('right', 10);
// } else {
// $el.css('left', options.mainBody.offset().left + mainBodyW - backtopW);
// }
} else {
$el.css('left', options.offset && options.offset.left ? options.offset.left : (mainBodyW + options.mainBody.offset().left + backtopW * 0.618));
}
};
var _setTop = function() {
var scrollTop = $win.scrollTop();
var offsetTop = options.offset && options.offset.top ? options.offset.top : $win.height() - ($el.height() + 100);
if (isIE6) {
$el[0].style.setExpression('top', 'document.compatMode=="CSS1Compat"?' +
'documentElement.scrollTop+' + offsetTop + ':document.body.scrollTop+' + offsetTop);
} else {
_showBacktop(offsetTop);
}
};
var _initPosition = function() {
if (isIE6) {
var offsetTop = options.offset && options.offset.top ? options.offset.top : $win.height() - ($el.height() + 100);
$el.css('position', 'absolute');
$el.hide();
$el[0].style.setExpression('top', 'document.compatMode=="CSS1Compat"?' +
'documentElement.scrollTop+' + offsetTop + ':document.body.scrollTop+' + offsetTop);
var body = document.body;
if (body.currentStyle.backgroundImage == 'none') {
body.style.backgroundImage = window.location.protocol == 'https:' ? 'url(https:///)' : 'url(about:blank)';
body.style.backgroundAttachment = 'fixed';
}
} else {
$el.css('position', 'fixed');
$el.css('top', defaultBacktopTop);
}
_setLeft();
if (!isIE6) {
$el.show();
}
};
var _handleScroll = function(e) {
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(_scroll, 300);
};
var _scroll = function() {
var nowScrollTop = $win.scrollTop();
var btOffset = $el.offset();
if (isIE6) {
if (nowScrollTop >= options.scrollTop && !hasShow) {
$el.show();
hasShow = true;
} else if (nowScrollTop < options.scrollTop && hasShow) {
$el.hide();
hasShow = false;
}
} else {
var offsetTop = options.offset && options.offset.top ? options.offset.top : $win.height() - ($el.height() + 100);
if (nowScrollTop >= options.scrollTop && !hasShow) {
_showBacktop(offsetTop);
hasShow = true;
} else if (nowScrollTop < options.scrollTop && hasShow) {
_showBacktop(defaultBacktopTop);
hasShow = false;
}
}
};
var _handleResize = function(e) {
if ($win.scrollTop() >= options.scrollTop) {
_setLeft();
_setTop();
} else {
_initPosition();
}
};
_initPosition();
$win.bind('scroll', _handleScroll);
$win.bind('resize', _handleResize);
$win.trigger('scroll');
};
})(jQuery);