元素实现吸顶

1、position: sticky

直接设置元素需要吸顶的距离,

复制代码
<!-- App.vue -->
<template>
  <div id="app">
    <!-- <List
      :items="items"
      :size="60"
      :shownumber="10"
    /> -->
	<div id="topHeight">
		<div v-for="item in 20"> 
    		{{ item }} 2
   	 	</div>
	</div>
    
    <div class="sticky"
		id="sticky"
	>
    	<div>
			黏性布局了
		</div>
    </div>
    <div v-for="item in 100">
        {{ item }}
    </div>
  </div>
</template>

<script>
const rafThrottle = (fn) => {
    let locked = false;
    return function (...args) {
        if (locked) return;
			locked = true;
			window.requestAnimationFrame(_ => {
			fn.apply(this, args);
			locked = false;
        });
    };
}
// import List from './components/List.vue'
export default {
	name: 'App',
	components: {
		// List,
	},
	data(){
		return {
			headerOriginalPos: 0,
		}
	},
	computed: {
		// 要进行渲染的数据列表
		items () {
			// 自己模拟一万条数据,将其内容进行填充
			return Array(1000).fill('').map((item, index) => ({
				id: index,
				content: '列表项内容' + index
			}))
		}
	},

	mounted() {
		this.headerOriginalPos = document.getElementById('sticky').offsetTop;
		window.addEventListener('scroll', this.scrollEvent);
	},

	beforeDestroy() {
		window.removeEventListener('scroll', this.scrollEvent);
	},
	methods: {
		// https://blog.csdn.net/weixin_56006480/article/details/130819249?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7ERate-2-130819249-blog-135112496.235%5Ev43%5Epc_blog_bottom_relevance_base3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7ERate-2-130819249-blog-135112496.235%5Ev43%5Epc_blog_bottom_relevance_base3&utm_relevant_index=3
		scrollEvent: rafThrottle(async function(e) {
			// let header = document.getElementById('sticky');
			// var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
			// if (scrollTop >= this.headerOriginalPos) {
			// 	header.style.position = 'fixed';
			// 	header.style.top = '40px';
			// 	header.style.width = '100%';
			// 	header.style.zIndex = '999';
			// } else {
			// 	header.style.position = 'static';
			// }
		})
	},
}
</script>

<style>
.sticky{
    position: sticky;
    top: 40px;
}
#app {
	font-family: Avenir, Helvetica, Arial, sans-serif;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	text-align: center;
	color: #2c3e50;
}
</style>

2.通过js判断当前元素的初始的offsetTop,与当前滚动条滚动的距离做判断。修改元素的样式

复制代码
<!-- App.vue -->
<template>
  <div id="app">
    <!-- <List
      :items="items"
      :size="60"
      :shownumber="10"
    /> -->
	<div id="topHeight">
		<div v-for="item in 20"> 
    		{{ item }} 2
   	 	</div>
	</div>
    
    <div class="sticky"
		id="sticky"
	>
    	<div>
			黏性布局了
		</div>
    </div>
    <div v-for="item in 100">
        {{ item }}
    </div>
  </div>
</template>

<script>
const rafThrottle = (fn) => {
    let locked = false;
    return function (...args) {
        if (locked) return;
			locked = true;
			window.requestAnimationFrame(_ => {
			fn.apply(this, args);
			locked = false;
        });
    };
}
// import List from './components/List.vue'
export default {
	name: 'App',
	components: {
		// List,
	},
	data(){
		return {
			headerOriginalPos: 0,
		}
	},
	computed: {
		// 要进行渲染的数据列表
		items () {
			// 自己模拟一万条数据,将其内容进行填充
			return Array(1000).fill('').map((item, index) => ({
				id: index,
				content: '列表项内容' + index
			}))
		}
	},

	mounted() {
		this.headerOriginalPos = document.getElementById('sticky').offsetTop;
		window.addEventListener('scroll', this.scrollEvent);
	},

	beforeDestroy() {
		window.removeEventListener('scroll', this.scrollEvent);
	},
	methods: {
		// https://blog.csdn.net/weixin_56006480/article/details/130819249?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7ERate-2-130819249-blog-135112496.235%5Ev43%5Epc_blog_bottom_relevance_base3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7ERate-2-130819249-blog-135112496.235%5Ev43%5Epc_blog_bottom_relevance_base3&utm_relevant_index=3
		scrollEvent: rafThrottle(async function(e) {
			let header = document.getElementById('sticky');
			var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
			if (scrollTop >= this.headerOriginalPos) {
				header.style.position = 'fixed';
				// top值为当前需要吸顶的距离,可根据自己的需求调整
				header.style.top = '100px';
				header.style.width = '100%';
				header.style.zIndex = '999';
			} else {
				header.style.position = 'static';
			}
		})
	},
}
</script>

<style>
.sticky{
    /* position: sticky;
    top: 40px; */
}
#app {
	font-family: Avenir, Helvetica, Arial, sans-serif;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	text-align: center;
	color: #2c3e50;
}
</style>
相关推荐
线上放牧人12 小时前
Windows删除图标缓存
windows·python·pyqt
Koi慢热13 小时前
DayDayMap学术社区体验:卫星网络测绘专题用下来怎么样
网络·人工智能·windows·web安全·网络安全
web守墓人14 小时前
【goed/ui】自定义组件设计思想篇
linux·windows·ui·golang
2601_9623649717 小时前
红外活体模组,Windows 设备安全身份入口解析
windows·安全·电脑
易点云徐源18 小时前
(已解决)Photoshop 2020 点击“选择主体”闪退:不用重装,1 个配置切回旧算法解决
windows·photoshop
云计算练习生18 小时前
什么是系统调用?为什么程序访问硬件必须经过它
linux·windows·操作系统·系统调用·操作系统原理
其实防守也摸鱼1 天前
DeepSeek Harness 开源贡献手记:从入门到合入主线
服务器·数据库·windows·https·ssl
qqww1551 天前
Win11更新后Edge卡顿掉帧?隐私窗口流畅解决办法
windows·edge·优化·卡顿
其实防守也摸鱼1 天前
堆叠注入(Stacked Injection)详解
服务器·数据库·windows·https·ssl
郝学胜-神的一滴1 天前
C++20模板元编程 05:吃透变参模板,解锁编译期万能参数能力
服务器·开发语言·c++·windows·vscode