浏览 Facebook 页面时,页眉和固定页脚部分在页面加载之间保持可见,并且地址栏中的 URL 会相应更改。至少,这是我得到的错觉。
从技术上讲,Facebook 是如何做到这一点的?
浏览 Facebook 页面时,页眉和固定页脚部分在页面加载之间保持可见,并且地址栏中的 URL 会相应更改。至少,这是我得到的错觉。
从技术上讲,Facebook 是如何做到这一点的?
请参阅 Mark Brittingham 的回答以了解如何设置它的样式,尽管我认为这不是您在这里要问的。我将为您提供有关它如何工作的技术细节(以及为什么它相当出色)。
当您将鼠标悬停在标题中的“个人资料”链接上时,请查看状态栏...
http://www.facebook.com/profile.php?id=514287820&ref=profile
这就是 <a> 标签所指向的地方。现在单击地址栏时查看它...
http://www.facebook.com/home.php#/profile.php?id=514287820&ref=profile
注意“#”片段标识符/哈希?这基本上证明你没有离开页面,并且之前的请求是用 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 个像素,露出顶部菜单的一半。单击其中一项,它会在片段标识符更新后立即将其跳回页面顶部(没有任何窗口重绘/重绘延迟)。
提供看起来不变的页眉和页脚的一种方法是通过 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 所做的,但它会给你带来几乎相同的效果。
嗯,完成这样的事情的方法是通过 AJAX,但据我所知,facebook 实际上并没有这样做......我刚刚检查过,它像大多数网站一样刷新标题......
编辑:当我第一次回答这个问题时,我正在使用谷歌浏览器(2.0)查看 Facebook,无论出于何种原因,它实际上并没有这样做——>当我从主页点击我的个人资料时,它给了我这个在地址栏中:http ://www.facebook.com/profile.php?id=1304250071&ref=profile
因此刷新了整个页面......奇怪
使用 CSS 绝对/固定定位,包含页眉和页脚的 div 标签可以位于 HTML 中的任何位置。就像在顶部!
在大多数当前的浏览器上,我相信 Firefox 会有四分之一秒的渲染延迟,因此页面不会在快速闪烁中显示部分渲染的内容,并且会在网络数据进入时浪费大量时间绘制。
所以可能发生的情况是新页面快速返回包含样式和页眉和页脚的 HTML。浏览器可以立即呈现此内容,因此当它显示下一页时,看起来好像这些内容没有改变。
如果页面正在生成动态内容,一个好的技巧是将所有静态信息放在顶部,输出并刷新数据缓冲区。然后进行动态数据库查询等。