angularjs 指令实现自定义滚动条

场景:横向商品栏,把原有的滚动条改成自定义的样式,并且给两边加上箭头可以调整,可以拖动商品和滚轮实现滚动条效果。

js

appService.directive('customScrollbar', function() {return {restrict: 'A',transclude: true,scope: {enableMouseWheel: '=?' // default false},template: `<div class="customScrollbar"><div class="scrollContent"><div class="detailContent" ng-mouseenter="enableMouseWheel === true && enableWheelScroll()" ng-mouseleave="enableMouseWheel === true && disableWheelScroll()" id="detailContent" ng-transclude></div><div class="scrollBarContent"><div class="scrollbar"><div class="scrollbar-thumb"></div></div><img src="./images/home/icon_left.png" alt="Left Arrow" class="scroll-arrow left"><img src="./images/home/icon_right.png" alt="Right Arrow" class="scroll-arrow right"></div></div></div>`,link: function(scope, element) {if (scope.enableMouseWheel === undefined) {scope.enableMouseWheel = false;}var content = element.find('.detailContent');var scrollbar = element.find('.scrollbar');var thumb = element.find('.scrollbar-thumb');var leftArrow = element.find('.scroll-arrow.left');var rightArrow = element.find('.scroll-arrow.right');checkArrowVisibilityByInit();content.scroll(function() {var scrollLeft = content.scrollLeft();var scrollRatio = scrollLeft / (content[0].scrollWidth - content.width());var newLeft = scrollRatio * (scrollbar.width() - thumb.width());thumb.css('left', newLeft);checkArrowVisibilityByScroll(scrollLeft);});leftArrow.click(function() {var newScrollLeft = content.scrollLeft() - 500;content.animate({scrollLeft: newScrollLeft}, 500);});rightArrow.click(function() {var newScrollLeft = content.scrollLeft() + 500;content.animate({scrollLeft: newScrollLeft}, 500);});var isDragging = false;var startX, startLeft;thumb.mousedown(function(e) {isDragging = true;startX = e.pageX;startLeft = thumb.position().left;e.preventDefault();});$(document).mousemove(function(e) {if (isDragging) {var offsetX = e.pageX - startX;var newLeft = Math.min(Math.max(0, startLeft + offsetX), scrollbar.width() - thumb.width());var scrollRatio = newLeft / (scrollbar.width() - thumb.width());var newScrollLeft = scrollRatio * (content[0].scrollWidth - content.width());thumb.css('left', newLeft);content.scrollLeft(newScrollLeft);}}).mouseup(function() {isDragging = false;});function checkArrowVisibilityByInit() {if (content.width() >= content[0].scrollWidth) {leftArrow.hide();rightArrow.hide();} else {leftArrow.hide(); //init content.scrollLeft() = 0;rightArrow.show();}}function checkArrowVisibilityByScroll(scrollLeft) {if (scrollLeft === 0) {leftArrow.hide();} else {leftArrow.show();}if (scrollLeft >= content[0].scrollWidth - content.width()) {rightArrow.hide();} else {rightArrow.show();}}//============ Enable wheel scrolling when mouse entersscope.enableWheelScroll = function() {element.on('wheel', function(e) {e.preventDefault();const delta = e.originalEvent.deltaY;content.scrollLeft(content.scrollLeft() + delta);});};scope.disableWheelScroll = function() {element.off('wheel');};//============ end//============ Implement scrollbar effect when dragging products with the mousevar isFinancialContentMouseDown = false;var startX;var scrollLeft;content.on('mousedown', function(e) {isFinancialContentMouseDown = true;startX = e.pageX - $(this).offset().left;scrollLeft = $(this).scrollLeft();});content.on('mousemove', function(e) {if (!isFinancialContentMouseDown) return;e.preventDefault();const x = e.pageX - $(this).offset().left;const walk = (x - startX) * 3;$(this).scrollLeft(scrollLeft - walk);});$(document).on('mouseup', function() {isFinancialContentMouseDown = false;});content.on('mouseleave', function() {isFinancialContentMouseDown = false;});//============end}};
});

css

/*customscroll*/
.customScrollbar .detailContent{width: 100%;display: flex;margin-top: 102px;gap: 30px;overflow-y: auto;overflow-x: hidden;}
.customScrollbar .scrollContent{position: relative}
.customScrollbar .scrollBarContent{width: 100%;display: flex;justify-content: center;margin-top: 40px}
.customScrollbar .scrollbar {width: 410px;height: 6px;background-color: #DAD2D2;position: absolute;bottom: 0;left: 50%;cursor: pointer;border-radius: 15px;transform: translateX(-50%);}
.customScrollbar .scrollbar-thumb {width: 96px;height: 133%;background-color: #E43134;position: absolute;left: 0;cursor: pointer;border-radius: 15px;top:-1px}
.customScrollbar .scroll-arrow {position: absolute;top:  calc(50% - 40px);;transform: translateY(-50%);cursor: pointer;}
.customScrollbar .scroll-arrow.left {left: 0;transform: translateX(-150%);width: 44px;height: 44px;}
.customScrollbar .scroll-arrow.right {right: 0;transform: translateX(150%);width: 44px;height: 44px;}

html

						<!--  custom-scrollbar="home"可以改成 custom-scrollbar,加了home是为了后面可能有多个滚动条的时候添加的唯一标识,但代码还没实现,遇到再改--><div custom-scrollbar="home"><!-- 里面的item自己填上,一般都是循环load items出来--><div class="box textBg fundBg"><span class="text">{{'webPage.body.home.A'|translate}}</span></div><div class="box textBg bondBg"><span class="text">{{'webPage.body.home.B'|translate}}</span></div><div class="box textBg structureBg"><span class="text">{{'webPage.body.home.C'|translate}}</span></div><div class="box textBg cryptocurrencyBg"><span class="text">{{'webPage.body.home.D'|translate}}</span></div><div class="box textBg swapsBg"><span class="text">{{'webPage.body.home.E'|translate}}</span></div></div>

效果

效果图

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux编程4.8 网络编程-建立连接

1、服务器端 #include <sys/types.h> #include <sys/socket.h>int listen(int sockfd, int backlog);返回&#xff1a;成功返回0&#xff0c;出错返回-1。参数&#xff1a;sockfd:套接字的文件描述符backlog:定义了sockfd的挂起连接队列可能增长的最大长度。…

web前端之多行文本擦除效果、文本逐个显示或展示、创建元素标签、querySelector、createElement、appendChild、requestAnimationFrame

MENU 版本一(requestAnimationFrame)版本二(setTimeout)版本三(css) 版本一(requestAnimationFrame) 前言 window.requestAnimationFrame()告诉浏览器——你希望执行一个动画&#xff0c;并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数…

关于udp能跨局域网传输的问题

UDP&#xff08;用户数据报协议&#xff09;以其独特的传输特性在多种应用场景中都有着极其重要的作用。然而&#xff0c;关于UDP是否能跨局域网&#xff08;LAN&#xff09;进行传输&#xff0c;以及这一传输过程中的优缺点&#xff0c;一直是网络技术领域讨论的热点。本文将详…

Unity中PICO中手柄按键返回值

文章目录 前言一、我们看一下每个按键返回值获取按键返回值的方法 二、我们实现一个左摇杆控制平滑移动的功能1、创建一个左摇杆控制移动的脚本2、传入XR Origin对象&#xff0c;并且定义一个公开变量控制移动速度3、获取到摇杆是否移动&#xff0c;以及移动的偏移量4、如果摇杆…

x264 编码器 slices_write 和 slice_write 函数

x264 264是一个开源的视频编码库,用于将视频压缩为H.264/AVC(Advanced Video Coding)格式。它是一种广泛使用的视频编码标准,能够提供高质量的视频压缩和较低的比特率。 x264库提供了一个编码器,可以将原始视频序列转换为H.264/AVC压缩的比特流。它实现了各种H.264编码算法…

Spring Data访问Elasticsearch----Elasticsearch操作

Spring Data访问Elasticsearch----Elasticsearch操作 一、用法示例二、搜索结果类型三、查询3.1 CriteriaQuery3.2 StringQuery3.3 NativeQuery3.4 SearchTemplateQuery Spring Data Elasticsearch使用多个接口来定义可以针对Elasticsearch索引调用的操作&#xff08;有关响应(…

3月15/18日:复原IP地址子集

93.复原IP地址 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址&#xff0c;但是 &q…

Modeling Influence Diffusion over Signed Social Networks

关键词——社会系统、影响力扩散、建模、签名社交网络、影响力最大化 Abstract 在离线或在线世界中&#xff0c;许多社交系统可以表示为签名社交网络&#xff0c;包括积极和消极关系。尽管由于独特极性特征的巨大应用价值&#xff0c;人们对签名社交网络进行了各种研究&#x…

【Docker篇】自定义Dockerfile的操作

文章目录 &#x1f354;镜像结构&#x1f6f8;什么是Dockerfile⭐基于Ubuntu镜像构建一个新镜像&#xff0c;运行一个java项目&#x1f50e;使用 java:8-alpine &#x1f354;镜像结构 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。 我们以MySQL为例&am…

环境安装篇 之 docker安装

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 环境安装 系列文章&#xff0c;介绍 docker 的安装详细步骤 # 卸载旧版本docker $ sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \d…

QT网络编程之实现UDP广播发送和接收

推荐一个不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;内容全面&#xff0c;作为入门科普和学习提升都不错&#xff0c;分享一下给大家&#xff1a;前言https://www.captainbed.cn/ai 一.UDP通信 1.QT中实现UDP通信主要用到了以下类&#xff1a;QUdpSocket、QHost…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:FolderStack)

FolderStack继承于Stack(层叠布局)控件&#xff0c;新增了折叠屏悬停能力&#xff0c;通过识别upperItems自动避让折叠屏折痕区后移到上半屏 说明&#xff1a; 该组件从API Version 11开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件…

深度学习——数据预处理

一、数据预处理 为了能用深度学习来解决现实世界的问题&#xff0c;我们经常从预处理原始数据开始&#xff0c; 而不是从那些准备好的张量格式数据开始。 在Python中常用的数据分析工具中&#xff0c;我们通常使用pandas软件包。 像庞大的Python生态系统中的许多其他扩展包一样…

算法刷题day32

目录 引言一、走迷宫二、八数码三、走迷宫四、全球变暖 引言 本篇文章是讲 B F S BFS BFS 的&#xff0c;我发现好像蓝桥杯都很爱考陆地海洋的这种问题&#xff0c;这种问题就是即使你的模板背的再熟练&#xff0c;你想不到做法其实还是没啥用&#xff0c;所以多做题很重要&a…

【LeetCode每日一题】310. 最小高度树

文章目录 [310. 最小高度树](https://leetcode.cn/problems/minimum-height-trees/)思路&#xff1a;拓扑排序代码&#xff1a; 310. 最小高度树 思路&#xff1a;拓扑排序 首先判断节点数量n&#xff0c;如果只有一个节点&#xff0c;则直接返回该节点作为最小高度树的根节点…

阿里云ECS服务器u1通用算力型CPU性能、限制使用及收费价格表

阿里云服务器u1是通用算力型云服务器&#xff0c;CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器&#xff0c;通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)&#xff0c…

【解读】Gartner 2023 DevOps平台魔法四象限

2023年6月5日Gartner发布了DevOps平台魔法四象限洞察报告&#xff08;Magic Quadrant for DevOps Platforms DevOps&#xff09;&#xff0c;Gartner指出&#xff0c;DevOps平台正在成为DevOps工具链的一种更简单的替代品&#xff0c;为组织提供一套整合的集成能力。软件工程领…

Python:文件的操作

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; Python的os库主要用于与操作系统进行交互&#xff0c;它提供了多种功能&#xff0c;使得在Python程序中处理操作系统级任务变得容易。这里是一些…

Linux文件系统中常见文件夹的作用

在Linux文件系统中&#xff0c;各个文件夹有不同的作用和用途。以下是一些常见的文件夹及其功能&#xff1a; /&#xff1a;根目录&#xff0c;整个文件系统的起始点。/bin&#xff1a;二进制可执行文件的存放目录&#xff0c;包含许多基本的系统工具和命令&#xff0c;如ls、…

05 龙芯平台openstack部署搭建-placement部署

一、创建placement相关数据库、凭据与API端点 1.创建placement数据库并授权 mysql -uroot -ploongson -e “CREATE DATABASE placement;” mysql -uroot -ploongson -e “GRANT ALL PRIVILEGES ON placement.* TO ‘placement’‘localhost’ IDENTIFIED BY ‘loongson’;” …