1.语法:这个方法没有参数。
rectObject = object.getBoundingClientRect();
2.返回值类型: rectObject.top:元素上边到视窗上边的距离;
rectObject.right:元素右边到视窗左边的距离;
rectObject.bottom:元素下边到视窗上边的距离;
rectObject.left:元素左边到视窗左边的距离;
3. IE67的left、top会少2px,并且没有width、height属性。
这个很简单,给导航栏的每一个元素加一个点击事件,其实也可以通过a标签的锚点来实现
<li v-for="(item, index) in navs"
:key="index"
:class="{click: selector==index}"
@click="toHash(item, index)">
{{item}}
</li>
// 点击右侧导航栏
toHash(item, index) {
this.selector = index;
window.location.hash = item;
// 导航栏向上滚动相应距离,一个li的高度为54px
this.$refs.left.scrollTop = (index > 7 ? index-7 : 0)*54;
}
右侧内容监听一个scroll事件,当触发滑动事件的时候获取粘性定位在顶部的标题,根据标题使导航栏定位到相应的li
var obj = element.getBoundingClientRect();
上述api返回一个对象obj,该对象有left、top等属性,可以根据该属性获得element元素在页面的位置
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);
}
}
}
#el {
position: sticky;
top: 0;
}
该元素定位表现为在跨越特定阈值前为相对定位,之后为固定定位。这也实现了内容区标题栏始终在顶部的效果。关于粘性定位更多的可以看这里
当我们点击添加按钮的时候其他的内容会缓慢弹出,这个是靠css的动画实现的。
我们先将个数减少按钮和被选中物品个数num的left设为48px,使其被隐藏。点击添加按钮时选择物品个数大于0则让left变为0达到一个缓慢弹出的动画效果。
<div :class="{pop: true, mov: item.num>0}">
<!---->
</div>
.pop {
display: inline-block;
position: relative;
left: 48px;
opacity: 0;
transition: all ease .5s;
}
.mov {
left: 0;
opacity: 1;
}
先准备n个小球,为什么不是一个呢?因为如果用户连续点击添加可能会出现小球不够的情况,所以需要多个小球。
<!-- 运动的小球 -->
<div id="points">
<div class="pointOuter pointPre">
<div class="point-inner"></div>
</div>
<!--其他n个小球-->
</div>
令小球为绝对定位这样可以改变它的left和top。
动画实现思路:用户点击添加时将一个小球的位置设置为被点击元素的位置,且获取目的地位置(购物车位置),当小球抛出时使其运动方式按照贝塞尔曲线过渡。
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);
}
以上是饿了么购物车模块主页面的几个主要技术点。上面的DOM操作可以改成使用vue的动画组件 transition 进行优化,感觉会更好,我在项目中使用了transition组件进行优化,代码更加简洁。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有