-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathsticky.js
More file actions
63 lines (61 loc) · 2.14 KB
/
sticky.js
File metadata and controls
63 lines (61 loc) · 2.14 KB
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
/**
* Created by yejiaming on 2017/9/28.
*/
/**
* Created by yejiaming on 2017/2/23.
*/
/*获取滚动目标节点对象*/
var getScrollEventTarget = function (element) {
let currentNode = element;
while (currentNode && currentNode.tagName !== 'HTML' &&
currentNode.tagName !== 'BODY' && currentNode.nodeType === 1) {
let overflowY = document.defaultView.getComputedStyle(currentNode).overflowY;
if (overflowY === 'scroll' || overflowY === 'auto') {
return currentNode;
}
currentNode = currentNode.parentNode;
}
return window;
};
/*判断浏览器是否支持某一个属性,和该属性的某一个值*/
var cssSupport = function (attr, value) {
var element = document.createElement('div');
if (attr in element.style) {
element.style[attr] = value;
return element.style[attr] === value;
} else {
return false;
}
}
export var sticky = {
// 当绑定元素插入到 DOM 中。
bind: function (el, binding, vnode) {
// console.log('首次加载挂载到DOM节点中——一次挂载之运行一次');
},
inserted: function (el, binding) {
// console.log('DOM节点挂载到完毕——一次挂载之运行一次');
var target = getScrollEventTarget(el);
if(target !== el.parentNode) {
console.error('当前含有stocky的节点,其父节点必须是滚动条的所在节点');
}else if (cssSupport('position', 'sticky')) {
return;
}
var top = binding.value ? binding.value : 0;
target.addEventListener('scroll', ()=> {
if (el.getBoundingClientRect().top < top) {
el.style.position = 'fixed';
}
if (target.scrollTop == 0) {
el.style.position = '';
}
})
},
update: function (el, binding) {
},
componentUpdated: function (el, binding) {
// console.log('完成更新DOM节点或者绑定数据——一次挂载之运行多次');
},
unbind: function (el, binding) {
// console.log('取消该节点的挂载——一次挂载之运行一次');
}
};