3D渐变的轮播图效果,有点儿意思!

news2024/11/15 13:33:25

阅读原文:原文地址

一、前言

在Web开发中,轮播图(Carousel)是一种非常常见的功能,用于展示图片或内容,通过自动或手动的方式切换不同的视图,在网页设计中扮演着重要的角色。

吸引注意力:轮播图通常位于页面的显眼位置,如首页的顶部或中心区域,能够立即吸引访问者的注意力。通过展示精美、引人注目的图片或视频,轮播图能够激发访问者的兴趣,促使他们进一步探索网站的内容。

展示重要信息:轮播图是一种高效展示重要信息或促销活动的方式。商家可以在轮播图中展示最新的产品、优惠活动、重要公告等,以吸引潜在客户的注意并促进销售。

增加互动性:一些轮播图设计会包含导航按钮(如前后翻页按钮)或指示器(如小圆点),允许用户手动切换图片。这种交互性设计能够提升用户体验,让用户更加主动地参与到内容浏览中来。

节省空间:在有限的网页空间内,轮播图提供了一种有效的方式来展示多个内容项。通过自动或手动切换,轮播图能够在不占用过多页面空间的情况下,展示更多的图片或信息。

提升网站美观度:轮播图通常采用高质量的图片和动画效果,能够提升网站的整体美观度和视觉吸引力。一个设计精良的轮播图不仅可以吸引访问者的眼球,还能增加网站的专业感和可信度。

引导用户行为:轮播图有时也用作引导用户行为的工具。例如,在电商网站的轮播图中,可以放置“立即购买”、“了解更多”等按钮,直接引导用户进行购买或查看更多信息。

3D轮播图是一种通过添加3D变换效果使轮播图呈现出立体感的展示方式。它通过在轮播过程中,对图片的旋转、缩放、移动等动画效果的处理,使得图片在视觉上产生深度感,给用户一种身临其境的视觉体验。

CSS3中的transform、perspective、animation等属性是实现3D轮播图的重要工具。transform属性用于对元素进行旋转、缩放、移动或倾斜,而perspective属性则用于设置观察者与屏幕之间的距离,从而创建出3D效果。

二、实现过程及分析

2.1 基础布局代码

<!DOCTYPE html>
<html>
  <head>
      <meta charset="utf-8">
      <title>c.html</title>
      <style type="text/css">
          .carousel {
              width: 100%;
              position: relative;
              height: 400px;
              overflow: hidden;
              margin-top: 2em;
          }
          .carousel-list {
              width: 100%;
              height: 100%;
              position: relative;
              perspective: 1000px;
          }
          .carousel-item {
              width: 600px;
              height: 100%;
              position: absolute;
              user-select: none;
              transition: 0.4s;
              left: 50%;
              top: 0;
              margin-left: -300px;
          }
          .arrow {
              position: absolute;
              top: 50%;
              margin-top: -50px;
          }
          .arrow img {
              width: 100px;
          }
          .prev {
              left: 30px;
          }
          .next {
              right: 30px;
          }
      </style>
  </head>
  <body>
      <div class="carousel">
          <div class="carousel-list">
              <img class="carousel-item" src="./img/carousel-1.jpeg" alt="" />
              <img class="carousel-item" src="./img/carousel-2.jpeg" alt="" />
              <img class="carousel-item" src="./img/carousel-3.jpeg" alt="" />
              <img class="carousel-item" src="./img/carousel-4.jpeg" alt="" />
              <img class="carousel-item" src="./img/carousel-5.jpeg" alt="" />
              <img class="carousel-item" src="./img/carousel-6.jpeg" alt="" />
              <img class="carousel-item" src="./img/carousel-7.jpeg" alt="" />
          </div>
          <div class="prev arrow">
              <img src="./img/arrow-left.png" alt="" />
          </div>
          <div class="next arrow">
              <img src="./img/arrow.png" alt="" />
          </div>
      </div>
  </body>
</html>

2.2 左右切换事件

获取所有的轮播图元素,声明index变量记录当前是第几张轮播图索引,在获取向左和向右的按钮,并注册事件。

// 获取所有的轮播元素
const items = document.querySelectorAll('.carousel-item');
// 当前显示的第几张轮播图
let index = 0;

function layout() {}

layout();

const prev = document.querySelector('.prev');
const next = document.querySelector('.next');
// 向左
prev.addEventListener('click', () => {
    index --;
    if(index < 0) {
        index = 0;
    }
    layout();
})
// 向右
next.addEventListener('click', () => {
    index ++;
    if(index > items.length - 1) {
        index = items.length - 1;
    }
    layout();
})
// 点击图片切换
items.forEach((item, i) => {
    item.addEventListener('click', () => {
        index = i;
        layout()
    })
})

2.3 实现layout函数

const items = document.querySelectorAll('.carousel-item');
// 当前显示的第几张轮播图
let index = 3;

function layout() {
    // 图片之间的间隔
    const xOffsetStep = 100;
    // 两张轮播图之间的递减缩放倍率
    const scaleStep = 0.6;
    // 两张轮播图之间的透明度递减倍率
    const opacityStep = 0.5;
    for (let i = 0; i < items.length; i++) {
        const item = items[i];
        // 计算每张图片i距离当前图片index之间间隔几张
        const dis = Math.abs(i - index);
        // 返回1,-1,0,-0,当做一个正负号
        const sign = Math.sign(i - index);
        
        let xOffset = (i - index) * xOffsetStep;
        // 每张图片的初始偏移量,解决初始偏移距离太小的问题
        if (i !== index) {
            // sign为正数,右边的每张图片加上100的偏移量;
            // sign为负数,左边的每张图片减去100的偏移量。
            xOffset = xOffset + 100 * sign;
        }
        // 每张图片缩放倍数
        const scale = scaleStep ** dis;
        // 如果是当前的不旋转,否则左边旋转45度,右边旋转-45度
        const rotateY = i === index ? 0 : 45 * -sign;
        item.style.transform = `translateX(${xOffset}px) scale(${scale}) rotateY(${rotateY}deg)`;
        // scale同理,每张图片的透明度,越远透明度越小
        const opacity = opacityStep ** dis;
        item.style.opacity = opacity;
        // 设置每张图片的层级,距离当前index越远的,层级越低
        const zIndex = items.length - dis;
        item.style.zIndex = zIndex;
    }
}
  

解析1:

let xOffset = (i - index) * xOffsetStep;
在这里插入图片描述

解析2:

const dis = Math.abs(i - index);

const zIndex = items.length - dis;
item.style.zIndex = zIndex;
图片

解析3:

const dis = Math.abs(i - index);
// 每张图片缩放倍数
const scale = scaleStep ** dis;
图片

效果如下:图片

三、完整代码

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>3D渐变的轮播图效果</title>
        <style type="text/css">
            .carousel {
                width: 100%;
                position: relative;
                height: 400px;
                overflow: hidden;
                margin-top: 2em;
            }

            .carousel-list {
                width: 100%;
                height: 100%;
                position: relative;
                perspective: 1000px;
            }

            .carousel-item {
                width: 600px;
                height: 100%;
                position: absolute;
                user-select: none;
                transition: 0.4s;
                left: 50%;
                top: 0;
                margin-left: -300px;
            }

            .arrow {
                position: absolute;
                top: 50%;
                margin-top: -50px;
            }

            .arrow img {
                width: 60px;
            }

            .prev {
                left: 30px;
            }

            .next {
                right: 30px;
            }
        </style>
    </head>
    <body>
        <div class="carousel">
            <div class="carousel-list">
                <img class="carousel-item" src="./img/carousel-1.jpeg" alt="" />
                <img class="carousel-item" src="./img/carousel-2.jpeg" alt="" />
                <img class="carousel-item" src="./img/carousel-3.jpeg" alt="" />
                <img class="carousel-item" src="./img/carousel-4.jpeg" alt="" />
                <img class="carousel-item" src="./img/carousel-5.jpeg" alt="" />
                <img class="carousel-item" src="./img/carousel-6.jpeg" alt="" />
                <img class="carousel-item" src="./img/carousel-7.jpeg" alt="" />
            </div>
            <div class="prev arrow">
                <img src="./img/arrow-left.png" alt="" />
            </div>
            <div class="next arrow">
                <img src="./img/arrow.png" alt="" />
            </div>
        </div>
    </body>
    <script>
        const items = document.querySelectorAll('.carousel-item');
        // 当前显示的第几张轮播图
        let index = 3;

        function layout() {
            // 图片之间的间隔
            const xOffsetStep = 100;
            // 两张轮播图之间的递减缩放倍率
            const scaleStep = 0.6;
            // 两张轮播图之间的透明度递减倍率
            const opacityStep = 0.5;
            for (let i = 0; i < items.length; i++) {
                const item = items[i];
                // 计算每张图片i距离当前图片index之间间隔几张
                const dis = Math.abs(i - index);
                // 返回1,-1,0,-0,当做一个正负号
                const sign = Math.sign(i - index);

                let xOffset = (i - index) * xOffsetStep;
                // 每张图片的初始偏移量,解决初始偏移距离太小的问题
                if (i !== index) {
                    // sign为正数,右边的每张图片加上100的偏移量;
                    // sign为负数,左边的每张图片减去100的偏移量。
                    xOffset = xOffset + 100 * sign;
                }
                // 每张图片缩放倍数
                const scale = scaleStep ** dis;
                // 如果是当前的不旋转,否则左边旋转45度,右边旋转-45度
                const rotateY = i === index ? 0 : 45 * -sign;
                item.style.transform = `translateX(${xOffset}px) scale(${scale}) rotateY(${rotateY}deg)`;
                // scale同理,每张图片的透明度,越远透明度越小
                const opacity = opacityStep ** dis;
                item.style.opacity = opacity;
                // 设置每张图片的层级,距离当前index越远的,层级越低
                const zIndex = items.length - dis;
                item.style.zIndex = zIndex;
            }
        }

        layout();

        const prev = document.querySelector('.prev');
        const next = document.querySelector('.next');

        prev.addEventListener('click', () => {
            index--;
            if (index < 0) {
                index = 0;
            }
            layout();
        })
        next.addEventListener('click', () => {
            index++;
            if (index > items.length - 1) {
                index = items.length - 1;
            }
            layout();
        })

        // 点击图片切换
        items.forEach((item, i) => {
            item.addEventListener('click', () => {
                index = i;
                layout()
            })
        })
    </script>
</html>

四、总结

3D轮播图效果就是利用CSS3中transform属性用于对元素进行旋转、缩放、移动或倾斜,而perspective属性则用于设置观察者与屏幕之间的距离,从而创建出3D效果。

优点:

提升用户体验:3D立体轮播效果可以给用户带来沉浸式的视觉体验,增强轮播图的吸引力,提升用户对内容的关注度。

增加页面互动性:通过添加3D旋转、缩放等效果,使轮播图具有更多的动态感,增加页面的互动性和趣味性。

增强品牌形象:采用3D立体轮播效果展示产品或品牌相关的图片可以更好地突出产品特点和品牌形象,提高用户对品牌的认知和记忆度。

缺点:

在实现3D轮播图时,需要注意兼容性问题。虽然现代浏览器大多支持CSS3的3D变换效果,但仍需考虑旧版浏览器的兼容情况。

3D轮播图的动画效果可能会增加页面的加载时间和资源消耗,因此需要合理控制动画的复杂度和数量,以确保页面的流畅性和性能。

阅读原文:原文地址

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

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

相关文章

用Python给英语单词批量划分音节

一、问题的缘起 最近&#xff0c;有网友在我的视频下面留言&#xff0c;问我可否把英语单词进行音节的划分&#xff1f;我以前也有同样的想法&#xff0c;但是始终没有得到解决。但是&#xff0c;我想使用python&#xff0c;学习英语的人都很多&#xff0c;说不定有人已经编写…

微信左滑删除聊天记录怎么恢复?记录找回秘籍,第一种更有效!

在日常的指尖滑动间&#xff0c;微信成为了我们生活中不可或缺的一部分&#xff0c;记录着与朋友、家人的温馨对话&#xff0c;以及工作中的重要信息。然而&#xff0c;当不小心的向左滑动&#xff0c;珍贵的聊天记录就会悄然消失。那么&#xff0c;微信左滑删除聊天记录怎么恢…

给儿童掏耳朵用什么工具好?2024四款精品合集汇总

在为儿童掏耳朵时&#xff0c;选择合适的工具非常重要。普通的金属挖耳勺太过坚硬&#xff0c;容易弄伤儿童脆弱的耳道&#xff0c;并不适合。柔软的小棉签虽然相对安全一些&#xff0c;但也只能清理外耳道比较浅处的耳垢&#xff0c;而且若使用不当同样存在风险。 相比之下&am…

大数据驱动的数字化营销策略,开启营销新征程

​在当今这个数字化时代&#xff0c;大数据正以崭新的大力量重塑着企业的营销策略。今天&#xff0c;就让我们一同深入探讨大数据驱动的数字化营销策略究竟有着怎样的魅力。用蚓链获数据资产&#xff0c;享大数据福利&#xff01; 大数据&#xff0c;精准定位目标客户的神器。…

【FPGA】HDMI参数信息汇总

文章列举已知大部分个人电脑屏幕尺寸信息&#xff0c;主要包括720p 1080p 2k 1440p 4k 5k以及8k屏幕。屏幕水平一行包括同步脉冲、后沿间隔、活跃像素、前沿间隔&#xff1b;屏幕垂直包括同步脉冲、后沿间隔、活跃行数、前沿间隔。 1. 720p (1280x720) 水平总像素 (HSYNC): 16…

element-plus 新增一行合计。除了用summary-method还可以用append的插槽

:summary-method"getSummaries" <el-table:data"reformtableData"style"width: 100%"show-summary:summary-method"getSummaries"ref"reformtableRef" > <el-table-column label"序号" type"index…

ArcGIS中怎么批量计算多个点到线最近距离,以及这些点到线的纬度差?

最近&#xff0c;我接到了一个关于批量计算多个点到线最近距离&#xff0c;以及这些点到线的纬度差的咨询。 下面是我对这个问题的解决思路&#xff1a; 先解决的如何计算是纬度差的问题&#xff0c;因为纬度差直接在地理坐标系下计算即可。 1,第一步对线要素转折点 2.接着在…

AI赚钱秘籍:如何利用大模型在2024年轻松月入过万?

随着人工智能技术的飞速发展&#xff0c;大模型已成为推动行业革新的重要力量。2024年&#xff0c;利用大模型技术月入过万已不再是遥不可及的梦想。本文将揭示AI赚钱的秘籍&#xff0c;帮助您在新的一年里通过大模型技术轻松实现月入过万的目标。 一、大模型技术概述 大模型技…

录屏怎么把声音录进去?三个方法让你告别无声录屏!

在数字化交流日益频繁的今天&#xff0c;录屏已经成为我们工作、学习及娱乐中不可或缺的一部分。然而&#xff0c;许多人在录屏时常常发现&#xff0c;尽管画面清晰&#xff0c;但声音却未能同步录制&#xff0c;这极大地影响了视频的完整性和观赏性。别担心&#xff0c;今天我…

超易企业管理系统 ajax/Login.ashx SQL注入致RCE漏洞复现

0x01 产品简介 超易软件作为一家专业从事企业管理软件的高新技术企业,其核心产品超易企业管理系统覆盖了企业日常运营的多个方面,包括进销存管理、仓库管理、销售管理、固定资产管理、人事管理等多个模块。这些模块相互关联,共同构成了一个全面的企业管理解决方案。 0x02 …

示波器输出的csv文件如何转换为频谱图及其excel表格(频率与幅值)

示波器输出的CSV文件通常包含的是采样的时域信号数据&#xff0c;而不是直接的频率和幅度信息。这个文件一般包括时间&#xff08;Time&#xff09;和电压&#xff08;Voltage&#xff09;两列&#xff0c;记录了电压随时间变化的情况。 要从这些时域数据中得到频率和幅度的变…

chapter08-面向对象编程(super)day09

目录 298-super基本语法 299-super使用细节1 300-super使用细节2 301-super使用细节3 298-super基本语法 1、可以访问父类的属性&#xff0c;但是不能访问父类的private属性 2、可以访问父类的方法&#xff0c;但不能访问父类的private方法 3、访问父类的构造器&#xff1a;…

并联去耦电容的反谐振

1 串联谐振与并联谐振 并联谐振是一种电流谐振现象&#xff0c;其中电容器&#xff08;C&#xff09;和电感器&#xff08;L&#xff09;上的电流相互交换&#xff0c;形成谐振状态。在谐振时&#xff0c;电容器和电感器上的电流对外交换为零&#xff0c;电路呈现开路状态&…

文献阅读:Pathway Ensemble Tool癌症途径和治疗法的无偏发现

介绍 正确地识别生物途径的扰动是揭示基本疾病机制和发展急需的治疗策略的关键步骤。然而&#xff0c;目前的工具是否最优化用于无偏发现相关途径仍然不清楚。在这里&#xff0c;我们创建了“基准测试”&#xff08;Benchmark&#xff09;来严格评估现有工具&#xff0c;并发现…

如何禁止编辑PDF文件?推荐两种方法!

在日常工作中&#xff0c;我们经常会遇到需要分享重要的PDF文件的情况&#xff0c;但又希望文件内容不被随意更改。为此&#xff0c;设置PDF文件的修改限制是一个非常有效的措施。今天分享两种常见的禁止修改PDF的方法&#xff0c;一起来看看如何设置。 方法一&#xff1a;使用…

每日Attention学习15——Cross-Model Grafting Module

模块出处 [CVPR 22] [link] [code] Pyramid Grafting Network for One-Stage High Resolution Saliency Detection 模块名称 Cross-Model Grafting Module (CMGM) 模块作用 Transformer与CNN之间的特征融合 模块结构 模块思想 Transformer在全局特征上更优&#xff0c;CNN在…

探索OpenCV:图像处理基础与实践

探索OpenCV&#xff1a;图像处理基础与实践 前言图像读取基础安装OpenCV库读取彩色与灰度图像 RGB颜色模型颜色通道解析单通道图像显示 感兴趣区域&#xff08;ROI&#xff09;图像处理进阶技巧图像打码图像组合图像缩放 结语 前言 在当今数字化时代&#xff0c;图像不仅是我们…

Grok-2 mini 性能翻倍,xAI开发团队获马斯克赞赏

硅纪元快讯栏目&#xff0c;每日追踪AI领域的最新动态&#xff0c;快速汇总最新科技新闻&#xff0c;助您时刻紧跟行业趋势。简明扼要的呈现资讯概要&#xff0c;让您快速了解前沿资讯。 1分钟速览新闻 《大都会》预告片风波&#xff1a;AI生成虚假影评人引言 微软图形学专家童…

【hot100篇-python刷题记录】【搜索二维矩阵】

R6-二分查找篇 印象题&#xff0c;直接把它转成一维来处理。 class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:nums[i for row in matrix for i in row]def binfind(the,target):low,high0,len(the)-1while low<high:mid(lowhigh…

htb-Beginner Track(轨道)详解

0x01 Lame nmap -sTCV -Pn 10.10.10.3 21端口 开启了ftp服务器&#xff0c;简单来说ftp就是一个供用户上传下载文件的一个文件存储器&#xff0c;通过ftp协议访问。 同时也开启了smb共享&#xff0c;nmap会自动去扫描是否存在游客登陆也就是guest&#xff0c;这里显然并没有开…