当前位置: 首页 > news >正文

tab切换动画,背景图向内收缩效果,主图片缓慢展开效果(含自适应)

先看效果:https://live.csdn.net/v/492602

tab切换,切换动画,页面自适应

PS:

  1. 这里的sm、md是在global.css中自定义的断点
  2. 代码中样式用的是tailwindcss,颜色可能有自定义的,可根据自身需要自行修改
  3. sm以下是移动端,tab在下面,左右点击切换
  4. 动画的速度和透明度变化可根据自己的要求更改具体数据
"use client";import { useState } from "react";const Test = () => {const [activeTab, setActiveTab] = useState(0);const [animationKey, setAnimationKey] = useState(0);const tabs = [{id: 0,title: "tab1",content: "tab1 alt",bgImage: "/bg-img/bg1.jpeg",mainImage: "/image/liuyifei11.jpeg",},{id: 1,title: "tab2",content: "tab2 alt",bgImage: "/bg-img/bg2.jpeg",mainImage: "/image/liuyifei12.jpeg",},{id: 2,title: "tab3",content: "tab3 alt",bgImage: "/bg-img/bg3.jpeg",mainImage: "/image/liuyifei13.jpeg",},{id: 3,title: "tab4",content: "tab4 alt",bgImage: "/bg-img/bg4.jpeg",mainImage: "/image/liuyifei14.jpeg",},];const nextTab = () => {setActiveTab((prev) => (prev + 1) % tabs.length);setAnimationKey((prev) => prev + 1);};const prevTab = () => {setActiveTab((prev) => (prev - 1 + tabs.length) % tabs.length);setAnimationKey((prev) => prev + 1);};const handleTabClick = (tabId: number) => {if (tabId === activeTab) return;setActiveTab(tabId);setAnimationKey((prev) => prev + 1);};const currentTab = tabs[activeTab];return (<div className="w-full">{/* Desktop: Tab栏导航 (sm以上) - 放在上面 */}<div className="hidden max-w-[1440px] mx-auto sm:flex md:px-[100px] lg:px-0 justify-center items-center"><div className="flex w-full">{tabs.map((tab) => (<buttonkey={tab.id}onClick={() => handleTabClick(tab.id)}className={`flex-1 px-4 py-2 text-sm leading-4 md:text-base md:leading-[18px] transition-all duration-300 border-b-2 ${activeTab === tab.id? "border-green-300 text-green-300 font-semibold": "border-transparent text-gray-400"}`}>{tab.title}</button>))}</div></div><div className="relative py-10 px-5 sm:px-10 md:px-[105px] md:pt-[50px] md:pb-[61px] overflow-hidden">{/* Background Image - 根据当前tab动态切换 */}<divkey={`bg-${animationKey}`}className="absolute inset-0 w-full h-full bg-cover bg-center bg-no-repeat animate-background-shrink"style={{backgroundImage: `url('${currentTab.bgImage}')`,}}/>{/* Content Area */}<div className="relative max-w-[1440px] mx-auto h-full rounded-[12px] sm:rounded-[20px] md:rounded-[30px] bg-gradient-to-br from-gray-50/33 to-white/33">{/* Overlay Content */}<div className="relative z-10 w-full h-full flex items-center justify-center p-1.5 sm:p-[15px]">{/* Main Image Container - 根据当前tab动态切换 */}<div className="relative w-full h-full flex items-center justify-center rounded-[8px] sm:rounded-[15px] md:rounded-[20px] overflow-hidden"><imgkey={`img-${animationKey}`}src={currentTab.mainImage}alt={`${currentTab.title} Content`}className="w-full h-full object-cover drop-shadow-xl animate-image-expand rounded-[8px] sm:rounded-[15px] md:rounded-[20px]"/></div></div></div>{/* Mobile: 左右按钮导航 (sm以下) - 放在下面 */}<div className="flex items-center justify-between sm:hidden mt-8">{/* 左侧导航按钮 */}<buttononClick={prevTab}className="w-[50px] h-[50px] rounded-full backdrop-blur-md border-2 border-gray-200 shadow-xl hover:bg-white/30 transition-all duration-300 flex items-center justify-center group"><imgsrc="icons/arrow-left.svg"className="h-5 w-5 text-gray-200 drop-shadow-lg group-hover:scale-110 transition-transform duration-200"/></button>{/* 中央标题 */}<div className="text-center"><h3 className="text-sm leading-[16px] font-semibold text-white drop-shadow-lg tracking-wide">{currentTab.title}</h3></div>{/* 右侧导航按钮 */}<buttononClick={nextTab}className="w-[50px] h-[50px] rounded-full backdrop-blur-md border-2 border-gray-200 shadow-xl hover:bg-white/30 transition-all duration-300 flex items-center justify-center group"><imgsrc="icons/arrow-right.svg"className="h-5 w-5 text-gray-200 drop-shadow-lg group-hover:scale-110 transition-transform duration-200"/></button></div></div></div>);
};export default Test;

css样式

@theme {--breakpoint-sm: 810px;--breakpoint-md: 1200px;
}/* Tab切换动画 */
@keyframes backgroundShrink {0% {transform: scale(1.05);}100% {transform: scale(1);}
}@keyframes imageExpand {0% {opacity: 0;transform: scale(0.97);}100% {opacity: 1;transform: scale(1);}
}.animate-background-shrink {animation: backgroundShrink 0.2s ease-out forwards;transform: scale(1.05);
}.animate-image-expand {animation: imageExpand 0.3s ease-out forwards;opacity: 0;transform: scale(0.97);
}

文章转载自:

http://Wp877kID.ghzfx.cn
http://leVgxw4e.ghzfx.cn
http://SZqB2tMw.ghzfx.cn
http://hy59XEkk.ghzfx.cn
http://ZxrR4yX1.ghzfx.cn
http://W2gCyi8N.ghzfx.cn
http://oxJCovut.ghzfx.cn
http://zmLKiIt1.ghzfx.cn
http://0qTnMlVk.ghzfx.cn
http://61jedjUf.ghzfx.cn
http://SG7yUfNN.ghzfx.cn
http://uR2rZQIQ.ghzfx.cn
http://lJcsN31a.ghzfx.cn
http://QjaBEeCB.ghzfx.cn
http://S1JXeSa1.ghzfx.cn
http://zenzuQGH.ghzfx.cn
http://gHkpZkk7.ghzfx.cn
http://6pqbpAVC.ghzfx.cn
http://6sh6pEXP.ghzfx.cn
http://cCjuoDpg.ghzfx.cn
http://IhpsaCD2.ghzfx.cn
http://WIlfUpa3.ghzfx.cn
http://PcDGy7rZ.ghzfx.cn
http://KoAK534c.ghzfx.cn
http://fLu0GRcZ.ghzfx.cn
http://yi6fAvbV.ghzfx.cn
http://8KsU4Wf3.ghzfx.cn
http://YRlTAORt.ghzfx.cn
http://oeoCeDeb.ghzfx.cn
http://UFnAqOBt.ghzfx.cn
http://www.dtcms.com/a/375268.html

相关文章:

  • 【内存管理】设置内存页表项 set_pte_at
  • Python中内置装饰器
  • 鸿蒙NEXT UI高性能开发实战:从原理到优化
  • 影视APP源码 SK影视 安卓+苹果双端APP 反编译详细视频教程+源码
  • Anthropic 支持加州 AI 安全法案
  • 【杂类】应对 MySQL 处理短时间高并发的请求:缓存预热
  • ubuntu 20.04 安装spark
  • 【企业微信】接口报错:javax.net.ssl.SSLHandshakeException
  • uniapp原生插件 TCP Socket 使用文档
  • 京东云-数据盘挂载
  • 【华为OD】Linux发行版的数量
  • 缓冲区漏洞详解
  • 位图转矢量图的实现方法与常用工具解析
  • 设计模式-简单工厂策略装饰器代理
  • 家庭劳务机器人发展阶段与时间预测
  • .NET 单文件程序详解:从原理到实践
  • 新能源汽车充电设备装调与检修仿真教学软件:理虚实融合实训方案
  • 小鹏汽车 vla 算法最新进展
  • C++ 20 视图view笔记
  • HTML 网页静态托管 API 接口文档(可集成到智能体Agent)
  • 在uni-app中使用lottie-web来展示Lottie动画
  • Python数据可视化基础:使用Matplotlib绘制图表
  • CodeBuddy Code深度实战:从零构建智能电商推荐系统的完整开发历程
  • 【Kubernetes知识点】PriorityClass,HPA和CICD
  • 赋能多场景创新:明远智睿H618核心板
  • (C++)数据结构初阶(顺序表的实现)
  • 一手实测,文心x1.1的升级很惊喜啊
  • 【系统分析师】第18章-关键技术:移动应用系统分析与设计(核心总结)
  • echarts 实现柱状图自动滚动展示数据(Vue3)
  • 基于Python的购物商城网站电商管理系统【2026最新】