滚动楼层导航html,vue css 滚动楼层导航定位

理解滚动图

e6e731fcd3a73f03191c85d7623bbb9e.png

左右结构

f393856ac595a7378e5f4d597bd7dde4.png

class="floor-item"

v-for="item in floorList"

:key="item.id">

{{ item.name }}

export default {

name: 'IFloor',

data () {

return {

element: {

nav_item: null,

floor_item: null

},

timer: null,

floorList: [

{ id: 1, name: 'F1' },

{ id: 2, name: 'F2' },

{ id: 3, name: 'F3' },

{ id: 4, name: 'F4' },

{ id: 5, name: 'F5' },

{ id: 6, name: 'F6' }

],

navItemIndex: 0,

}

},

mounted () {

this.element = {

nav_item: document.getElementsByClassName('nav-list-item'),

floor_item: document.getElementsByClassName('floor-item')

}

this.element.nav_item[0].classList.add('active')

// window.addEventListener('scroll', this.floorSrcollEventListener)

},

beforeDestroy () {

// window.removeEventListener('scroll', this.floorSrcollEventListener)

},

methods: {

/**

* 根据下标改变菜单样式

* @param {Number} index 楼层下标

*/

changeNavClass(index) {

this.element.nav_item[this.navItemIndex].classList.remove('active');

this.element.nav_item[index].classList.remove('active');

this.navItemIndex = index;

},

/**

* 设置楼层导航事件驱动方法

* @param {Number} index 楼层下标

*/

setFloorNavMountClick (index) {

const { floor_item } = this.element

const floor_offsetTop = floor_item[index].offsetTop - floor_item[0].offsetTop,

window_scrollTop = document.documentElement.scrollTop || document.body.scrollTop,

timer = {

step: 60,

times: 16,

FLOOR_OFFSETTOP: floor_offsetTop,

}

if (window_scrollTop > floor_offsetTop) {

this.setFloorScrollArrowUp(timer)

} else if (window_scrollTop == floor_offsetTop) {

return false

} else {

this.setFloorScrollArrowDown(timer)

}

},

/**

* 设置楼层向上滚动

* @param {Object} timer 定时器配置

*/

setFloorScrollArrowUp (timer) {

clearInterval(this.timer)

this.timer = setInterval(() => {

let window_scrollTop = document.documentElement.scrollTop || document.body.scrollTop

if (window_scrollTop <= timer.FLOOR_OFFSETTOP) {

document.documentElement.scrollTop = timer.FLOOR_OFFSETTOP

document.body.scrollTop = timer.FLOOR_OFFSETTOP

clearInterval(this.timer)

} else {

document.documentElement.scrollTop = window_scrollTop - timer.step

document.body.scrollTop = window_scrollTop - timer.step

}

}, timer.times)

},

/**

* 设置楼层向下滚动

* @param {Object} timer 定时器配置

*/

setFloorScrollArrowDown (timer) {

clearInterval(this.timer)

this.timer = setInterval(() => {

let window_scrollTop = document.documentElement.scrollTop || document.body.scrollTop

// 这里多加了一个大一点的值,需要精确的就这里自己算一下,我随便写了个500,

// 不加会导致window_scrollTop一直小于timer.FLOOR_OFFSETTOP,

// 退出不了setInterval,导致滑动失效一直在底部。

if (window_scrollTop + 500 >= timer.FLOOR_OFFSETTOP) {

document.documentElement.scrollTop = timer.FLOOR_OFFSETTOP

document.body.scrollTop = timer.FLOOR_OFFSETTOP

clearInterval(this.timer)

} else {

document.documentElement.scrollTop = window_scrollTop + timer.step

document.body.scrollTop = window_scrollTop - timer.step

}

}, timer.times)

},

// /**

// * 监听窗口滚动楼层导航动态定位

// */

// floorSrcollEventListener () {

// const { nav_item, floor_item } = this.element

// const window_scrollTop = document.documentElement.scrollTop || document.body.scrollTop

// for (let i = 0, len = floor_item.length; i < len; i++) {

// let floor_offsetTop = floor_item[i].offsetTop - floor_item[0].offsetTop

// if (window_scrollTop >= floor_offsetTop) {

// for (let n = 0, len = nav_item.length; n < len; n++) {

// const current_classList = nav_item[n].classList

// i === n

// ? current_classList.add('active')

// : current_classList.remove('active')

// }

// }

// }

// }

}

}

.floor-warpper {

width: 1000px;

margin: auto;

}

.floor-nav {

/*position: fixed;*/

float: left;

width: 100px;

}

.nav-list {

width: 100%;

padding: 0;

display: inline-block;

text-align: center;

/*background-color: #f8f8f8;*/

}

.nav-list-item {

display: inline-block;

width: 100%;

height: 100%;

line-height: 48px;

vertical-align: middle;

align-self: center;

border-bottom: 1px solid #fff;

cursor: pointer;

}

.nav-list-item.active,

.nav-list-item:hover {

/*color: #FFF;*/

background-color: #C9C9C9;

}

.wrap-body {

margin-left: 120px;

border-left: dashed #1c1c1c 1px;

}

.floor-item {

margin-left: 20px;

width: 95%;

/*margin: 60px auto;*/

min-height: 300px;

text-align: center;

color: #FFF;

background-color: #404040;

}

原左边固定不变

b6b10d812b6377c3eae77fb996085082.png

class="floor-item"

v-for="item in floorList"

:key="item.id">

{{ item.name }}

export default {

name: 'IFloor',

data () {

return {

element: {

nav_item: null,

floor_item: null

},

timer: null,

floorList: [

{ id: 1, name: 'F1' },

{ id: 2, name: 'F2' },

{ id: 3, name: 'F3' },

{ id: 4, name: 'F4' },

{ id: 5, name: 'F5' },

{ id: 6, name: 'F6' }

]

}

},

mounted () {

this.element = {

nav_item: document.getElementsByClassName('nav-list-item'),

floor_item: document.getElementsByClassName('floor-item')

}

this.element.nav_item[0].classList.add('active')

window.addEventListener('scroll', this.floorSrcollEventListener)

},

beforeDestroy () {

window.removeEventListener('scroll', this.floorSrcollEventListener)

},

methods: {

/**

* 设置楼层导航事件驱动方法

* @param {Number} index 楼层下标

*/

setFloorNavMountClick (index) {

const { floor_item } = this.element

const floor_offsetTop = floor_item[index].offsetTop - floor_item[0].offsetTop,

window_scrollTop = document.documentElement.scrollTop || document.body.scrollTop,

timer = {

step: 60,

times: 16,

FLOOR_OFFSETTOP: floor_offsetTop,

}

if (window_scrollTop > floor_offsetTop) {

this.setFloorScrollArrowUp(timer)

} else if (window_scrollTop == floor_offsetTop) {

return false

} else {

this.setFloorScrollArrowDown(timer)

}

},

/**

* 设置楼层向上滚动

* @param {Object} timer 定时器配置

*/

setFloorScrollArrowUp (timer) {

clearInterval(this.timer)

this.timer = setInterval(() => {

let window_scrollTop = document.documentElement.scrollTop || document.body.scrollTop

if (window_scrollTop <= timer.FLOOR_OFFSETTOP) {

document.documentElement.scrollTop = timer.FLOOR_OFFSETTOP

document.body.scrollTop = timer.FLOOR_OFFSETTOP

clearInterval(this.timer)

} else {

document.documentElement.scrollTop = window_scrollTop - timer.step

document.body.scrollTop = window_scrollTop - timer.step

}

}, timer.times)

},

/**

* 设置楼层向下滚动

* @param {Object} timer 定时器配置

*/

setFloorScrollArrowDown (timer) {

clearInterval(this.timer)

this.timer = setInterval(() => {

let window_scrollTop = document.documentElement.scrollTop || document.body.scrollTop

if (window_scrollTop + 500 >= timer.FLOOR_OFFSETTOP) {

document.documentElement.scrollTop = timer.FLOOR_OFFSETTOP

document.body.scrollTop = timer.FLOOR_OFFSETTOP

clearInterval(this.timer)

} else {

document.documentElement.scrollTop = window_scrollTop + timer.step

document.body.scrollTop = window_scrollTop - timer.step

}

}, timer.times)

},

/**

* 监听窗口滚动楼层导航动态定位

*/

floorSrcollEventListener () {

const { nav_item, floor_item } = this.element

const window_scrollTop = document.documentElement.scrollTop || document.body.scrollTop

for (let i = 0, len = floor_item.length; i < len; i++) {

let floor_offsetTop = floor_item[i].offsetTop - floor_item[0].offsetTop

if (window_scrollTop >= floor_offsetTop) {

for (let n = 0, len = nav_item.length; n < len; n++) {

const current_classList = nav_item[n].classList

i === n

? current_classList.add('active')

: current_classList.remove('active')

}

}

}

}

}

}

.floor-warpper {

width: 1000px;

margin: auto;

}

.floor-nav {

position: fixed;

top: 200px;

left: 50px;

}

.nav-list {

width: 48px;

padding: 0;

display: inline-block;

text-align: center;

background-color: #f8f8f8;

}

.nav-list-item {

display: inline-block;

width: 100%;

height: 100%;

line-height: 48px;

vertical-align: middle;

align-self: center;

border-bottom: 1px solid #fff;

cursor: pointer;

}

.nav-list-item.active,

.nav-list-item:hover {

color: #FFF;

background-color: #404040;

}

.floor-item {

width: 100%;

margin: 60px auto;

min-height: 300px;

text-align: center;

color: #FFF;

background-color: #404040;

}

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于Vue· 美籍华人尤雨溪所作,文档健全,生态完整,与脸谱的React各领前端半边天下;· 相对于React,Vue相对于初学者更容易上手;· 目前统治C端市场的跨平台框架uni-app也是基于Vue的基础技术栈进行开发;· Vue与React在框架设计上有极高的相似度,上手Vue以后,我们可以轻松过渡到React学习;课程特色· 零基础教学,由浅入深,轻松诙谐,物超所值;· 基于官方文档教学,在学习Vue的同时学习阅读文档的方式,授人以鱼更授人以渔;· 课程包含Vuex和Vue-Router最新版内容,即所谓【Vue全家桶开发】;· 完整包含Vue3全部内容;· 含京东商城完整项目从零到一开发过程;· 含最新版@vue/cli的开发和生产环境打包流程;· 含Vite两套脚手架的开发和生产环境打包流程;· 含项目部署上线全流程;· 含自定义组件库高阶课程,带你从零到一完成电梯组件开发与发布;· 附Vue高频面试题50余道,OFFER轻松斩获;课程收益· 掌握Vue2+Vue3的框架基础知识;· 掌握Vue全家桶项目开发+打包+上线全流程;· 掌握自定义组件库技巧;· 掌握Vue高频面试题回答技巧;课程关键词Vue2 Vue3 Vuex Vue-RouterVue项目 Vue全家桶@vue/cli Vite 项目打包 项目上线 自定义组件库 Vue面试题写在最后就连太阳光照到地球都需要8分钟,所以,你也需要时间,耐心一点,持续修炼。 

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值