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

news2024/11/29 6:28:49

效果图

思路:

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>
			<span
				v-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.coloradmin.cn/o/1341181.html

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

相关文章

中国蚁剑-antSword

1.简介 蚁剑是一款开源的跨平台Webshell管理工具&#xff0c;它是一个开源的远程管理工具&#xff0c;主要面向于合法授权的渗透测试安全人员以及进行常规操作的网站管理员。蚁剑提供了一个图形化界面&#xff0c;可以通过简单的操作连接和控制目标设备或系统。 蚁剑具有以下…

POLL机制

文章目录 一、POLL机制1、应用场景2、执行流程 二、程序1、驱动程序2、测试应用程序 三、总结 一、POLL机制 1、应用场景 使用休眠-唤醒的方式等待某个事件发生时&#xff0c;有一个缺点&#xff1a;等待的时间可能很久。我们可以加上一个超时时间&#xff0c;这时就可以使用…

在linux服务器安装anaconda3

下载anaconda3 wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh授权 chmod x Anaconda3-2023.09-0-Linux-x86_64.sh运行安装 ./Anaconda3-2023.09-0-Linux-x86_64.shenter yes 自定义路径&#xff0c;注意路径下的anaconda3文件夹不能已经存…

基于鸿蒙OS开发一个前端应用

创建JS工程&#xff1a;做鸿蒙应用开发到底学习些啥&#xff1f; 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。选择HarmonyOS模板库&#xff0c…

视频美颜SDK趋势畅想:未来发展方向与应用场景

当下&#xff0c;视频美颜SDK正不断演进&#xff0c;本文将深入探讨视频美颜SDK的发展趋势&#xff0c;探讨未来可能的方向和广泛的应用场景。 1.深度学习与视频美颜的融合 未来&#xff0c;我们可以期待看到更多基于深度学习算法的视频美颜SDK&#xff0c;为用户提供更高质量…

FinalShell连接虚拟机遇到的问题

在下载好VM后也安装好了虚拟机&#xff08;我这里使用Centos7.5&#xff09;&#xff0c;但是当使用FinalShell连接虚拟机的时候&#xff0c;一直提示连接超时。。。。 后来找了半天&#xff0c;发现是有次校园网和VM虚拟机冲突&#xff0c;就把虚拟机的网络连接给关了&#x…

Redis 核心知识总结

Redis 核心知识总结 认识 Redis 什么是 Redis&#xff1f; Redis 是一个由 C 语言开发并且基于内存的键值型数据库&#xff0c;对数据的读写操作都是在内存中完成&#xff0c;因此读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列、分布式锁等场景。 有以下几个特…

Python漂浮爱心完整代码

文章目录 环境需求完整代码详细分析环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://want595.blog.csdn.net/arti…

我的2023年,平淡中寻找乐趣

文章目录 两个满意我学会了自由泳。学习英语 一个较满意写博客 2024的期望 2023年&#xff0c;我有两个满意&#xff0c;一个较满意。 两个满意 我学会了自由泳。 开始练习自由泳是从2023年3月份&#xff0c;我并没有请教练&#xff0c;而是自己摸索。在抖音上看自由泳的视频…

im6ull学习总结(二)Framebuffer 应用编程

1 LCD操作原理 linux中通过framebuffer驱动程序来控制LCD。framebuffer中包含LCD的参数&#xff0c;大小为LCD分辨率xbpp。framebuffer 是一块内存 内存中保存了一帧图像。 关于图像的帧指的是在图像处理中&#xff0c;一帧&#xff08;Frame&#xff09;是指图像序列中的单个…

Unity中URP下精度修饰符real

文章目录 前言一、real是什么&#xff1f;1、我们在项目的Packages下找到如下文件&#xff1a;2、HAS_HALF(1代表有half精度&#xff0c;0代表没有half精度)3、PREFER_HALF4、REAL_IS_HALF5、如果 real is half6、否则为float 二、总结 前言 在使用雾效时&#xff0c;ComputeFo…

基于动态窗口的航线规划

MATLAB2016b可以运行 % ------------------------------------------------------------------------- % File : DWA 算法 % Discription : Mobile Robot Motion Planning with Dynamic Window Approach % Author :Yuncheng Jiang % License : Modified BSD Software License A…

【JAVA】OPENGL绕XYZ轴旋转立体图效果

JAVA-OPENGL绕XYZ轴旋转立体图效果_哔哩哔哩_bilibiliJAVA-OPENGL绕XYZ轴旋转立体图效果开始显示的是绕X轴、Y轴、Z轴旋转&#xff0c;后边是同时绕两个轴旋转&#xff0c;头有点晕&#xff0c;反应不过来了。, 视频播放量 1、弹幕量 0、点赞数 0、投硬币枚数 0、收藏人数 0、转…

canal 数据同步组件

canal 数据异构组件 为啥要使用这个组件&#xff1f; 在更新DB的时候不同步更新到redis&#xff0c;es等数据库中&#xff0c;时间太久&#xff0c;而且可能会存在同步失败的问题&#xff0c;因此引入canal去拉取DB的数据&#xff0c;再去更新到redis&#xff0c;es等数据库中&…

【Harmony OS - 应用数据持久化】

概述 应用数据持久化就是应用将内存中的数据通过文件或者数据库的方式保存在设备本机上。HarmonyOS标准系统支持一下三种f方式进行持久化处理&#xff1a;包括用户首选项、键值型数据库、关系型数据库。 用户首选项 用户首选项(Preferences) 是通过将数据(Key-Value键值)保存…

【C++篇】讲解Vector容器的操作方法

文章目录 &#x1f354;vector容器概念&#x1f339;操作方法⭐赋值操作⭐容量和大小⭐插入和删除⭐数据存取 &#x1f354;vector容器概念 vector 是 C 标准库中的一个容器&#xff0c;它提供了一种动态数组的实现。vector 容器可以存储任意类型的元素&#xff0c;并且可以根…

【办公技巧】为什么有的pdf不能编辑

pdf文件大家应该都经常接触&#xff0c;但是不知道大家会遇到这种情况&#xff1a;有些PDF文件打开之后无法编辑&#xff1f;是什么原因呢&#xff1f;今天我们来分析一下都是那些原因导致的。 首先我们可以考虑一下&#xff0c;PDF文件中的内容是否是图片&#xff0c;如果确认…

【中小型企业网络实战案例 四】配置OSPF动态路由协议

【中小型企业网络实战案例 三】配置DHCP动态分配地址-CSDN博客 【中小型企业网络实战案例 二】配置网络互连互通-CSDN博客 【中小型企业网络实战案例 一】规划、需求和基本配置_大小企业网络配置实例-CSDN博客 配置OSPF 由于内网互联使用的是静态路由&#xff0c;在链路出…

软件测试/测试开发丨Git常用命令学习笔记

基于 Git 的远程仓库 远程仓库地址备注GitHubgithub.com/世界上最主流的远程开源仓库。Giteegitee.com/国内目前比较主流的开源仓库&#xff0c;也可以私有化部署。&#xff08;推荐&#xff09;GitLabgitlab.com/私有化部署&#xff0c;企业使用较多。 Git 远程仓库的应用场…

腾讯云服务器怎么购买?购买流程

腾讯云轻量应用服务器购买指南&#xff0c;有两个入口&#xff0c;一个是在特价活动上购买&#xff0c;一个是在轻量应用服务器官方页面购买&#xff0c;特价活动上购买价格更便宜&#xff0c;轻量2核2G3M带宽服务器62元一年起&#xff0c;阿腾云atengyun.com分享腾讯云轻量应用…