解决固定导航时锚点偏移问题

最近Bootstrap修改了博客主题,使其支持响应式布局,并且将导航菜单固定住,不随滚到条滚动,这样做带来的影响是CategoriesTags页面点击某一个分类或者标签链接时,锚点定位必然定位于页面顶部,这样一来就会被固定住的导航遮挡,例如,我在Categories页面,点击hbase分类,锚点定位最后如下图:

网上查找了一些资料,找到一篇文章点击锚点让定位偏移顶部,这篇文章提到几种解决办法:

第一种,使用css将锚点偏移:

<a class="target-fix" ></a>
<artivle>主体内容...</article>

css如下:

.target-fix {
    position: relative;
    top: -44px; /*偏移值*/
    display: block;
    height: 0;
    overflow: hidden;
}

对于现代浏览器如果支持css的:target声明,可以这么设置:

article.a-post:target{
    padding-top:44px;
}

第二种,使用JavaScript去调整scroll值:

$(function(){
  if(location.hash){
     var target = $(location.hash);
     if(target.length==1){
         var top = target.offset().top-44;
         if(top > 0){
             $('html,body').animate({scrollTop:top}, 1000);
         }
     }
  }
});

注意:上面代码中的44为固定的导航所占的像素高度,根据你的实际情况做修改。

当然,你也可以使用jquery-hashchange插件去实现上面的功能,但是需要注意jquery-hashchange是否支持你使用的JQuery版本。

$(function(){
        /* 绑定事件*/
        $(window).hashchange(function(){
            var target = $(location.hash);
            if(target.length==1){
                 var top = target.offset().top-44;
                 if(top > 0){
                     $('html,body').animate({scrollTop:top}, 1000);
                 }
             }
        });
        /* 触发事件 */
        $(window).hashchange();
});

分析上面两种方法,我最后使用的是第二种方法,在core.js文件中添加如下代码:

$('a[href^=#][href!=#]').click(function() {
  var target = document.getElementById(this.hash.slice(1));
  if (!target) return;
  var targetOffset = $(target).offset().top-70;
  $('html,body').animate({scrollTop: targetOffset}, 400);
  return false;
});

这里,我是在链接上监听单击事件,获取目标对象的偏移,上面减去70是因为下面的css代码:

#wrap {
  min-height: 100%;
  height: auto;
  margin: 0 auto -60px;
  padding: 70px 0 60px;
}

刷新页面,再次点击目录或者标签,就可以正常的跳到锚点位置了。你可以点击分类hbase 试试效果。

但是,还没有结束。如果是从其他页面,例如,在文章页面点击分类或标签时,页面却不会跳转到正确的锚点位置。这是因为上面的javascript代码只是考虑了当前页面,是在当前页面获取目标的偏离,而没有考虑在另外一个页面单击链接跳到目标页面的锚点的情况。

所以,我们需要修改代码:

var handler=function(hash){
    var target = document.getElementById(hash.slice(1));
    if (!target) return;
    var targetOffset = $(target).offset().top-70;
    $('html,body').animate({scrollTop: targetOffset}, 400);
}

$('a[href^=#][href!=#]').click(function(){
    handler(this.hash)
});

if(location.hash){ handler(location.hash) }

这样,就大功告成了,希望这篇文章对你有所帮助。

时间: 2024-12-31 20:52:25

解决固定导航时锚点偏移问题的相关文章

解决网页中使用Bootstrap固定导航时锚点偏移问题

使用Bootstrap布局了一个网页使其支持响应式布局,并且将导航菜单固定住,这样做 Categories 和 Tags 页面点击某一个分类或者标签链接时, 锚点定位必然定位于页面顶部,这样一来就会被固定住的导航遮挡 ,例如,我在Categories页面,点击 hbase 分类,锚点定位最后如下图: 找到一篇文章<点击锚点让定位偏移顶部>(底部我们给出原文) ,这篇文章提到几种解决办法:  第一种,使用css将锚点偏移: <a class="target-fix" &

Fullpage.js固定导航栏-实现定位导航栏_javascript技巧

FullPage.js 是一个简单而易于使用的插件,用来创建全屏滚动网站(也被称为单页网站).除了可以创建全屏滚动效果以外,也可以给网站添加一些水平的滑块效果.能够自适应不同的屏幕尺寸,包括平板电脑和移动设备. 开始制作自己的个人简历啦,决定要使用固定导航栏,又打算使用fullpage.js做全屏滚动. 仔细看了fullpage文档之后,发现不用额外写js代码就可以实现以下效果: 1.当滚动翻页时,导航栏也自动定位到这一页的标签 2.当然点击标签时,也是滚动到那一页而不是直接跳转的. 一.准备工

解决bootstrap导航栏navbar在IE8上存在缺陷的方法_javascript技巧

在Bootstrap的官网上,提供了一种导航栏的组件: 只要在站点文件夹放好JQ与Bootstrap输入如下代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml

CSS3单页面垂直固定导航的例子

越来越多的开发者喜欢将单页面尤其像产品介绍页面设计成用一个简单的导航条关联的页面各个重要部分(节点).本例中,一个页面由多个重要节点组成,在页面一侧会垂直展示多个简单的导航远点,滑上圆点会展示对应节点部分的名称,点击页面会滚动到对应的节点部分,而导航条位置固定不变. 当屏幕足够小时(如手机移动设备),会在屏幕右下角展示一个图标,触控图标,则会展开导航菜单,点击菜单页面会滚动到对应的节点,效果非常酷. 我们的导航条是一个无序列表ul,包含在nav.cd-vertical-nav内,通过连接a#se

解决安装Office2013时提示“该程序包安装失败”

解决安装 Office2013 时提示"该程序包安装失败",如果你在使用了 Ramdisk,并修改了TEMP临时文件夹的变量路径,那么安装Office2013时就会提示"该程序包安装失败". 主要 Ramdisk 分配的容量不够解压Office2013. 解决方法:把TEMP临时文件夹的变量路径修改回默认就可以解决啦.安装完毕后建议重新修改TEMP临时文件夹到Ramdisk.

解决参数错误时注释删除不干净遗留问题

  在解决MindManager出现参数不正确问题时,用户能够运用的方法之一就是对模板中的注释进行删除,但因为某些原因,部分用户未删除干净,那么就出现了遗留问题.本文就是主要讲解了如何解决参数错误时注释删除不干净遗留问题. 针对参数错误或不正确问题的两种解决办法分别为①更改系统区域和语言为"英语(美国)" , ②将模版中的"注释"那个小框全部删除.第一种方法不适合我们,如果用第一种方法,好多文字都会显示乱码(Unicode编码).第二种方法可以参考文章如何解决Min

vs2015-怎么解决输入-1时被当做EOF问题

问题描述 怎么解决输入-1时被当做EOF问题 循环输入一些整数并把这些整数存到一个容器中,当输入ctrlz时跳出循环,那么怎么解决当输入-1时被当做ctrlz而跳出循环 解决方案 不可能啊,你程序是怎么判断的,贴出代码看下. 解决方案二: int i;while (cin >> i) std::cout << ""The input is: "" << i << std::endl; 这种写法就可以输入-1只是得到的-

解决NSTextContainer分页时文本截断问题

解决NSTextContainer分页时文本截断问题 NSTextContainer与NSLayoutManager配合使用可以将大文本文件分页,但是,分页过程中会遇到问题,显示字符被截断的问题:) - (void)viewDidLoad { [super viewDidLoad]; // 数据源 NSString *string = [NSString stringWithContentsOfURL:[NSBundle.mainBundle URLForResource:@"bubizhida

百度导航初始化引擎时成功,在启动导航时就直接报错了,下面是错误信息

问题描述 百度导航初始化引擎时成功,在启动导航时就直接报错了,下面是错误信息 错误提示信息:08-25 10:09:43.560 13750-13750/com.allan.nvigtive.gps E/Jni_JniEngine﹕ ######## Java_com_baidu_AppTest_AppTest JNI_OnLoad08-25 10:09:43.560 13750-13750/com.allan.nvigtive.gps E/Jni_JniEngine﹕ ######## Jav