css3的animation实现购物车小球飞入效果

一.思路

这里写图片描述
1.在body下添加5个元素并绝对定位,且display:none;(5个元素是防止用户连续点击)
2.单机页面的某一处位置,并将第一个dispaly:none;的dom定位到单机位置
3.使用css3将定位后的dom运动到目标,并去除style,设置display:none;

二.实现

html

<body>
    <p>在页面的任何位置点击,将有一个小球飞入类为d-targer圆形容器中,可以连续点击</p>
    <div id="ttt" class="d-target"></div>
</body>

css

.d-target{
    width: 100px;
    height: 100px;
    border: 1px solid #ccc;
    border-radius: 50%;
    position: absolute;
    left: 100px;
    bottom: 100px;
}

.outer{
    width: 30px;
    height: 30px;
    position: absolute;
    left: 0px;
    top: 0px;
    transition: all 0.35s linear;
}
.outer .inner{
    width: 30px;
    height: 30px;
    background: #ccc;
    border-radius: 50%;
    transition: all 0.35s cubic-bezier(0.39,-0.4,0.83,0.23);
    position: absolute;
}
.outer.point-pre{
    display: none;
}

js

window.onload = function () {
    /* add elements */
    function addElements(CLASSNAME_OUTER,CLASSNAME_INNER) {
        var outerWrapper = document.createElement('div');
        var outer = null;
        var inner = null;
        for (var i = 0; i< 5; i++) {
            outer = document.createElement('div');
            outer.classList.add(CLASSNAME_OUTER);
            outer.classList.add('point-pre');
            // outer.setAttribute('class', CLASSNAME_OUTER+" point-pre");
            // outer.setAttribute('myshow', 'hide');
            inner = document.createElement('div');
            inner.setAttribute('class', CLASSNAME_INNER);
            outer.appendChild(inner);
            outerWrapper.appendChild(outer);
            inner = null;
            outer = null;
        }
        document.body.appendChild(outerWrapper);
        return outerWrapper;
    }

    /* 获取终止点的相对于窗口的坐标 */
    function getEndCoordinate (ele) {
        var left = ele.offsetLeft;
        var top  = ele.offsetTop;
        return [left,top];
    }

    /* 获取outer下myshow属性为hide的第一个元素 */
    function getElementMyShowHide (parentElement,CLASSNAME_SHOW_NONE) {
        var result = null;
        var childElements = parentElement.getElementsByClassName(CLASSNAME_SHOW_NONE);
        result = childElements[0];

        return result;
    }

    var CLASSNAME_OUTER = 'outer';
    var CLASSNAME_INNER = 'inner';
    // 增加小球元素
    var outerWrapper = addElements(CLASSNAME_OUTER,CLASSNAME_INNER);
    var endLeft = getEndCoordinate(document.getElementById('ttt'))[0];
    var endTop  = getEndCoordinate(document.getElementById('ttt'))[1];

    // 真实中的购物车实现是这里的click事件绑在添加购物车的按钮或者类似按钮的dom上
    window.addEventListener('click', function (event) {
        // 当双击的时候,小球会从(0,0)的位置落入目标区,以下为当双击的时候,只会第一次点击的setTimeout会被清除
        // 所以只会显示一次从点击地点到目标区的运动
        // 但是依然会执行第一次的逻辑,因为内部两个setTimeout没有被清除
        clearTimeout(timer);
        var timer = setTimeout(function () {
            var left = event.offsetX;
            var top  = event.offsetY;
            // 定位球元素
            var childElement = getElementMyShowHide(outerWrapper,'point-pre');
            childElement.style.left = left + 'px';
            childElement.style.top = top + 'px';
            // 计算坐标差
            var leftDifference = -(left - endLeft);
            var topDifference = -(top - endTop);
            // 开始
            childElement.classList.remove('point-pre');
            setTimeout(function () {
                childElement.getElementsByClassName('inner')[0].style.transform = `translateY(${topDifference}px)`;
                childElement.style.transform = `translateX(${leftDifference}px)`;
                setTimeout(function () {
                    childElement.getElementsByClassName('inner')[0].setAttribute('style', '');
                    childElement.setAttribute('style', '');
                    childElement.classList.add('point-pre');
                }, 350);
            }, 1);
        }, 30);
    });
}

三.关于动画

<div class="outer">
    <div class="inner"></div>
</div>

实现曲线运动是使用如上dom结构,
运动的时候,让outer进行水平运动(tanslateX(n)),让inner进行垂直运动(translateY(n))
当然这不会出现想要的曲线运动
outer会沿着x轴运动,inner会出现想要的曲线运动,这时outer就不需要被看到,可以设置无背景或者背景透明

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值