首页 > 其他分享 >3D Carousel(3D轮播)

3D Carousel(3D轮播)

时间:2024-10-12 10:18:42浏览次数:10  
标签:style 轮播 3D carousel let Carousel deg 图片

3D Carousel JavaScript 逻辑步骤归纳

3D轮播图展示,动态添加图片,设置旋转动画,通过JavaScript和CSS3实现图片轮播效果。

初始化图片列表

  • 定义一个数组 imgList,其中包含所有图片的 URL。
    let imgList = [];

计算每张图片的旋转角度

  • 通过 let deg = 360 / imgList.length; 计算每张图片在 360
    度圆周上应旋转的角度。这个角度将用于后续设置每个 .carousel-item 的初始 3D 变换和动画关键帧。
    let deg = 360 / imgList.length;

获取轮播图的 DOM 元素

  • 使用 document.getElementsByClassName(“carousel”)[0]; 获取轮播图的 DOM元素,并将其存储在变量 carouselDom 中。
    let carouselDom = document.getElementsByClassName("carousel")[0];

隐藏轮播图容器

  • 在添加图片之前,通过 carouselDom.style.display = “none”;隐藏轮播图容器,以避免在图片加载时出现闪烁或布局混乱、减少页面重排次数。
carouselDom.style.display = "none";

遍历图片列表并创建图片元素

  • 使用 imgList.forEach((i, index) => { … }); 遍历图片列表。
  • 在每次迭代中,创建一个 img元素,并设置其 class 为 carousel-item 和 src 为当前图片的 URL。
  • 将创建的 img 元素添加到轮播图的DOM 元素 carouselDom 中。
  imgList.forEach((i, index) => {
        let img = document.createElement("img");
        img.setAttribute("class", `carousel-item`); // 设置类名
        img.setAttribute("src", i); // 设置图片源
        carouselDom.appendChild(img); // 将图片添加到轮播图中
    });

显示轮播图容器

  • 在所有图片元素都被添加到轮播图后,通过 carouselDom.style.display = “flex”; 显示轮播图容器。
carouselDom.style.display = "flex";

定义并添加关键帧动画

  • 调用 addKeyframeAnimation(imgList.length, deg); 函数,传入图片数量和每张图片的旋转角度。
  • 在 addKeyframeAnimation 函数内部
    • 创建一个 style 元素,并设置其 type 为 text/css。
    • 计算每个关键帧的百分比 quotient,即 100 / length。
    • 初始化一个空字符串 keyframeCSS,用于存储生成的 CSS。
    • 遍历图片数量,为每个 .carousel-item 设置初始的 3D 变换,即 transform: rotateY(${(i - 1) * deg}deg) translateZ(150px);。
    • 定义关键帧动画 rotateCarousel,并在每个百分比点上设置轮播图的旋转角度,即 transform: rotateY(${deg * i}deg) rotateX(0deg);。
    • 将生成的 CSS 添加到 style元素中,然后将 style 元素添加到文档的 head 中。
    // 定义函数,用于创建并添加包含关键帧动画的<style>元素
    function addKeyframeAnimation(length, deg) {
        const style = document.createElement('style'); // 创建一个<style>元素
        style.type = 'text/css'; // 设置样式表类型
        const quotient = 100 / length; // 计算每个关键帧的百分比
        let keyframeCSS = ``; // 初始化CSS字符串
        // 为每个.carousel-item元素设置初始的3D变换
        for (let i = 1; i <= length; i++) {
            keyframeCSS += `
                .carousel-item:nth-child(${i}) {
                    transform: rotateY(${(i - 1) * deg}deg) translateZ(150px);
                }
            `;
        }

        // 定义关键帧动画rotateCarousel
        keyframeCSS += `
            @keyframes rotateCarousel {
        `;
        for (let i = 0; i <= length; i++) {
            // 为每个百分比点设置轮播图的旋转角度
            keyframeCSS += `
                ${(i * quotient).toFixed(2)}% {
                    transform: rotateY(${deg * i}deg) rotateX(0deg);
                }
            `;
        }
        keyframeCSS += `}`;

        // 将CSS添加到<style>元素中
        if (style.styleSheet) {
            // 对于IE浏览器
            style.styleSheet.cssText = keyframeCSS;
        } else {
            // 对于其他浏览器
            style.appendChild(document.createTextNode(keyframeCSS));
        }

        // 将<style>元素添加到文档的<head>中
        document.head.appendChild(style);
    }

完成

  • 此时,3D 轮播图已经成功创建,并应用了无限循环的动画效果。用户将看到一个不断旋转的 3D 图片轮播。
最后源码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"> <!-- 设置文档的字符编码为UTF-8 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- 使页面在移动设备上具有适当的视口和缩放 -->
    <title>3D Carousel</title> <!-- 页面标题 -->
    <style>
        body {
            margin: 0;
            padding: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh; /* 使内容垂直居中,并设置高度为视口高度 */
            background-color: #f0f0f0; /* 背景颜色 */
            overflow: hidden; /* 隐藏滚动条,防止页面滚动 */
        }

        .carousel-container {
            perspective: 1000px; /* 设置3D视角距离 */
            width: 300px;
            height: 300px;
            border-radius: 10px; /* 圆角边框 */
            position: relative; /* 相对定位,为子元素提供绝对定位的参考 */
            transform-style: preserve-3d; /* 保持子元素的3D变换 */
        }

        .carousel {
            width: 100%;
            height: 100%;
            display: flex;
            justify-content: center;
            align-items: center;
            transform-style: preserve-3d; /* 保持3D变换 */
            transform: rotateY(0deg) rotateX(0deg); /* 初始旋转角度 */
            transition: transform 0.2s ease-out; /* 平滑过渡效果 */
            animation: rotateCarousel 10s infinite; /* 应用无限循环的动画 */
        }

        .carousel-item {
            width: 100px;
            height: 100px;
            background-color: #3498db; /* 默认背景颜色 */
            color: white; /* 文本颜色 */
            display: flex;
            justify-content: center;
            align-items: center;
            border-radius: 10px; /* 圆角边框 */
            margin: 0 20px; /* 调整边距以适应六个项目的布局 */
            position: absolute; /* 绝对定位 */
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); /* 阴影效果 */
            pointer-events: none; /* 禁止鼠标事件 */
        }
    </style>
</head>
<body>
<div class="carousel-container"> <!-- 3D轮播图的容器 -->
    <div class="carousel"> <!-- 轮播图的核心元素,包含所有的图片 -->
    </div>
</div>
<script>
    // 定义函数,用于创建并添加包含关键帧动画的<style>元素
    function addKeyframeAnimation(length, deg) {
        const style = document.createElement('style'); // 创建一个<style>元素
        style.type = 'text/css'; // 设置样式表类型
        const quotient = 100 / length; // 计算每个关键帧的百分比
        let keyframeCSS = ``; // 初始化CSS字符串
        // 为每个.carousel-item元素设置初始的3D变换
        for (let i = 1; i <= length; i++) {
            keyframeCSS += `
                .carousel-item:nth-child(${i}) {
                    transform: rotateY(${(i - 1) * deg}deg) translateZ(150px);
                }
            `;
        }

        // 定义关键帧动画rotateCarousel
        keyframeCSS += `
            @keyframes rotateCarousel {
        `;
        for (let i = 0; i <= length; i++) {
            // 为每个百分比点设置轮播图的旋转角度
            keyframeCSS += `
                ${(i * quotient).toFixed(2)}% {
                    transform: rotateY(${deg * i}deg) rotateX(0deg);
                }
            `;
        }
        keyframeCSS += `}`;

        // 将CSS添加到<style>元素中
        if (style.styleSheet) {
            // 对于IE浏览器
            style.styleSheet.cssText = keyframeCSS;
        } else {
            // 对于其他浏览器
            style.appendChild(document.createTextNode(keyframeCSS));
        }

        // 将<style>元素添加到文档的<head>中
        document.head.appendChild(style);
    }

    // 图片列表(注意:这里的URL是不完整的,应补充完整的URL)
    let imgList = [
        "https://aaa.com/it/u=2961459243,2146986594&fm=193&f=GIF", // 示例图片URL(需补全)
        // 其他图片的URL(需补全)...
    ];

    // 计算每个图片应旋转的角度(360度除以图片数量)
    let deg = 360 / imgList.length;

    // 获取轮播图的DOM元素
    let carouselDom = document.getElementsByClassName("carousel")[0];

    // 隐藏轮播图容器,以便在添加图片后显示
    carouselDom.style.display = "none";

    // 遍历图片列表,为每个图片创建一个<img>元素,并添加到轮播图中
    imgList.forEach((i, index) => {
        let img = document.createElement("img");
        img.setAttribute("class", `carousel-item`); // 设置类名
        img.setAttribute("src", i); // 设置图片源
        carouselDom.appendChild(img); // 将图片添加到轮播图中
    });

    // 显示轮播图容器
    carouselDom.style.display = "flex";

    // 调用函数添加关键帧动画
    addKeyframeAnimation(imgList.length, deg);

</script>
</body>
</html>

标签:style,轮播,3D,carousel,let,Carousel,deg,图片
From: https://blog.csdn.net/2201_75491699/article/details/142773028

相关文章

  • AI预测福彩3D采取888=3策略+和值012路或胆码测试10月11日新模型预测第107弹
            经过100多期的测试,当然有很多彩友也一直在观察我每天发的预测结果,得到了一个非常有价值的信息,那就是9码定位的命中率非常高,100多期一共只错了12次,这给喜欢打私房菜的朋友提供了极高价值的预测结果~当然了,大部分菜友还是走的正常渠道,因此,得想办法进行缩水,尽可能......
  • 3dmax简体中文版百度云资源下载(附教程)
    如大家所熟悉的,3dmax是一款基于PC系统的三维动画渲染和制作软件。其广泛应用于广告、影视、工业设计、建筑设计、三维动画、多媒体制作、游戏、以及工程可视化等领域。3dsmax自用安装包、教程自用:https://pan.baidu.com/s/1D52GYEVeTN-ffCXsd4oK9Q?pwd=15133dmax学习方法......
  • Unity实现3D模型子物体伸出折线并显示各自名称的功能
    一、灵感    在unity项目中我们经常会遇到很多介绍产品的场景需求,所以咱干脆写一个脚本来简单介绍把!话不多说,直接开干!二、场景搭建1、搭建一个简单的场景,创建一个cube作为最大的父物体,接着再创建一个球和一个圆柱作为cube的子物体。具体场景结构如下图:三、实现......
  • SketchUp Pro 2024 for Mac 3D建模 草图设计大师软件安装【保姆级教程,简单小白轻松上
    Mac分享吧文章目录SketchUpPro3D建模草图设计大师软件安装完成,软件打开效果一、Mac中安装SketchUpPro3D建模草图设计大师软件——v241️⃣:下载软件2️⃣:安装软件,将安装包从左侧拖入右侧文件夹中3️⃣:应用程序,打开安装的应用软件文件夹,运行SketchUp.app4️⃣:任选示例模型,......
  • 比CesiumLab还好用的工具:免费的倾斜摄影OSGB/3Dtiles编辑转换发布平台
    GIS数据处理工具在现代技术与应用中扮演着至关重要的角色,它们不仅是连接原始地理信息与可分析、可视化数据的桥梁,更是推动地理信息系统(GIS)在各个行业领域深入发展与应用不可或缺的关键工具。选择一款合适的工具直接关系到数据处理、分析和展示的效率和精度,本文将对比GISBox、Ce......
  • 大贤3D家谱-保存、删除与重建
    保存:对于创建的节点、内容进行本地存储。重建:清除没有保存的数据,重现保存过的历史节点。删除:删除包括该节点的所有子节点信息。灵活的使用模式​为了保证软件的持续健康发展,我们采用了试用+付费的模式。用户可以先免费体验大贤3D家谱2025的基本功能,感受其强大的家谱构建和......
  • SIGGRAPH Asia 2024 | 网易伏羲研究成果入选,3D面部动画技术再获新突破
    近日,国际计算机图形与交互技术顶会SIGGRAPHAsia2024公布论文接收结果:网易伏羲最新研究成果《FreeAvatar:Robust3DFacialAnimationTransferbyLearninganExpressionFoundationModel》成功入选。今年12月,SIGGRAPHAsia2024大会将在日本东京举行,届时网易伏羲实验室视觉......
  • 汽车3d动效的作用!云渲染实现3d动效
    在汽车营销领域,3D动效技术以其独特的视觉冲击力和交互体验,正成为吸引消费者注意力的新利器。而云渲染技术的应用,更是让这些动效如虎添翼,实现了高效、低成本的3D视觉内容制作与分享。本文将探讨汽车3D动效的作用,并分析云渲染如何助力实现这些令人惊叹的视觉效果。一、汽车3d动效......
  • 怎么修复d3dx9_40.dll缺失?运行程序时d3dx9_40.dll缺失问题的原因与解决方案
    当您在运行某些程序或游戏时,可能会遇到“d3dx9_40.dll缺失”的错误提示。这一错误通常表明DirectX9.0c组件中的d3dx9_40.dll文件未能正确安装或已被损坏。以下是对该问题的深入剖析及一系列解决方案:一、问题成因DirectX安装不完整:若DirectX9.0c的安装过程存在问题,可能会导......
  • 锐龙7 7800X3D与i7-14700K到底怎么选!其实很简单
    从2022年的锐龙75800X3D到后来的锐龙77800X3D,笔者使用X3D处理器已有2年多的时间。站在自己的立场,我是非常希望游戏老鸟购买这类处理器的,并且也推荐了不少。这里说的是老鸟,也就是比较懂电脑的玩家。但是对于新手玩家而言,3099元的i7-14700K和2999元的锐龙77800X3D摆在面前,该如......