vue父子组件嵌套 锚点定位

父子、祖孙组件组件嵌套,父级容器监听了scroll事件:在子、孙子组建中点击相应的标题,定位到对应的位置,实现平滑滚动。

参考文章:https://blog.csdn.net/iceking66/article/details/78211213?locationnum=1&fps=1

一、在子组建中设置:

子组件页面设置如下:
菜单项:“topMenu” 为菜单数组
<button v-for="(item,index) in topMenu" :key="item.value" @click.native="jump(index)">{{item.name}}</button>

<组件1 class=".textcss"></组件1>
.....................
<组件n class=".textcss"></组件n>

在method中编写个方法
jump(index){
	let jump = document.querySelecotor('.textcss');
	let param = {
		index: index,
		jump: jump,
	};
	
	this.$root.eventHub.$emit('scrollTo',param);
}

二、父组件中编写,滚动:

父组件中 如: <div ref="viewhome"></div>

在父组件的 mounted中编写如下:
this.$root.eventHub.$on('scrollTo', (params)=>{
	let _this = this;  //这行必写
	let jump = params.jump;
	let index = params.index;
	let total = jump[index].offsetTop;
	let distance = _this.$refs.viewhome.scrollTop;
	let step = total/50;
	if(total > distance){
		smoothDown();
	} else {
		let newTotal = distance - total;
		step = newTotal / 50;
		smoothUp();
	}
	
	function smoothDown(){
		if(distance < total){
			distance += step;
			_this.$refs.viewhome.scrollTop = distance - 40; //减多少 需要根据页面调试
			//如果 _this 变成 this 提示 $refs未定义  --》这就是 开头  let _this = this;的作用
			// 这里通过$refs来操作dom来替代: document.body.scrollTop = distance   和  document.documentElement.scrollTop = distance
			setTimeout(smoothDown,10);
		}else{
			_this.$refs.viewhome.scrollTop = total - 40;
		}
	}
	
	function smoothUp(){
		if(distance > total){
			distance -= step;
			_this.$refs.viewhome.scrollTop = distance - 20;
			setTimeout(smoothUp, 10);
		}else{
			_this.$refs.viewhome.scrollTop = total - 20;
		}
	}
})


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值