前端实战(一):锚点跳转与滚动条监听

目录

开发环境

实现效果

技术要点及代码

一、querySelectorAll() 方法

二、scrollIntoView()方法

实战核心代码


开发环境

HBuilder X开发工具下通过CDN的方式引入vue2.0以及Element-UI

<!--引入vue2.0-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.10/dist/vue.js"></script>
<!--引入elementui-->
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">

实现效果

技术要点及代码

一、querySelectorAll() 方法

querySelectorAll() 方法返回文档中匹配指定 CSS 选择器的所有元素,返回NodeList对象。NodeList 对象表示节点的集合。可以通过索引访问,索引值从 0 开始。你可以使用 NodeList 对象的length属性来获取匹配选择器的元素属性,然后你可以遍历所有元素,从而获取你想要的信息。

elementList = document.querySelectorAll(selectors);
  • elementList 是一个静态的 NodeList 类型的对象;
  • selectors 是一个由逗号连接的包含一个或多个 CSS 选择器的字符串。

二、scrollIntoView()方法

scrollIntoView()方法将指定的元素滚动到浏览器窗口的可见区域。

实例

var elmnt = document.getElementById("content");
elmnt.scrollIntoView();

语法:

element.scrollIntoView(); // 等同于element.scrollIntoView(true)
element.scrollIntoView(alignToTop); //布尔参数
element.scrollIntoView(scrollIntoViewOptions); //对象参数

语法参数:

alignToTop参数详情
true元素的顶部将对齐到可滚动祖先的可见区域的顶部。对应于scrollIntoViewOptions: {block: "start", inline: "nearest"}
false元素的底部将与可滚动祖先的可见区域的底部对齐。对应于scrollIntoViewOptions: {block: "end", inline: "nearest"}
scrollIntoViewOptions参数详情
behavior定义过渡动画。"auto","instant""smooth"。默认为"auto"
block"start""center""end""nearest"。默认为"center"
inline"start""center""end""nearest"。默认为"nearest"
  • behavior 表示滚动方式。auto 表示使用当前元素的 scroll-behavior 样式。instant 和 smooth 表示 直接滚到底 和 使用平滑滚动
  • block 表示块级元素排列方向要滚动到的位置。对于默认的 writing-mode: horizontal-tb 来说,就是竖直方向。start 表示将视口的顶部和元素顶部对齐;center 表示将视口的中间和元素的中间对齐;end 表示将视口的底部和元素底部对齐;nearest 表示就近对齐。
  • inline 表示行内元素排列方向要滚动到的位置。对于默认的 writing-mode: horizontal-tb 来说,就是水平方向。其值与 block 类似。

实战核心代码

<div id="app">
	<el-dialog title="作文集" :visible.sync="dialogVisible" width="50%" class="spec-dialog"  :close-on-click-modal="false" @close="closeDialog()">
		<el-row>
			<el-col :span="4" style="height:150px">
				<el-steps direction="vertical" :active="active" finish-status="success">
					<el-step title="作文一" @click.native="goRule('zwy')"></el-step>
					<el-step title="作文二" @click.native="goRule('zwe')"></el-step>
					<el-step title="作文三" @click.native="goRule('zws')"></el-step>
				</el-steps>
			</el-col>
			<el-col :span="20">
				  <div class="scoll_box" @scroll="onScroll" id="scrollElement" ref="myScroll">
						<span id="zwy" class="scroll-item">作文一</span>
						<el-divider></el-divider>
						<div class="scroll_content">
							内容1
						</div>
						<span id="zwe" class="scroll-item">作文二</span>
						<el-divider></el-divider>
						<div class="scroll_content">
			                内容2
						</div>
						<span id="zws" class="scroll-item">作文三</span>
						<el-divider></el-divider>
						<div class="scroll_content">
							内容3
						</div>
				</div>
			</el-col>
		</el-row>
	</el-dialog>
</div>
<script type="text/javascript">
		var app = new Vue({
			el: "#app",
			data: {
				dialogVisible: true,
				active: 0
			},
			methods: {
				//锚点跳转
				goRule(event) {
					var id = "#" + event;
					document.querySelector(id).scrollIntoView({
						behavior: "smooth",
						block: "start",
						inline: "nearest",
					});
					if (this.active++ > 2) this.active = 0;
				},
				//监听滚动条
				onScroll(e) {
					let scrollItems = document.querySelectorAll(".scroll_content");
					for (let i = scrollItems.length - 1; i >= 0; i--) {
						// 判断滚动条滚动距离是否大于当前滚动项可滚动距离
						let judge = e.target.scrollTop >= scrollItems[i].offsetTop - scrollItems[0].offsetTop;
						//监听滚动条是否到底部
						const dom = document.getElementById('scrollElement');
						let scrollHeight = dom.clientHeight + dom.scrollTop >= dom.scrollHeight;
						if (judge) {
							this.active = i;
							if (scrollHeight) {
								//到达底部,步骤条完成
								this.active = i + 1;
								break;
							}
							break;
						}
					}
				},
				//关闭弹窗,重置元素
				closeDialog() {
					this.active = 0;
					this.$refs.myScroll.scrollTop = 0;
				}
			}
		})
	</script>
<style>
         /**
		 * el-divider 虚线
		 */
		.el-divider--horizontal {
			margin: 8px 0;
			background: 0 0;
			border-top: 1px dashed #e8eaec;
		}

		/**
		 * 滚动条start
         * 不使用el-dialog的滚动条,通过overflow: hidden和overflow-y: scroll 让指定元素产生滚动条
		 */
		.el-dialog__wrapper {
			overflow: hidden;
		}
		.scoll_box {
			height: 380px;
			overflow: hidden;
			overflow-y: scroll;
			font-size: 15px;
		}
        
		/**
		 * 滚动条end
		 */

		.scoll_box>div {
			margin-bottom: 10px;
		}

		.scoll_box>span {
			font-size: 20px;
		}

		.scroll-item {
			font-weight: bold;
			font-size: 25px;
		}
	</style>

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: 好的,我可以帮您写一个简单的 Vue 登录界面代码。 以下是一个示例代码: ``` <template> <div> <form> <label for="username">用户名:</label> <input id="username" v-model="username" type="text" /> <br /> <label for="password">密码:</label> <input id="password" v-model="password" type="password" /> <br /> <button @click.prevent="ha ### 回答2: 使用JavaScript创建一个锚点跳转需要以下步骤: 1. 在 HTML 中定义一个带有 `id `属性的目标元素,作为锚点跳转目标。例如: ``` <div id="target">这是跳转目标</div> ``` 2. 在 HTML 中定义一个触发锚点跳转的元素,例如一个按钮或者链接。例如: ``` <a href="#" onclick="jump()">点击跳转</a> ``` 3. 在 JavaScript 中编写 `jump()` 函数,该函数将通过 `scrollIntoView()` 方法使目标元素滚动到可见区域,从而实现锚点跳转。例如: ``` function jump() { var element = document.getElementById("target"); element.scrollIntoView(); } ``` 4. 将 `jump()` 函数与触发元素的 `onclick` 事件关联起来,以实现点击触发跳转功能。例如: ``` <a href="#" onclick="jump()">点击跳转</a> ``` 现在当点击带有 `onclick="jump()"` 的链接时,页面将自动滚动到具有 `id="target"` 的目标元素处。 注意:以上代码仅为示例,您可以根据自己的需求修改锚点跳转目标的 `id` 和触发元素的代码。 ### 回答3: 当需要在网页中实现锚点跳转时,我们可以使用JavaScript来改变浏览器的滚动位置。以下是一个简单的示例,展示如何使用JavaScript实现锚点跳转: ```html <!DOCTYPE html> <html> <head> <title>锚点跳转示例</title> <style> /* 用于测试的样式 */ .section { height: 500px; } </style> </head> <body> <nav> <ul> <li><a href="#section1">Section 1</a></li> <li><a href="#section2">Section 2</a></li> <li><a href="#section3">Section 3</a></li> </ul> </nav> <section id="section1" class="section"> <h2>Section 1</h2> <p>这是第一部分的内容。</p> </section> <section id="section2" class="section"> <h2>Section 2</h2> <p>这是第二部分的内容。</p> </section> <section id="section3" class="section"> <h2>Section 3</h2> <p>这是第三部分的内容。</p> </section> <script> // 获取所有锚点的<a>标签 const anchors = document.querySelectorAll('a[href^="#"]'); // 遍历所有锚点 anchors.forEach(anchor => { // 添加点击事件监听器 anchor.addEventListener('click', function (e) { e.preventDefault(); // 阻止默认的链接行为 const targetId = this.getAttribute('href'); // 获取目标锚点的id const targetElement = document.querySelector(targetId); // 获取目标锚点的元素 if (targetElement) { // 使用scrollIntoView方法滚动到目标元素 targetElement.scrollIntoView({ behavior: 'smooth' // 平滑滚动,如果需要可选的 }); } }); }); </script> </body> </html> ``` 在这个示例中,我们首先创建了一个包含多个锚点的导航栏。每个链接的`href`属性值以`#`开头,指向相应的锚点。然后,在JavaScript中,我们使用`querySelectorAll`方法获取到所有的锚点`<a>`标签,并使用`forEach`方法遍历它们。然后,我们为每个锚点添加了一个`click`事件监听器。当用户点击一个锚点链接时,监听器会阻止默认的链接行为,获取目标锚点的id并使用`querySelector`方法获取目标元素。最后,我们使用目标元素的`scrollIntoView`方法,可以平滑滚动到该元素所在的位置。 通过这种方式,我们可以实现一个基本的锚点跳转功能。当点击导航栏中的链接时,页面会平滑滚动到指定的锚点位置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@李优秀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值