div交换css动画效果

2020-05-07 13:37:12

当然我无论永不用js都是不影响实际操作的。

主要讲下两个div交换的时候带有动画效果的思路。至于使用什么样的动画插件,或者自己写动画都无所为。


当然首先说明的是insertBefore或者append或者appendTo都的时候transition都将会被打断。如何实现动画效果呢。

还是曲线救国的办法。

首先我们正常的让两个div替换位置,这里肯定是瞬间的。

但是我们再瞬间完成以后,给div一个transform让他再瞬间回到原来的位置,这样我们在取消transform动画,这样div就在设定的时间内缓慢的根据动画回来了。

其实也就是先转移后动画,一个障眼法。

好了,看下面的例子。

参考地址  Jquery 动态交换两个div位置并添加Css动画效果

 前端网页开发中我们经常会遇到需要动态置换两个DIV元素的位置,常见的思路大多是不考虑原始位置,直接采用append或者appendTo方式将两元素进行添加,该法未考虑原始位置,仅会添加为元素的最后一子元素。

  今天将给大家介绍一种位置交换方式(判断兄弟元素是否存在),并添加简单的css效果。

  

  设计思路

  判断元素后边是否存在兄弟元素;存在则通过insertBefore方法将另一元素添加至其兄弟元素前,否则则直接采用appendTo方法添加至父元素。

 

 核心代码

  1.判断其后边是否存在兄弟元素

1 function hasBorther(va1){ 2             if(va1.next()[0]){//兄弟元素 3                 return {bor:va1.next()}; 4             }else{ 5                 return {par:va1.parent()};//父元素 6             } 7         }

  2.根据兄弟元素存在与否改变元素位置

 

12345678function removeDiv(app,Div){           if(app.bor){//兄弟元素              Div.insertBefore(app.bor);           }else{              Div.appendTo(app.par);           }        }

 

  

 

  3.移动时之前------添加动画

 

+ View Code

 

  效果图

    说明:更改下拉框可完成两容器位置的交换,目前版本加入部分css动画,效果不是十分完美,欢迎大佬指导。

  

 

源码

  说明:引入jquery库即可。

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153<!DOCTYPE html><html lang="en"> <head>    <meta charset="utf-8">    <title>        Document    </title>    </meta></head> <body>    <script src="jquery-1.11.3.min.js" type="text/javascript">    </script>    <style>    .my-container {        margin: auto 0;        padding: 10px;    }     .my-container>div:first-child {        background: #c0cbff;        margin: auto 0;        padding: 10px;        height: 130px;    }      .my-container>div:last-child {        background: pink;        margin: 10px 0;        padding: 10px;        height: 130px;    }     .my-container>div>div {        width: 100px;        height: 100px;        margin: 5px 10px;        padding: 10px;        float: left;        /* 过渡时间 */        transition:width 2s, height 2s, transform 2s;        -webkit-transition:width 2s, height 2s, -webkit-transform 2s; /* Safari and Chrome */    }     .my-container>div:first-child>div {        background: #ccc;    }     .my-container>div:last-child>div {        background: #fff;    }    </style>    <div class="my-container">        <div class="div1">            <div id="A">子容器A</div>            <div id="B">子容器B</div>        </div>        <div class="div2">            <div id="C">子容器C</div>            <div id="D">子容器D</div>        </div>    </div>    交换元素:    <select name="" id="select1" class="select">        <option value="A">A</option>        <option value="B">B</option>        <option value="C">C</option>        <option value="D">D</option>    </select>    <select name="" id="select2" class="select">        <option value="A">A</option>        <option value="B">B</option>        <option value="C">C</option>        <option value="D">D</option>    </select>    <script>    $(function() {        $('.select').on('change',function(){            var select1=$('#select1');            var select2=$('#select2');            if(select1.val()!=select2.val()){//不同元素  位置交换                var removeDiv1=$('#'+select1.val());                var removeDiv2=$('#'+select2.val());                var appendToObj1=hasBorther(removeDiv1);                var appendToObj2=hasBorther(removeDiv2);                addCartoon(removeDiv1,removeDiv2);//添加动画                //移动两个容器                removeDiv(appendToObj1,removeDiv2);                removeDiv(appendToObj2,removeDiv1);                             }else{                alert('请选择不同元素交换位置!');            }        })         //判断其后边是否存在兄弟元素        function hasBorther(va1){            if(va1.next()[0]){//兄弟元素                return {bor:va1.next()};            }else{                return {par:va1.parent()};//父元素            }        }        //保证位置正确        function removeDiv(app,Div){            if(app.bor){//兄弟元素               Div.insertBefore(app.bor);            }else{               Div.appendTo(app.par);            }         }         //移动时之前------添加动画        function addCartoon(a,b){            var clearTransform=function(Div,time){                setTimeout(function(){                    Div.css({'transform':'inherit','-webkit-transform':'inherit'});                   },time)            }            //记录两容器原始高宽            var oldOpt={ax:a.width(),ay:a.height(),bx:b.width(),by:b.height()};             //获取两容器屏幕位置            var a_pos=a.offset();            var b_pos=b.offset();            //获取两容器偏移值            var offset_x=a_pos.left-b_pos.left;            var offset_y=a_pos.top-b_pos.top;             //第一个花括号里面是动画内容,可以为空,但不能省去中括号            a.animate({},function(){                   var offset_x_=-offset_x; //偏移值取反                var offset_y_=-offset_y;                                                  var transformStr='rotate(360deg) translate('+offset_x_+'px,'+offset_y_+'px)';                a.css({'width':oldOpt.bx+'px','height':oldOpt.by+'px','transform':transformStr,'-webkit-transform':transformStr});                clearTransform(a,0);                        })              b.animate({},function(){                  var transformStr='rotate(360deg) translate('+offset_x+'px,'+offset_y+'px)';                b.css({'width':oldOpt.ax+'px','height':oldOpt.ay+'px','transform':transformStr,'-webkit-transform':transformStr});                clearTransform(b,0);            })        }             })    </script></body> </html>

  


  • 2020-04-15 21:14:13

    .d.ts与.ts的区别 .d.ts怎么用

    在TypeScript项目中直接引入Javascript包是不能使用的,因为包中缺少TypeScript类型声明,如果是自己写的包,可以考虑自己增加一个.d.ts类型声明文件,如果代码比较多或者使用的是第三方的包,自己写就比较麻烦了。第三方的包首先考虑找一个别人写好的声明文件,如果没有可以使用一些自动生成声明文件的工具。

  • 2020-04-17 09:27:38

    推荐一个老前端开发者的博客

    前端修炼场,首页标签大全greenSock前端研究VUE研究我们的作品flash技术探讨开发心得个人档案培训与招聘服务报价

  • 2020-04-17 09:41:47

    前端css博客推荐

    这个博客有大量的css内容,有svg,TweenMax等教程,抽空通读一下

  • 2020-04-17 10:20:47

    GreenSocks Animation Platform详细工作机制以及TweenMax用法

    GSAP(GreenSocks Animation Platform)是一个性能较好的前端动画库。最近在写一个前端SVG动画编辑器时选择了它作为底层的动画库。为了减少踩坑,我大致浏览了它的源代码,这篇文章主要是对我的理解进行记录。 我会先简单介绍一下这个动画库的API,再介绍它的插件机制,最后会从一个用例出发跟踪其运行机制。

  • 2020-04-17 10:39:02

    CSS 滤镜技巧与细节,实现火焰,融合等特效

    简单来说,CSS 滤镜就是提供类似 PS 的图形特效,像模糊,锐化或元素变色等功能。通常被用于调整图片,背景和边界的渲染。本文就会围绕这些滤镜展开,看看具体能怎么使用或者玩出什么花活。

  • 2020-04-17 10:42:29

    (三)TweenMax运动效果

    运动效果 实例化对象.set() 立刻运动到指定地点,不用加时间

  • 2020-04-17 11:19:55

    Vue中的is和操作DOM

    vue中is的属性引入是为了解决dom结构中对放入html的元素有限制的问题,譬如ul里面要接上li的标签,引入is的属性后,你完全可以写成这样

  • 2020-04-17 11:27:48

    TweenMax中文初级教程一

    TweenMax.js集成了GreenSock动画平台的大部分核心功能,且具有极高的兼容性。