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

vue 纵向滚动菜单, 点击滚动到选中菜单

1 背景

需要设计一个纵向滚动菜单,要求丝滑点,默认显示选中菜单

在这里插入图片描述

2 思路

  • 给定一个容器,样式包含overflow:hidden,默认高宽足够显示一个菜单(以下用图标代替菜单),鼠标悬浮时增大容器高度,显示更多图标
  • 设置两个div用于触发上下滚动(本意直接用每页第一和最后图标进行触发,但是这样会导致鼠标悬停时直接滚动,体验不好)
  • 鼠标点击时将点击图标滚动到当前页的第一个图标,鼠标没有点击,移出后菜单还原

3 实现

<template><div class="container" @mouseleave="handleMouseLeave"><divclass="action up"v-if="scrollTop !== -1 * (totalHeight - pageHeight)"@mouseover="handleMouseOver('up')"></div><ul :style="{ transform: `translateY(${scrollTop}px)` }"><liv-for="(item, index) in imgs":key="index":style="{ padding: itemPadding + 'px' }"><img:src="item"alt="":style="{ width: iconSize[0] + 'px', height: iconSize[1] + 'px' }"@click="handleClick(index)"/></li></ul><divclass="action dowm"v-if="scrollTop !== 0"@mouseover="handleMouseOver('down')"></div></div>
</template><script setup lang="ts">
import { ref, computed } from "vue";const props = defineProps({iconSize: {type: Array,default: () => [60, 60],},pageSize: {type: Number,default: 6,},itemPadding: {type: Number,default: 20,},
});
const list = ["vue.svg","back.svg","behance.svg","down.svg","hands.svg","hdd.svg","next.svg", //"one.svg","snow.svg","three.svg","up.svg","upload.svg","vip.svg", //"dvi.svg","bone.svg","bird.svg","ipad.svg","duck.svg","deer.svg", //"fish.svg","clap.svg","eagle.svg",
];
const imgs = ref(list.map((item) => new URL(`./assets/${item}`, import.meta.url).href)
);const scrollTop = ref(0);
const baseIndex = ref(0);const actionHeight = computed(() => {return props.itemPadding+ "px";
});const itemHeight = computed(() => {return props.iconSize[1] + 2 * props.itemPadding;
});
const containerBaseSize = computed(() => {return itemHeight.value + "px";
});
const containerHeight = computed(() => {return itemHeight.value * props.pageSize + "px";
});
const pageHeight = computed(() => {return props.pageSize * itemHeight.value;
});
const totalHeight = computed(() => {return imgs.value.length * itemHeight.value;
});const handleMouseOver = async (direction: string) => {if (direction === "up") {if (scrollTop.value + (totalHeight.value - pageHeight.value) >pageHeight.value) {scrollTop.value += -1 * pageHeight.value;} else {scrollTop.value = -1 * (totalHeight.value - pageHeight.value);}} else {if (scrollTop.value + pageHeight.value >= 0) {scrollTop.value = 0;} else {scrollTop.value += pageHeight.value;}}
};const handleClick = (index: number) => {scrollTop.value = -1 * index * itemHeight.value;baseIndex.value = index;
};
const handleMouseLeave = () => {handleClick(baseIndex.value);
};
</script><style scoped lang="scss">
.container {overflow: hidden;transition: all 0.5s;position: relative;width: v-bind(containerBaseSize);height: v-bind(containerBaseSize);&:hover {height: v-bind(containerHeight);}.action {cursor: pointer;position: absolute;width: 100%;height: v-bind(actionHeight);z-index: 10;&.up {top: 0;}&.dowm {bottom: 0;}}ul {box-sizing: content-box;margin: 0;padding: 0;height: 100%;transition: all ease-in-out 1s;list-style: none;li {line-height: 0;position: relative;img {cursor: pointer;transition: all 0.5s;&:hover {scale: 1.3;}}}}
}
</style>

相关文章:

  • 【项目托管git】本地项目托管到 Gitee
  • 机器学习-决策树算法
  • IDEA连接MySQL后如何管理数据库
  • JavaSE——类和对象(二)~~封装
  • 光耦合器的特性和应用概述
  • Mac电脑太卡了怎么办 Mac电脑常见问题 cleanmymacX有必要买吗
  • tensorflow下载
  • 编一个自己的万年历
  • 接口使用实例——数组排序
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • Android Audio基础——AudioFlinger回放录制线程(七)
  • 【NUCLEO-G071RB】007——IWDG-喂狗
  • 网站策划是什么
  • 专注于运动控制芯片、运动控制产品研发、生产与销售为一体的技术型芯片代理商、方案商——青牛科技
  • mac 系统正确安装nvm
  • 3.7、@ResponseBody 和 @RestController
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • js面向对象
  • JS字符串转数字方法总结
  • LintCode 31. partitionArray 数组划分
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 排序(1):冒泡排序
  • 树莓派 - 使用须知
  • MPAndroidChart 教程:Y轴 YAxis
  • MyCAT水平分库
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​iOS实时查看App运行日志
  • #pragma 指令
  • (06)Hive——正则表达式
  • (1)(1.11) SiK Radio v2(一)
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (五)Python 垃圾回收机制
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (原創) 未来三学期想要修的课 (日記)
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .form文件_SSM框架文件上传篇
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET Micro Framework 4.2 beta 源码探析
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架
  • .NET 使用 XPath 来读写 XML 文件
  • .net 微服务 服务保护 自动重试 Polly
  • .net8.0与halcon编程环境构建
  • .NET多线程执行函数
  • .ui文件相关
  • @Data注解的作用
  • @JsonFormat与@DateTimeFormat注解的使用
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @软考考生,这份软考高分攻略你须知道
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [000-01-030].Zookeeper学习大纲