元素实现吸顶

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>
相关推荐
路由侠内网穿透1 小时前
本地部署开源持续集成和持续部署系统 Woodpecker CI 并实现外部访问
服务器·网络·windows·ci/cd·开源
CsharpDev-奶豆哥1 小时前
ASP.NET中for和foreach使用指南
windows·microsoft·c#·asp.net·.net
Microsoft Word6 小时前
跨平台向量库:Linux & Windows 上一条龙部署 PostgreSQL 向量扩展
linux·windows·postgresql
Wx-bishekaifayuan6 小时前
基于微信小程序的社区图书共享平台设计与实现 计算机毕业设计源码44991
javascript·vue.js·windows·mysql·pycharm·tomcat·php
zhuyasen8 小时前
在某些 Windows 版本,Go 1.25.x 编译出来的 exe 运行报错:此应用无法在你的电脑上运行
windows·go·编译器
tjsoft17 小时前
设置 windows nginx.exe 每天 重启
运维·windows·nginx
读书读傻了哟17 小时前
Windows 10 使用 VMware Workstation 搭建 Ubuntu 虚拟机
linux·windows·ubuntu
小龙报1 天前
《彻底理解C语言指针全攻略(3)》
c语言·开发语言·windows·git·创业创新·学习方法·visual studio
00后程序员张1 天前
Windows 安全分割利器:strtok_s () 详解
windows·单片机·安全
NEFU AB-IN1 天前
在 Windows PowerShell(pwsh)中配置 Oh My Posh + Conda 环境美化与性能优化
windows·conda