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

分析:

从图中我们可以看出:右边的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. 【ASH】如何导出视图DBA_HIST_ACTIVE_SESS_HISTORY的查询结果数据

    [ASH]如何导出视图DBA_HIST_ACTIVE_SESS_HISTORY的查询结果数据 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后 ...

  2. jQuery简单入门(五)

    5.Ajax应用 在jQuery中$ajax()方法属于最底层的方法,第二层是load().$.get().$.post(),第三层是$.getScript()和 $.getJSON():下面根据使用 ...

  3. 通过HostOnly Cookie为Cookie正确的设置一级域名

    前言 用户行为分析,最重要的一点就是通过埋点准确的获取用户的Cookie,那么这个Cookie到底怎么设置呢?那么如果面对的是站群,用户Cookie又该怎么设置,才能让访客量和新访客量准确无误呢? 接 ...

  4. Sql server2012连接Sql server 2008时出现的问题:已成功与服务器建立连接,但在登陆过程中发生错误。(provider:SSL Provider,error:0-接收到的消息异常,或格式不正确。)

    以前连接是正常的,就这两天连不上了.(没有耐心的直接看末尾解决办法) 错误消息如下: 1.尝试读取或写入受保护的内存.这通常指示其他内存已损坏.(System.Data) 2.已成功与服务器建立连接, ...

  5. Neutron分析(4)—— neutron-dhcp-agent

    一.概述 neutron dhcp为租户网络提供DHCP服务,即IP地址动态分配,另外还会提供metadata请求服务. 3个主要的部件: DHCP agent scheduler:负责DHCP ag ...

  6. 周一干不干活-PHP+MySQLi

    hi 本来是雄心壮志的要干活的,哪知天有不测,早上大阴天起不来,中午又回寝室折腾衣服(做女工啊,牛不牛)没睡午觉,这样的迷糊状态,怎么科研,写这个好了. 1.PHP的OOP编程 4.7 多态 --定义 ...

  7. dedecms调用标签总结(一)

    dedecms 基本包含了一个常规网站需要的一切功能,拥有完善的中文学习资料,很容易上手,学习成本较低.学会dedecms 的模板修改.栏目新增.内容模型新增和常用的标签调用方法后,即便我们不懂 ph ...

  8. 配置WebSite的IIS时遇到的问题与解决方法

    http://www.cnblogs.com/mingmingruyuedlut/archive/2011/11/04/2235630.html#commentform

  9. u3d_shader_surface_shader_6

    主题:1.膨胀效果:2.surface shader实际生成的代码: o(︶︿︶)o  粘贴复制代码易,理解透彻代码难... 一:膨胀效果 1.在#pragma 编译指令里添加vertex:vert以 ...

  10. java 28 - 6 JDK7的新特性

    JDK7的新特性: 二进制字面量 数字字面量可以出现下划线 switch 语句可以用字符串 泛型简化 异常的多个catch合并 try-with-resources 语句 二进制字面量 JDK7开始, ...