前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >商品添加到购物车动画getBoundingClientRect获取元素位置

商品添加到购物车动画getBoundingClientRect获取元素位置

作者头像
javascript.shop
发布2019-09-04 16:34:23
1.6K0
发布2019-09-04 16:34:23
举报
文章被收录于专栏:杰的记事本杰的记事本

语法

1.语法:这个方法没有参数。

代码语言:javascript
复制
        rectObject = object.getBoundingClientRect();

2.返回值类型: rectObject.top:元素上边到视窗上边的距离;

rectObject.right:元素右边到视窗左边的距离;

rectObject.bottom:元素下边到视窗上边的距离;

rectObject.left:元素左边到视窗左边的距离;

3. IE67的left、top会少2px,并且没有width、height属性。

效果图

实现功能

1. 联动菜单

1.1 用户点击左侧导航栏会跳转到相应的内容

这个很简单,给导航栏的每一个元素加一个点击事件,其实也可以通过a标签的锚点来实现

代码语言:javascript
复制
<li v-for="(item, index) in navs" 
    :key="index" 
    :class="{click: selector==index}"
    @click="toHash(item, index)">
    {{item}}
</li>
复制代码
复制代码
代码语言:javascript
复制
// 点击右侧导航栏
toHash(item, index) {
    this.selector = index;
    window.location.hash = item; 
    
    // 导航栏向上滚动相应距离,一个li的高度为54px
    this.$refs.left.scrollTop = (index > 7 ? index-7 : 0)*54;
}
复制代码
复制代码

1.2 用户滑动右侧的内容左侧的导航栏会响应式改变

右侧内容监听一个scroll事件,当触发滑动事件的时候获取粘性定位在顶部的标题,根据标题使导航栏定位到相应的li

代码语言:javascript
复制
var obj = element.getBoundingClientRect();

上述api返回一个对象obj,该对象有left、top等属性,可以根据该属性获得element元素在页面的位置

复制代码
复制代码
代码语言:javascript
复制
listScroll() {
    // 为了达到联动效果,右侧滑动则改变左侧导航栏样式
    var titles = document.getElementsByClassName('goodTitle');
    for(var i = 0; i < titles.length; i++) {
        var style = titles[i].getBoundingClientRect();
        if(style.top == 107) {
            this.toHash(titles[i].innerHTML, i);
        }
    }
}
复制代码
复制代码

1.3 标题栏粘性定位

代码语言:javascript
复制
#el {
    position: sticky;
    top: 0;
}

该元素定位表现为在跨越特定阈值前为相对定位,之后为固定定位。这也实现了内容区标题栏始终在顶部的效果。关于粘性定位更多的可以看这里

2. 按钮缓慢弹出

当我们点击添加按钮的时候其他的内容会缓慢弹出,这个是靠css的动画实现的。

我们先将个数减少按钮和被选中物品个数num的left设为48px,使其被隐藏。点击添加按钮时选择物品个数大于0则让left变为0达到一个缓慢弹出的动画效果。

代码语言:javascript
复制
 <div :class="{pop: true, mov: item.num>0}">
    <!---->
 </div>
代码语言:javascript
复制
.pop {
    display: inline-block;
    position: relative;
    left: 48px;
    opacity: 0;
    transition: all ease .5s;
}
.mov {
    left: 0;
    opacity: 1;
}

3.小球飞入购物车动画

先准备n个小球,为什么不是一个呢?因为如果用户连续点击添加可能会出现小球不够的情况,所以需要多个小球。

代码语言:javascript
复制
<!-- 运动的小球 -->
<div id="points">
    <div class="pointOuter pointPre">
        <div class="point-inner"></div>
    </div>  
    <!--其他n个小球-->
</div>

令小球为绝对定位这样可以改变它的left和top。

动画实现思路:用户点击添加时将一个小球的位置设置为被点击元素的位置,且获取目的地位置(购物车位置),当小球抛出时使其运动方式按照贝塞尔曲线过渡。

代码语言:javascript
复制
increase(index1, index2, event) { 
    
    // some code...
    
    // 小球动画 
    var top = event.clientY, // 小球降落起点
        left = event.clientX,
        endTop = window.innerHeight - 30,  // 小球降落终点
        endLeft = 20; 

    // // 小球到达起点并去掉小球的display: none;
    var outer = $('#points .pointPre').first().removeClass("pointPre").css({
        left: left + 'px',
        top: top + 'px'
    });
    var inner = outer.find(".point-inner"); 

    setTimeout(function() { 
        // 将jquery对象转换为DOM对象
        outer[0].style.webkitTransform = 'translate3d(0,' + (endTop - top) + 'px,0)';
        inner[0].style.webkitTransform = 'translate3d(' + (endLeft - left) + 'px,0,0)';
        
        // 小球运动完毕恢复到原点
        setTimeout(function() {
            outer.removeAttr("style").addClass("pointPre");
            inner.removeAttr("style");
        }, 1000);  //这里的延迟值和小球的运动时间相关
    }, 1); 
}
注意点:
  • 嵌套的setTimeout中的时间之所以设置为1s,是因为css中规定的小球运动时间为1s,所以在小球1s运动完以后会令它恢复到原来的位置,你想想,小球一共就只有那么几个,如果不恢复的话下次用户点击了小球就不够啊…

总结

以上是饿了么购物车模块主页面的几个主要技术点。上面的DOM操作可以改成使用vue的动画组件 transition 进行优化,感觉会更好,我在项目中使用了transition组件进行优化,代码更加简洁。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年3月12日2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 语法
  • 效果图
  • 实现功能
    • 1. 联动菜单
      • 1.1 用户点击左侧导航栏会跳转到相应的内容
      • 1.2 用户滑动右侧的内容左侧的导航栏会响应式改变
      • 1.3 标题栏粘性定位
    • 2. 按钮缓慢弹出
      • 3.小球飞入购物车动画
      • 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档