WordPress 滚动导航菜单

Sep 7th, 2008 Add Comment

滚动菜单, 顾名思义是以滚动的方式显示和隐藏菜单的. 其实跟淡入淡出菜单和滚动菜单的原理是一样的, 前者是在触发事件的时候改变菜单的透明度, 而后者则是改变菜单的高度. 那为什么后者的处理难度会比前者高呢? 这正因为菜单高度的处理比透明度有更高的技巧要求. 下面我们就讨论一下该如何处理, 并难在什么地方.

这里只列出与淡入淡出菜单实现有所不同的地方, 对于以前说过的问题不再重复. 如有疑惑请先查看之前几篇相关的文章, 也欢迎在此留言交流.

这是效果演示

相关话题:

WordPress 导航菜单
二级导航菜单
淡出淡入导航菜单
滚动导航菜单
多级导航菜单
jQuery 导航菜单
点选式导航菜单 (待定话题)

作业分析:

正如前面所说, 滚动菜单的关键是对菜单高度的操作. 主要操作如下:
1. 菜单的初期化处理.
2. 展开和折叠菜单的处理方法.
3. 激活菜单的瞬间, 对菜单高度的处理.

实施操作:

初期化处理
为了处理更加灵活, 我们需要为它定义一个作为参数的滑动速度, 也就是每一个单位时间间隔, 菜单高度的改变幅度. 另外, 我们需要将菜单的初始高度定为 0.

// 速度来自参数, 默认没个时间单位移动 10px
this.speed = speed || 10;
// 设定初始化高度
this.util.setStyle(this.body, 'height', '0');

展开和折叠
展开和折叠的方法对应淡入淡出菜单的加强和减小不透明度, 只是处理对象不一样, 原理是一样的. 要注意将获取的高度转为整型再进行计算.

expand: function() {
	// 获取当前高度, 并整型化
	var height = parseInt(this.util.getStyle(this.body, 'height'));
	// 在时间单位内加上速度, 直到高度等于或超过最大高度
	height += this.speed;
	if(height >= this.height) {
		height = this.height;
		// 取消循环调用
		clearTimeout(this.tid);
	}
	// 重新设定菜单高度
	this.util.setStyle(this.body, 'height', height + 'px');
}
 
/**
 * 折叠菜单, 直到高度为 1 时隐藏菜单
 */
collapse:function() {
	// 获取当前高度, 并整型化
	var height = parseInt(this.util.getStyle(this.body, 'height'));
	// 在时间单位内减去速度, 直到高度等于或小于 1
	height -= this.speed;
	if(height <= 1) {
		height = 1;
		// 隐藏菜单
		this.util.setStyle(this.body, 'visibility', 'hidden');
		// 取消循环调用
		clearTimeout(this.tid);
	}
	// 重新设定菜单高度
	this.util.setStyle(this.body, 'height', height + 'px');
}

激活菜单的瞬间
十分十分十分重要, 滚动菜单中最具技巧, 也最有意思的一部分.
本程序中, 我对获取高度的方法进行了封装, 获取高度其实是返回元素的 offsetHeight. 按我的理解 (不知道是否正确), offsetHeight 会优先去获取 CSS 样式中的高度并返回, 当样式为空时才会去获取元素的实际高度. 所以有以下代码:

// 获得初始高度, 当鼠标在菜单标题上时获得展开时的初始高度, 当鼠标在菜单体上时取得菜单的实际高度
var initHeight = this.util.getStyle(this.body, 'height');
// 获得实际高度, 必须先清空样式的高度, 否则只会得到样式中的高度
this.util.setStyle(this.body, 'height', '');
this.height = this.util.getHeight(this.body);
// 重新设定初始高度
this.util.setStyle(this.body, 'height', initHeight);

演示主题:

以 WordPress 自带主题 default 为基础, 仅做学习参考使用, 修改过的文件有 header.phpstyle.css, 添加了文件 js/menu.js

下载主题: default_with_menubar_4.zip

下回预告:

下回继续讲讲点选式导航菜单, 也就是类似 Windows 窗体的菜单, 点下菜单即显示相应的菜单项, 直到菜单失去焦点. 只修改 JavaScript 代码实现, 可能会用到三个监听器: onclick, onmouseover 和 onblur.

声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: WordPress 滚动导航菜单

  1. http://0.gravatar.com/avatar/85000ff5eefb048caf3de94266347775?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    博主很牛啊,学习了

  2. http://0.gravatar.com/avatar/c146d3fdb1b58c8ac8c148e5ab1bcb3b?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    菜鸟求教,如何调用?能否给个简单点的二级导航的示例代码,不甚感谢……

  3. http://0.gravatar.com/avatar/aad3b4423e897b2fd2647ee77a56a965?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    请问一下:如何修改上面"演示主题"中的JS 才能给主题Inove中的RSS feed列表也加上滚动效果?
    我不怎么懂JS,不知道怎样才能获取订阅的"菜单列表",现在只能同时使用两个JS,而订阅没有滚动效果.
    如果可以而您又有时间的话,麻烦您指点一下,谢谢了!
    还有,感谢您的主题和插件!

  4. http://0.gravatar.com/avatar/cb09b5a26e4cb3a115bb1d942dc416cc?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  5. http://0.gravatar.com/avatar/249519c0f5684ae954f0b99d1c6b998d?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    收藏了,回去实践一下

  6. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @林晨
    你可以由简单些的开始啊.

  7. http://0.gravatar.com/avatar/e9c5cb89c31aea7f63aba937c2bc8c98?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    技术性很强,看来我是学不懂喽

  8. http://1.gravatar.com/avatar/10e5731d1a8aed7f69f55e9f6dbc92d7?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    侧边竖列目录的弹出式菜单感觉配色挺诡异的 :cool: 而且貌似不怎么起眼。
    PS. 顺便膜拜一下上面的Trackbacks。

  9. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  10. http://0.gravatar.com/avatar/ce367e04f75be8c3b5de2c86eafc4ce3?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    呵呵,找到原因,问题解决

  11. http://0.gravatar.com/avatar/ce367e04f75be8c3b5de2c86eafc4ce3?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    锐风:
    貌似米啥难度啊..

    七月:
    想问问评论中的QUOTE这个是怎么实现的啊?

    很简单很简单.. 一段 JavaScript 代码.. 你去翻翻 Blocks2 的源码就知道了..

    我翻过这段代码,我想把它改造到IRIS模板上,但是一直不成功,都会提示错误,document.getElementById(authorId) is null

  12. http://1.gravatar.com/avatar/7060dfb9a4706f749898fb7b915aa5da?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    貌似米啥难度啊..

    七月:
    想问问评论中的QUOTE这个是怎么实现的啊?

    很简单很简单.. 一段 JavaScript 代码.. 你去翻翻 Blocks2 的源码就知道了..

  13. http://0.gravatar.com/avatar/ce367e04f75be8c3b5de2c86eafc4ce3?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    想问问评论中的QUOTE这个是怎么实现的啊?

  14. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @Alan
    :wink:

    @schuen
    白天能见到你真难得.

  15. http://1.gravatar.com/avatar/7c9412d8d9386b950a3ebfe8bfedc053?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  16. http://1.gravatar.com/avatar/bc0c69a6bf72455c4abb653a1d70747a?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  1. Loading...