本次要实现的是一种常见的网页效果,如下:

页面由头部,导航,主体内容三部分组成,当页面发生滚动时,头部逐渐隐藏,导航部分向上移动,直到导航部分距离浏览器顶部为零时,导航部分固定不动,保持吸顶效果,如下所示:

我们分三步实现上面的效果。

首先是页面的基础结构,为了简化操作,将头部、导航部分和主体内容部分全部用图片表示。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style>
*{
margin: 0;
padding: 0;
list-style: none;
border:none
}
img{
vertical-align: top;
width: 100%;
} section{
width: 70%;
margin: 0 auto;
} </style>
</head>
<body>
<header id="head">
<img src="data:images/top.png" alt="">
</header>
<nav id="nav">
<img src="data:images/nav.png" alt="">
</nav>
<section>
<img src="data:images/body01.png" alt="">
<img src="data:images/body02.png" alt="">
</section>
</body>
</html>

此时,一个基本的页面效果已经出来了,我们再来做一个提前准备,就是监听滚动事件,所以需要用到上一篇所封装的方法和之前用的根据id获取元素方法:

<script>
function scroll() {
if(window.pageYOffset !== null){
return {
top: window.pageYOffset,
left: window.pageXOffset
}
}else if(document.compatMode === "CSS1Compat"){ // W3C
return {
top: document.documentElement.scrollTop,
left: document.documentElement.scrollLeft
}
}else{
return {
top: document.body.scrollTop,
left: document.body.scrollLeft
}
}
}
function $(id) {
  return typeof id === "string" ? document.getElementById(id) : null;
  }</script>

至此,所有的准备都完成了,我们再来分析理想的效果:当浏览器发生滚动时,页面向上卷起,直到顶部完全卷起,即浏览器的卷起部分等于导航部分最初距离顶部边缘的距离,此时,吸顶的部分即导航部分位于浏览器顶部,继续滚动时,主体部分发生了滚动,但导航部分的位置不再发生变化:

1,找到临界位置,卷起高度==初始化时导航部分距离浏览器顶部的高度

2,赋予导航部分吸顶效果:position:fixed

3,卷起高度变大时,继续吸顶,卷起高度变小时,取消吸顶

根据上面的分析,我们前面的基础上继续完善代码:

<style>
.nav{
position: fixed;
left: 0;
top:0;
width: 100%;
} </style> <script>
window.onload = function () {
// 1. 求出offsetHeight
var nav_top_height = $("nav").offsetTop; // 2. 监听窗口滚动
window.onscroll = function () {
var scroll_top_height = scroll().top;
console.log(scroll_top_height); // 2.1 判断
if(scroll_top_height >= nav_top_height){
$("nav").className = "nav";
}else {
$("nav").className = "";
}
}
}
</script>

这样,简易的吸顶效果就实现了,完整代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style>
*{
margin: 0;
padding: 0;
list-style: none;
border:none
}
img{
vertical-align: top;
width: 100%;
} section{
width: 70%;
margin: 0 auto;
} .nav{
position: fixed;
left: 0;
top:0;
width: 100%;
} </style>
</head>
<body>
<header id="head">
<img src="data:images/top.png" alt="">
</header>
<nav id="nav">
<img src="data:images/nav.png" alt="">
</nav>
<section>
<img src="data:images/body01.png" alt="">
<img src="data:images/body02.png" alt="">
</section> <script>
function scroll() {
if(window.pageYOffset !== null){
return {
top: window.pageYOffset,
left: window.pageXOffset
}
}else if(document.compatMode === "CSS1Compat"){ // W3C
return {
top: document.documentElement.scrollTop,
left: document.documentElement.scrollLeft
}
}else{
return {
top: document.body.scrollTop,
left: document.body.scrollLeft
}
}
}
function $(id) {
  return typeof id === "string" ? document.getElementById(id) : null;
  }
window.onload = function () {
// 1. 求出offsetHeight
var nav_top_height = $("nav").offsetTop; // 2. 监听窗口滚动
window.onscroll = function () {
var scroll_top_height = scroll().top;
console.log(scroll_top_height); // 2.1 判断
if(scroll_top_height >= nav_top_height){
$("nav").className = "nav";
}else {
$("nav").className = "";
}
}
}
</script>
</body>
</html>

完整详细代码下载:点这里

基于scroll的吸顶效果的更多相关文章

  1. 自定义tab吸顶效果一(原理)

    PS:问题:什么是吸顶,吸顶有什么作用,吸顶怎么使用? 在很多app商城中,介绍软件的时候就会使用吸顶效果, 吸顶有很多作用,一个最简单粗暴的作用就是,让用户知道此刻在浏览哪个模块,并可以选择另外的模 ...

  2. better-scroll之吸顶效果巨坑挣扎中

    今天和大家分享下better-scroll这款移动端用来解决各种滚动需求的插件(目前已经支持PC) 关于其中的API大家可以去官网看下  这里就给大家介绍几种常用的以及需要注意的点是什么 首先说一下b ...

  3. react.js中实现tab吸顶效果问题

    在react项目开发中有一个需求是,页面滚动到tab所在位置时,tab要固定在顶部. 实现的思路其实很简单,就是判断当滚动距离scrollTop大于tab距离页面顶部距离offsetTop时,将tab ...

  4. Vue 事件监听实现导航栏吸顶效果(页面滚动后定位)

    Vue 事件监听实现导航栏吸顶效果(页面滚动后定位) Howie126313 关注 2017.11.19 15:05* 字数 100 阅读 3154评论 0喜欢 0 所说的吸顶效果就是在页面没有滑动之 ...

  5. tabControl组件的吸顶效果

    最开始,还没有使用better-scroll插件的时候,直接在class中设定了一定的position为sticky,设置一定的top达成了效果.但是,使用better-scroll组件后,这些属性就 ...

  6. Html吸顶效果

    Html吸顶效果 一.HTML HTML中需要给div一个id <!DOCTYPE html> <html lang="en"> <head> ...

  7. js之吸顶效果

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. [RN] React Native 头部 滑动吸顶效果的实现

    React Native 头部 滑动吸顶效果的实现 效果如下图所示: 实现方法: 一.吸顶组件封装 StickyHeader .js import * as React from 'react'; i ...

  9. js 实现吸顶效果 || 小程序的吸顶效果

    小程序吸顶效果 <!--index.wxml--> <view class="container"> <view class='outside-img ...

随机推荐

  1. js-自加和自减

    i++ 返回的是自增之前的值    先利用再加 ++i 返回的是自增之后的值    先加再利用

  2. web四则混合运算3

    一.程序要求: 可以控制下列参数: 是否有乘除法: 是否有括号(最多可以支持十个数参与计算): 数值范围: 加减有无负数: 除法有无余数!   二.设计思路 要求能够通过参数来控制有无乘除法,加减有无 ...

  3. struts2参数转换器用法

    贴代码 struts的action中接收简单类型参数,struts2可以自动转化,但是复杂类型需要自定义转换器转换 public class ConvertAction extends ActionS ...

  4. 【HAOI2014】走出金字塔

    神奇…… 原题: 在探险的过程中,考古学家Dr. Kong 无意地被困在一个金字塔中.金字塔中的每个房间都是三角形.Dr. Kong可以破壁走到相邻的房间去. 例如,如果他目前处于三角形(2,2)房间 ...

  5. 生产者消费者两种实现:wait/notifyAll和Lock/Condition

    1.wait/notifyAll /** * 面试题:写一个固定容量同步容器,拥有put和get方法,以及getCount方法, * 能够支持2个生产者线程以及10个消费者线程的阻塞调用 * * 使用 ...

  6. immutable-styles 基本试用

    此文档来自官方文档,从官方demo 学起比较快 安装 官方推荐的是通过webpack 的构建方式,通过babel loader clone 代码 git clone https://github.co ...

  7. 当 1117 遇到 MLCC 后

    当 1117 遇到 MLCC 后 AMS1117 很多人用过吧,但是当大容量的 MLCC 时会出现什么呢? 会出现问题,而且严重的问题,输出纹波会变大,会自激,会有声音出来. 这是很多工程师没有注意的 ...

  8. Reactor/Proactor的比较 (ZZ)

    一般情况下,I/O 复用机制需要事件分享器(event demultiplexor [1.3]). 事件分享器的作用,即将那些读写事件源分发给各读写事件的处理者,就像送快递的在楼下喊: 谁的什么东西送 ...

  9. 五、springboot(二)配置数据源oracle

    1.添加依赖 <!-- jpa --> <dependency> <groupId>org.springframework.boot</groupId> ...

  10. python调用hanlp分词包手记

    python调用hanlp分词包手记   Hanlp作为一款重要的分词工具,本月初的时候看到大快搜索发布了hanlp的1.7版本,新增了文本聚类.流水线分词等功能.关于hanlp1.7版本的新功能,后 ...