最新要闻
- 保利联合:上半年净利润预计盈利5560万元–7522万元
- 天天微头条丨6月总票房破40亿!国产悬疑片《消失的她》16亿票房第一:你贡献几张票?
- 称孩子报新闻学就打晕!大学新闻教授称张雪峰的话不无道理
- 天际汽车停工停产 被发动机厂商起诉“还钱”
- 女高材生制售救猫药获刑15年 罚金4000万:没有获批 卖了8000多万
- 孟羽童离职格力后 董明珠谈接班人:一把手要把企业视为自己生命
- 只有4节车厢的绿皮火车:一开就是27年!你见过吗? 世界今热点
- 天天热讯:售价218万 没有机翼也能飞 北美首款飞行汽车正式发布
- 阿斯巴甜可能致癌!无糖饮料还能放心喝吗?
- 焦点资讯:小区一保时捷内燃冒烟 保安拿铁锹拍烂前挡风灭火!网友:这物业费值
- 头条焦点:艾隆科技:智慧医疗领域迎来黄金期,公司布局精准,稳步发展,前景可期!|投资者问答精选
- 趴桌子午睡是怎么毁掉你的身体的?
- 7399元 壹号本OneXPlayer 2Pro EVA联名限量版今晚开售:8.4寸大屏|今日热闻
- 全国最大“吃鸡”外挂案宣判:卖挂赚近3千万 两被告获刑4年
- 苹果带出来得“歪路”要改 手机重回可拆卸电池是必然
- 胖东来8页报告调查顾客与员工争执:管理人员携礼登门致歉
手机
光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯
搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注
- 光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯
- 搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注
- 视点!美国首位女总统即将诞生?拜登恐怕要提前下岗,美政坛迎来变局?
- 当前速递!用理想仪器实现更好的颗粒 德国新帕泰克亮相CPHI & PMEC China获好评
- 微粒贷怎么申请开通 开通方法如下
- 焦点简讯:心疼!这位40岁的云南缉毒警,已是满头白发
家电
记录--让整个网站界面无滚动条
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
界面无滚动条
滚动条的优化也有很多种,比如随便再网上搜索美化浏览器滚动条样式
,就会出现些用css
去美化滚动条的方案。 那种更好呢?
(资料图片)
没有更好只有更合适
- 像默认的滚动条的话,他能让你方便摁着往下滑动(他比较宽)特别省劲,不用担心美化过后变细摁不到问题。
- 美化后的滚动条样式啊更贴合网站主题,让用户体验更好。
- 无滚动条(鼠标放上去后出现)这种更适合像一个页面好多个块,每个块的话还很多内容(都有滚动条)。如果像这种都默认都出现滚动条的话,也太不美观了。
那咱们就从无滚动条展开说说!!!
无滚动条设计
比如像
element ui
组件内像input
的自定义模块数据过多的时候出现的下拉框内的滚动条,如下图:
在element-ui
里面它其实是有内部组件el-scrollbar在的。那么它是怎么实现无滚动条呢?
如下图咱们先把:hover
勾选上让滚动条一直处于显示得状态。然后咱们再分析他的实现。
当我把样式稍微修改下,咱们再观察下图:
这么看是不是就很明白了 他其实用margin
值把整个容器扩大了点然后溢出隐藏,其实滚动条还在就是给界面上看不到了而已。
然后它自己用dom
画了个滚动条,如下图:
经过上面分析,咱们已经很清楚得了解到一个无滚动条是从那个方面实现得了。
- 使用
margin
值把滚动条给溢出隐藏掉。- 使用
div
自己画了一个滚动条。方便咱们隐藏、显示、更改样式等。
无滚动条实现
那咱们再从细节上拆分下具体实现要考虑那些点:
- 需要计算滚动条得宽度用来
margin
扩大得距离(每个界面上得滚动条得宽度是不一样得)。 - 需要计算画的
div
滚动条得高度(这个内容多少会影响滚动条的高度)。 - 需要根据滚动条去
transform: translateY(19.3916%);
移动咱们自己画的div
滚动条的。 - 需要根据摁着画的
div
滚动条,去实际更改需要滚动的高度。 - 需要点击滚动轴的柱子支持跳到目标的滚动位置;
一 计算界面原本滚动条的宽度
计算下界面上原本滚动条的宽度如下:
let scrollBarWidth;export default function() { if (scrollBarWidth !== undefined) return scrollBarWidth; const outer = document.createElement("div"); outer.className = "el-scrollbar__wrap"; outer.style.visibility = "hidden"; outer.style.width = "100px"; outer.style.position = "absolute"; outer.style.top = "-9999px"; document.body.appendChild(outer); const widthNoScroll = outer.offsetWidth; outer.style.overflow = "scroll"; const inner = document.createElement("div"); inner.style.width = "100%"; outer.appendChild(inner); const widthWithScroll = inner.offsetWidth; outer.parentNode.removeChild(outer); scrollBarWidth = widthNoScroll - widthWithScroll; return scrollBarWidth;};
先创建了一个
div
, 设置成scroll
, 然后再在里面嵌套一个没有滚动条的div
设置宽度100%
, 获取到两者的offsetWidth
, 相减获取到scrollBarWidth
。赋值给scrollBarWidth
是惰性加载的优化,只需要计算一次就可以了。 具体展现如下图:
二 计算画的滚动条的高度height
计算下画的
div
滚动条的高度height
。是用当前容器的内部高度 / 容器整个滚动条的高度 * 100计算出百分比;
比如:
const warp = this.$refs.wrap; // 或者使用documnet获取容器const heightPercentage = (wrap.clientHeight * 100 / wrap.scrollHeight); // heightconst widthPercentage = (wrap.clientWidth * 100 / wrap.scrollWidth); // width
解析: 如当前容器高
30px
,内容撑起来总共高100px
,那么滚动条的高度就是当前容器的30%
;
三 计算滚动条需要移动的值
计算画的
div
需要滚动条的高度moveY
是, 获取当前容器滚动的scrollTop
/ 当前容器内部高度 * 100:
算法一:
解析 使用
transform: translateY(0%);
是移动的是自己本身的百分比那么(容器滚动的scrollTop
/ 当前容器内部高度 * 100)算法如下:
const warp = this.$refs.wrap; // 或者使用documnet获取容器this.moveY = ((wrap.scrollTop * 100) / wrap.clientHeight);this.moveX = ((wrap.scrollLeft * 100) / wrap.clientWidth);
算法二:
解析:使用定位
top
值,这个比较好理解滚动条的滚动 / 容器的滚动总高度 * 100得到百分比,如下:
const warp = this.$refs.wrap; // 或者使用documnet获取容器this.moveY = ((wrap.scrollTop * 100) / wrap.scrollHeight);this.moveX = ((wrap.scrollLeft * 100) / wrap.scrollWidth);
把计算出来的
moveY
、moveX
的方法 绑定给scroll
滚动事件就可以了。
四 摁着画的div
滚动条 经行拖动
滚动条都是支持拖着上下左右移动的,那咱们也要支持下:
- 获取当前滚动条的高度或者宽度可以使用
getBoundingClientRect()
如下图: - 获取拖着移动的距离 就是再鼠标摁下先计一个当前的
x1、y1
监听move
的x2、y2
相减就是拖动的距离了。 - 获取到拖动的距离后转成
transform || top
值。
一个简单的拖动组件如下:
<script>export default { name: "DraggableComponent", props: { initialValue: { type: Object, required: false, default: () => ({ x: 0, y: 0 }), }, }, data() { return { currentValue: { x: 0, y: 0 }, isDragging: false, startX: 0, startY: 0, diffX: 0, diffY: 0, }; }, computed: { style() { return `left: ${this.currentValue.x + this.diffX}px; top: ${this.currentValue.y + this.diffY}px`; }, }, watch: { initialValue: { handler(val) { this.currentValue = val; }, immediate: true, }, }, mounted() { this.$nextTick(() => { const { draggableRef } = this.$refs; if (draggableRef) { draggableRef.addEventListener("mousedown", this.startDrag); document.addEventListener("mousemove", this.moveDrag); document.addEventListener("mouseup", this.endDrag); } }); }, beforeDestroy() { const { draggableRef } = this.$refs; draggableRef.removeEventListener("mousedown", this.startDrag); document.removeEventListener("mousemove", this.moveDrag); document.removeEventListener("mouseup", this.endDrag); }, methods: { startDrag({ clientX: x1, clientY: y1 }) { this.isDragging = true; document.onselectstart = () => false; this.startX = x1; this.startY = y1; }, moveDrag({ clientX: x2, clientY: y2 }) { if (this.isDragging) { this.diffX = x2 - this.startX; this.diffY = y2 - this.startY; } }, endDrag() { this.isDragging = false; document.onselectstart = () => true; this.currentValue.x += this.diffX; this.currentValue.y += this.diffY; this.diffX = 0; this.diffY = 0; }, },};</script>
咱们需要获取到画的滚动条的高度,然后根据拖动的距离算出来
transform: translateY(0%);
或者top
值;如上面拖动组件 拖动部分代码就不在重复了 咱们直接用diffX、diffY、lastX、lastY
来用了。
diffX、diffY
是拖动差的值lastX、lastY
是上一次也就是未拖动前的值translateY || top
算法一(transform)
const thumb = document.querySelector("el-scrollbar__thumb"); // element ui el-scrollbar 的滚动条const { height: thumbHeight } = thumb?.getBoundingClientRect() || {};const diffY = 10;const lastY = "300"; // transform: translateY(300%);`const moveY = (diffY / thumbHeight) + lastY;算法二(top)
const thumb = document.querySelector("el-scrollbar__thumb"); // element ui el-scrollbar 的滚动条const { height: thumbHeight } = thumb?.getBoundingClientRect() || {};const diffY = 10;const lastY = 30; // top: 30%`const moveY = (diffY / wrap.scrollWidth * 100) + lastY;
五 点击滚动轴使滚动条跳转到该位置
- getBoundingClientRect 的 top 是获取到距离浏览器顶部的距离。 写一个点击事件如下
function clickTrackHandler(event) { const wrap = this.$refs.wrap; // 1. 减去clientX 正好能获取到需要滚动到的位置 const offset = Math.abs(e.target.getBoundingClientRect().top - e.clientX); // 2. 利用offset 的到画的滚动条的实际位置 两种算法transform || top const thumb = document.querySelector("el-scrollbar__thumb"); // element ui el-scrollbar 的滚动条 const { height: thumbHeight } = thumb?.getBoundingClientRect() || {}; const translateY = offset / height * 100; // transform const top = offset / wrap.scrollHeight * 100; // top // 3、计算实际需要滚动的高度 使界面滚动到该位置。两种算法transform(scrollTop2) || top(scrollTop1) const scrollTop1 = top * wrap.scrollHeight; // top const scrollTop2 = translateY * wrap.clientHeight; // transform}
本文转载于:
https://juejin.cn/post/7227033124856135738
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
关键词:
记录--让整个网站界面无滚动条
保利联合:上半年净利润预计盈利5560万元–7522万元
每日机构分析:6月30日
天天微头条丨6月总票房破40亿!国产悬疑片《消失的她》16亿票房第一:你贡献几张票?
称孩子报新闻学就打晕!大学新闻教授称张雪峰的话不无道理
天际汽车停工停产 被发动机厂商起诉“还钱”
女高材生制售救猫药获刑15年 罚金4000万:没有获批 卖了8000多万
Maven高级相关知识:模块,打包方式,依赖继承,聚合,私服搭建-每日报道
热热热!全球多地出现极端高温|天天快播
【金融街发布】人民银行增加支农支小再贷款、再贴现额度2000亿元-全球最资讯
孟羽童离职格力后 董明珠谈接班人:一把手要把企业视为自己生命
只有4节车厢的绿皮火车:一开就是27年!你见过吗? 世界今热点
天天热讯:售价218万 没有机翼也能飞 北美首款飞行汽车正式发布
阿斯巴甜可能致癌!无糖饮料还能放心喝吗?
焦点资讯:小区一保时捷内燃冒烟 保安拿铁锹拍烂前挡风灭火!网友:这物业费值
git rebase合并多个commit
处理开发者账号到期导致APP下架的方处理开发者账号到期导致APP下架的方法
头条焦点:艾隆科技:智慧医疗领域迎来黄金期,公司布局精准,稳步发展,前景可期!|投资者问答精选
趴桌子午睡是怎么毁掉你的身体的?
7399元 壹号本OneXPlayer 2Pro EVA联名限量版今晚开售:8.4寸大屏|今日热闻
全国最大“吃鸡”外挂案宣判:卖挂赚近3千万 两被告获刑4年
苹果带出来得“歪路”要改 手机重回可拆卸电池是必然
胖东来8页报告调查顾客与员工争执:管理人员携礼登门致歉
环球精选!使用Python字符串访问与修改局部变量
在python中实现使用迭代生成器yield减少内存占用的方法
文心一言 VS 讯飞星火 VS chatgpt (52)-- 算法导论6.2 4题_观焦点
使用Python字符串访问与修改局部变量_每日热议
热点在线丨狂收 3.2k star!百度开源压测工具,可模拟几十亿的并发场景,太强悍了!
【津云镜头】特警三支队、金街治安派出所做好爱警暖警工作
布局高端车载PHY芯片,加速推动高速以太网通信芯片国产化——访裕太微首席运营官李晓刚
科创板收盘播报:科创50指数涨0.37% 新股芯动联科较发行价涨75.21%
满满的回忆!赵雅芝吕良伟同台合唱《上海滩》 头条焦点
印度加入美国载人登月计划 被赞苏醒中的巨人:航天将远超俄罗斯
特斯拉天幕变全景烤炉 开车戴帽子冰袖 女子调侃自己变烤乳猪
这就是差距!AMD ROCm开发平台终于要支持RX 7900 XTX
蓉港高铁明天正式开行:成都10小时直达香港
收评:创业板指涨1.6% 复合集流体概念涨幅居前-焦点速讯
证监会公布第三批企业债注册批文 职责划转后核发募资超千亿元
天热要注意!女子连吃两个超甜菠萝肝衰竭 医生称元凶可能是蜡样芽孢杆菌
上市公司回应给员工放暑假:放假情况属实 但个位数员工在岗不实
比盐粒还小的“LV”手提包卖出46.2万:用显微镜才能看清
从此告别毛巾了:芷雨加大洗脸巾13.9元200抽狂促
世界热讯:索尼第一方大作改编!电影《GT赛车:极速狂飙》官宣引进国内
今日讯!交易所协会再提积极服务低碳转型 绿色债券这三年发展有多快?
「隐私计算黑客松」获奖代码全部开源!快去打卡~
当前资讯!干货|三个维度详解 Taier 本地调试原理和实践
通过 ChatGPT 提高你的创造力 焦点报道
天天微速讯:JetBrains系IDE使用Git很慢的问题
第一批实验室培育肉在美获准销售,人造肉市场发展风口何时来?
世界快报:流水线“造人”成真?科学家成功培养首个人类胚胎模型 全球哗然专家释疑
索尼称Xbox太有钱 能花50亿美元做3款独占《COD》
手握309亿利润却不分红 中芯国际:为股东长期利益考虑 滚动
大棕熊“下班”咣咣砸门急得直跳脚 绝不加班:网友直呼像极了打工人的我
盘点C#中感叹号"!"的作用_全球时讯
数码教程资讯:小米11青春版怎么设置24小时 全球聚看点
热热热!全国多地气温超40度 新能源车主如何经受“烤验”_环球头条
热文:炸串店老鼠啃食香肠被拍下 网友:主打一个明目张胆
315曝光假泰国香米公司被吊销:完全香精勾兑 和香米不沾边
何小鹏:和李斌、李想还在一个群里 但跟李斌聊得多些
上新了!小米平板6 Max首曝:12.4寸屏+10000mAh电池_环球关注
什么是 ChatGPT? 环球短讯
js中的解构赋值
Spring事件监听在业务使用中的优化
我国首个万吨级光伏制氢项目投产-环球今亮点
好作品应如实呈现时代的偏见吗?——《漫长的季节》中的女性角色塑造 焦点
【速看料】国产办公软件WPS出现服务故障 官微道歉:正在紧急排查修复
全球实时:红魔电竞平板官宣:首款骁龙8 Gen2+内置风扇平板
《博德之门3》反向跳票!不会为主机版质量向30帧妥协 全球快讯
你退了吗?网易暴雪国服游戏退款申请今天截止:过期视为自动放弃 全球快消息
男生长胖20斤被公司解约 官方回应:如举报会责令整改_当前短讯
每日播报!Linux 中重置数据库的 root 密码的技巧
海外视频直播源码技术视频直播间的搭建
BabylonJS教程_编程入门自学教程_菜鸟教程-免费教程分享|动态焦点
海康威视产品命名规则
焦点快看:记录一次项目数据采集分析-NEWC数据泄漏
微软只保证《使命召唤》停留三年 索尼官方回应
新资讯:携程正式宣布员工生孩后补贴5万元:每年1万 连领5年
超值优惠手慢无:真维斯Z+冰丝短裤29元、长裤/Polo衫39元
特斯拉充电中被临车女车主强行拔枪:哨兵模式拍个正着-焦点信息
你能坚持多久?小伙在没信号的原始森林隐居4年火了:中国最神秘部落揭秘_环球今热点
每日消息!特斯拉人形机器人将亮相上海:预计未来售价不超过15万元
IAM风险CTF挑战赛
PC网站如何实现微信扫码登录
【世界热闻】马价十倍说明了什么道理_马价十倍
【新视野】7月新规来了
我们该怎么帮助年轻人就业
2.5万元的Vision Pro问世 荣耀赵明:整个行业都应该感谢苹果_最新快讯
焦点资讯:帕萨特提车第二天就严重抖动 车主:车子像是仿佛在蹦
荣耀赵明:面对最强对手苹果竞争 荣耀整合核心能力突破
荣耀Magic V2即将发布 赵明:折叠屏将是未来最优解
贵州6人吃野生菌4人被送云南抢救:误食亚稀褶红菇、严重可致死
呼和浩特市:69处党政机关、企事业单位内部车场共享开放
一天吃透MySQL面试八股文 环球快资讯
央企的无奈:假央企何以屡禁不止?
每日快报!高温持续驻守华北黄淮等地 长江中下游降雨增强
游客自驾游开车压草场牧民损失数万 无视警示牌:官方回应
世界简讯:建全自主半导体产业链几乎不可能!ASML找强援:加速推进新一代光刻机
全球聚焦:频繁被黑!警惕抹黑清华的舆论倾向 网友支持:严惩造谣者
特斯拉Model 3一头扎进农田 只是因为捡一个瓶子 全球滚动
行政拘留能暂缓执行吗