Facebook 如何在加载不同页面时保持页眉和页脚固定?

Posted

技术标签:

【中文标题】Facebook 如何在加载不同页面时保持页眉和页脚固定?【英文标题】:How does Facebook keep the header and footer fixed while loading a different page? 【发布时间】:2010-10-14 16:23:26 【问题描述】:

浏览 Facebook 页面时,页眉和固定页脚部分在页面加载之间保持可见,并且地址栏中的 URL 会相应更改。至少,这是我得到的错觉。

从技术上讲,Facebook 如何做到这一点?

【问题讨论】:

Facebook 正在为我刷新整个页面... 只是一种错觉。他们真的很快,仅此而已。 不,这不是幻觉。 @Jim Soho 他们使用 ajax 来 1. 清除除导航栏以外的 div 的整个页面和 2. 从 externamlpage 加载 div 到其中 【参考方案1】:

请参阅 Mark Brittingham 的回答以了解如何设置它的样式,尽管我认为这不是您在这里要问的。我将为您提供有关其工作原理的技术细节(以及为什么它相当出色)。

当您将鼠标悬停在标题中的个人资料链接上时,请查看状态栏...

http://www.facebook.com/profile.php?id=514287820&ref=profile

这就是 标签所指向的地方。现在点击地址栏看看...

http://www.facebook.com/home.php#/profile.php?id=514287820&ref=profile

注意到“#”fragment identifier/hash了吗?这基本上证明你没有离开页面并且之前的请求是用AJAX发出的。他们正在拦截这些链接上的点击事件,并用他们自己的东西覆盖默认功能。

要使用 javascript 实现这一点,您所要做的就是为这些链接分配一个点击事件处理程序......

var header = document.getElementById('header');
var headerLinks = header.getElementsByTagName('a');

for(var i = 0, l = headerLinks.length; i < l; i++) 
  headerLinks[i].onclick = function() 
    var href = this.href;

    //Load the AJAX page (this is a whole other topic)
    loadPage(href);  

    //Update the address bar to make it look like you were redirected
    location.hash = '#' + href;

    //Unfocus the link to make it look like you were redirected
    this.blur();

    //Prevent the natural HTTP redirect
    return false;
  

这种方法的一个惊人的好处是它允许后退按钮发挥作用(带有一点额外的技巧),这在传统上一直是长期使用 AJAX 的痛苦副作用。我不能 100% 确定这个诡计是什么,但我敢打赌,它能够以某种方式检测浏览器何时修改片段标识符(可能每 500 毫秒检查一次)。

附带说明,将哈希更改为在 DOM 中找不到的值(通过元素 ID)会将页面一直滚动到顶部。看看我在说什么:从 Facebook 顶部向下滚动大约 10 个像素,露出顶部菜单的一半。单击其中一个项目,它会在片段标识符更新后立即将其跳回到页面顶部(没有任何窗口重绘/重绘延迟)。

【讨论】:

谢谢乔希,这就是我在看它时错过的,它使用了哈希技巧。 优秀且解释清楚的回答乔希。谢谢:) 是的,听起来有点像他们在做这样的事情:contentwithstyle.co.uk/content/…【参考方案2】:

提供看起来不变的页眉和页脚的一种方法是通过 CSS - 这是一个固定页脚的示例(注意“位置:固定;”):

#Footer   
  font-size:xx-small; 
  text-align:left; 
  width:100%; 
  bottom:0px; 
  position:fixed; 
  left:0px; 
  background-color: #CCCCCC; 
  border-top: 1px solid #999999; 
  padding:4px; 
  padding-right:20px; 
  color:#666666; 

您需要确保将一些 Margin-Bottom 添加到页面 div(填充页面主要部分的那些),以便为固定页脚留出空间(与使用 Margin-Top 的页眉相同)。

这确实实际上停留在页面上,但是,因为定位是如此紧凑和不变,除非您的页面加载时间过长,否则它看起来好像确实如此。我不知道这是否是 FaceBook 所做的,但它会给你带来几乎相同的效果。

【讨论】:

【参考方案3】:

使用 CSS 绝对/固定定位,包含页眉和页脚的 div 标签可以位于 html 中的任何位置。喜欢在顶部!

在大多数当前的浏览器上都有一个渲染延迟,我相信 Firefox 为四分之一秒,因此页面不会在快速闪烁中显示部分渲染的内容,并且会浪费大量时间来绘制网络数据。

所以可能发生的情况是新页面快速返回包含样式以及页眉和页脚的 HTML。浏览器可以立即呈现此内容,因此当它显示下一页时,就好像这些内容没有改变一样。

如果页面正在生成动态内容,一个很好的技巧是将所有静态信息放在顶部,输出并刷新数据缓冲区。然后进行动态数据库查询等。

【讨论】:

【参考方案4】:

嗯,完成这样的事情的方法是通过 AJAX,但据我所知,Facebook 实际上并没有这样做......我刚刚检查过,它像大多数网站一样刷新标题.. .

编辑:当我第一次回答这个问题时,我正在使用 Google Chrome (2.0) 查看 Facebook,无论出于何种原因,它实际上并没有这样做-->当我从主页单击我的个人资料时,它在地址栏中给我这个:http://www.facebook.com/profile.php?id=1304250071&ref=profile

因此刷新了整个页面...奇怪

【讨论】:

【参考方案5】:

增加Josh Stodola's 答案:据我了解,YUI Bookmark Manager 正是完成这项工作。

【讨论】:

以上是关于Facebook 如何在加载不同页面时保持页眉和页脚固定?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# VSTO Word 加载项中在页码旁边设置页眉和页脚文本?

使用不同的页眉和页脚在Drupal上创建页面

如何自动加载页眉和页脚视图?

WORD文档,如何使前后两页的页眉页脚显示不同

GridView 在回发或 onselectedindexchanged 后丢失数据表页眉和页脚

导航页面时如何使页眉和水平菜单保持一致