点击左右箭头实现内容滑动

实现效果
实现效果:
1、通过点击左右箭头实现内容滑动
2、点击+添加标签
3、点击×删除标签
4、点击标签
实现思路:
1、position布局

1 、通过点击左右箭头实现内容滑动

代码:
html

<!-- 可滑动区域和操作可滑动区域的icon -->
        <div class="scrollTab">
            <i class="el-icon-caret-left" @click="leftClick"></i>
            <!-- 显示的区域 -->
            <div id="classifyScroll">
                <!-- 滑动的区域 -->
                <div class="classifys">
                    <!-- 单个标签 -->
                    <div
                        class="classifys-item"
                        :class="index == currentFlowIndex ? 'classifys-activeItem' : 'classifys-item'"
                        v-for="(item, index) in flowList"
                        :key="index"
                        :ref="`item${index}`"
                        @click="changeFlow(item, index)"
                        @dblclick="changeCurrentFlow(item, index)"
                    >
                        <p>{{ item.backEnd.name ? item.backEnd.name : '空白页' }}</p>
                        <i class="el-icon-close" @click.stop="closeFlowList(index)"></i>
                    </div>
                </div>
            </div>
            <i class="el-icon-plus" style="font-weight:500;" @click="addFlowList"></i>
            <i class="el-icon-caret-right" @click="rightClick"></i>
 </div>

scss

.scrollTab {
   width: calc(100% - 170px);
   display: flex;
   justify-content: space-between;
   align-items: center;
   margin-left: 170px;
   #classifyScroll {
       width: calc(100% - 45px);
       height: 36px;
       overflow: hidden;
       transition: all 0.3s;
       position: relative;
       display: flex;
       justify-content: flex-start;
       align-items: center;
       .classifys {
           position: absolute;
           left: 0px;
           height: 36px;
           transition: all 0.3s;
           width: auto;
           display: flex;
           align-items: center;
           background: #f0f0f0;
           &-item {
               width: 140px;
               font-size: 15px;
               font-weight: 400;
               color: #000;
               padding: 8px 0px 8px 6px;
               box-sizing: border-box;
               background: #f0f0f0;
               display: flex;
               justify-content: space-between;
               align-items: center;
               > p {
                   width: 140px;
                   overflow: hidden;
                   text-overflow: ellipsis;
                   white-space: nowrap;
               }
               > i {
                   margin-right: 8px;
               }
               > i:hover {
                   cursor: pointer;
               }
           }
           &-activeItem {
               background: #fff;
               // border-top-right-radius: 10px;
           }
           &-item:hover {
               cursor: pointer;
           }
       }
   }
}

js
点击左箭头

leftClick() {
    // 在点击的时候判断可滑动区域的left是否大于-20(因为我在左右点击的时候每次移动20px,所以需要判断是否大于20;)
    // 小于:直接将left设置为0
    // 大于:left则加20
    if (document.getElementsByClassName('classifys')[0].offsetLeft >= -20) {
        document.getElementsByClassName('classifys')[0].style.left = 0 + 'px';
    } else {
        document.getElementsByClassName('classifys')[0].style.left = document.getElementsByClassName('classifys')[0].offsetLeft + 20 + 'px';
    }
}

点击右箭头

rightClick() {
     // 在点击的时候判断可滑动区域的left+可视区域的宽度是否大于可滑动区域的宽度
     // 大于:则left为可视区域的宽度-可滑动区域的宽度
     // 小于:当前的可滑动区域的left-20即可
     if (
         document.getElementsByClassName('classifys')[0].scrollWidth +
             document.getElementsByClassName('classifys')[0].offsetLeft -
             20 <=
         document.getElementById('classifyScroll').offsetWidth
     ) {
         document.getElementsByClassName('classifys')[0].style.left =
             document.getElementById('classifyScroll').offsetWidth -
             document.getElementsByClassName('classifys')[0].scrollWidth +
             'px';
     } else {
         document.getElementsByClassName('classifys')[0].style.left =
             document.getElementsByClassName('classifys')[0].offsetLeft - 20 + 'px';
     }
 }

2、点击+添加标签

此处需要注意的是,在添加标签的时候,可滑动区域的left应该为多少
判断:如果可滑动区域的宽度大于了可显示的区域,那么可滑动区域的left=可显示区域的宽度-可滑动区域的宽度

if (document.getElementsByClassName('classifys')[0].scrollWidth > document.getElementById('classifyScroll').offsetWidth) {
    document.getElementsByClassName('classifys')[0].style.left =
        document.getElementById('classifyScroll').offsetWidth -
        document.getElementsByClassName('classifys')[0].scrollWidth +
        'px';
}

3、点击×删除标签

此处需要注意的与添加标签时碰到的问题类似
判断:
(1)如果可滑动区域的宽度小于可显示的区域,那么可滑动区域的left= 0px
(2)如果可滑动区域的宽度大于可显示的区域,那么可滑动区域的left=当前的可滑动区域的left+140 + ‘px’。因为我给标签设置的宽度为140px,如果删除一个标签,那么理应给left+140

if (document.getElementsByClassName('classifys')[0].scrollWidth <= document.getElementById('classifyScroll').offsetWidth) {
    document.getElementsByClassName('classifys')[0].style.left = 0 + 'px';
} else {
    document.getElementsByClassName('classifys')[0].style.left =
        document.getElementsByClassName('classifys')[0].offsetLeft + 140 + 'px';
}

4、点击标签

此处需要注意的是在点击标签时,如果标签现在一半显示一半未显示,那么可滑动区域的left该怎么设置呢
标签的一半显示和一般未显示分为两种情况:
在这里插入图片描述
第一个红框圈起来的则为前半部分未显示,后半部分显示的情况
第二个红框圈起来的则为后半部分未显示,前半部分显示的情况
下方出现的index为当前点击的标签在数组中的位置
判断一:index*140 < 可滑动区域的left的值,那么证明,这个标签前半部分是被隐藏的,所以在点击它的时候,需要把前半部分显示出来,所以将可滑动区域的left设置为 index * -140 + ‘px’
判断二:(index+1)*140 > 可滑动区域的left + 可显示区域的宽度,那么证明在,这个标签的后半部分是被隐藏的,所以在点击它的时候,需要把后半部分显示出来,所以将可滑动区域的left设置为document.getElementById(‘classifyScroll’).offsetWidth - (index + 1) * -140 + ‘px’

if (document.getElementsByClassName('classifys')[0].scrollWidth > document.getElementById('classifyScroll').offsetWidth) {
    if (index * 140 < Math.abs(document.getElementsByClassName('classifys')[0].offsetLeft)) {
        document.getElementsByClassName('classifys')[0].style.left = index * -140 + 'px';
    } else if (
        (index + 1) * 140 >
        document.getElementById('classifyScroll').offsetWidth -
            document.getElementsByClassName('classifys')[0].offsetLeft
    ) {
        document.getElementsByClassName('classifys')[0].style.left =
            document.getElementById('classifyScroll').offsetWidth - (index + 1) * 140 + 'px';
    }
}

有问题欢迎来问!!!

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这可以通过JavaScript和CSS实现。首先,需要在HTML中创建一个具有滑动效果的容器,例如一个div元素,并为其添加CSS样式,使其可以滑动。然后,使用JavaScript监听用户的滑动手势事件,并根据用户的滑动方向来移动容器的位置。 以下是一个示例代码,实现左右滑动效果: HTML代码: ``` <div class="slider"> <div class="slides"> <img src="image1.jpg"> <img src="image2.jpg"> <img src="image3.jpg"> </div> </div> ``` CSS代码: ``` .slider { width: 100%; overflow: hidden; } .slides { display: flex; width: 300%; } .slides img { width: 33.33%; float: left; } ``` JavaScript代码: ``` var slider = document.querySelector('.slider'); var slides = document.querySelector('.slides'); var slideIndex = 0; // 监听用户的滑动手势事件 slider.addEventListener('touchstart', handleTouchStart, false); slider.addEventListener('touchmove', handleTouchMove, false); var x1 = null; var y1 = null; // 处理滑动手势开始事件 function handleTouchStart(event) { x1 = event.touches[0].clientX; y1 = event.touches[0].clientY; } // 处理滑动手势移动事件 function handleTouchMove(event) { if (!x1 || !y1) { return; } var x2 = event.touches[0].clientX; var y2 = event.touches[0].clientY; var xDiff = x2 - x1; var yDiff = y2 - y1; if (Math.abs(xDiff) > Math.abs(yDiff)) { // 水平滑动 event.preventDefault(); if (xDiff > 0) { // 向右滑动 slideIndex--; if (slideIndex < 0) { slideIndex = slides.children.length - 1; } } else { // 向左滑动 slideIndex++; if (slideIndex >= slides.children.length) { slideIndex = 0; } } slides.style.transform = 'translateX(-' + slideIndex * 100 / slides.children.length + '%)'; } x1 = null; y1 = null; } ``` 这段代码中,我们使用了CSS的flex布局来创建一个具有滑动效果的容器,其中图片元素的宽度设为33.33%。然后,我们监听了滑动手势事件,并根据用户的滑动方向来移动容器的位置,从而实现左右滑动效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值