嵌套走马灯Carousel

news2024/10/6 1:38:08

Carousel 的应用很广泛,基础用法这里不多做阐述,感兴趣的可以去element-gui了解Carousel 组件。

今天主要是梳理嵌套走马灯的逻辑,背景如下:

需要对项目做一个展示,项目可能有一个或多个,同时一个项目可能不包含标段,也可能包含一个或多个标段。

要求: 切换展示项目,若是项目包含标段,停止项目的切换,进行标段的切换(2个标段占用一个走马灯),当当前项目的标段信息切换到最后一页之后,切换下一个项目,一直这样轮回切换。

具体效果如下所示:

嵌套走马灯

外层灰色框的是项目走马灯,里面嵌套的是标段走马灯。

代码如下:

<template>
<!-- 嵌套走马灯示例 :initial-index="projectIndex"  bidAutoArr[key]-->
  <el-carousel :interval="4000" type="card" width="1500px" height="230px" :autoplay="projectAuto" @change="projectPlayChange">
    <el-carousel-item v-for="(item, key) in carouselData" :key="key">
      <p>项目编号: {{item.projectCode}}</p>
      <p>项目名称: {{item.projectName}}</p>
      <div class="outer">
        <el-carousel :interval="4000" type="card" height="100px" :autoplay="item.bidAutoplay" @change="bidPlayChange" ref="bidCarousel">
          <el-carousel-item v-for="(bidSection, bidSectionKey) in item.bidSections" :key="bidSectionKey" class="content">
            <p v-for="(bidInfo,bidInfoKey) in bidSection" :key="bidInfoKey">
              {{bidInfo.bidSectionCode}} : {{bidInfo.bidSectionName}}
            </p>
          </el-carousel-item>
        </el-carousel>
      </div>
    </el-carousel-item>
  </el-carousel>
</template>

<script>
import data from '../dataMaked/CarouslDemo.json'
export default {
  data(){
    return {
      carouselData: [],   // 嵌套走马灯里需展示的数据
      projectAuto: false, // 项目是否自动切换
      projectIndex: 0,    // 走马灯显示的当前项目的索引
    }
  },
  methods: {
    // 项目走马灯切换
    projectPlayChange(proIndex) {
      console.log('==================项目=============================');
      console.log(proIndex);
      this.projectAuto = false;
      // 把上一页的项目的标段走马灯手动切换到第一页(不然上一页项目的标段走马灯是最后一页的状态)
      console.log('pppppppppppppppppppppppppppppppppppppppppppppp');
      console.log(this.$refs.bidCarousel[this.projectIndex]);
      this.$refs.bidCarousel[this.projectIndex].setActiveItem(0);

      // 更换项目索引为的当前项目
      this.projectIndex = proIndex;
      // 判断当前项目下标段走马灯数量,若是大于1,切标段;反之切项目
      console.log(this.carouselData[this.projectIndex].bidSections.length);
      if(this.carouselData[this.projectIndex].bidSections.length > 1) {
        this.carouselData[this.projectIndex].bidAutoplay = true;
      } else {
        this.projectAuto = true;
      }
    },
    // 标段走马灯切换
    bidPlayChange(bidIndex) {
      console.log('==================标段=============================');
      console.log(bidIndex);
      // 获取当前项目的标段走马灯数量
      const BidCarouselNum = this.carouselData[this.projectIndex].bidSections.length;
      // console.log(BidCarouselNum);
      // 当前索引等于BidCarouselNum-1,意味着切到最后一张走马灯了
      //      此时:判断项目长度,如果项目长度大于1,停止切标段,切项目;反之一直切换标段
      if(bidIndex == BidCarouselNum-1 && this.carouselData.length > 1) {
        this.carouselData[this.projectIndex].bidAutoplay = false;
        this.projectAuto = true;
      }
    },
  },
  created() {},
  mounted() {
    // 数据格式重构--嵌套走马灯里需展示的数据
    this.carouselData = this.$carouselInitData(data.res.kbProjectBidInfo);
    console.log('111111111111111111111111111111111111111111111');
    console.log(this.carouselData);
    // 查看第一个项目的标段数量,如果标段数量大于1,从标段开始切换。
    //    若是标段数量小于1,判断项目的个数,项目个数大于1,切项目;项目个数小于1,不动。
    if(this.carouselData[0].bidSections.length > 1) {
      this.carouselData[0].bidAutoplay = true;
    } else {
      if(this.carouselData.length > 1) {
        this.projectAuto = true;
      }
    }

  }
}
</script>

<style>
  .el-carousel__item h3 {
    color: #475669;
    font-size: 14px;
    opacity: 0.75;
    line-height: 50px;
    margin: 0;
  }

  .el-carousel__item:nth-child(2n) {
    background-color: #99a9bf;
  }

  .el-carousel__item:nth-child(2n+1) {
    background-color: #d3dce6;
  }

  .content:nth-child(2n) {
    background-color: #1db418 !important;
  }

  .content:nth-child(2n+1) {
    background-color: #d3361b !important;
  }

  .outer {
    height: 100px;
    width: 800px;
    background: #3128b4;
    margin: 10px auto;
  }
</style>

主要用到的走马灯的属性:

属性含义
:autoplay是否自动切换走马灯
:interval走马灯自动切换的时间间隔

除此之外,还用到走马灯切换时触发的事件:@change

还用到手动切换走马灯的方法:setActiveItem

逻辑梳理起来很简单,由于我们是嵌套走马灯,所以优先需要生成嵌套走马灯需要的数据格式,由此,我封装了一个方法。

/**
 * @Author: zhl
 * @Date: 2021-03-04
 * @Description: 生成两个嵌套跑马灯显示的项目及标段信息
 * @param {*} originData 表示项目信息数组
 * @param {*} bidNum 表示内层每个跑马灯显示的标段数量,不传参数就使用默认值:2
 */
var carouselInitData = function(originData, bidNum=2) {
  var newData = [];
  for(let i=0; i < originData.length; i++) {
    var info = {}; // 包含项目和标段信息的对象
    info.projectCode = originData[i].projectCode; // 项目编号
    info.projectName = originData[i].projectName; // 项目名称
    info.bidSections = []; // 内嵌走马灯每页显示标段信息(将原来的一维数组转化为二维数组)
    if(originData[i].gtvBidSection && originData[i].gtvBidSection.length > 0) { // 先判断该项目有没有标段
      var bidSectionNum = Math.ceil(originData[i].gtvBidSection.length / bidNum);
      for(let j=0; j < bidSectionNum; j++) {
        var bidSection = originData[i].gtvBidSection.slice(j*bidNum, (j+1)*bidNum);
        info.bidSections.push(JSON.parse(JSON.stringify(bidSection)));
      }
    }
    info.bidAutoplay = false; // 默认设置内层跑马灯(包含标段信息的)不切换
    newData.push(JSON.parse(JSON.stringify(info)));
  }
  return newData;
}
export default carouselInitData;

对应的生成数据之后,就可以进行切换了:

首先 ,将项目和标段的自动切换设置为false,即:projectAuto: false ,由 carouselInitData 方法重构的数据也将所有项目的标段的自动切换设置为false了。

然后,进行切换的初始触发,在 mounted 钩子函数里面做一个判断:查看第一个项目的标段数量,如果标段数量大于1,从标段开始切换。若是标段数量小于1,判断项目的个数,项目个数大于1,切项目;项目个数小于1,不动。

其次 ,标段走马灯切换方法编写,如果项目有标段,且进行了标段的切换,如果切换到最后一张走马灯,且当前项目数量大于1,则停止当前项目标段的切换,切换到下一个项目。

最后 ,项目走马灯切换方法编写,项目切换之后,触发 projectPlayChange 方法,此时,优先停止项目的切换,同时将上一个项目的标段走马灯手动切换到第一页。然后判断当前项目下标段走马灯的数量,若是大于1,切标段;反之切项目。

这样就构成了一个循环,也实现了最终的切换效果。

原理其实就是:动态修改两个嵌套走马灯的 autoplay 属性。

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

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

相关文章

2023爱分析·云原生智能运维中台市场厂商评估报告:秒云(miaoyun.io)

目录 1. 研究范围定义 2. 云原生智能运维中台市场定义 3. 厂商评估&#xff1a;秒云&#xff08;miaoyun.io&#xff09; 4. 入选证书 1. 研究范围定义 数字化时代&#xff0c;应用成为企业开展各项业务的落脚点。随着业务的快速发展&#xff0c;应用的功能迭代变得越…

Scala集合详解(第七章:集合、数组、列表、set集合、map集合、元组、队列、并行)(尚硅谷笔记)

集合第七章:集合7.1 集合简介7.1.1 不可变集合继承图7.1.2 可变集合继承图7.2 数组7.2.1 不可变数组7.2.2 可变数组7.2.3 不可变数组与可变数组的转换7.2.4 多维数组7.3 列表 List7.3.1 不可变 List7.3.2 可变 ListBuffer7.4 Set 集合7.4.1 不可变 Set7.4.2 可变 mutable.Set7.…

蓝牙运动耳机什么牌子的好、运动蓝牙耳机排行榜推荐

近些年&#xff0c;户外运动兴起&#xff0c;运动耳机迎来爆发增长&#xff0c;拒绝运动乏味&#xff0c;追求健康运动方式&#xff0c;已经成为当下年轻人的共同诉求。跑步骑行听音乐&#xff0c;已经是运动爱好者再熟悉不过的操作&#xff0c;很多人在运动中离不开音乐的节奏…

双检测人脸防伪识别方法(活体检测+人脸识别+关键点检测+人像分割)

双检测人脸防伪识别=人脸检测+活体检测+人脸识别 1.人脸关键点+语义分割 使用mediapipe进行视频人脸关键点检测和人像分割: import time import cv2 import mediapipe as mp import numpy as npmp_drawing = mp.solutions.drawing_utils mp_drawing_styles = mp.solution…

定了:Python3.7,今年停止更新~

大家好&#xff0c;这里是程序员晚枫。 今天给大家分享一个来自Python官网的重要消息&#xff1a;Python3.7马上就要停止维护了&#xff0c;请不要使用了&#xff01; 官网链接&#xff1a;https://devguide.python.org/versions/ 停更的后果是什么&#xff1f; 周末翻阅Py…

从功能测试(点点点)到进阶自动化测试,实现薪资翻倍我只用了3个月时间

前言 从事测试工作已3年有余了&#xff0c;今天想聊一下自己刚入门时和现在的今昔对比&#xff0c;虽然现在也没什么成就&#xff0c;只能说笑谈一下自己的测试生涯&#xff0c;各位看官就当是茶余饭后的吐槽吧&#xff0c;另外也想写一写自己的职场感想&#xff0c;希望对刚开…

实例4:树莓派GPIO控制舵机转动

实例4&#xff1a;树莓派GPIO控制舵机转动 实验目的 通过背景知识学习&#xff0c;了解舵机的外观及基本运动方式。了解四足机器人mini pupper腿部单个舵机的组成结构。通过GPIO对舵机进行转动控制&#xff0c;熟悉PWM。了解mini pupper舵机组的整体调零。 实验要求 使用Py…

【vue2每日小知识】实现directive自定义指令的封装与全局注册

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;将我们的自定义指令directive统一管理并批量注册 目录 一、directive自定义指令介绍 二…

LeetCode——752. 打开转盘锁

一、题目 你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字&#xff1a; ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ 。每个拨轮可以自由旋转&#xff1a;例如把 ‘9’ 变为 ‘0’&#xff0c;‘0’ 变为 ‘9’ 。每次旋转都只能旋转一个…

Python每日一练(20230222)

目录 1. 柱状图中最大的矩形 2. 汇总区间 3. 寻找旋转排序数组中的最小值 1. 柱状图中最大的矩形 难度&#xff1a;困难 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出…

IDEA工具系列之连接Linux

我们在开发的时候&#xff0c;用IDEA开发程序&#xff0c;用XSHELL来管理服务器&#xff0c;这两个工具切换比较麻烦。有没有用IDEA来连接Linux。当然有&#xff0c;下面有实践步骤&#xff1a; 首先&#xff1a;连接Linux 打开IDEA->Tools->Start SSH Session 其中1&…

MySQL------窗口函数

一、窗口函数定义 1、 适用场景及分类 怎么样得到各部门工资排名前N名员工列表? 查找各部门每人工资占部门总工资的百分比&#xff1f; 累计求和如何计算&#xff1f; 连续统计N天登陆的用户&#xff1f;以上类型问题均使用窗口函数可以解决&#xff0c;这类需求都有一个共同…

51单片机串口使用

文章目录前言一、串口概念二、中断中的RI、TI和SUBF1.RI2.TI3.SUBF三、串口波特率的计算四、代码的编写总结前言 今天将为大家讲解51单片机的串口原理及代码编写。 一、串口概念 51单片机串口是一种通信接口&#xff0c;它可以将51单片机与外部设备连接起来&#xff0c;实现…

单片机输入输出模式

单片机输入输出模式输入模式模拟输入、浮空输入、上拉输入、下拉输入GPIO输出模式推挽输出、开漏输出、复用推挽输出、复用开漏输出。上下拉电阻上拉电阻下拉电阻输入模式 模拟输入、浮空输入、上拉输入、下拉输入 模拟输入&#xff1a;I/O端口的模拟信号&#xff08;电压信号…

Python入门自学进阶-Web框架——32、上课、作业流程开发

对学员上课、作业进行管理。首先对几个表&#xff0c;即model用途进行阐述&#xff1a;课程表存放要开什么课&#xff0c;有了课程表&#xff0c;就要有班级&#xff0c;如开了Python入门课程&#xff0c;再根据学员人数&#xff0c;组成班级&#xff0c;如Python入门课程一班、…

报考浙大MBA项目的基本常识信息

一、项目简介 以培养具有国际视野、创新创业精神、卓越领导能力和高度社会责任感的中高级管理人才和创业型人才为己任。通过对引领时代发展的经典管理思想和前沿管理理念的传授&#xff0c;以及对推动行业健康发展的企业管理实践的研讨&#xff0c;来培养和提升学员的职业意…

一个测试工程师的7年感悟 ---- 致在一路独行的你(别放弃)

前言 不知不觉在软件测试行业&#xff0c;摸爬滚打了7年之久。这一路上也留下了许许多多令我难以忘记的故事。有刚入行时的迷茫&#xff0c;有学习技术路上踩过的坑&#xff0c;有做项目连夜敲代码的悲情也有迎来项目成功上线的欢愉&#xff0c;有太多太多值得铭记的瞬间&…

JUC-day02

JUC-day02 集合的线程安全callable和futureJUC三个工具类(练习)读写锁: 共享锁 独占锁(练习)AQS: 实现原理(核心方法)CAS: 原理–>可见性关键字 1 集合的线程安全(重点) 1.1 集合操作Demo NotSafeDemo public static void main(String[] args) {List list new ArrayLis…

Java集合(二)---Map

1.什么是Hash算法哈希算法是指把任意长度的二进制映射为固定长度的较小的二进制值&#xff0c;这个较小的二进制值叫做哈希值static final int hash(Object key) {int h;return (key null) ? 0 : (h key.hashCode()) ^ (h >>> 16);}以上是HashMap中的hash算法代码2…

三天吃透Spring面试八股文(最新整理)

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…