基于scroll的吸顶效果
本次要实现的是一种常见的网页效果,如下:
页面由头部,导航,主体内容三部分组成,当页面发生滚动时,头部逐渐隐藏,导航部分向上移动,直到导航部分距离浏览器顶部为零时,导航部分固定不动,保持吸顶效果,如下所示:
我们分三步实现上面的效果。
首先是页面的基础结构,为了简化操作,将头部、导航部分和主体内容部分全部用图片表示。
<!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的吸顶效果的更多相关文章
- 自定义tab吸顶效果一(原理)
PS:问题:什么是吸顶,吸顶有什么作用,吸顶怎么使用? 在很多app商城中,介绍软件的时候就会使用吸顶效果, 吸顶有很多作用,一个最简单粗暴的作用就是,让用户知道此刻在浏览哪个模块,并可以选择另外的模 ...
- better-scroll之吸顶效果巨坑挣扎中
今天和大家分享下better-scroll这款移动端用来解决各种滚动需求的插件(目前已经支持PC) 关于其中的API大家可以去官网看下 这里就给大家介绍几种常用的以及需要注意的点是什么 首先说一下b ...
- react.js中实现tab吸顶效果问题
在react项目开发中有一个需求是,页面滚动到tab所在位置时,tab要固定在顶部. 实现的思路其实很简单,就是判断当滚动距离scrollTop大于tab距离页面顶部距离offsetTop时,将tab ...
- Vue 事件监听实现导航栏吸顶效果(页面滚动后定位)
Vue 事件监听实现导航栏吸顶效果(页面滚动后定位) Howie126313 关注 2017.11.19 15:05* 字数 100 阅读 3154评论 0喜欢 0 所说的吸顶效果就是在页面没有滑动之 ...
- tabControl组件的吸顶效果
最开始,还没有使用better-scroll插件的时候,直接在class中设定了一定的position为sticky,设置一定的top达成了效果.但是,使用better-scroll组件后,这些属性就 ...
- Html吸顶效果
Html吸顶效果 一.HTML HTML中需要给div一个id <!DOCTYPE html> <html lang="en"> <head> ...
- js之吸顶效果
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [RN] React Native 头部 滑动吸顶效果的实现
React Native 头部 滑动吸顶效果的实现 效果如下图所示: 实现方法: 一.吸顶组件封装 StickyHeader .js import * as React from 'react'; i ...
- js 实现吸顶效果 || 小程序的吸顶效果
小程序吸顶效果 <!--index.wxml--> <view class="container"> <view class='outside-img ...
随机推荐
- Windows 清理磁盘
====手动清理C盘(开始\运行\cleanmgr,选择C盘...)或者如下右键C盘,选择属性,点击通用页签下方[磁盘清理]按钮.磁盘清理界面,中间部分可以选择要清理的项目,可以全选.然后点击下方的清 ...
- C++学习(二十七)(C语言部分)之 预处理命令
结构体 联合 枚举 联合 只能保存最后赋值的结果枚举 所有可能值列出来 预处理命令是在编译前期的阶段 代码-(编译)-->可执行文件(exe)预编译 编译前对代码处理 *1.插入头文件的内容 # ...
- ios存储图片注意
以下方法可以解决 ios不能长按图片保存到手机的问题 -webkit-touch-callout:default;
- mysql 之mvcc多版本控制
MVCC是multiversion concurrency control的缩写,提供MySQL事物隔离级别下无锁读,例如一个事物在执行update等修改数据的sql,并未提交时其他事物进行数据读取是 ...
- ansible-playbook入门实例解析
[root@localhost tlsit]# ansible-playbook a.yml PLAY [test] ***************************************** ...
- linux 控制结构
一.if 注: 格式1.格式2:一个条件一个命令: 格式3:一个条件两个命令: 格式4:两个条件三个命令,注意条件的写法. 例1: #!/bin/sh#ifTest#to show the metho ...
- Thread与ThreadPool的内存之战
Thread与ThreadPool使用的时候在内存里对象是如何分布的呢? 今天我们就从内存堆的角度分析下两者. 先上小白鼠代码: static void Main(string[] args) ...
- 用Promise对象实现的 Ajax 操作
- mysql查询相关问题
前言 本文实现的这个需求其实十分普遍,举例来说,我们存在一个用户来源表,用来标记用户从哪个渠道注册进来.表结构如下所示… 其中 origin 是用户来源,其中的值有 iPhone .Android . ...
- C编程技巧资源
Keil C 位变量外部引用的方法 https://blog.csdn.net/zh458042230/article/details/8627604 单片机Keil C51 C语言多文件如何使用全局 ...