vue3 封装t点击左右箭头实现内容滑动组件
1、组件
<template> <div class="switch-tab"> <div class="switch-tab-left" @click="leftClick"> <el-icon :size="24" color="rgba(99, 149, 255, 1)"><ArrowLeft /></el-icon> </div> <!-- 显示的区域 --> <div class="switch-tab-wrap"> <!-- 滑动的区域 --> <div class="switch-tab-scroll-content" :class="id"> <slot /> </div> </div> <div class="switch-tab-right" @click="rightClick"> <el-icon :size="24" color="rgba(99, 149, 255, 1)"><ArrowRight /></el-icon> </div> </div> </template> <script setup> import { reactive, ref } from "vue"; /*******************************定义属性props***************************************/ const props = defineProps({ moveWidth: { // 左右移动基础值 type: Number, default: 100, }, id: { // 唯一性 type: String, default: `switch-scroll`, }, }); /*******************************定义变量***************************************** */ /******************************定义函数*******************************************/ const leftClick = () => { let dom = document.querySelector(`.${props.id}`); if (dom.offsetLeft >= -props.moveWidth) { dom.style.left = `0px`; } else { dom.style.left = `${dom.offsetLeft + props.moveWidth}px`; } }; const rightClick = () => { let dom = document.querySelector(`.${props.id}`); let domWrap = document.querySelector(".switch-tab-wrap"); if ( dom.scrollWidth + dom.offsetLeft - props.moveWidth <= domWrap.offsetWidth ) { dom.style.left = `${domWrap.offsetWidth - dom.scrollWidth}px`; } else { dom.style.left = `${dom.offsetLeft - props.moveWidth}px`; } }; </script> <style lang='scss' scoped> .switch-tab { display: flex; align-items: center; justify-content: space-between; width: 100%; height: 100%; &-left, &-right { display: flex; align-items: center; justify-content: center; width: 40px; height: 82px; background: rgba(52, 118, 255, 0.04); border-radius: 2px; cursor: pointer; } &-wrap { position: relative; display: flex; justify-content: flex-start; align-items: center; width: calc(100% - 100px); height: 100%; padding: 0 10px; overflow: hidden; transition: all 0.3s; } &-scroll-content { position: absolute; left: 0px; display: flex; align-items: center; width: auto; height: 36px; transition: all 0.3s; } } </style>
2、父组件调用
<template>
<zy-switch-tab :moveWidth="187" id="to-do">
<div class="switch-tab-scroll-item" v-for="item in 30" :key="item"> {{ item }} </div> </zy-switch-tab> </template> <script setup> import { reactive } from "vue"; /*******************************定义属性props***************************************/ /*******************************定义变量***************************************** */ /******************************定义函数*******************************************/ </script> <style lang='scss' scoped> .switch-tab-scroll-item { width: 100px; font-size: 15px; font-weight: 400; color: #000; } </style>