vue3旋转木马型轮播图,环型滚动

news2024/11/15 17:42:37
<template>
  <div>
    <div class="content">
      <div class="but1" @click="rotateLeft">--向左</div>
      <div class="ccc">
        <main id="main">
          <div class="haha" ref="haha">
            <div
              class="box"
              v-for="(item, index) in imgList"
              :key="index"
             :style="boxStyle(index)"
            >
            <!-- :style="{ '--d': index }" -->
            <!--  :style="boxStyle(index)" -->
              <div class="boxs">{{ index }}
                <img class="img" :src="item.url" alt="" />
              </div>
            </div>
          </div>
        </main>
      </div>
      <div class="but2" @click="rotateRight">++向右</div>
    </div>
    <p>当前中间的图片索引是: {{ currentIndex }}</p>
  </div>
</template>

<script lang="ts" setup>
import { ref, onMounted, onUnmounted,computed } from "vue";
import img1 from "./imgs/pic_dsjfx.png";
import img2 from "./imgs/pic_lyxxw.png";
import img3 from "./imgs/pic_rjgl.png";
import img4 from "./imgs/pic_yqjc.png";
import img5 from "./imgs/pic_lyzhjgpt.png";

const haha = ref<HTMLDivElement | null>(null);
const zhuan = ref(0);
let lunbo: number | undefined;
const imgList = [
{
    url: img4,
  },
  {
    url: img5,
  },
  {
    url: img1,
  },
  {
    url: img2,
  },
  {
    url: img3,
  },
  {
    url: img4,
  },
  {
    url: img5,
  },
  {
    url: img1,
  },
  {
    url: img2,
  },
];
const boxes = [
  { background: "orange" },
  // { background: 'pink' },
  { background: "green" },
  { background: "red" },
  { background: "blue" },
  { background: "aqua" },
];

const rotateRight = () => {
  zhuan.value -= 20;
  console.log(zhuan.value);
  if (haha.value) {
    haha.value.style.transform = `rotateY(${zhuan.value}deg)`;
  }
};

const rotateLeft = () => {
  zhuan.value += 20;
  console.log(zhuan.value);
  if (haha.value) {
    haha.value.style.transform = `rotateY(${zhuan.value}deg)`;
  }
};

const startInterval = () => {
  lunbo = setInterval(rotateRight, 3000);
};

const clearInterval = () => {
  if (lunbo !== undefined) {
    window.clearInterval(lunbo);
  }
};
let chushidushi = 0
let dangqian = 0
const totalBoxes = imgList.length;
// 计算当前中间的图片索引
const currentIndex = computed(() => {
  // zhuan.value / 20 用于计算旋转了多少个位置
  // Math.round 用于修正因浮点数运算导致的小数问题
  const normalizedIndex = Math.round(zhuan.value / 20) % totalBoxes;

  // 确保 index 是一个正值并且在 [0, totalBoxes-1] 范围内
  console.log(-(normalizedIndex ) % totalBoxes);
  dangqian = -(normalizedIndex ) % totalBoxes
  return -(normalizedIndex ) % totalBoxes;
});
// 动态计算每个 box 的样式,包括大小调整
// const boxStyle = (index: number) => {
    
//   const offset = (index - currentIndex.value + totalBoxes) % totalBoxes;
// // const offset = dangqian;
// console.log(offset,'---offset');

//   let scale = 1;
    
//   if (offset === 0) {
//     scale = 1.2; // 正中间的图片放大
//   } else if (offset === 1 || offset === totalBoxes - 1) {
//     scale = 0.8; // 左右两侧的图片缩小
//   } else {
//     scale = 0.6; // 其他图片更小
//   }

//   return {
//     '--d': index.toString(),
//     transform: ` transform: rotateY(calc(var(--d) * 20deg)) translateZ(450px); scale(${scale})`,
//   };
// };

const boxStyle = (index: number) => {
  const offset = (index - currentIndex.value + totalBoxes) % totalBoxes;
  let scale = 1;

  if (offset === 0) {
    scale = 1.2; // 正中间的图片放大
  } else if (offset === 1 || offset === totalBoxes - 1) {
    scale = 1; // 左右两侧的图片缩小
  } else if(offset === 2 || offset === totalBoxes - 2) {
    scale = 0.6; // 其他图片更小
  } else {
    scale = 0.2; // 其他图片更小

  }

  return {
    '--d': index.toString(),
    transform: `rotateY(calc(var(--d) * 20deg)) translateZ(450px) scale(${scale})`,
    transition: 'transform 0.5s ease',
  };
};


onMounted(() => {
  // startInterval();
//   zhuan.value -= 20;
});

onUnmounted(() => {
  // clearInterval();
});
</script>

<style scoped lang="scss">
.content {
  width: 1800px;
  margin: 0px auto;
//   background-color: pink;
  position: relative;
  padding: 50px 0;
  display: flex;
  align-items: center;
}

.ccc {
  width: 1800px;
  height: 600px;
  background-color: #4fb3f6;
  margin: 0 auto;
  display:flex;
  align-items:center;
  justify-content: center
}

main {
  position: relative;
  width: 130px;
  height: 130px;
//   margin:  auto;
  perspective: 900px;
  background-color: rgb(242, 171, 232);
}

.haha {
  position: relative;
  width: 100%;
  height: 100%;
  transform-style: preserve-3d;
  transition: all 1s;
}

.but1,
.but2 {
  width: 50px;
  height: 50px;
  background-color: greenyellow;
}

.box {
  position: absolute;
  width: 100%;
  height: 100%;
  transform: rotateY(calc(var(--d) * 20deg)) translateZ(450px);
  background-color: #d0c2c2ac;
  display: flex;
  justify-content: center;
}

.boxs {
  width: 100px;
  height: 160px;
}
.img {
  width: 100%;
  height: 100%;
}
</style>

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

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

相关文章

垂直电商的兴衰与开源AI智能名片S2B2C商城系统的崛起:一场商业模式的革新

摘要&#xff1a;随着互联网技术的飞速发展&#xff0c;电子商务行业经历了从萌芽到繁荣再到精细化分化的历程。垂直电商作为电商领域的一个重要分支&#xff0c;曾因其聚焦细分市场、满足特定用户需求、产品标准化及快速整合供应链等优势&#xff0c;吸引了大量资本的关注。然…

Ubuntu上安装Redis的详细教程

1、安装redis 首先&#xff0c;访问Redis官网&#xff0c;点击首页的【Get Started】&#xff0c;然后点击Install Redis on Linux 安装 终端依次输入以下命令&#xff0c;如果过程中没有错误提示&#xff0c;则redis安装完成。 sudo apt install lsb-release curl gpg cu…

【前端】NodeJS:会话控制

文章目录 1 介绍2 cookie2.1 cookie是什么2.2 cookie的特点2.3 cookie的运行流程2.4 浏览器操作cookie2.5 cookie的代码操作 3 session3.1 session是什么3.2 session的作用3.3 session运行流程3.4 session的代码操作 4 session和cookie的区别5 token5.1 token是什么5.2 token的…

网络安全之xss靶场练习

目录 一、xss靶场练习 1、Ma Spaghet! 2、Jefff 第一个方法 第二个方法 3、Ugandan Knuckles 4、Ricardo Milos 5、Ah Thats Hawt 6、Ligma 7、Mafia​编辑 8、Ok, Boomer 一、xss靶场练习 靶场地址 https://xss.pwnfunction.com/ 页面显示如下 1、Ma Spaghet! 分析…

旧版Pycharm支持的python版本记录

版权声明&#xff1a;本文为博主原创文章&#xff0c;如需转载请贴上原博文链接&#xff1a;旧版Pycharm支持的python版本记录-CSDN博客 前言&#xff1a;近期由于打算研究GitHub上一个开源量化交易平台开发框架&#xff0c;但是该框架是基于python3.10的版本开发&#xff0c;所…

海康VisionMaster使用学习笔记5-开机自启动

开机自启动 在实际应用中&#xff0c;用户会希望机台上电开机后&#xff0c;软件能自启动避免现场人员误操作&#xff0c;减少机台重新上电时的操作步骤以提升效率。 设置 打开VM,点击设置,软件设置->开机自启动->勾选开机自启动->确定 默认运行界面 启动时以设定的…

MapReduce原理和操作

目录 一、MapReduce开发1. 数据处理的过程&#xff08;MapReduce&#xff09;2. 入门案例 二、MapReduce的高级特性1. 序列化2. 排序3. 分区4. Combiner——合并5. Shuffle——洗牌 一、MapReduce开发 1. 数据处理的过程&#xff08;MapReduce&#xff09; 注意 JobMapReduce&…

不同操作系统中如何搭建RabbitMQ开发环境?

大家好&#xff0c;我是袁庭新。今天介绍在不同操作系统中如何搭建RabbitMQ开发环境&#xff1f; 在使用RabbitMQ之前必须预先安装配置&#xff0c;参考RabbitMQ官网说明&#xff0c;RabbitMQ支持多平台安装&#xff0c;例如Linux、Windows、macOS、Docker等。不同架构的芯片对…

通过电影之镜,探索美的无限可能

通过电影之镜&#xff0c;探索美的无限可能&#xff1a;以《至爱梵高星空之谜》、《阳光灿烂的日子》与《这个杀手不太冷》为例 在光影交错的世界里&#xff0c;电影不仅是故事的讲述者&#xff0c;更是审美的引领者。三部风格迥异却同样引人入胜的电影——《至爱梵高星空之谜…

SSM学生社团管理系统—计算机毕业设计源码无偿分享20360

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 学生社团管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系…

海康VisionMaster使用学习笔记8-OKNG计数方案

OKNG计数方案 1. 添加图像源 2. 添加圆弧边缘缺陷检测 基本参数 自行绘制ROI,在图像上拖动小圆,圈住被测物 运行参数 边缘类型:选择最强边缘极性:由黑到白 缺陷距离阈值: 10 结果显示 为方便查看,文本显示内容设置为:检测结果:{} 光标移动到{}中间,选择模块状态 执行结果…

DeepSeek开源数学大模型,高中、大学定理证明新SOTA

DeepSeek-Prover-V1.5 通过结合强化学习和蒙特卡洛树搜索&#xff0c;显著提升了证明生成的效率和准确性。 AI 技术与数学发现的进展&#xff0c;正前所未有地交织在一起。 前段时间&#xff0c;著名数学家陶哲轩在牛津数学公开讲座中做了主题为「AI 在科学和数学中的潜力」的主…

利用modelscope下载模型

1. modelscope的简介 ModelScope作为一个先进的“模型即服务”(MaaS)平台&#xff0c;它的核心在于汇聚人工智能领域的尖端模型&#xff0c;降低了在现实世界应用这些前沿技术的门槛。该平台通过ModelScope库展现了其强大功能&#xff0c;这一库专为简化开发者体验而设计&…

CyberLink PowerDVD v23.0解锁版下载和安装教程 (专业蓝光影音播器)

前言 CyberLink PowerDVD 是一款全球专业蓝光影音播放软件&#xff0c;新版全新64位播放引擎&#xff0c;改进了8K超清视频播放、更高分辨率高清视频处理&#xff0c;同时4K视频后期处理还新增了色彩校正、对比度增强、HDR等。另外&#xff0c;新版支持HEIC/HEIF图像格式&…

【vue3动画】基于侦听器的动画

今天没事翻Vue3文档的时候看见一个不错的动画效果&#xff0c;做个记录&#xff0c;以后可能会用到 Vue3文档–基于侦听器的动画效果 //代码 import { ref, reactive, watch } from vue import gsap from gsap const number ref(0) const tweened reactive({number: 0 }) …

实验室、办公室管理系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设残哥 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目、 源…

利用亚马逊云科技Bedrock和LangChain开发AI驱动数据分析平台

项目简介&#xff1a; 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 本次介绍的是如何在亚马逊云科技上SageMak…

【Qt】QWidget的styleSheet属性

QWidget的styleSheet属性 通过CSS设置widget的样式。 样式具体描述了界面具体是什么样子的。 CSS (Cascading Style Sheets 层叠样式表) 在进行网页开发的时候&#xff0c;设置网页样式的方式。本⾝属于⽹⻚前端技术. 主要就是⽤来描述界⾯的样式。CSS已经发展多年&#xff0c…

10 个 C# 关键字和功能

在 Stack Overflow 调查中&#xff0c;C# 语言是排名第 5 位的编程语言。它广泛用于创建各种应用程序&#xff0c;范围从桌面到移动设备再到云原生。由于有如此多的语言关键字和功能&#xff0c;对于开发人员来说&#xff0c;要跟上新功能发布的最新信息将是一项艰巨的任务。本…

PYQT实现上传图片,保存图片

代码如下 from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * import sysclass MyWindow(QMainWindow):def __init__(self):super(MyWindow, self).__init__()self.setWindowTitle("图片处理")self.setGeometry(200, 200, 500, …