那些年原生js实现的楼层跳转
最近做一个需求~~楼层跳转(京东、淘宝侧边导航),由于现在项目都用框架,所以 jquery是不能再用了,只好自己原生写一个,其实实现起来很简单,无非就是获取到每个楼层距离文档顶部的距离,然后通过控制滚动条来实现,麻烦的是需求在变,由于突然引出了一个锚点导航遇到了fixed,所以只好重新思考,满足需求。
简单的楼层跳转样例可以先看一下之前写的demo(https://lewiscutey.github.io/yintai),看起来效果很好吧,下面详解其中的坑:
1.锚点导航遇到fixed
现在布局一般都要box-sizing:border-box/content-box,所以不要再用padding-top:50px;margin-top:-50px;这种写法了,最好直接写一个子元素来定位,这样既不占空间,又可以精确定位,下面是简易的demo:
.floor {
position: relative;
#anchor{
position: absolute;
top: -56px;
width: 100%;
}
}
2.子元素永远比父元素层级z-index高
大家总是习以为常的拿z-index来决定层级,当有时候就算z-index:9999!important;还是不起作用的时候,也许就是父子元素定位出了问题,这样唯一的解决办法就是给他们在加一个父元素,原来的父子元素现在变成了兄弟方可有效,呜呜,不幸中招。
3.慎用getBoundingClientRect()
大家可能对这个方法有点陌生,其实就是用来获取dom节点对于bom的相对位置,今天要说的这个坑是当页面中有锚点链接时,直接路由进来的页面会显示到锚点的内容区域,从而通过getBoundingClientRect()获取到的值就会乱套,因此如果用作楼层跳转里楼层高度获取值时,就会失效了,所以慎用这个获取相对位置的方法,我们一般用offsetTop来获取dom节点对于bom的相对位置,这就要求把该dom直接作为body的子元素,经检测方便可靠,下面是一个简单的demo:
let flag = true;
let floorHeights = [];
let slideBar = document.querySelector("#slide-bar");
let floors = document.querySelectorAll(".floor");
let floorLinks = document.querySelectorAll("#slide-bar .floor-link");
for (let i = 0; i < floors.length; i++){
floorHeights.push(floors[i].offsetTop - 56);
}
window.onscroll = function() {
let scrollTop = document.body.scrollTop||document.documentElement.scrollTop;
if(scrollTop > 750){
if(flag){
flag = false;
slideBar.style.bottom = '50%';
}
}else{
if(!flag){
flag = true;
slideBar.style.bottom = '-200%';
}
}
for (let i = 0; i < floorHeights.length; i++) {
if(floorHeights[i] < scrollTop + 200){
for (let j = 0; j < floorHeights.length; j++) {
floorLinks[j].style.opacity = 0;
}
floorLinks[i].style.opacity = 1;
}
}
}
window.onscroll();
for (let i = 0; i < floorLinks.length; i++) {
floorLinks[i].index = i;
floorLinks[i].onmouseover = function(){
for (let j = 0; j < floorLinks.length; j++) {
floorLinks[j].style.opacity = 0;
}
this.style.opacity = 1;
} floorLinks[i].onclick = function() {
for (let j = 0; j < floorLinks.length-1; j++) {
floorLinks[j].style.opacity = 0;
}
document.body.scrollTop = floorHeights[this.index];
document.documentElement.scrollTop = floorHeights[this.index];
} floorLinks[floorLinks.length-1].onclick = function() {
document.body.scrollTop = 0;
document.documentElement.scrollTop = 0;
}
}
哈哈,命名即思维,我相信通过代码大家可以弄的一清二楚,下面附上经典老图(一图胜千言)!

以后要把这些琐碎的知识点记录下来,就如阮一峰老师所说的:炫耀从来不是我的动机,好奇才是,一边学习,一边记录!
那些年原生js实现的楼层跳转的更多相关文章
- 原生js阻止表单跳转
/* W3C浏览器下的 */ var forms = document.getElementById("from") forms.addEventListener('submit' ...
- jQuery跳转到另一个页面以及原生js跳转到另一个页面
1.原生js我们可以利用http的重定向来跳转 window.location.replace("https://www.cnblogs.com/pythonywy/"); 2.原 ...
- 原生JS实现banner图的滚动与跳转
HTML部分: <div id="banner"> <!--4张滚动的图片--> <div id="inside"> < ...
- js各种特效轮播图,选项卡,放大镜,窗口拖拽,楼层跳转
// 透明度轮播图 // img:轮播图片 // dot:轮播点 // lbtn:左箭头 // rbtn:右箭头 // banner:轮播盒子 // active:轮播点选中效果类名 // time: ...
- 原生js焦点轮播图
原生js焦点轮播图主要注意这几点: 1.前后按钮实现切换,同时注意辅助图2.中间的button随着前后按钮对应切换,同时按button也能跳转到相应的index3.间隔调用与无限轮播.4.注意在动画时 ...
- 使用原生js写ajax
// 使用原生js 封装ajax // 兼容xhr对象 function createXHR(){ if(typeof XMLHttpRequest != "undefined") ...
- 原生JS面向对象思想封装轮播图组件
原生JS面向对象思想封装轮播图组件 在前端页面开发过程中,页面中的轮播图特效很常见,因此我就想封装一个自己的原生JS的轮播图组件.有了这个需求就开始着手准备了,代码当然是以简洁为目标,轮播图的各个功能 ...
- 原生js实现轮播图
原生js实现轮播图 很多网站上都有轮播图,但找到一个系统讲解的却很难,因此这里做一个简单的介绍,希望大家都能有所收获,如果有哪些不正确的地方,希望大家可以指出. 原理: 将一些图片在一行中平铺,然后计 ...
- 利用原生js制做数据管理平台,适合初学者学习
摘要:数据管理平台在当今社会中运用十分广泛,我们在应用过程中,要对数据进行存储,管理,以及删除查询等操作,而我们在实际设计的时候,大牛们大多用到的是JQuery,而小白对jq理解也较困难,为了让大家回 ...
随机推荐
- 大白话Vue源码系列目录
.first-level{ font-size: 1.2rem; cursor: default; color: #666; } .second-level{ font-size: 1.1rem; p ...
- jsp内置对象 的使用范围和类型【说明】
jsp内置对象 jsp内置对象有以下9种,我们会在后面的章节中分别介绍他们.这9种对象例如以下: 名称 类型 使用范围 request javax.servlet.http.HttpServletRe ...
- Gradle笔记——构建基础
本篇文章主要介绍一下Gradle的构建基础. 它看起来似乎和android项目没多大关系.不能让人一下子理解android项目中的Gradle配置文件,可是这篇基础真的非常重要. 学习Gradle前, ...
- OVS 总体架构、源码结构及数据流程全面解析
在前文「从 Bridge 到 OVS」中,我们已经对 OVS 进行了一番探索.本文决定从 OVS 的整体架构到各个组件都进行一个详细的介绍. OVS 架构 OVS 是产品级的虚拟交换机,大量应用在生产 ...
- Laravel技巧之记录多日志
相信每个小伙伴在使用laravel的时候都会记录日志.查看日志.那么问题来了,比如我在对接zabbix接口的时候,使用 Log::info() 会让日志全部记录在 storage/logs/larav ...
- Intellij IDEA更新SVN没有提示语
更新SVN时IDE下方没有提示语句 解决方法: 点击编辑器右下方的 Event Log 按钮 打开 Show balloons 就可以显示了.
- shell编写mysql抽取数据脚本
#!/bin/bash DT=`date +%Y%m%d` #当前日期YESTERDAY=`date -d "yesterday" +%Y-%m-%d` #昨天,用于处理数据的日期 ...
- 实现我博客旁边的线条效果 html canvas-nest.js 源码
canvas-nest.js 这个js文件可以用来实现炫酷的线条与鼠标进行交互的功能,具体效果如图所示 js具体源码如下: /** * Copyright (c) 2016 hustcc * Lice ...
- Javascript之模拟文字高亮
在我们平时浏览网页的时候,我们常常会用到Ctrl+F(搜索)功能,被搜索到的文字就是高亮显示.那么,如何在Javascript中模拟文字高亮显示这一功能呢? 以下为笔者写的样例代码: <!DOC ...
- 【python】递归(阶乘、斐波纳契、汉诺塔)