前端 CSS 经典:3D 渐变轮播图

前言:无论什么样式的轮播图,核心 JS 实现原理都差不多。所以小伙伴们,还是需要了解一下核心 JS 实验原理的。

效果图:

实现代码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><style>.carousel {display: flex;position: relative;width: 705px;margin: 50px auto;overflow: hidden;}.carousel-box {perspective: 1000px;width: 100%;height: 200px;}.carousel-item {position: absolute;left: calc(50% - 200px);width: 400px;height: 100%;user-select: none;transition: all 0.4s ease;}.indicator {position: absolute;top: calc(50% - 25px);width: 50px;height: 50px;line-height: 50px;text-align: center;border: 1px solid;z-index: 999;border-radius: 50%;font-size: 25px;cursor: pointer;}.prev {left: 0;}.next {right: 0;}</style></head><body><div class="carousel"><div class="carousel-box"><img class="carousel-item" src="2.jpg" /><img class="carousel-item" src="2.jpg" /><img class="carousel-item" src="2.jpg" /><img class="carousel-item" src="2.jpg" /><img class="carousel-item" src="2.jpg" /></div><div class="indicator prev"><</div><div class="indicator next">></div></div><script>const items = document.querySelectorAll(".carousel-item"); // 拿到所有轮播图片let index = 2; // 当前索引// 布局函数const layout = () => {console.log(items, index);const offsetStep = 100; // 两张图片的偏移量const scaleStep = 0.6; // 两张图片的缩放比例const opacityStep = 0.5; // 两张图片的透明度for (let i = 0; i < items.length; i++) {const item = items[i];const dis = Math.abs(i - index); // 布局比例const sign = i - index > 0 ? 1 : -1; // 布局方向const zIndex = items.length - dis;const scale = scaleStep ** dis;let rotateY = 45 * -sign;const opacity = opacityStep ** dis;let xOffset = (i - index) * offsetStep;if (i !== index) {xOffset = xOffset + 100 * sign;} else {rotateY = 0;}item.style.zIndex = zIndex;item.style.transform = `translateX(${xOffset}px) scale(${scale}) rotateY(${rotateY}deg)`;item.style.opacity = opacity;console.log(item);}};layout();// 向前的按钮const prev = document.querySelector(".prev");prev.onclick = () => {index--;if (index < 0) {index = 0;}layout();};// 向后的按钮const next = document.querySelector(".next");next.onclick = () => {index++;if (index > items.length - 1) {index = items.length - 1;}layout();};// 点轮播图items.forEach((item, i) => {item.onclick = () => {index = i;layout();};});</script></body>
</html>

 

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

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

相关文章

MySQL —— 复合查询

一、基本的查询回顾练习 前面两章节整理了许多关于查询用到的语句和关键字&#xff0c;以及MySQL的内置函数&#xff0c;我们先用一些简单的查询练习去回顾之前的知识 1. 前提准备 同样是前面用到的用于测试的表格和数据&#xff0c;一张学生表和三张关于雇员信息表 雇员信息…

优化数据查询性能:StarRocks 与 Apache Iceberg 的强强联合

Apache Iceberg 是一种开源的表格格式&#xff0c;专为在数据湖中存储大规模分析数据而设计。它与多种大数据生态系统组件高度兼容&#xff0c;相较于传统的 Hive 表格格式&#xff0c;Iceberg 在设计上提供了更高的性能和更好的可扩展性。它支持 ACID 事务、Schema 演化、数据…

leetcode-设计LRU缓存结构-112

题目要求 思路 双链表哈希表 代码实现 struct Node{int key, val;Node* next;Node* pre;Node(int _key, int _val): key(_key), val(_val), next(nullptr), pre(nullptr){} };class Solution { public: unordered_map<int, Node*> hash; Node* head; Node* tail; int …

普源DHO924示波器OFFSET设置

一、简介 示波器是电子工程师常用的测量工具之一&#xff0c;能够直观地显示电路信号的波形和参数。普源DHO924是一款优秀的数字示波器&#xff0c;具有优异的性能和易用性。其中OFFSET功能可以帮助用户调整信号的垂直位置&#xff0c;使波形更清晰易读。本文将详细介绍DHO924…

专注于运动控制芯片、运动控制产品研发、生产与销售为一体的技术型芯片代理商、方案商——青牛科技

深圳市青牛科技实业有限公司,是专注于运 动控制芯片、运动控制产品研发、生产与销售为一体的技术型 芯片代理商、方案商。现今代理了国产品牌GLOBALCHIP&#xff0c;芯谷&#xff0c;矽普&#xff0c;TOPPOWER等品牌。其中代理品牌TOPPOWER为电源模块&#xff0c;他们公司通过了…

cherry-pick的强大之处在于哪里

git cherry-pick 的强大之处在于它提供了一种灵活的方式来应用特定的提交到不同的分支上&#xff0c;而无需合并整个分支或拉取其他不需要的提交。以下是 git cherry-pick 的几个主要优点和强大之处&#xff1a; 选择性应用提交&#xff1a;你可以挑选一个或多个特定的提交&…

声音转文本(免费工具)

声音转文本&#xff1a;解锁语音技术的无限可能 在当今这个数字化时代&#xff0c;信息的传递方式正以前所未有的速度进化。从手动输入到触控操作&#xff0c;再到如今的语音交互&#xff0c;技术的发展让沟通变得更加自然与高效。声音转文本&#xff08;Speech-to-Text, STT&…

Plant Simulation验证AGV算法

Plant Simulation验证算法也是非常高效且直观的&#xff0c;一直以来波哥在迭代算法的时候图形显示这块都是使用Openframeworks去做&#xff0c;效果还是非常不错的。 这里简要介绍一下openFrameworks&#xff0c;openFrameworks是一个开源的、跨平台的 C 工具包。旨在开发实时…

LeetCode hot100-49-N

236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;…

爬虫学习--12.MySQL数据库的基本操作(下)

MySQL查询数据 MySQL 数据库使用SQL SELECT语句来查询数据。 语法&#xff1a;在MySQL数据库中查询数据通用的 SELECT 语法 SELECT 字段1&#xff0c;字段2&#xff0c;……&#xff0c;字段n FROM table_name [WHERE 条件] [LIMIT N] 查询语句中你可以使用一个或者多个表&…

uni-app项目在微信开发者工具打开时报错[ app.json 文件内容错误] app.json: 在项目根目录未找到 app.json

uni-app项目在微信开发者工具打开时报错[ app.json 文件内容错误] app.json: 在项目根目录未找到 app.json 出现这个问题是因为打开的文件地址不对&#xff0c;解决这个问题首先我们要查看是否有unpackage文件夹&#xff0c;如果有&#xff0c;项目直接指向unpackage\dist\dev\…

vue3使用mitt.js进行各种组件间通信

我们在vue工程中&#xff0c;除开vue自带的什么父子间&#xff0c;祖孙间通信&#xff0c;还有一个非常方便的通信方式&#xff0c;类似Vue2.x 使用 EventBus 进行组件通信&#xff0c;而 Vue3.x 推荐使用 mitt.js。可以实现各个组件间的通信 优点&#xff1a;首先它足够小&…

【云原生】Kubeadm部署k8s

目录 一、部署步骤 二、部署kubernetes 2.1、所有节点关闭防火墙 核心防护 iptables规则 swap交换 2.2、修改主机名并添加主机映射 2.3、调整内核参数 三、安装Docker 3.1、所有节点安装docker 3.2、所有接点添加镜像加速器 3.3、开启docker、并设置开机自启、查看状态…

ESP32学习笔记:WS2812B驱动

WS2812B是一款贴片RGB灯。由于采用了单总线通讯&#xff0c;所以需要特别关注下它的通讯时序。 调试细节&#xff1a; 本来以为会是一个比较简单的调试&#xff0c;结果还是花了很长时间才调试完成。 首先是关于ESP32的纳秒级延时确定&#xff0c;当时按照空指令始终调试不出来…

Linux中的计划任务(crontab)详解

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、Linux的起源与发展 2、什么是计划任务&#xf…

超详细的前后端实战项目(Spring系列加上vue3)(一步步实现+源码)前端篇(一)

最近想着一步步搭建一个前后端项目&#xff0c;将每一步详细的做出来。&#xff08;如果有不足或者建议&#xff0c;也希望大佬们指出哦&#xff09; 前端初始化 1.根据vue脚手架创建vue项目 这里可以用很多方法创建vue项目&#xff0c;大家看着创建吧&#xff0c;只要能创建…

k8s 部署mqtt简介

在Kubernetes&#xff08;K8s&#xff09;中部署MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;服务通常涉及以下几个步骤&#xff1a; 选择MQTT Broker MQTT Broker是MQTT消息传递的中间件。流行的MQTT Broker包括Mosquitto, HiveMQ, EMQ X等。你需要选择一…

机器学习面试问题总结 | 贝叶斯网络

本文给大家带来的百面算法工程师是机器学习中贝叶斯网路面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的面试问题&#xff0c;并提供参考的回答及其理论基础&#…

K8S Secret管理之SealedSecrets

1 关于K8S Secret 我们通常将应用程序使用的密码、API密钥保存在K8S Secret中&#xff0c;然后应用去引用。对于这些敏感信息&#xff0c;安全性是至关重要的&#xff0c;而传统的存储方式可能会导致密钥在存储、传输或使用过程中受到威胁&#xff0c;例如在git中明文存储密码…

FreeRTOS_事件组_学习笔记

事件组 原文链接 事件组是一个整数&#xff0c;其中的高8位留给内核&#xff0c;只能用其他位来表示时间 每一位代表一个事件&#xff0c;且每个时间的含义由程序员决定 1为发生&#xff0c;0为未发生 一个/多个任务或ISR都能读写这些位 可以等待某一位&#xff0c;也可以等待…