vue实现滑动切换:切换选项时滑块有滑动过渡的效果

效果图

思路:

1. 高亮的色块是独立的一个盒子,需要插入当前激活的内容用来撑开色块盒子的宽度,这样色块的宽度就会和当前激活的内容宽度一致,色块的字体颜色设置透明即可

2. 色块滑动的距离是读当前激活元素的offsetLeft,赋值给色块盒子的translateX 属性

3. 使用vue3的新属性,在css中使用v-bind()动态的设置可变化的属性

4. 在色块盒子加上过渡的属性transition,即可实现色块的滑动过度效果

实现代码

// 新建CSlideSwitch.vue组件
<template><div class="c-slide-switch"><div class="container"><!-- silder 是高亮的颜色 --><span class="slider" :class="{ 'is-transition': animation }">{{ showSliderName }}</span><spanv-for="(item, index) in dataSource":key="index"ref="sliderItemRef"style="z-index: 66":class="{ actived: currentValue === item[propsAttr.value] }"@click="changeSlide(index, item[propsAttr.value])">{{ item[propsAttr.label] }}</span></div></div>
</template>
<script setup lang="ts">
/*** 这是 滑动切换组件*/
import { ref, computed, watch } from "vue";
type Props = {modelValue?: any; // 数值dataSource: any[]; // 数据源propsObj?: { [key: string]: any }; // 读取的字段属性animation?: boolean; // 是否开启动画duration?: number; // 动画时长 注意单位为毫秒 
};
const props = withDefaults(defineProps<Props>(), {modelValue: null,dataSource: () => [],propsObj: () => {// 属性return {};},animation: true,duration: 500
});
const emit = defineEmits(["update:modelValue", "change"]);const propsAttr = computed(() => {const obj = {label: "label",value: "value"};return Object.assign(obj, props.propsObj);
});const sliderItemRef = ref(); // slider下的每个item实例
const currentValue = ref(props.modelValue); // 记录当前激活的值
const sliderOffsetLeft = ref("0"); // 记录滑块需要滑动的距离// 用于在slider滑块上展示的文案--这个文案的作用主要是撑开slider滑块的宽度
const showSliderName = computed(() => {const target = props.dataSource.find((item: any) => item[propsAttr.value.value] === currentValue.value);return target[propsAttr.value.label];
});
// 滑块的动画时常
const sliderDuration = computed(() => {return (props.duration / 1000) + "s";
})// 监听激活的值的变化发射事件
watch(() => currentValue.value,() => {emit("update:modelValue", currentValue.value);},{ immediate: true }
);// 切换滑块
const changeSlide = (index: number, value: any) => {const offset = 2; // 偏移量// 更改滑块 滑动的距离sliderOffsetLeft.value = sliderItemRef.value[index].offsetLeft - offset + "px";// 记录当前激活的值currentValue.value = value;emit("change", value);
};
</script><style scoped lang="scss">
.container {position: relative;display: inline-flex;align-items: center;padding: 3px;overflow: hidden;background: rgba($color: #000000, $alpha: 10%);border-radius: 20px;span {display: inline-block;padding: 2px 24px;font-size: 12px;color: ##606266;cursor: pointer;}.slider {position: absolute;display: inline-block;transform: translateX(v-bind(sliderOffsetLeft));overflow: hidden;color: transparent;background-color: ##409EFF;border-radius: 20px;}.is-transition {transition: all v-bind(sliderDuration);}.actived {z-index: 99;font-weight: 600;color: #ffffff;border-radius: 20px;}
}
</style>

在文件中使用滑动切换组件

<template><div><h2>滑动切换组件</h2><CSlideSwitch v-model="slideValue" :data-source="btnList" /><div>绑定的值:{{ slideValue }}</div></div>
</template><script setup lang="ts">
import { ref } from "vue";
import CSlideSwitch from "@/components/modules/CSlideSwitch/index.vue";const btnList = [{ label: "今天", value: "today" },{ label: "昨天", value: "yesterday" },{ label: "本周", value: "this_week" },{ label: "上周", value: "last_week" },{ label: "本月", value: "this_month" },{ label: "上月", value: "last_month" }
];const slideValue = ref("today");
</script>

~~END~~

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

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

相关文章

Python进行网页爬取,使用Python中的那些库和工具。

要使用Python进行网页爬取&#xff0c;您可以使用Python中的一些库和工具来实现。 常用的Python库和工具包括&#xff1a; Requests&#xff1a;用于发送HTTP请求和获取网页内容。Beautiful Soup&#xff1a;用于解析HTML和XML文档&#xff0c;并从中提取数据。Scrapy&#x…

【上分日记】377场周赛(图论 + dp)

文章目录 前言正文1.2975. 移除栅栏得到的正方形田地的最大面积2.2976. 转换字符串的最小成本 I3.2977. 转换字符串的最小成本 II 总结后文 前言 本场周赛&#xff0c;后两题都涉及到了图论的最短路径&#xff08;克鲁斯卡尔算法&#xff09;的知识&#xff0c;恰巧又没学过&am…

文献阅读:LoRA: Low-Rank Adaptation of Large Language Models

文献阅读&#xff1a;LoRA: Low-Rank Adaptation of Large Language Models 1. 文章简介2. 方法介绍3. 实验 & 结论 1. 基础实验 1. Bert系列模型2. GPT系列模型 2. 消解实验 1. 作用矩阵考察2. 中间维度考察3. 扰动程度分析 4. 总结 & 思考 文献链接&#xff1a;htt…

SLAM学习入门--机器学习

文章目录 机器学习逻辑回归&#xff08;LR&#xff09;基本原理为什么 LR 要使用 sigmoid 函数&#xff1f;LR 可以用核函数么&#xff1f;为什么 LR 用交叉熵损失而不是平方损失&#xff1f;LR 能否解决非线性分类问题&#xff1f;LR为什么要离散特征&#xff1f;逻辑回归是处…

Linux文件系统结构及相关命令2 什么是Shell? help cd cd的用法 ls 的用法

Shell 是一种用于与操作系统进行交互的命令行解释器。它是用户与操作系统内核之间的接口&#xff0c;接受用户的命令并将其传递给操作系统进行执行。 在大多数的 Unix-like 操作系统&#xff08;如 Linux 和 macOS&#xff09;以及类 Unix 系统中&#xff0c;Shell 是默认的命…

10 HXCodec

前言 这个主要是提供了日常的相关 编码解码体系 的工具包, 依赖于fastjson 和 netty-all 里面主要包含了一些 摘要的生成, base64编码解码, ByteBuf操作api, Des编码解码, 文件操作, 十六进制操作, io操作, md5操作, 属性操作, rsa操作, socket操作 对象 序列化为字节序列, …

Qlib从入门到精通

前面谈到了简单的一个示例代码&#xff0c;实际上里面的策略源码和模型回测源码都需要好好了解&#xff0c;他这个回测系统和我之前用到的回测策略代码有不一样的地方&#xff0c;作为一个量化策略攻城狮&#xff0c;掌握源码是基本的技能。 Qlib内置了A股、美股两个市场的历史…

如何开发一个google插件(二)

前言 在上一篇文章如何开发一个google插件(一)里主要介绍了google插件的基本结构。 在这篇文章中主要结合reactwebpack进行一个代码演示&#xff0c;源码地址&#xff1a;源码地址 下载源码后打开浏览器的扩展程序管理->加载已解压的扩展程序&#xff0c;即可调试插件 此…

在线客服选择要点分析:如何挑选适合您需求的客服解决方案

选择一款好的在线客服系统&#xff0c;可以帮助企业多渠道的触达客户&#xff0c;与客户进行高效的沟通&#xff0c;最终达成转化的目的。 市面上现在成熟的客服系统产品有很多&#xff0c;企业在进行选择时要考虑以下几点&#xff1a; 1、企业需求 市场上的客服系统产品主要…

10、复制

复制概述 复制解决的基本问题是让一台服务器的数据与其他服务器保持同步。一台主库的数据可以同步到多台备库上&#xff0c;备库本身也可以被配置成另外一台服务器的主库。主库和备库之间可以有多种不同的组合方式。 Mysql 支持两种复制方式&#xff1a;基于行的复制和基于语句…

向表达式添加括号后的最小结果

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 给你一个下标从 0 开始的字符串 expression &#xff0c;格式为 “num1num2” &#xff0c;…

ArkTS - 组件生命周期

一、先说下自定义组件 在arkTs中&#xff0c;自定义组件分为两种&#xff08;我的总结&#xff09;&#xff1a; 一种是&#xff1a;根组件&#xff0c;就是被装饰器Entry装饰的入口组件&#xff0c;这也是自定义组件(父组件)。 另一种是&#xff1a;没有被Entry装饰的自定义…

跟我学c++中级篇——再谈C++20中的协程

一、协程 在前面分析过协程是什么&#xff0c;也对c20中的协程的应用进行了举例说明。所以这次重点分析一下c20中的整体构成及应用的方式。等明白了协程是如何动作的&#xff0c;各种情况下如下何处理相关的事件&#xff0c;那么在以后写协程时就不会死搬硬套了。 二、整体说…

分布式存储考点梳理 + 高频面试题

欢迎来到分布式存储模环节&#xff0c;本文我将和你一起梳理面试中分布式系统的数据库的高频考点&#xff0c;做到温故知新。 面试中如何考察分布式存储 广义的分布式存储根据不同的应用领域&#xff0c;划分为以下的类别&#xff1a; 分布式协同系统 分布式文件系统 分布式…

Xline command 去重机制(一)—— RIFL 介绍

为什么要对 command 去重&#xff1f; 在一个接收外部 command 的系统中&#xff0c;通常一个 command 至少要执行一次&#xff0c;我们称其为 at-least-once semantics。如果一个 command 执行失败&#xff0c;系统内部经常会实现一套重试结构来尝试恢复这个问题&#xff0c;…

HTML 基础

文章目录 01-标签语法标签结构 03-HTML骨架04-标签的关系05-注释06-标题标签07-段落标签08-换行和水平线09-文本格式化标签10-图像标签图像属性 11-路径相对路径绝对路径 12-超链接标签13-音频14-视频 01-标签语法 HTML 超文本标记语言——HyperText Markup Language。 超文本…

【分布式配置中心】聊聊Apollo的安装与具体配置变更的原理

【管理设计篇】聊聊分布式配置中心 之前就写过一篇文章&#xff0c;介绍配置中心&#xff0c;但是也只是简单描述了下配置中心的设计点。本篇从apollo的安装到部署架构到核心原理进一步解读&#xff0c;大概看了下apollo的原理&#xff0c;感觉没有必要深究&#xff0c;所以就…

2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项样题卷③

2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项&#xff08;高职组&#xff09; 样题&#xff08;第3套&#xff09; 目录 2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项&#xff08;高职组&#xff09; 样题&#xff08;第3套&#xff09; 模块…

2024黑龙江省职业院校技能大赛暨国赛选拔赛应用软件系统开发赛项(高职组)赛题第1套

2024黑龙江省职业院校技能大赛暨国赛选拔赛 应用软件系统开发赛项&#xff08;高职组&#xff09; 赛题第1套 竞赛说明 目录 需要竞赛源码资料可私信博主&#xff01; 竞赛说明 模块一&#xff1a;系统需求分析 任务1&#xff1a;制造执行MES—质量管理—质检标准&#xff…

FreeRTOS学习--49讲 事件标志位

事件标志位&#xff1a; 用一个bit位来表示事件是否发生&#xff0c;只有0(未发生)和1(已发生)两种状态 事件组&#xff1a;事件组是一组事件标志的集合&#xff0c;一组事件组包含了EventBites_t数据类型的变量&#xff0c;该变量高8未不能作为事件标志&#xff0c;用于存储控…