首页 > 其他分享 >vue3 封装t点击左右箭头实现内容滑动组件

vue3 封装t点击左右箭头实现内容滑动组件

时间:2022-12-12 14:23:56浏览次数:49  
标签:flex 封装 center dom vue3 content width props 组件

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">
        <!-- <div class="switch-tab-scroll-item" v-for="item in 30" :key="item">
          {{ item }}
        </div> -->
        <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 } from "vue";
/*******************************定义属性props***************************************/
const props=defineProps({
  moveWidth:{ // 左右移动基础值
    type:[String,Number],
    default: 100
  }
})
/*******************************定义变量***************************************** */
/******************************定义函数*******************************************/
const leftClick = () => {
  let dom = document.querySelector(".switch-tab-scroll-content");
  console.log(dom.offsetLeft);
  if (dom.offsetLeft >= -props.moveWidth) {
    dom.style.left = `0px`;
  } else {
    dom.style.left = `${dom.offsetLeft + props.moveWidth}px`;
  }
};
const rightClick = () => {
  let dom = document.querySelector(".switch-tab-scroll-content");
  let domWrap = document.querySelector(".switch-tab-wrap");
  console.log(dom.scrollWidth);
  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;
    display: inline-block;
    text-align: center;
    width: 40px;
    height: 82px;
    line-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;
  }
  &-scroll-item {
    width: 100px;
    font-size: 15px;
    font-weight: 400;
    color: #000;
  }
}
</style>
View Code

2、父组件调用

<template>
  <zy-switch-tab>
    <!-- class类必须为switch-tab-scroll-item -->
    <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>

 

标签:flex,封装,center,dom,vue3,content,width,props,组件
From: https://www.cnblogs.com/vhen/p/16975913.html

相关文章

  • Vue3.0文档学习心得--响应式核心
    1.ref():接受一个内部值,返回一个响应式的、可更改的ref对象.此对象只有一个指向其内部值的属性 .value。使用实例:constcount=ref(0) console.log(count.value)//......
  • react组件深度解读
    五、React核心是组件在React中,我们使用组件(有状态、可组合、可重用)来描述UI。在任何编程语言中,你都可以将组件视为简单的函数。React组件也一样,它的输入是props......
  • 前端开发系列052-基础篇之数据流和组件通信(Vue)
    title:前端开发系列052-基础篇之数据流和组件通信(Vue)tags:categories:[]date:2017-12-2100:00:00本文是早期学习Vue整理的一些阶段性总结,内容主要关于Vue框架......
  • 前端开发系列050-基础篇之组件的概念和使用(Vue)
    title:'前端开发系列050-基础篇之组件的概念和使用(Vue)'tags:categories:[]date:2017-12-0901:00:00本文是早期学习Vue整理的一些阶段性总结,内容主要关于Vue框......
  • React组件之间的通信方式总结(下)
    一、写一个时钟用react写一个每秒都可以更新一次的时钟importReactfrom'react'importReactDOMfrom'react-dom'functiontick(){letele=<h1>{ne......
  • 如何使用 Towify 在小程序里实现使用菜单控制器控制两个组件切换?
    在某些使用场景下,你需要在菜单选项栏进行组件切换,例如底部导航栏、新手引导等场景。这时你可以使用菜单控制器和组件切换器配合来实现这一目的。效果展示:前置准备:一个......
  • React组件之间的通信方式总结(上)
    先来几个术语:官方我的说法对应代码ReactelementReact元素letelement=<span>A爆了</span>Component组件classAppextendsReact.Component{}无Ap......
  • 【秀米教程】变换组件的高级应用
    变换组件从“图1”变成“图2”,你会怎么做呢?图1图2插入一个新的时间轴,复制“图1”中的文字和图片到“图2”中?没错,我第一次也是这么想的......
  • vue3+element plus封装一个Drawer抽屉组件
    在开发中,我们经常使用vue2封装一些弹窗、抽屉组件,但是vue3的用法与vue2又不同,记录下本次使用vue3基于elementplus封装的一个抽屉组件开发思路是,关闭和打开抽屉组件的方......
  • vue3简易入门剖析
    vue3入门本章内容vue3简介vue3项目构建工具vitevue3组合式APIvue3响应式原理–Proxy+Object.defineProperty()computed计算属性watch侦听器函数的使用新增内置组件一、vue3......