千家信息网

如何使用CSS+JS帮你实现苹果cover flow效果

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,小编给大家分享一下如何使用CSS+JS帮你实现苹果cover flow效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! cove
千家信息网最后更新 2026年11月04日如何使用CSS+JS帮你实现苹果cover flow效果

小编给大家分享一下如何使用CSS+JS帮你实现苹果cover flow效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

            coverflow-demo            

稍微解释下这里用到的几个知识点:

1. flex-box.

什么是flex-box捏, 它是为了适应当前设备屏幕大小不一而提出的一种display方法. 当一个父元素的显示被设定为display:flex时, 它内部的子元素们会被平均分配占满父元素的空间, 并且当父元素的尺寸变化时, 子元素的尺寸也会相应变化! 是不是很神奇呢? 不仅如此, 你还可以任意分配子元素们的排列顺序, 如果觉得某个子元素需要突出显示, 就可以给这个子元素以特殊身份, 让它相比其他子元素大一些, 或者小一些! 由于其的自适应特性, flex是移动开发的一把利器, 我们先来看看一个小应用:

设计一个对话框函数, 当传入一个回调函数时, 只显示一个'确定'按钮, 占100%宽度; 当传入两个回调函数(确定和取消)时, 分别显示'确定'和'取消'按钮, 各占50%宽度, 样式分别如下:

怎么实现呢? 我们当然可以用JS来做, 但是(凡事就怕一个但是哈哈)! 我们作为有追求的前端, 战斗在CSS探索的***线, 现在有了如此好用的flex属性, 为毛不立马用起来呢? 说走咱就走, 按钮容器和按钮本身的CSS如下:


关键是按钮的width:100%属性. 有了它, 当容器里只有一个按钮时, 它的宽度会拓展为容器的100%宽度; 而当容器里有两个按钮时, 按钮的宽度都为100%, 怎么办呢? 由于两个按钮势均力敌, 它们只好平分秋色, 各占50%的空间了!

有的同学要问了: 要是我不想按钮把空间占满怎么办呢? 这时候, 可以设定按钮的宽度各为45%, 然后在父元素上设置justify-content:center, 意思是两个子元素只占了90%的横向空间, 那怎么分配剩下的10%空间呢? 那就两边各分配5%吧! 除此之外, 该属性的其它值, 可以让子元素左右对齐, 更多flexbox的神奇应用, 请参考这篇文章~

A Complete Guide to Flexbox

回到我们的例子. 在卡片们没有被应用transform属性之前, 它们看起来是这个样子的:

七个元素平均分布, 占据了父元素的全部横向空间. 其中中间的元素应用了flex-grow:2的属性, 使得它比其他元素高人一等, 面积是其他元素的两倍~~

2. transform

其实有了上一幅图, 初始页面的雏形就已经差不多了~现在只需要给父元素设置视角(关于视角, 3D变换等内容, 请见我的这一篇文章). 为了得到比较明显3D效果, 设置了父元素的perspective为较小的值300px, 就相当于从距离3D变换平面300px的距离看. perspective的值越大, 相当于从越远的距离看, 3D效果越不明显, 平面化效果越强烈~

设置好了视角, 接下来该给元素们设置3D效果了. ***步很简单: 假设有7个元素, 沿Y轴***旋转角度为42度, 则0,1,2号元素分别旋转42, 28, 14度, 3号元素旋转0度同时变大2倍,4,5,6号元素分别旋转-14, -28, -42度. 用一个简单的for循环就可以完成这项任务, 代码如下:

for(var i = 0; i

初始化完成后效果图如下:

此时每个卡片的translateX为0, 这个值要预先写好, 才能通过改变该值来实现卡片的左右移动效果; rotateY的值分别为42, 28, 14, 0, -14, -28, 42度; flex-grow(相对于其它子元素的大小)分别为1, 1, 1, 2, 1, 1, 1

3.-webkit-box-reflect

那么漂亮的倒影是怎么实现的呢? 哈哈其实一行CSS就能搞定, 那就是强大的-webkit-box-reflect, 值为below 5% linear-gradient(transparent, white). 相信聪明的小伙伴看到这里已经明白了大概了, 为了避免误解, 稍稍再解释一下~below是倒影在盒子下方, 5%表示offset, 和盒子的距离是盒子宽度的5%, linear-gradient(transparent, white)指的是倒影的颜色, 从透明到完全不透明. 渐变语法的颜色在这里起作用的只有透明度, 白色的颜色是不会显出来的~到这里, 我们用的大部分都是CSS, 效果图如下:

然而静态的展示是不够的, 我们的目标是! 要让它动起来! 来回左右动! 到这里CSS已经无能为力, 改JS闪亮登场的时候了!~

4.JS控制

控制左右移动的函数如下, 接受一个参数left或者right表示要移动的方向~

// 定义提取旋转角度和translateX值的正则, 例如 -> $0.style.transform.match(/rotateY\((\-?\d{1,3}\.?\d*)deg\)/) <- ["rotateY(14deg)", "14"]        var rotateReg = /rotateY\((\-?\d{1,3}\.?\d*)deg\)/, translateReg = /translateX\((\-?\d{1,3}\.?\d*)px\)/;         function move(direction){            // 当前值为0或者当前值为卡片数目时, 返回            if(currentIndex==(direction=='right'?0:coverCount-1))return;             // 当前值自增或者自减            direction=='right'?currentIndex--:currentIndex++;             // ***Z-index自增            maxZIndex++;             [].forEach.call(cards, function(element, index) {                // 提取变换之前的旋转角度                var previousRotate = parseInt(element.style.transform.match(rotateReg)[1]);                 // 提取变换之前的translateX                var previousTranslate = parseInt(element.style.transform.match(translateReg)[1]);                var currentRotate, currentTranslate;                 if(direction=='right'){                    // 计算rotatey的值                    currentRotate = previousRotate-stepper;                     // 计算平移的距离                    currentTranslate = previousTranslate+(parentWidth/(coverCount+1));                 }else{                    currentRotate = previousRotate+stepper;                     currentTranslate = previousTranslate-(parentWidth/(coverCount+1));                 }                // 写入元素属性                element.style.transform = 'translateX(' + currentTranslate + 'px) rotateY('+ currentRotate +'deg)'                // element.style.zIndex =                 if(index == currentIndex){                    element.style.flexGrow = 2;                     // 不断写入maxZIndex, 确保翻过的元素始终在最前面                    element.style.zIndex = maxZIndex;                  }else{                    element.style.flexGrow = 1;                 }            });        }

再给按钮或者键盘增加事件监听, 这样就完成啦!

看完了这篇文章,相信你对"如何使用CSS+JS帮你实现苹果cover flow效果"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!

元素 按钮 效果 宽度 属性 空间 角度 两个 函数 卡片 容器 篇文章 变换 应用 移动 倒影 盒子 视角 颜色 分配 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 咖啡 广东万易互联网科技有限公司惠州分公司 上海卓越科技互联网 厦门中拓互联网络科技有限公司 互联网通讯科技 电子科技大学互联网 米客互联网科技 广州紫鲸互联网科技 长亮科技 互联网金融 互联网科技股有哪些 互联网巨头投资的硬核科技 昭通云南众福互联网科技有限公司 浙南科技城互联网大厦建设工程 玉溪新华互联网科技好不好 互联网时代的科技公司 互联网公司高科技产品 湖北辰鑫科技互联网 互联网科技品牌 互联网科技创新方面的资料 互联网科技创业有什么好项目 科技赋能下的互联网金融 互联网科技公司发展 极限挑战互联网科技 丰台科技园 互联网公司 互联网科技创新企业排名 互联网系的金融科技公司 郑州欣桑互联网科技有限公司 广州三三互联网科技有限公司 银川新华互联网科技学校招聘 株洲百竞科技的互联网营销顾问
0