• 实现一个图片轮播-3d播放效果


    前言:最近在做一个音乐播放器,首页要做一个图片轮播,看了bootstrap的carousel插件以及移动端的swipe.js库,都是平面图片轮播的效果,所以自己想着实现类似网易云app里那种3d图片轮播的效果,所以写下此文.

    源代码:here

    demo演示: here

    使用方法:

    首先,引入Swipe.js和Swipe.css

    html结构如下:

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4   <meta charset="UTF-8">
     5   <meta name="viewport" content="width=device-width, initial-scale=1.0">
     6   <meta http-equiv="X-UA-Compatible" content="ie=edge">
     7   <title>图片轮播3d效果</title>
     8   <link rel="stylesheet" href="swipe.css">
     9 </head>
    10 <body>
    11   <div class="slide_box">
    12            <ul class="slide_list swipe" id="swipe_list" data-ride='swipe'>
    13              <li class="item">
    14                <a href="" class="slide_list_link">
    15                  <img src="https://y.gtimg.cn/music/common/upload/t_focus_info_iphone/67011.jpg" alt="" class="slide_list_pic">
    16                </a>
    17              </li>
    18            </ul>
    19          <div class="slide_action">
    20              <a href="##" class="slide_action_btn-left"><span class=" glyphicon glyphicon-home" ></span></a>
    21              <a href="##" class='slide_action_btn-right'><span class=" glyphicon glyphicon-home" ></span></a>
    22          </div>
    23        </div>
    24        <script src="http://cdn.bootcss.com/jquery/3.0.0-rc1/jquery.js"></script>
    25        <script src='swipe.js'></script>
    26 </body>
    27 </html>

    然后脚本中加上以下代码,即可实现

    1 $(window)
    2   .on('load', function () {
    3     var swipes = $('[data-ride="swipe"]')
    4     swipes.each(function (index, item) {
    5       var swipe = new Swipe(item)
    6       swipe.init()
    7     });
    8   })

    实现原理

    1. 定义了一个Swipe构造函数,主要通过对每一个item添加删除类,结合css的transform属性的translate3d()来实现滚动3d效果,这里只是实现一个简单的效果,具体的可以继续扩展
    2. CSS中主要有五个类来实现动画效果p0,p1,p2,p3,p4;

    类p2是主要呈现的图片,初始化的时候会默认最中间的图片添加p2类,然后左边的图是p0,p1类,右边的是p3,p4类;

    p0,p4主要是隐藏在后边的图片,设计这两个类是为了动画更加的流畅。

    大概这么说吧,比如我们有7张图片,那么默认会初始化this.$itemIndenxArr=[0,0,1,2,3,4,4];

    然后根据 this.$itemIndenxArr 分别添加类 p0,p0,p1,p2,p3,p4,p4,就可以实现初始效果图如下:

    1. 在Swipe.prototype.prev以及Swipe.prototype.next中通过对this.$itemIndexArr的修改,来实现图片的滚动效果

    当向左滚动,会修改 this.$itemIndenxArr=[4,0,0,1,2,3,4];此时呈现在中间的就是第五张图

    Swipe.prototype.slide判断滚动方向进行实际的滚动(即实际的添加删除类)

     

    总结:

        总得来说,实现原理不难,基本上实现了图片的响应式,以及任意图片添加都可以实现此轮播效果,对于以后实现都可以直接引入代码,感觉还是不错的

    更全面的内容请看 这一篇 《3D轮播插件》 

    具体代码如下:

    index.html

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4   <meta charset="UTF-8">
     5   <meta name="viewport" content="width=device-width, initial-scale=1.0">
     6   <meta http-equiv="X-UA-Compatible" content="ie=edge">
     7   <title>图片轮播3d效果</title>
     8   <link rel="stylesheet" href="swipe.css">
     9 </head>
    10 <body>
    11   <div class="slide_box">
    12            <ul class="slide_list swipe" id="swipe_list" data-ride='swipe'>
    13              <li class="item">
    14                <a href="" class="slide_list_link">
    15                  <img src="https://y.gtimg.cn/music/common/upload/t_focus_info_iphone/67011.jpg" alt="" class="slide_list_pic">
    16                </a>
    17              </li>
    18            </ul>
    19          <div class="slide_action">
    20              <a href="##" class="slide_action_btn-left"><span class=" glyphicon glyphicon-home" ></span></a>
    21              <a href="##" class='slide_action_btn-right'><span class=" glyphicon glyphicon-home" ></span></a>
    22          </div>
    23        </div>
    24        <script src="http://cdn.bootcss.com/jquery/3.0.0-rc1/jquery.js"></script>
    25        <script src='swipe.js'></script>
    26 </body>
    27 </html>
    View Code

    Swipe.js

     1 var Swipe = function (element) {
     2   this.$element = $(element)
     3   this.$item = $(element)
     4     .children('.item')
     5   this.$length = $(element)
     6     .children('.item')
     7     .length
     8   this.$itemIndexArr = []
     9   for (var i = 0, len = this.$length; i < len; i++) {
    10     if (i < Math.floor(len / 2))
    11       this.$itemIndexArr[i] = 0
    12     else if (i > Math.floor(len / 2))
    13       this.$itemIndexArr[i] = 4
    14     if (i == Math.floor(len / 2) - 1)
    15       this.$itemIndexArr[i] = 1
    16     if (i == Math.floor(len / 2))
    17       this.$itemIndexArr[i] = 2
    18     if (i == Math.floor(len / 2) + 1)
    19       this.$itemIndexArr[i] = 3
    20   }
    21 }
    22 Swipe.prototype.DEFAULTS = {
    23   interval: 3000,
    24   pause: 'hover'
    25 }
    26 Swipe.prototype.init = function () {
    27 
    28   var that = this
    29   that.$item.each(function (index, item) {
    30     $(item)
    31       .addClass('p' + that.$itemIndexArr[index])
    32   })
    33   that.cycle()
    34   var links = this.$element.siblings('.slide_action')
    35     .find('a')
    36   links.each(function (index, item) {
    37     var type = $(item)
    38       .attr('class')
    39       .match(/left/) ? 'prev' : 'next'
    40     switch (type) {
    41       case 'prev':
    42         $(this)
    43           .bind('click', function () {
    44             that.prev()
    45           })
    46         break;
    47       case 'next':
    48         $(this)
    49           .bind('click', function () {
    50             that.next()
    51           })
    52         break;
    53     }
    54   });
    55 }
    56 Swipe.prototype.cycle = function () {
    57   var that = this
    58   var cycleInterval = setInterval(function () {
    59     return that.next()
    60   }, that.DEFAULTS.interval)
    61 }
    62 Swipe.prototype.next = function () {
    63   var len = this.$length
    64   var indexArr = this.$itemIndexArr
    65   this.$itemIndexArr = indexArr.map(function (item, index) {
    66     if (item === 4 && indexArr[(index + 1) % len] === 0) {
    67       return 0;
    68     } else if (item === 4) {
    69       return 4;
    70     }
    71     return item + 1;
    72   })
    73   return this.slide();
    74 }
    75 Swipe.prototype.prev = function () {
    76   var len = this.$length
    77   var indexArr = this.$itemIndexArr
    78   this.$itemIndexArr = indexArr.map(function (item, index) {
    79     if (item === 0 && indexArr[(index + len - 1) % len] === 4) {
    80       return 4;
    81     } else if (item === 0) {
    82       return 0;
    83     }
    84     return item - 1;
    85   })
    86   return this.slide();
    87 }
    88 Swipe.prototype.slide = function () {
    89   var indexArr = this.$itemIndexArr
    90   this.$item.removeClass('p0 p1 p2 p3 p4')
    91   this.$item.each(function (index, item) {
    92     $(item)
    93       .addClass('p' + indexArr[index])
    94   })
    95 }
    View Code

    Swipe.css

      1 @media (min-width : 996px){
      2   html {
      3     font-size: 102.4px;
      4   }
      5 }
      6 @media (min-width : 667px) and (max-width :996px){
      7   html {
      8     font-size: 66.7px;
      9   }
     10 }
     11 @media (min-width : 375px) and (max-width : 667px){
     12   html {
     13     font-size: 37.5px;
     14   }
     15 }
     16 /* =============================================================
     17    Swiper styles
     18    ========================================================================== */
     19 .slide_box {
     20   position: relative;
     21   overflow: hidden;
     22   width: 10rem;
     23   margin-bottom: 25px;
     24   height: 4.5rem;
     25 }
     26 .slide_list {
     27   position: relative;
     28   width: 9rem;
     29   max-height: 361px;
     30 }
     31 .slide_list>.item {
     32   position: absolute;
     33   display: inline-block;
     34   top: 0;
     35   /* left: 0; */
     36   width: 7rem;
     37   left: calc(50% - 3rem);
     38   height: 4.5rem;
     39   max-height: 325px;
     40   /* margin: 0 auto; */
     41   /*opacity: 0;*/
     42   filter: alpha(opacity=0);
     43   z-index: 1;
     44   -webkit-transition: all 300ms ease-in-out;
     45   -ms-transition: all 300ms ease-out;
     46   transition: all 300ms ease-out;
     47 }
     48 .slide_list>.item.p2 {
     49   z-index: 10;
     50 }
     51 .slide_list>.item.p1 {
     52     /*向左移动 并且放小*/
     53   -webkit-transform: translate3d(-116px,0,0) scale(0.81);
     54   transform: translate3d(-116px,0,0) scale(0.81);
     55 }
     56 .slide_list>.item.p1,.slide_list>.item.p3{
     57   opacity: .8;
     58   filter: none;
     59 }
     60 .slide_list>.item.p0,.slide_list>.item.p4{
     61   opacity: 0;
     62   filter: none;
     63 }
     64 /*向左滚动*/
     65 .slide_list>.item.p1{
     66   transform-origin: 0 50%;
     67 }
     68 /*向右滚动*/
     69 .slide_list>.item.p3 {
     70   transform-origin: 100% 50%;
     71 }
     72 .slide_list>.item.p0 {
     73   -webkit-transform: translate3d(-328pxpx,0,0) scale(0.41);
     74   transform: translate3d(-328px,0,0) scale(0.41);
     75 }
     76 .slide_list>.item.p3 {
     77   -webkit-transform: translate3d(116px,0,0) scale(0.81);
     78   transform: translate3d(116px,0,0) scale(0.81);
     79 }
     80 .slide_list>.item.p4 {
     81   -webkit-transform: translate3d(328px,0,0) scale(0.41);
     82   transform: translate3d(328px,0,0) scale(0.41);
     83 }
     84 @media screen and (min-960px) {
     85   .slide_list>.item {
     86     left: calc(50% - 3.5rem);
     87   }
     88 }
     89 .event_list_pic {
     90   width: 100%;
     91   height: 100%;
     92 }
     93 .slide_list_link {
     94   /*  10%; */
     95   height: 100%;
     96 }
     97 .slide_list_pic {
     98   width: 100%;
     99 }
    100 .slide_action {
    101   position: absolute;
    102   top: 0;
    103   width: 100%;
    104   height: 100%;
    105   overflow: hidden;
    106 }
    107 [class^=slide_action_btn] {
    108   position: absolute;
    109   top: 50%;
    110   margin-top: -54px;
    111   width: 72px;
    112   height: 108px;
    113   background: rgba(153,153,153,.4);
    114   opacity: 0;
    115   visibility: none;
    116   transition-property: opacity,transform;
    117   transition-duration: .5s;
    118   z-index: 2;
    119 }
    120 [class^=slide_action_btn]:hover {
    121   opacity: 1.0;
    122 }
    123 .slide_action-left,.slide_action_btn-left {
    124   left: 0;
    125 }
    126 .slide_sction-right,.slide_action_btn-right {
    127   right: 0;
    128 }
    View Code
  • 相关阅读:
    [专项]tcp状态机,为什么3次握手(很好)(done)
    Win7系统如何创建计划任务的小技巧(图文)
    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
    Java项目 使用MyEclipse打包生成jar文件方法
    excel插入柱形图和插入置信值
    关于Virtual Box虚拟机里的系统不能启动的解决方法
    html文件的中文乱码问题与在浏览器中的显示 .
    Windows的计划任务
    不能为虚拟电脑 Fedora1 打开一个新任务.
    bat 通过bat脚本来每隔一段时间运行jar包
  • 原文地址:https://www.cnblogs.com/kasmine/p/6343921.html
Copyright © 2020-2023  润新知