vue实现stickUp的效果
2017-12-05 21:30
316 查看
先学习这篇文章
顶部吸顶的效果查看
效果1:
效果2:
顶部吸顶的效果查看
效果1:
效果2:
<template> <div> <header class="header" ref='header'>高度250</header> <ul class="nav" :class="{isFixed:isFixed}" ref="nav"> <li class="item" v-for="(item,index) in new Array(4)" :key="index" @click="selectItem(index)" :class="{'current':currentIndex===index}">{{index+1}},高度50</li> </ul> <div class="fakeNavHeight" v-if="isFixed"></div> <ul class="content"> <li class="tips" ref="foodList" v-for="(item,index) in new Array(4)" :key="index">{{index+1}}</li> </ul> </div> </template>
<script> var throttle = require('lodash/throttle'); //从lodash中引入的throttle节流函数 export default { name: 'stickUp', data() { return { listHeight: [], // currentIndex: 0, isFixed: false, //是否固定的 throttleScroll: null, //定义一个截流函数的变量, scrollTop: 0, //页面实时滚动的距离 headerHeight: '', //header部分的高度, navHeight: '', //nav部分的高度, }; }, computed: { currentIndex() { console.info('scrollTop', this.scrollTop, 'headerHeight', this.headerHeight, 'n dcb5 avHeight', this.navHeight); for (let i = 0; i < this.listHeight.length; i++) { let height1 = this.listHeight[i]; let height2 = this.listHeight[i + 1]; if (this.scrollTop - this.headerHeight >= height1 && this.scrollTop - this.headerHeight < height2) { return i; } else if ($(window).height() + this.scrollTop + 20 >= $(document).height()) { //到达底部还有20px 触发currentIndex选中 , 只针对最后一个元素不满整屏的高度的时候 return this.listHeight.length - 2; } } return 0; }, }, methods: { selectItem(index) { console.info('index', index); //恒定时间 var speed = 200; //滑动的速度 $('body,html').animate({ scrollTop: this.listHeight[index] + this.headerHeight }, speed); return false; }, //滚动的函数 handleScroll() { this.headerHeight = $(this.$refs.header).outerHeight(); //header的高度 this.scrollTop = $(window).scrollTop(); //滚动的距离的,为什么这里使用的jq,因为不用考虑的什么的兼容问题 this.navHeight = $(this.$refs.nav).outerHeight(); //nav的高度 //判断是否吸顶效果 if (this.scrollTop > this.headerHeight) { this.isFixed = true; } else { this.isFixed = false; } }, _calculateHeight() { let foodList = this.$refs.foodList; let height = 0; this.listHeight.push(height); for (let i = 0; i < foodList.length; i++) { let item = foodList[i]; height += item.clientHeight; this.listHeight.push(height); } console.info('每个东西的高度', this.listHeight, '页面总的高度', $(window).height(), $(document).height()); }, }, mounted() { this.$nextTick(() => { //这里使用监听的scroll的事件,为什么要使用的节流函数,如果不使用的,页面一直在滚动计算的,这样在 //使用手机时候,出现非常卡的,隔一段时间计算,大大降低了性能的消耗(具体的好处自己去查资料) window.addEventListener('scroll', this.throttleScroll, false); this._calculateHeight(); }); this.throttleScroll = throttle(this.handleScroll, 100); }, destroyed() { //离开页面需要remove这个监听器,不然还是卡到爆。 window.removeEventListener('scroll', this.throttleScroll); }, }; </script>
<style lang="scss" scoped> .header { height: 5rem; width: 100%; background-color: red; } .nav { display: flex; height: 1rem; background-color: transparent; line-height: 1rem; text-align: center; width: 100%; &.isFixed { position: fixed; left: 0; top: 0; z-index: 9999; } .item { flex: 1; &.current { background-color: #000; color: #fff; font-weight: 900; } } } .fakeNavHeight { height: 1rem; width: 100%; } .content { .tips { height: 15rem; width: 100%; &:first-child { background-color: red; } &:nth-child(2) { background-color: pink; } &:nth-child(3) { background-color: yellow; } &:last-child { background-color: blue; height: 6rem; } } } </style>
相关文章推荐
- vue中用动态组件实现选项卡切换效果
- Vue-router结合transition实现app前进后退动画切换效果
- Vue实现内部组件轮播切换效果的示例代码
- vue实现滑动切换效果(仅在手机模式下可用)
- Vue 使用 Mint UI 实现左滑删除效果CellSwipe
- vue组件实现弹出框点击显示隐藏效果
- vue实现app页面切换效果
- vue实现标签云效果
- (五)vue开发 - 使用 vue-layer-mobile组件实现toast,loading效果
- vue 在微信端实现前进左滑,返回右滑的动画效果
- Vue-router结合transition实现app前进后退动画切换效果
- VUE 实现tab切换页面效果
- vue.js+mock.js+node.js实现移动端翻页效果
- vue+ElementUI实现订单页动态添加产品数据效果实例代码
- Vue如何使用vue-area-linkage实现地址三级联动效果 很多时候我们需要使用地址三级联动,即省市区三级联动。网上有很多插件,在此介绍Vue的一款地区联动插件:vue-ar
- vue2.0 使用element-ui里的upload组件实现图片预览效果方法
- 详解vue2.0 使用动态组件实现 Tab 标签页切换效果(vue-cli)
- 用Vue实现好友分组效果
- Vue2路由动画效果实现
- vue结合Echarts实现点击高亮效果的示例