吸顶效果—position:sticky的vue组件化和兼容性解决
封装
<template>
<div class="header_sticky">
<slot></slot>
</div>
</template>
<script>
export default {
name: 'stickyHeader',
computed: {
randomId: function(){
return 'randomId_' + Number(Math.random().toString().substr(3,3) + Date.now()).toString(36);
},
targetElement_: function() {
return this.$el
}
},
mounted() {
//获取高度变化
this.$refs.sticky_.sticky()
},
methods: {
// css: 用于替换的css样式; (一般用默认的)
sticky_(css='sticky_') {
if (CSS.supports('position', 'sticky') || CSS.supports('position', '-webkit-sticky')) {
console.log('>>>>>>>>> sticky is supported')
} else {
let newNodeTop;
let header = this.targetElement_;
if(document.getElementById(this.randomId)) {
newNodeTop = document.getElementById(this.randomId);
}else{
newNodeTop = document.createElement("div");
newNodeTop.id = this.randomId;
header.parentNode.insertBefore(newNodeTop, header);
header.classList.add(css);
}
setTimeout(() => {
let height = header.offsetHeight + 1; //高度 + 1 以防有小数点
newNodeTop.style.height = height + 'px';
}, 0)
}
},
watch: {
oldToNew(newVal, oldVal) {
if(newVal.length !== oldVal.length) {
this.$refs.sticky_.sticky()
}
}
},
}
}
</script>
<style scoped>
.header_sticky {
width: 100%;
position: sticky;
position: -webkit-sticky;
top: 0;
z-index: 100;
transition: height 1s;
-moz-transition: height 1s;
-webkit-transition: height 1s;
-o-transition: height 1s;
}
.sticky_ {
width: 100%;
position: fixed;
position: -webkit-fixed;
top: 0;
z-index: 100;
}
</style>
使用
<sticky-header ref="sticky_">
<!-- contents -->
</sticky-header>