其实这种效果网上好多的插件,但是我想自己实现看看,其实把思路理清实现起来就非常简单了,让我们看看:

分析:

从图中我们可以看出:右边的top=100px,那么它应该在第一个框的top+height=150px区域内,

 当鼠标滚动到第2个区域时,同理,右边的top,应该在第2个框的top+height内 ,这样思路理清了,那么接下来我们来实现吧。
<nav class="sidebar">
<ul>
<li>F1-植物王国</li>
<li>F2-动物世界</li>
<li>F3-科学探秘</li>
<li>F4-文化节日</li>
<li>F5-成长健康</li>
<li>F6-生活百科</li>
<li>F7-艺术欣赏</li>
<li>F8-语言乐园</li>
<li>F9-数学小天地</li>
</ul>
</nav>
/*侧边栏开始*/
.sidebar {
border: 1px solid #E5E9EF;
position: fixed;
width: 100px;
right: 12%;
top: 45%;
border-radius: 4px;
} .sidebar>ul { } .sidebar>ul>li {
padding: 10px;
width: 100px;
cursor: pointer;
} .sidebar .active {
background-color: #06A3D7;
color: #fff;
}
/*侧边栏结束*/
$(window).scroll(function() {
//这里是要显示的div的id,一定要按照从上到下的顺序排列,如果有新的可以往后加
var tops = [ 'f1', 'f2', 'f3', 'f4' ];
for (var i = 0; i < tops.length; i++) {
var top = $('.sidebar ul li').eq(i).offset().top;
var t = $('#' + tops[i]).offset().top;
var h = $('#' + tops[i]).height();
if (top > t && top < t + h) {
$('.sidebar ul li').removeClass('active');
$('.sidebar ul li').eq(i).addClass('active');
}
if (top < t && i == 0) {
$('.sidebar ul li').removeClass('active');
}
}
});

效果图:

总结:

1、刚开始做的时候没有思绪,然后一个朋友给了一段自己写的代码,我就参考一下然后自己优化了一下它的代码

2、默认在页面最上面应该不显示active状态,所以第2个if判断至关重要!!!

参考:

http://www.bootcss.com/p/stickup/

===========================================分割线=========================================================

上面是依据sidebar来判断div的,也就是说当div和sidebar同处同一水平线,那么导航就高亮,现在我参照bilibili的网站,它的是当div在屏幕可见区域1/4位置时导航就高亮,所以代码改成:

$(document).on('scroll', function() {
var height = $(window).height();
var tops = [ 'f1', 'f2', 'f3', 'f4' ];
for (var i = 0; i < tops.length; i++) {
var rectop = $('#' + tops[i])[0].getBoundingClientRect().top;
console.log('rectop=' + rectop)
if (rectop < height /4) {
$('.sidebar ul li').removeClass('active');
$('.sidebar ul li').eq(i).addClass('active');
} else if (i == 0) {
$('.sidebar ul li').removeClass('active');
}
}
}); $(".sidebar ul li").click(function(e) {
var index = $(this).index();
var height = $(window).height();
$("html,body").animate({
scrollTop : $('#f' + (parseInt(index) + 1)).offset().top
}, 500);
});
$(".sidebar a").click(function(e) {
$("html,body").animate({
scrollTop : $('body').offset().top
}, 500);
});

总结:这样虽然完成了,但是最后一个div如果没有达到屏幕可见区域的1/4位置,那么导航就不高亮,bilibili的做法是,直接去掉最后一个导航,而我的做法是最后div的margin-bottom设置成200px,那就会“撑”到1/4位置了。

参考:http://www.bilibili.com/

制作stick侧边栏导航效果的更多相关文章

  1. CSS实现商城分类导航效果(hover选择器)

    学完制作出这个导航效果之后,收获最多的是了解了hover选择器的功能,:hover 选择器用于选择鼠标指针浮动在上面的元素.在鼠标移到元素上时向此元素添加特殊的样式(CSS).例如:改变鼠标悬停处的元 ...

  2. 学习使用 CSS3 制作网站面包屑导航效果

    作为最重要的导航展示形式之一,面包屑导航能够让用户更清楚的知道他们所在页面的层次结构,让他们可以方便的导航到上一层页面.在本教程中,您将学习如何使用 CSS3 技术创建自己的面包屑导航效果. 效果演示 ...

  3. css制作漂亮彩带导航条菜单

    点击这里查看效果:http://keleyi.com/keleyi/phtml/divcss/17.htm 效果图: 以下是源代码: <!DOCTYPE html PUBLIC "-/ ...

  4. Simptip – 使用 Sass 制作的 CSS Tooltip 效果

    Simptip 是一个简单基于 Sass 的 CSS 工具提示效果.帮助你在网站中加入在不同的方向(上.左.右.下)的工具提示,也可以设置不同的颜色如成功.信息.警告和危险.最后还有其他特性如软边.半 ...

  5. Smint – 用于单页网站制作的 jQuery 导航菜单插件

    Smint 是一款用于实现单页风格网站的 jQuery 导航插件,包含两部分:固定在页面顶部的精美导航条和能够在你点击的时候自动滚动到对应内容的菜单按钮.Smint 使用非常简单,只有一个参数用于设置 ...

  6. 利用TabHost制作QQ客户端标签栏效果(低版本QQ)

    学习一定要从基础学起,只有有一个好的基础,我们才会变得更加的perfect 下面小编将利用TabHost制作QQ客户端标签栏效果(这个版本的QQ是在前几年发布的)…. 首先我们看一下效果: 看到这个界 ...

  7. CSS3特效----制作3D旋转导航

    大致思路:首先给 three-d-box 设置一个 transition是不可少的 然后每个 a 标签里面有两个 span 一个叫 font 一个叫 back,默认状态下 font 旋转0度,也就是没 ...

  8. Extjs6(四)——侧边栏导航根据路由跳转页面

    本文基于ext-6.0.0 之前做的时候这个侧边栏导航是通过tab切换来切换页面的,但是总感觉不太对劲,现在终于发现怎么通过路由跳转了,分享给大家,可能有些不完善的地方,望大家读后可以给些指点.欢迎留 ...

  9. vue侧边栏导航和右边内容一样高

    vue侧边栏导航和右边内容一样高吗? 失败了,最后用做导航和上导航 定位, 右内容类似滚动条 效果: 直接把top导航和左侧导航栏display:flxed定位左边,右边内容left: top

随机推荐

  1. Maven基础配置--nexus私服配置

    登录nexus私服后台,按照下图1-3的顺序进行添加仓库: 其中步骤3有三种仓库类型(Type)进行选择 1. Hosted Repository:本地仓库,在私服服务器上存放用户自行上传的jar包: ...

  2. 按要求编写一个Java应用程序: (1)编写一个矩形类Rect,包含: 两个属性:矩形的宽width;矩形的高height。 两个构造方法: 1.一个带有两个参数的构造方法,用于将width和height属性初化; 2.一个不带参数的构造方法,将矩形初始化为宽和高都为10。 两个方法: 求矩形面积的方法area() 求矩形周长的方法perimeter() (2)通过继承Rect类编写一个具有确定位

    package com.hanqi.test; public class Rect { ; ; public double getWidth() { return width; } public vo ...

  3. tomcat黑/白名单设置

    vim $tomcat_home/conf/server.xml(可以单个IP或者多个ip,多个ip用|分隔,支持正则) <Context path=" reloadable=&quo ...

  4. x01.os.14: 时间都去哪儿了

    时间都去哪儿了 老帕的“花儿为什么这样红”,三分钟引起六次欢呼,却败给了张碧晨.试想一下,如果是人气更高的陈冰,即使唱得和张碧晨一模一样,可能仍然不敌老帕,为什么张碧晨就能取胜呢?有这么个笑话:一人弹 ...

  5. XSS quiz练习题做题过程及感悟

    XSS quiz 最近刚学XSS.所以新手理解如有错误不当,欢迎批评指正. 第1题 一开始做,使用了Chrome浏览器.第一题怎么都做不出来.突然想起来使用IE,打开IE11,才成功了. <sc ...

  6. 盘点国内程序员不常用的热门iOS第三方库:看完,还敢自称”精通iOS开发”吗?【转载】

    综合github上各个项目的关注度与具体使用情况,涵盖功能,UI,数据库,自动化测试,编程工具等类型,看完,还敢自称”精通iOS开发”吗? https://github.com/syedhali/EZ ...

  7. ubuntu编译最新版本WebKit

    好久都没更新webkit 源码在ubuntu上编译了,网上搜了一下,基本上都是早期编译的webkit版本.可能是大家都去搞高大上的谷歌浏览器了吧. 今天就以ubuntu14.04版本作为编译环境来讲讲 ...

  8. C#类型转换运算符之 explicit implicit

    类型转换运算符 explicit和implicit用于声明用户定义的类型转换运算符,如果可以确保转换过程不会造成数据丢失,则可使用这两个关键字在用户定义的类型和其他类型之间进行转换. explicit ...

  9. jQuery学习笔记(一):入门

      jQuery学习笔记(一):入门 一.JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察. 不使用JQuery时获取DOM文本的操 ...

  10. I/O工作机制

    I/O问题是任何编程语言都无法回避的问题,可以说I/O是整个人机交互的核心问题,因为I/O是机器获取和交换信息的主要渠道.java的I/O操作类在包java.io下,大概有将近80个类,这些类大概可以 ...