当前位置: 首页 > wzjs >正文

网站制作职业网页模板下载

网站制作职业,网页模板下载,网站开发的硬件环境,万户网络app功能说明 ​​拖动功能​​: 鼠标按下时记录初始位置和滚动位置拖动过程中计算移动距离并更新滚动位置松开鼠标后根据速度实现惯性滚动 ​​滚动控制​​: 支持鼠标滚轮横向滚动(通过 wheel 事件)自动边界检测防止滚动超出内容…

功能说明

​​拖动功能​​:

  • 鼠标按下时记录初始位置和滚动位置
  • 拖动过程中计算移动距离并更新滚动位置
  • 松开鼠标后根据速度实现惯性滚动

​​滚动控制​​:

  • 支持鼠标滚轮横向滚动(通过 wheel 事件)
  • 自动边界检测防止滚动超出内容范围

实现代码

<template><div ref="scrollContainer" class="horizontal-scroll-container"@mousedown="startDrag"@mousemove="onDrag"@mouseup="stopDrag"@mouseleave="stopDrag"><div class="scroll-content"><div v-for="(item, index) in items" :key="index" class="item">{{ item }}</div></div></div>
</template><script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue'// 定义滚动容器引用
const scrollContainer = ref<HTMLElement | null>(null)// 定义滚动内容数据
const items = ref<string[]>(Array.from({ length: 20 }, (_, i) => `Item ${i + 1}`))// 拖动状态变量
let isDragging = false
let startX = 0
let scrollLeft = 0
let lastTime = 0
let velocity = 0// 开始拖动
const startDrag = (e: MouseEvent): void => {if (!scrollContainer.value) returnisDragging = truestartX = e.pageX - scrollContainer.value.getBoundingClientRect().leftscrollLeft = scrollContainer.value.scrollLeftlastTime = performance.now()scrollContainer.value.style.cursor = 'grabbing'
}// 拖动中
const onDrag = (e: MouseEvent): void => {if (!isDragging || !scrollContainer.value) returnconst x = e.pageX - scrollContainer.value.getBoundingClientRect().leftconst walk = (x - startX) * 1.5 // 调整滚动速度系数scrollContainer.value.scrollLeft = scrollLeft - walk// 计算速度(用于惯性滚动)const now = performance.now()velocity = (x - startX) / (now - lastTime)lastTime = now
}// 停止拖动
const stopDrag = (): void => {if (!isDragging || !scrollContainer.value) returnisDragging = falseif (Math.abs(velocity) > 0.1) {requestAnimationFrame(inertiaScroll)}scrollContainer.value.style.cursor = 'grab'
}// 惯性滚动
const inertiaScroll = (): void => {if (!scrollContainer.value || Math.abs(velocity) < 0.01) returnscrollContainer.value.scrollLeft += velocity * 10velocity *= 0.95 // 摩擦系数requestAnimationFrame(inertiaScroll)
}// 边界检测
const checkBounds = (): void => {if (!scrollContainer.value) returnconst containerWidth = scrollContainer.value.clientWidthconst contentWidth = scrollContainer.value.scrollWidthif (scrollContainer.value.scrollLeft < 0) {scrollContainer.value.scrollLeft = 0} else if (scrollContainer.value.scrollLeft > contentWidth - containerWidth) {scrollContainer.value.scrollLeft = contentWidth - containerWidth}
}// 鼠标滚轮横向滚动
const handleWheel = (e: WheelEvent): void => {if (!scrollContainer.value) returne.preventDefault()scrollContainer.value.scrollLeft += e.deltaYcheckBounds()
}// 生命周期钩子
onMounted(() => {if (scrollContainer.value) {scrollContainer.value.addEventListener('wheel', handleWheel, { passive: false })}
})onUnmounted(() => {if (scrollContainer.value) {scrollContainer.value.removeEventListener('wheel', handleWheel)}
})
</script><style scoped>
.horizontal-scroll-container {width: 100%;overflow-x: auto;white-space: nowrap;cursor: grab;height: 220px; /* 确保容器有固定高度 */border: 1px solid #eee;border-radius: 8px;padding: 10px;box-sizing: border-box;
}.horizontal-scroll-container:active {cursor: grabbing;
}.scroll-content {display: inline-block;
}.item {display: inline-block;width: 200px;height: 200px;margin-right: 10px;background: #f0f0f0;display: flex;align-items: center;justify-content: center;font-size: 20px;border: 1px solid #ddd;box-sizing: border-box;border-radius: 4px;transition: transform 0.2s ease, box-shadow 0.2s ease;
}.item:hover {transform: scale(1.02);box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
</style>

文章转载自:

http://wb35GKT3.ryfqj.cn
http://y371g2rP.ryfqj.cn
http://oQVaBdyK.ryfqj.cn
http://RDgblMQ3.ryfqj.cn
http://UG2qVuNU.ryfqj.cn
http://qG5CZtFb.ryfqj.cn
http://JVkxMYdh.ryfqj.cn
http://QfoIJuLl.ryfqj.cn
http://1UakMjdR.ryfqj.cn
http://dtHxyxjY.ryfqj.cn
http://Jw7yPXur.ryfqj.cn
http://IUaTsPvD.ryfqj.cn
http://3NEjTeFF.ryfqj.cn
http://uCnYIKQ4.ryfqj.cn
http://za1U4oan.ryfqj.cn
http://KPduFJ6t.ryfqj.cn
http://ecl25hRF.ryfqj.cn
http://HGCrEKOq.ryfqj.cn
http://M4yBs3Bn.ryfqj.cn
http://t2TTzbWU.ryfqj.cn
http://vuk4JY7O.ryfqj.cn
http://OZANq4iv.ryfqj.cn
http://YeTQi9yU.ryfqj.cn
http://QDiuhw71.ryfqj.cn
http://4SSiyYvO.ryfqj.cn
http://Mtgbpu3l.ryfqj.cn
http://VWfZWtP1.ryfqj.cn
http://wcd2pRLK.ryfqj.cn
http://5jPUnogd.ryfqj.cn
http://R96Kp1EE.ryfqj.cn
http://www.dtcms.com/wzjs/692114.html

相关文章:

  • 如何做销售网站网站开发专业能力
  • 上海手机网站建设电话杭州观建设计网站
  • 网站正在紧急建设中在线网站制作系统源码
  • 海南房产网站制作wordpress小鹅通
  • 做网站公违法嘛做网站要多少
  • 花都建网站公司网站开发者取色工具
  • php网站开发专业xiu主题做的网站
  • 韩国男女直接做的视频网站微商手机网站制作公司哪家好
  • 个人网站开发主要问题对互联网网站的理解
  • 网站建设需要摊销几年白银网站建设熊掌号
  • 旅游电子商务网站开发方案云和建设局网站
  • 做网站 传视频 用什么笔记本好沈阳城市建设学院网站
  • 全校网站建设与管理查看网站是用什么做的
  • 做网站公司深圳建公司网站
  • 白酒企业网站源码公司注册地址和经营地址不一致
  • 网站 开发 工具wordpress加载进度条
  • 淘宝客商品推广网站建设淘宝卖东西如何在网站做宣传
  • 网站设计建设公司教程公司网站优化
  • 网站申请服务器空间网站后台账户密码
  • 销售网站建设工资多少西部数码域名注册官网
  • 兰州网站备案谁家做天津做网站价格
  • 北京建网站报价网络销售公司怎么运作
  • 贵阳网站建设wordpress后台登不了是什么原因
  • 判断电脑和手机访问网站h5企业网站定制排名
  • 网站建设与管理适合男的还是女的网络营销的认识
  • 扁平化的网站结构图360建筑网官网入口官方
  • 门户网站建设多少钱aso安卓优化公司
  • 广宁网站建设wordpress 跳转 文章
  • 网站制作器软件下载百度手机助手app安卓版官方下载
  • 免费建站系统怎么用拼多多网站建设过程