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

<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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mac 中安装内网穿透工具ngrok

ngrok 是什么&#xff1f; Ngrok 是一个网络工具&#xff0c;主要用于在网络中创建从公共互联网到私有或本地网络中运行的web服务的安全隧道。它充当了一个反向代理&#xff0c;允许外部用户通过公共可访问的URL访问位于防火墙或私有网络中的web应用程序或服务。Ngrok 特别适用…

Memcached深度解析:提升Web应用性能的内存缓存利器

一、引言 1. 介绍Web应用性能的重要性 在当今数字化时代&#xff0c;Web应用已成为企业与用户交互的主要渠道。用户对Web应用的期望越来越高&#xff0c;不仅要求功能丰富&#xff0c;还要求响应迅速、操作流畅。Web应用的性能直接影响到用户体验&#xff0c;进而关系到用户满…

Python Django功能强大的扩展库之channels使用详解

概要 随着实时 web 应用程序的兴起,传统的同步 web 框架已经无法满足高并发和实时通信的需求。Django Channels 是 Django 的一个扩展,旨在将 Django 从一个同步 HTTP 框架转变为一个支持 WebSockets、HTTP2 和其他协议的异步框架。它不仅能够处理传统的 HTTP 请求,还可以处…

mac清理软件哪个好用免费 MacBook电脑清理软件推荐 怎么清理mac

随着使用时间的增长&#xff0c;mac电脑会积累一些不必要的垃圾文件&#xff0c;这些文件会占用宝贵的存储空间&#xff0c;影响电脑的运行速度和稳定性。因此&#xff0c;定期清理mac电脑的垃圾文件是非常有必要的。市场上有许多优秀的Mac清理软件&#xff0c;包括一些出色的国…

MySQL零散拾遗(四)--- 使用聚合函数时需要注意的点点滴滴

聚合函数 聚合函数作用于一组数据&#xff0c;并对一组数据返回一个值。 常见的聚合函数&#xff1a;SUM()、MAX()、MIN()、AVG()、COUNT() 对COUNT()聚合函数的更深一层理解 COUNT函数的作用&#xff1a;计算指定字段在查询结果中出现的个数&#xff08;不包含NULL值&#…

《昇思25天学习打卡营第2天|张量》

张量其实就是矩阵&#xff0c;在python中主要是使用numpy这个库来操作&#xff0c;然后再mindspore中一般使用tensor对象作为张量的载体 张量如果维度只有二维的话可以简单理解为数据库中的表&#xff0c;但是如果是3维4维主要是在列表中增加列表项比如 【 【1&#xff0c;1】…

ROS2入门到精通—— 2-8 ROS2实战:机器人安全通过狭窄区域的方案

0 前言 室内机器人需要具备适应性和灵活性&#xff0c;以便在狭窄的空间中进行安全、高效的导航。本文提供一些让机器人在狭窄区域安全通过的思路&#xff0c;希望帮助读者根据实际开发适当调整和扩展 1 Voronoi图 Voronoi图&#xff1a;根据给定的一组“种子点”&#xff0…

嵌入式C++、ROS 、OpenCV、SLAM 算法和路径规划算法:自主导航的移动机器人流程设计(代码示例)

在当今科技迅速发展的背景下&#xff0c;嵌入式自主移动机器人以其广泛的应用前景和技术挑战吸引了越来越多的研究者和开发者。本文将详细介绍一个嵌入式自主移动机器人项目&#xff0c;涵盖其硬件与软件系统设计、代码实现及项目总结&#xff0c;并提供相关参考文献。 项目概…

手持式气象检测设备:便携科技,气象探测

一、手持式气象检测设备&#xff1a;小巧身躯&#xff0c;大能量 手持式气象检测设备&#xff0c;顾名思义&#xff0c;是一种可以手持操作的气象监测工具。它集成了温度、湿度、气压、风速风向等多种传感器&#xff0c;能够实时获取气象数据&#xff0c;并通过显示屏或手机APP…

实战解读:Llama Guard 3 Prompt Guard

前序研究&#xff1a;实战解读&#xff1a;Llama 3 安全性对抗分析 近日&#xff0c;腾讯朱雀实验室又针对 Llama 3.1 安全性做了进一步解读。 2024年7月23日晚&#xff0c;随着Llama3.1的发布&#xff0c;Meta正式提出了“Llama系统”的概念&#xff0c;通过系统级的安全组件对…

Sentinel限流规则详解

上一期教程讲解了 Sentinel 的快速入门&#xff1a;Sentinel快速入门&#xff0c;这一期主要讲述 Sentinel 的限流规则 簇点链路 簇点链路就是项目内的调用链路&#xff08;Controller -> Service -> Mapper&#xff09;&#xff0c;链路中被监控的每个接口就是一个资源…

Nginx 如何处理 WebSocket 连接?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 Nginx 如何处理 WebSocket 连接&#xff1f;一、WebSocket 连接简介二、Nginx 处理 WebSocket 连接的基本原理三、配置 Nginx 支持 WebSocket 连接四、Nginx 中的…

苍穹外卖(一)之环境搭建篇

Ngnix启动一闪而退 启动之前需要确保ngnix.exe的目录中没有中文字体&#xff0c;在conf目录下的nginx.conf文件查看ngnix的端口号&#xff0c;一般默认为80&#xff0c;若80端口被占用就会出现闪退现象。我们可以通过logs/error.log查看错误信息&#xff0c;错误信息如下&…

边界网关IPSEC VPN实验

拓扑&#xff1a; 实验要求&#xff1a;通过IPSEC VPN能够使PC2通过网络访问PC3 将整个路线分为三段 IPSEC配置在FW1和FW2上&#xff0c;在FW1与FW2之间建立隧道&#xff0c;能够传递IKE&#xff08;UDP500&#xff09;和ESP数据包&#xff0c;然后在FW1与PC2之间能够流通数据…

Linux网络:传输层协议TCP(二)三次挥手四次握手详解

目录 一、TCP的连接管理机制 1.1三次握手 1.2四次挥手 二、理解 TIME_WAIT 状态 2.1解决TIME_WAIT 状态引起的 bind 失败的方法 三、理解CLOSE_WAIT状态 一、TCP的连接管理机制 在正常情况下, TCP 要经过三次握手建立连接, 四次挥手断开连接 1.1三次握手 三次握手顾名思…

基于微信小程序+SpringBoot+Vue的资料分享系统(带1w+文档)

基于微信小程序SpringBootVue的资料分享系统(带1w文档) 基于微信小程序SpringBootVue的资料分享系统(带1w文档) 校园资料分享微信小程序可以实现论坛管理&#xff0c;教师管理&#xff0c;公告信息管理&#xff0c;文件信息管理&#xff0c;文件收藏管理等功能。该系统采用了Sp…

LINUX 孤儿进程和僵尸进程

1、孤儿进 一个父进程退出&#xff0c;而它的一个或多个子进程还在运行&#xff0c;那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养&#xff0c;并由init进程对它们完成状态收集工作 为了释放子进程的占用的系统资源&#xff1a; 进程结束之后&#xf…

pyenv-win | python版本管理,无需卸载当前版本

系统&#xff1a;windows&#xff0c;且已安装git。 使用 pyenv-win 在Windows中管理多个python版本&#xff0c;而无需卸载当前版本。安装步骤如下&#xff1a; 安装 pyenv-win 1. 安装 Git 和 pyenv-win: git clone https://github.com/pyenv-win/pyenv-win.git %USERPRO…

ControlNet on Stable Diffusion

ControlNet on Stable Diffusion 笔记来源&#xff1a; 1.Adding Conditional Control to Text-to-Image Diffusion Models 2.How to Use OpenPose & ControlNet in Stable Diffusion 3.ControlNet与DreamBooth&#xff1a;生成模型的精细控制与主体保持 4.Introduction t…

Git(分布式版本控制系统)(fourteen day)

一、分布式版本控制系统 1、Git概述 Git是一种分布式版本控制系统&#xff0c;用于跟踪和管理代码的变更&#xff0c;它由Linux、torvalds创建的&#xff0c;最初被设计用于Linux内核的开发。Git允许开发人员跟踪和管理代码的版本&#xff0c;并且可以在不同的开发人员之间进行…