原生横向滚动条 吸附 页面底部

news/2024/7/23 23:22:17 标签: javascript, vue.js, 前端

效果图
在这里插入图片描述

/** 横向滚动条 吸附 页面底部 */
export class StickyHorizontalScrollBar {
	constructor(options = {}) {
		const { el, style = '' } = options
		this.createScrollbar(style)
		this.insertScrollbar(el)
		this.setScrollbarSize()
		this.onEvent()
	}
	/** 创建滚轴组件元素 */
	createScrollbar = (style = '') => {
		if (this.scrollbar) return this.scrollbar
		const timer = Date.now()
		this.thumbId = `thumb${timer}`
		this.scrollbarId = `scrollbar${timer}`
		this.scrollbar = document.createElement('div')
		this.scrollbar.setAttribute('id', this.scrollbarId)
		this.scrollbar.innerHTML = `
			<style>
				#${this.scrollbarId} {
					position: sticky;
					width: 100%;
					box-shadow: 0 15px 0 0 #fff;
					bottom: 8px;
					left: 0;
					height: 17px;
					overflow-x: auto;
					overflow-y: hidden;
					margin-top: -17px;
					z-index: 3;
					${style}
				}
				#${this.scrollbarId} #${this.thumbId} {
					height: 17px;
				}
			</style>
			<div id="${this.thumbId}"></div>
		`
	}
	/** 把滚轴组件元素插入目标元素的后面 */
	insertScrollbar = (el) => {
		this.target = document.querySelector(el)
		if (!this.target) throw Error('el Dom do not exit')
		this.targetParentElement = document.querySelector(el).parentElement
		this.targetIndex = [...this.targetParentElement.children].findIndex(
			(item) => item === this.target
		)
		this.insertIndex = this.targetIndex + 1
		if (!this.targetParentElement.querySelector(`#${this.scrollbarId}`)) {
			if (this.insertIndex >= this.targetParentElement.children.length - 1) {
				this.targetParentElement.appendChild(this.scrollbar)
			} else {
				this.targetParentElement.insertBefore(
					this.scrollbar,
					this.targetParentElement.children[this.insertIndex]
				)
			}
		}
		return this.target
	}
	/** 设置 滚轴组件元素尺寸 */
	setScrollbarSize = () => {
		this.scrollbar.style.width = this.target.clientWidth + 'px'
		this.scrollbar.querySelector(`#${this.thumbId}`).style.width =
			this.target.scrollWidth + 'px'
	}
	/** 监听目标元素和滚轴元素的scroll和页面resize事件 */
	onEvent = () => {
		this.target.addEventListener('scroll', this.onScrollTarget)
		this.scrollbar.addEventListener('scroll', this.onScrollScrollbar)
		window.addEventListener('resize', this.setScrollbarSize)
	}
	/** 移除事件 */
	removeEvent = () => {
		this.target.removeEventListener('scroll', this.onScrollTarget)
		this.scrollbar.removeEventListener('scroll', this.onScrollScrollbar)
		window.removeEventListener('resize', this.setScrollbarSize)
	}
	onScrollTarget = (e) => {
		this.scrollbar.scrollLeft = e.target.scrollLeft
	}
	onScrollScrollbar = (e) => {
		this.target.scrollLeft = e.target.scrollLeft
	}
}
//用法
const stickyScrollBar= new StickyScrollBar({
	el: '#container',
})
   
//重新设置滚动条尺寸
stickyScrollBar.setScrollbarSize()

http://www.niftyadmin.cn/n/5237804.html

相关文章

第一个小记录达成:第一个年费会员用户

早上看到&#xff0c;欸&#xff0c;有个用户好像充了 9.9 元&#xff0c;挺开心&#xff0c;刚刚看飞书消息&#xff0c;看到了这条分享给朋友&#xff0c;等等&#xff0c;是充值了 99 元&#xff0c;有个用户充了年费&#xff0c;偶买噶&#xff0c;开心 &#x1fae1; 这是…

ffmpeg 任意文件读取漏洞/SSRF漏洞 (CVE-2016-1897/CVE-2016-1898)

漏洞描述 影响范围 FFmpeg 2.8.x < 2.8.5FFmpeg 2.7.x < 2.7.5FFmpeg 2.6.x < 2.6.7FFmpeg 2.5.x < 2.5.10 漏洞环境及利用 搭建docker环境 访问8080端口看到上传界面 由于vulhub并没有讲述该漏洞如何复现&#xff0c;我们需要进入环境查看源码 <?php if(!…

重温经典struts1之搭建环境

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 今天参加了一个项目&#xff0c;什么项目&#xff1f;struts1的项目&#xff0c;什么&#xff1f;&#xff01;现在还有struts1的项目&#xff0c;读到这里你是不是和我…

【Windows】使用SeaFile搭建本地私有云盘并结合内网穿透实现远程访问

1. 前言 现在我们身边的只能设备越来越多&#xff0c;各种智能手机、平板、智能手表和数码相机充斥身边&#xff0c;需要存储的数据也越来越大&#xff0c;一张手机拍摄的照片都可能有十多M&#xff0c;电影和视频更是按G计算。而智能设备的存储空间也用的捉襟见肘。能存储大量…

面试官:说说synchronized与ReentrantLock的区别

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

vue自定义指令:指定文字高亮

vue自定义指令&#xff1a;指定文字高亮 自定义指令 除了核心功能默认内置的指令 (v-model 和 v-show)&#xff0c;Vue 也允许注册自定义指令。注意&#xff0c;在 Vue2.0 中&#xff0c;代码复用和抽象的主要形式是组件。然而&#xff0c;有的情况下&#xff0c;你仍然需要对…

2024年PMP考试会有变化吗?你关心的来了!

2024年PMP考试大纲依然使用项目管理协会&#xff08;PMI协会&#xff09;于2021年1月发布的考试内容大纲。 PMP考试题目将分布在以下三个领域&#xff1a; 1【人员】考试内容所占比例 42% 2【过程】考试内容所占比例 50% 3【业务环境】考试内容所占比例 8% 在考试中约一半…

2023年【山东省安全员C证】考试题及山东省安全员C证证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年山东省安全员C证考试题为正在备考山东省安全员C证操作证的学员准备的理论考试专题&#xff0c;每个月更新的山东省安全员C证证考试祝您顺利通过山东省安全员C证考试。 1、【多选题】《建设工程安全生产管理条例…