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

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

/** 横向滚动条 吸附 页面底部 */
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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/217011.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows下打包C++程序无法执行:无法定位程序输入点于动态链接库

1、问题描述 环境&#xff1a;CLionCMakeMinGW64遇到问题&#xff1a;打包的exe无法运行&#xff0c;提示无法定位程序输入点于动态链接库。 2、解决思路 ​ 通过注释头文件的方式&#xff0c;初步定位问题是因为使用了#include <thread> 多线程库引起的。而且exe文件…

外包干了2个月,技术倒退2年。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;20年通过校招进入深圳某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年国庆&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

如何创建maven项目的多模块项目

Maven多模块项目是指一个Maven项目中包含多个子模块&#xff0c;每个子模块又是一个独立的Maven项目&#xff0c;但它们之间可以存在依赖关系。Maven多模块项目可以方便地管理多个子模块的依赖和构建过程&#xff0c;同时也可以提高项目的可维护性和可扩展性。创建maven项目的父…

ChatGPT发布一年后,搜索引擎的日子还好吗?

导读&#xff1a;生成式AI&#xff0c;搜索引擎的终结者还是进化加速器 ChatGPT发布刚刚一年&#xff0c;互联网世界已经换了人间。 2023年&#xff0c;以ChatGPT和大模型为代表的生成式AI浪潮对全球互联网、云计算、人工智能领域都带来巨大冲击。而且生成式AI在各行各业的应用…

深入理解JVM虚拟机第二十七篇:详解JVM当中InvokeDynamic字节码指令,Java是动态类型语言么?

😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783824 📚📚 工作微信:BigTreeJava 拉你进微信群,免费领取! 🍎🍎4:本文章内容出自上述:Sp…

[ROS2] --- ROS diff ROS2

1 ROS存在的问题 一旦Ros Master主节点挂掉后&#xff0c;就会造成整个系统通信的异常,通信基于TCP实现&#xff0c;实时性差、系统开销大对Python3支持不友好&#xff0c;需要重新编译消息机制不兼容没有加密机制、安全性不高 2 ROS and ROS2架构对比 ROS和ROS2架构如下图所…

Redis实战篇笔记(最终篇)

Redis实战篇笔记&#xff08;七&#xff09; 文章目录 Redis实战篇笔记&#xff08;七&#xff09;前言达人探店发布和查看探店笔记点赞点赞排行榜 好友关注关注和取关共同关注关注推送关注推荐的实现 总结 前言 本系列文章是Redis实战篇笔记的最后一篇&#xff0c;那么到这里…

如何使用cpolar内网穿透工具实现公网SSH远程访问Deepin

文章目录 前言1. 开启SSH服务2. Deppin安装Cpolar3. 配置ssh公网地址4. 公网远程SSH连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 前言 Deepin操作系统是一个基于Debian的Linux操作系统&#xff0c;专注于使用者对日常办公、学习、生活和娱乐的操作体验的极致&#xff0…

卷积神经网络(CNN):乳腺癌识别.ipynb

文章目录 一、前言一、设置GPU二、导入数据1. 导入数据2. 检查数据3. 配置数据集4. 数据可视化 三、构建模型四、编译五、训练模型六、评估模型1. Accuracy与Loss图2. 混淆矩阵3. 各项指标评估 一、前言 我的环境&#xff1a; 语言环境&#xff1a;Python3.6.5编译器&#xf…

(C语言)交换变量

在主函数中定义两个双精度变量x,y&#xff0c;并输入值&#xff0c;编写一个函数实现交换变量x,y&#xff0c;要求函数的参数是指针类型&#xff0c;并编写一个主函数进行调用。 #include<stdio.h> void swap(double *x,double *y) {double t;t *x;*x *y;*y t;} int …

Web前端 ---- 【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)

目录 前言 父子组件 父传子 子传父 全局事件总线 什么叫全局事件总线 如何创建全局事件总线 如何在组件上获取到这个全局vc对象 最常用的创建全局事件总线 兄弟组件 消息订阅与发布 安装 使用 爷孙组件 前言 在上篇文章我们介绍了父子组件之间的传值通信&#xff…

软件平台架构设计与技术管理之道笔记

软件平台架构设计与技术管理之道笔记 认知 领导软件平台各方面的工作&#xff0c;对技术底蕴、思维模式、决策能力、工作风格、文化铸造等方面都有极高的要求&#xff0c;可以称之为“领域智慧”。认知盲区的代价是巨大的&#xff0c;“不知”比“不会”的后果更严重&#xf…

【VRTK】【VR开发】【Unity】10-连续移动

课程配套学习资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【概述】 连续移动与瞬移有如下不同: 连续移动不容易打断沉浸对于新手或者不适应者来说更容易晕动 我对玩家的建议:连续移动前后左右可以用摇杆,转向用自己…

是时候重估荣耀了

文 | 智能相对论 作者 | 叶远风 在更换董事长后&#xff0c;荣耀的上市计划总算落定。 除了“借壳”被否认&#xff0c;外界对荣耀所有上市的猜想基本都被印证&#xff0c;此外CEO赵明明确表示会在境内上市。 在三年的长途奔袭后&#xff0c;毫无疑问荣耀来了到一个重要关口…

【电源专题】什么是电源管理

电源管理为什么重要? 在电子系统和电路的设计中,负载往往需要恒定的电流电压,所以最先考虑的就是电源电路的设计。电源管理所考虑的问题是如何将电源有效分配给系统的不同组件,保障系统不同的负载正常运行。 如电源的输入是交流 (AC) 或直流 (DC)?输入电压是高于或低于输…

JavaEE之多线程编程(一):基础篇

文章目录 一、关于操作系统一、认识进程 process二、认识线程三、进程和线程的区别&#xff08;重点&#xff01;&#xff09;四、Java的线程和操作系统线程的关系五、第一个多线程编程 一、关于操作系统 【操作系统】 驱动程序&#xff1a; 如&#xff1a;我们知道JDBC的驱动程…

centos7 设置静态ip

文章目录 设置VMware主机设置centos7 设置 设置VMware 主机设置 centos7 设置 vim /etc/sysconfig/network-scripts/ifcfg-ens33重启网络服务 service network restart检验配置是否成功 ifconfig ip addr

工程师业余生活之制作蔬菜盆景

工程师业余生活陶冶情操之制作蔬菜盆景 &#xff08;蔬 果 盆 景 裝 點 家 居&#xff09; 市場上好多蔬菜瓜果,稍用一些心思,將一些價廉的蔬果製成別致的盆景, 便能使家居充滿自然氣息&#xff0c;增添生活情趣。以下介紹幾種製作方法&#xff1a; 【番薯盆景】 (番薯又名地…

百望云供应链协同解决方案入选北大创新评论产业研究案例库

11月28日-29日&#xff0c;百望云受邀出席《北大创新评论》2023 Inno China 中国产业创新大会&#xff0c;从战略构建、生态塑造、科技创新等议题出发&#xff0c;与学术专家、产业专家、企业代表共赴盛会&#xff0c;思享汇聚。会上&#xff0c;《北大创新评论产业研究案例库&…

C++数据结构:B树

目录 一. 常见的搜索结构 二. B树的概念 三. B树节点的插入和遍历 3.1 插入B树节点 3.2 B树遍历 四. B树和B*树 4.1 B树 4.2 B*树 五. B树索引原理 5.1 索引概述 5.2 MyISAM 5.3 InnoDB 六. 总结 一. 常见的搜索结构 表示1为在实际软件开发项目中&#xff0c;常用…