如何在Flutter中实现自定义Carousel?参考Dribbble影院App UI
实现这款影院App轮播UI的思路拆解
先明确这个轮播的核心特点:中心卡片放大突出,两侧卡片缩小且带透明度渐变,滑动切换时过渡平滑,还有阴影增强层次感。下面是具体的实现思路:
一、基础布局搭建
- 用一个容器装所有卡片,设置
overflow: hidden把超出可视区域的部分藏起来,容器宽度设成和屏幕可视区域一致。 - 卡片可以用绝对定位或者flex排列,初始时让中心卡片刚好在容器正中间,两侧卡片依次排在左右两边。
二、卡片状态样式控制
- 给卡片分三个状态:活跃(中心卡片)、左侧卡片、右侧卡片,分别写对应的样式:
/* 中心活跃卡片 */ .card.active { transform: scale(1.2); opacity: 1; z-index: 10; box-shadow: 0 8px 20px rgba(0,0,0,0.3); } /* 左右两侧卡片 */ .card.prev, .card.next { transform: scale(0.9); opacity: 0.7; z-index: 5; } .card.prev { transform: translateX(-22%) scale(0.9); } .card.next { transform: translateX(22%) scale(0.9); } - 别忘了给卡片加
transition: all 0.3s ease,让状态切换时动画更顺滑。
三、滑动交互逻辑实现
- 监听触摸或鼠标事件:记录点击/触摸的初始位置,滑动过程中计算位移,松开时判断是向左还是向右滑。
- 切换卡片状态:比如向右滑的话,把当前中心卡片变成左侧卡片,原来的右侧卡片变成中心卡片,同时调整其他卡片的状态类。
- 如果要做自动轮播,就加个定时器,定时触发切换逻辑,鼠标悬停时暂停定时器就行。
四、可选技术方案
- 原生JS:完全自定义,代码轻量,适合需要精细控制的场景。
- Vue/React:用框架的状态管理来维护卡片的状态,配合框架的过渡组件能简化动画实现。
- 现成轮播库:比如Swiper,通过自定义配置能快速接近目标效果,但可能需要额外调整样式来匹配设计。
内容的提问来源于stack exchange,提问作者Dean Villamia
相关产品推荐
相关产品推荐

