美文网首页前端程序猿Web前端之路
js原生加简单C3动画实现--相册旋转拖拽效果

js原生加简单C3动画实现--相册旋转拖拽效果

作者: 蘩蕐皆成空 | 来源:发表于2017-05-03 20:13 被阅读128次

废话多说无益,直接上两张图片看效果,然后进入代码环节

微信截图_20170503192746.png
微信截图_20170503192802.png
准备阶段

1)找十张左右的大小差别不大的照片(最好120*180的 比例在4:6)
2)创建一个dome文件,里面创建一个html文件和一个img的文件夹,把照片放进去img文件夹中

-注意-:阅读下面的东西之前,请先把代码复制到你的html文档中,把照片的名字更改一下,先去自己看下效果,然后再回来阅读。

3)效果分析{
1、从最终呈现的效果来看,是需要一个3D的场景的
2、照片是围成一个圈的,并且自身具备一定的角度的
3、可以上下左右移动,并且带有一定的惯性运动(鼠标事件)
4、开场动画是从中间一个个出现的
}
4){
1、首先肯定是先把页面搭建起来,也就是把body里的东西先让他呈现出来,不要先管他动不动,怎么动的问题
2、搭建3D场景,设置transform的各项属性,让照片围成成一个圆
3、拖动的三个鼠标事件(按下鼠标的效果,按着移动的效果,抬起鼠标的效果)
4、添加底座和开场动画
}

开始编写代码

我依然还是采用边写代码边注释解释的方式来写这下面的代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>拖拽旋转相册</title>
    <style>
        /*去掉内外间距*/
    *{
        padding:0;
        margin:0;
    }
    body{
        background-color:black;/*整个后面大的背景*/
        overflow:hidden;/*取消滚动条*/
    }
    #perspective{
        /*设置景深*/
        perspective:800px;
    }
    /*设置盛放照片的div*/
    #wrap{
        width:120px;
        height:180px;
        /*border:1px solid yellow;*/  /*建议学习的同仁把这个恢复后再运行,方便理解代码,但是印象美观*/
        position:relative;
        margin:0 auto;
        /*创建3D场景*/
        transform-style: preserve-3d;
         /*让照片出现后上下呈现一定的角度*/
        transform:rotateX(-10deg) rotateY(0deg);

    }
    /*给图片添加样式和属性*/
    #wrap img{
        position:absolute;
        width:100%;
        height:100%;
        border-radius:5px;
        /*给照片添加圆角和阴影*/
        box-shadow: 0 0 2px pink;
        transform:rotateY(0deg) translateZ(0px);
        /*倒影:朝向 偏移  遮盖  *//*线性渐变(从哪里开始) 开始时候的颜色  结束时候的颜色*/
       -webkit-box-reflect:below 5px -webkit-linear-gradient(top,rgba(0,0,0,0) 40%,rgba(0,0,0,0.5) 100%);
    }
    /*底座光环*/
     #wrap p{
            width:1200px;
            height:1200px;
            /*径向渐变 (从哪里开始) 扩散程度 开始时候的颜色  结束时候的颜色*/
            background:-webkit-radial-gradient(center center,600px 600px,rgba(244,23,134,0.2),rgba(0,0,0,0));
                border-radius:100%;
                position:absolute;
                left:50%;
                top:102%;
                margin-left:-600px;
                margin-top:-600px;
                transform:rotateX(90deg);
        }
    </style>
    <script type="text/javascript">
    window.onload = function(){
            var oWrap = document.getElementById('wrap');
            var oImg = document.getElementsByTagName('img');
            var oImgLength = oImg.length;
            var Deg = 360/oImgLength;
            var nowX;
            var nowY;
            var lastX;
            var lastY;
            var minuseX = 0;
            var minuseY = 0;
            var roX = -10;
            var roY = 0;
            var timer;

            // 给img设置旋转度
            for(var i=0;i<oImgLength;i++){
                oImg[i].style.transform = 'rotateY('+i*Deg+'deg)translateZ(350px)'
                // 语法:transition: property duration timing-function delay;
                //                   property:设置过渡效果的 CSS 属性的名称
                //                   duration:完成过渡效果需要多少秒或毫秒
                //                   timing-function:速度效果的速度曲线
                //                   delay:过渡效果何时开始
                oImg[i].style.transition = 'transform 1s '+ (oImgLength-1-i)*0.1 +'s';
            }

            mTop();

                window.onresize = mTop;  // 窗口调整大小的时候

                function mTop(){
                    var wH = document.documentElement.clientHeight;
                    oWrap.style.marginTop = wH / 2 - 180 + 'px';
                }


            //  三个鼠标事件
            //  按下   按下后移动   提起

            //  第一个
            document.onmousedown = function(ev){
                ev = ev ||window.event;
                lastX = ev.clientX;
                lastY = ev.clientY;
                // console.log("前一点X坐标"+lastX)
                // console.log("前一点Y坐标"+lastY)


                //第二个事件
                //
                //移动事件
                // 给wrap添加transform属性
                //需要获取的的是鼠标移动的坐标值 求差值  把差值作为rotate的值
                this.onmousemove = function(ev){
                     ev =ev||window.event;


                     clearInterval(timer);

                    nowX = ev.clientX;
                    nowY = ev.clientY;
                    // 求差值
                    minuseX = nowX - lastX;
                    minuseY = nowY - lastY;
                    //更新wrap的旋转角度,拖拽越快--> minus变化越大->
                    //roY变化越大  旋转越快
                    roX -= minuseY*0.1
                    roY += minuseX*0.2
                    console.log(roX)

                    // console.log("当前点X坐标"+lastX)
                    // console.log("当前点Y坐标"+lastY)
                    oWrap.style.transform ='rotateX('+roX+'deg) rotateY('+roY+'deg)';
                    // 随着鼠标移动,当前点成前一点
                    lastX = nowX;
                    lastY = nowY;

                 }

                 // 第三个事件  提起
                 //
                 this.onmouseup = function(){
                    // 清除移动事件
                    this.onmousemove = null;
                    //设置定时器 让差值逐渐减小  形成类似惯性的运动效果
                    timer =setInterval(function(){
                            minuseX *= 0.95; // 让差值无限次乘以一个小数  值会无限接近零 但不会等于零
                            //console.log(minuseX)

                            minuseY *= 0.95;
                            roY += minuseX*0.2;
                            roX -= minuseY*0.1;
                            oWrap.style.transform ='rotateX('+roX+'deg)rotateY('+roY+'deg)';
                            if(Math.abs(minuseX)<0.2&&Math.abs(minuseY)<0.1){
                                clearInterval(timer)
                            }
                    },13)


                 }

                return  false;//  取消鼠标的默认事件
            }





        }
    </script>
</head>
<body>
    <div id="perspective">
        <div id="wrap">
            ![](img/1.jpg)
            ![](img/2.jpg)
            ![](img/3.jpg)
            ![](img/4.jpg)
            ![](img/5.jpg)
            ![](img/6.jpg)
            ![](img/7.jpg)
            ![](img/8.jpg)
            ![](img/9.jpg)
            ![](img/10.jpg)
            ![](img/11.jpg)
            <p></p>
        </div>
    </div>
</body>
</html>

相关文章

  • js原生加简单C3动画实现--相册旋转拖拽效果

    废话多说无益,直接上两张图片看效果,然后进入代码环节 准备阶段 1)找十张左右的大小差别不大的照片(最好120*1...

  • 实现拖拽

    原生js实现 HTML5原生实现:拖拽draggable属性、DataTranfers对象

  • JQuery animate.easing

    JQuery动画能实现各种效果,相比css动画、原生JS动画解决了兼容性问题;一般的动画用起来比较简单,通过更改$...

  • HTML5实现拖拽

    实现拖拽效果源元素 - 要拖拽的文件目标元素 - 要拖拽到哪里去 目前实现拖拽效果使用原生DOM就能实现 - 最麻...

  • 原生JS实现Tab切换效果和模态框效果

    原生JS实现Tab切换效果 效果展示 原生JS实现模态框效果 效果展示

  • js拖拽html元素工具类

    复制就能用的拖拽js方法 原生js实现拖拽元素方法 使用(注意拖拽目标元素需绝对定位 position: 'abs...

  • 原生JS实现拖拽条效果

    HTML结构: 首先是我们的HTML结构,我们的拖拽条使用了 标签来实现, 10类型设置为range即可出现拖拽条...

  • Drag Drop---API

    在h4标准中,我们定义个拖拽事件是很麻烦的,用原生的js来实现拖拽的效果。我们需要计算拖拽的元素的坐标位置和距离之...

  • 原生js拖拽效果

    最近新学了拖拽效果,没有好记性,只好用烂笔头记录一下了。首先讲讲拖拽的思路(只分析水平方向,垂直方向类似): 首先...

  • JS 原生拖拽的简单实现

网友评论

    本文标题:js原生加简单C3动画实现--相册旋转拖拽效果

    本文链接:https://www.haomeiwen.com/subject/waeltxtx.html