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>

  


  • 2017-02-10 15:19:51

    Git:代码冲突常见解决方法

    如果系统中有一些配置文件在服务器上做了配置修改,然后后续开发又新添加一些配置项的时候, 在发布这个配置文件的时候,会发生代码冲突:

  • 2017-02-10 15:24:14

    linux学习之——vim简明教程

    学习 vim 并且其会成为你最后一个使用的文本编辑器。没有比这个更好的文本编辑器了,非常地难学,但是却不可思议地好用。 我建议下面这四个步骤: 存活 感觉良好 觉得更好,更强,更快 使用VIM的超能力

  • 2017-02-10 16:22:13

    git历史记录查询

    查看提交历史:git log 查看提交历史并显示版本间的差异:git log -p 查看指定历史:git log xxx(sha1值) -p 查看提交历史(指定时间):

  • 2017-02-13 17:50:05

    cURL error 60: SSL certificate problem: unable to get local issuer certificate

    Drupal 8 version uses Guzzle Http Client internally, but under the hood it may use cURL or PHP internals. If you installed PHP cURL on your PHP server it typically uses cURL and you may see an exception with error Peer certificate cannot be authenticated with known CA certificates or error code CURLE_SSL_CACERT (60).