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

使用Bootstrap布局了一个网页使其支持响应式布局,并且将导航菜单固定住,这样做 Categories 和 Tags 页面点击某一个分类或者标签链接时, 锚点定位必然定位于页面顶部,这样一来就会被固定住的导航遮挡 ,例如,我在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) }

我主要的参考文章:点击锚点让定位偏移顶部

最近遇到的问题是:网页多出需要设置锚点,但网站顶部导航采用float:fixed绝对定位,浮动于顶部。那么问题来了,锚点定位必然定位于页面顶部,这样一来就会被浮动的导航遮挡。

在stackoverflow看到的一个方法是在主体内容前加一个暗锚:

<a class="target-fix" name="a-<?php $a->id(); ?>"></a>
<artivle>主体内容...</article>

将锚点进行偏移,并隐藏占位:

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

这个也是最直接的方法。

我采用的是相对简洁的方法:对于现代浏览器如果支持css的:target声明,可以这么设置:

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

对于IE这等落后的浏览器是不支持的.另外可以使用js去调整scroll,比如使用jQuery:

$(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);
         }
     }
  }
});

可以使用jquery-hashchange:https://github.com/cowboy/jquery-hash...

绑定window.onhashchange事件:

$(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();
});

时间: 2024-11-07 23:12:09

解决网页中使用Bootstrap固定导航时锚点偏移问题的相关文章

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

最近Bootstrap修改了博客主题,使其支持响应式布局,并且将导航菜单固定住,不随滚到条滚动,这样做带来的影响是Categories和Tags页面点击某一个分类或者标签链接时,锚点定位必然定位于页面顶部,这样一来就会被固定住的导航遮挡,例如,我在Categories页面,点击hbase分类,锚点定位最后如下图: 网上查找了一些资料,找到一篇文章点击锚点让定位偏移顶部,这篇文章提到几种解决办法: 第一种,使用css将锚点偏移: <a class="target-fix" >

webview-WebView 加载的页面,当触发网页中类似toast的事件时,toast里的内容模糊,求大神解

问题描述 WebView 加载的页面,当触发网页中类似toast的事件时,toast里的内容模糊,求大神解 详情是:在手机的webview载入如下网址后,点击Add to cart就会出现上图的情况http://m.aliexpress.com/item/32329058540.html?sk=vzNZvnIai%3A&cpt=1439022323417&productId=32329058540&aff_platform=aaf&aff_trace_key=3094989

如何解决FormView中实现DropDownList连动选择时出现 &quot;Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用&quot; 的错误

原文:如何解决FormView中实现DropDownList连动选择时出现 "Eval().XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用" 的错误FormView控件是可及显示.修改.添加.删除为一体的控件,感觉很好用,可是昨天发现了一个可以说是它的一个Bug吧,我是想要实现下拉框的联动效果,比如在A下拉框选择了省对应B的下拉框会把对应A中省的市显示在B下拉框中,我想要实现的是校区和对应校区建筑的联动效果,单纯的这种效果很好实现比如下面的代码   

网页中调用本地应用程序时的路径问题

由于一些原因,需要网页中调用本地应用程序,在网上查了一下,有好几种方法,有的是用javascript实现的,这种方法有安全限制,并且只能用IE浏览器,还有一种方法比较好,就是添加自定义URL协议,这种方法必须先在客户端将应用程序添加成为URL协议,上面两种方法的具体操作步骤网上都有. 下面说一下"添加自定义URL协议"这种方法的一个问题,配置完成后,可以正常调用本地应用程序,但是,这个应用程序在登录时又调用了另外一个本地应用,这时,就会弹出"系统找不到文件"之类的错

网页中照片预览导航设计技巧

导航并不只是指常位于网站头部的导航条,路边的指示牌.商场的指示牌等等都是一种导航,可以说导航在生活中无处不在,如果没有这些导航存在,那么我们将迷失,迷失在互联网信息的海洋中,迷失在纵横交错的马路上,迷失在琳琅满目的商品货架之间. 在所谓的WEB2.0风潮疯狂的从国外吹入国内的时候,国外一些成功网站的成功模式也疯狂的吹入到国内的模仿者的眼前.目前在国内关于网络相册方面或者时尚一点是说关于WEB2.0网络相册方面做得比较好的应该算是yupoo了,同时它也是国内模仿flickr模式最像的最成功的--事

解决 JScript 中使用日期类型数据时出现类型错误的问题_应用技巧

例如以下代码: 程序代码: 复制代码 代码如下: <%@LANGUAGE="JScript" CODEPAGE="65001"%>  <script language="JScript" runat="server">  Response.Cookies("xujiwei")("name") = "xujiwei";  Response.Coo

解决VS2008中生成C/C++项目时遇到“生成‘rc.exe’时出错”

解决步骤: 1.运行VS2008安装程序. 2.在"选择要安装的功能"这一步时,依次展开"语言工具"--"Visual C++"--"Visual C++ 工具",勾选"Win32 工具"一项. 3.点"更新"按钮. 此时安装程序将开始维护操作,完成后将解决生成rc.exe时出错的问题. PS.如果还不行,就把"语言工具"--"Visual C++"

解决网页中使用自定义中文字体的方法

英文字体自定义 中文字体自定义 上面的两个图片例子,展示了自定义字体在网页里面的应用,这里不是浏览器的字体,也不是客户电脑里安装的字体,也不是图片或其他方式,而且是以文字的方式显示,这样做的好处是有的,最简单的好看啊,再比如可以方便修改,重要的是利于SEO优化.好处不多讲,先讲讲如何实现. 首先,要准备字体,要使用字体的三种文件格式,确保能在主流浏览器中都能正常显示该字体. 下面是几种主流浏览器对于字体格式的支持情况: .TTF或.OTF,适用于Firefox 3.5.Safari.Opera

PHP中usort在值相同时改变原始位置问题的解决方法_php技巧

从 PHP 4.1.0 后,usort 在比较的值相同时,原始位置可能会改变,文档中是这样说的: If two members compare as equal, their order in the sorted array is undefined. 也就是说,如果比较的2个值相同,则它们在排序结果中的顺序是随机的.如果你需要保持相同值的原始位置,可以参考本文的方法. 演示数据: 复制代码 代码如下: <?php /* 解决 PHP 中 usort 在值相同时改变原始位置的问题 作者:Art