📅  最后修改于: 2023-12-03 15:08:53.938000             🧑  作者: Mango
在JavaScript中,可以使用HTML5和CSS3的一些新特性,以及一些简单的代码实现制作楼梯效果。
首先,我们需要在HTML文档中创建一个容器,用来包含楼梯的所有元素。我们选择使用一个有序列表(<ol>
标签)来实现。
<ol id="stairs"></ol>
为了使楼梯的样式更加美观,我们可以使用CSS来设置一些样式。这里先提供一个简单的样式,实际生产中可以自行根据需求修改。
#stairs {
list-style: none;
padding: 0;
margin: 0;
display: flex;
justify-content: center;
}
#stairs li {
width: 50px;
height: 50px;
margin: 0 10px;
background-color: #ccc;
border-radius: 50%;
cursor: pointer;
}
#stairs li.active {
background-color: #f00;
}
以上样式用于给楼梯容器和楼梯元素设置样式。其中,楼梯容器为 #stairs
,楼梯元素为 #stairs li
。这里设置了每个楼梯的宽度、高度、背景颜色、圆角、鼠标指针样式等。最后一个选择器 #stairs li.active
用于为活动状态的楼梯元素添加样式。
现在我们开始编写JavaScript代码。
首先,我们需要获取这些HTML元素。可以使用document.querySelector()
方法。
const stairs = document.querySelector("#stairs"); // 获取楼梯容器
const steps = document.querySelectorAll("#stairs li"); // 获取楼梯元素
const length = steps.length; // 获取楼梯的数量
下一步,我们需要为每个楼梯元素添加点击事件。当用户单击一个楼梯时,页面将滚动到该楼层。
for (let i = 0; i < length; i++) {
steps[i].addEventListener("click", function () {
// do something
});
}
然后,我们需要获取每个楼层在页面中的位置。我们可以使用 document.querySelectorAll()
方法来获取所有楼层元素,然后再用 getBoundingClientRect()
方法获取它们在窗口中的位置。
const floors = document.querySelectorAll(".floor"); // 获取所有楼层元素
const floorPositions = []; // 存储每个楼层的位置
floors.forEach(function (floor) {
const { top } = floor.getBoundingClientRect();
floorPositions.push(top);
});
接下来,我们需要为活动状态的楼层元素添加样式。我们可以使用 window.pageYOffset
属性获取窗口当前的滚动位置。只需判断这个位置是否在某个楼层的范围内,然后为那个楼层元素添加样式即可。
function setActiveStep() {
const position = window.pageYOffset;
for (let i = 0; i < floorPositions.length; i++) {
if (position < floorPositions[i]) {
steps.forEach((step) => step.classList.remove("active"));
steps[i].classList.add("active");
break;
}
}
}
window.addEventListener("scroll", setActiveStep);
最后,当用户单击某个楼层时,页面需要滚动到该楼层。我们可以使用 window.scrollTo()
方法实现。
steps[i].addEventListener("click", function () {
window.scrollTo({
top: floorPositions[i],
behavior: "smooth",
});
});
完整的HTML、CSS和JavaScript结合起来,形成一个简单的楼梯效果。可以在一个HTML文档中放置多个楼层元素,然后将每个楼层的位置存储在 floorPositions
数组中,即可实现一个基本的楼梯效果。
<ol id="stairs">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ol>
<div class="floor" id="floor1">楼层1</div>
<div class="floor" id="floor2">楼层2</div>
<div class="floor" id="floor3">楼层3</div>
<div class="floor" id="floor4">楼层4</div>
<style>
#stairs {
list-style: none;
padding: 0;
margin: 0;
display: flex;
justify-content: center;
}
#stairs li {
width: 50px;
height: 50px;
margin: 0 10px;
background-color: #ccc;
border-radius: 50%;
cursor: pointer;
}
#stairs li.active {
background-color: #f00;
}
</style>
<script>
const stairs = document.querySelector("#stairs"); // 获取楼梯容器
const steps = document.querySelectorAll("#stairs li"); // 获取楼梯元素
const length = steps.length; // 获取楼梯的数量
const floors = document.querySelectorAll(".floor"); // 获取所有楼层元素
const floorPositions = []; // 存储每个楼层的位置
floors.forEach(function (floor) {
const { top } = floor.getBoundingClientRect();
floorPositions.push(top);
});
function setActiveStep() {
const position = window.pageYOffset;
for (let i = 0; i < floorPositions.length; i++) {
if (position < floorPositions[i]) {
steps.forEach((step) => step.classList.remove("active"));
steps[i].classList.add("active");
break;
}
}
}
window.addEventListener("scroll", setActiveStep);
for (let i = 0; i < length; i++) {
steps[i].addEventListener("click", function () {
window.scrollTo({
top: floorPositions[i],
behavior: "smooth",
});
});
}
</script>