
原文:http://valums.com/vertical-scrolling-menu/
接下来我们来看如何使用jquery创建如上图的垂直菜单
创建如下html菜单结构
- <div class="sc_menu_wrapper">
- <div class="sc_menu">
- <a title="Menu" href="#"><img src="img/1.jpg" alt="Menu"/></a>
- <a title="Navigation" href="#"><img src="img/2.jpg" alt="Navigation"/></a>
- <a title="jQuery" href="#"><img src="img/3.jpg" alt="jQuery"/></a>
- <a title="CSS" href="#"><img src="img/4.jpg" alt="CSS"/></a>
- <a title="Vertical" href="#"><img src="img/5.jpg" alt="Vertical"/></a>
- <a title="Menu" href="#"><img src="img/1.jpg" alt="Menu"/></a>
- <a title="Navigation" href="#"><img src="img/2.jpg" alt="Navigation"/></a>
- </div>
- </div>
很简单的结构,一个a代表着菜单的一个元素,当然元素内的内容可以是文字,也可以是图片。
创建如下样式:
- div.sc_menu_wrapper {
- position: relative;
- height: 500px;
- /*容器尺寸应大于元素的尺寸 */
- width: 160px;
- margin-top: 30px;
- overflow: auto;
- }
- div.sc_menu {
- padding: 15px 0;
- }
- .sc_menu a {
- display: block;
- margin-bottom: 5px;
- width: 130px;
- border: 2px rgb(79, 79, 79) solid;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- /* When image support is turned off */
- color: #fff;
- background: rgb(79, 79, 79);
- }
- .sc_menu a:hover {
- border-color: rgb(130, 130, 130);
- border-style: dotted;
- }
- .sc_menu img {
- display: block;
- border: none;
- }
引入jquery库
- <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js" type="text/javascript"></script>
来看函数及其接口
- function makeScrollable(wrapper, scrollable){}
- $(function(){ makeScrollable("div.sc_menu_wrapper", "div.sc_menu");});
来看其makeScrollable函数实现的过程
- function makeScrollable(wrapper, scrollable){
- //获取一个jquery元素
- var wrapper = $(wrapper), scrollable = $(scrollable);
- // 隐藏预加载
- scrollable.hide();
- var loading = $('<div class="loading">Loading...</div>').appendTo(wrapper);
- // 检查是否所有的图片都已经加载完毕
- var interval = setInterval(function(){
- var images = scrollable.find('img');
- var completed = 0;
- //统计成功加载的图片数量
- images.each(function(){
- if (this.complete) completed++;
- });
- if (completed == images.length){
- clearInterval(interval);
- // Timeout added to fix problem with Chrome
- setTimeout(function(){
- loading.hide();
- // Remove scrollbars
- wrapper.css({overflow: 'hidden'});
- scrollable.slideDown('slow', function(){
- enable();
- });
- }, 1000);
- }
- }, 100);
- function enable(){
- }
- }
来看其enable函数
- function enable(){
- // height of area at the top at bottom, that don't respond to mousemove
- var inactiveMargin = 100;
- // Cache for performance
- var wrapperWidth = wrapper.width();
- var wrapperHeight = wrapper.height();
- // Using outer height to include padding too
- var scrollableHeight = scrollable.outerHeight() + 2*inactiveMargin;
- // Do not cache wrapperOffset, because it can change when user resizes window
- // We could use onresize event, but it's just not worth doing that
- // var wrapperOffset = wrapper.offset();
- //创建一个提示框
- var tooltip = $('<div class="sc_menu_tooltip"></div>')
- .css('opacity', 0)
- .appendTo(wrapper);
- // 保存菜单标题
- scrollable.find('a').each(function(){
- // The "data" function attaches custom data to an element
- $(this).data('tooltipText', this.title);
- });
- // 删除默认的提示
- scrollable.find('a').removeAttr('title');
- // Remove default tooltip in IE
- scrollable.find('img').removeAttr('alt');
- var lastTarget;
- //When user move mouse over menu
- wrapper.mousemove(function(e){
- // Save target
- lastTarget = e.target;
- var wrapperOffset = wrapper.offset();
- var tooltipLeft = e.pageX - wrapperOffset.left;
- // Do not let tooltip to move out of menu.
- // Because overflow is set to hidden, we will not be able too see it
- tooltipLeft = Math.min(tooltipLeft, wrapperWidth - 75); //tooltip.outerWidth());
- var tooltipTop = e.pageY - wrapperOffset.top wrapper.scrollTop() - 40;
- // Move tooltip under the mouse when we are in the higher part of the menu
- if (e.pageY - wrapperOffset.top < wrapperHeight/2){
- tooltipTop = 80;
- }
- tooltip.css({top: tooltipTop, left: tooltipLeft});
- //滚动菜单
- var top = (e.pageY - wrapperOffset.top) * (scrollableHeight - wrapperHeight) / wrapperHeight - inactiveMargin;
- if (top < 0){
- top = 0;
- }
- wrapper.scrollTop(top);
- });
- var interval = setInterval(function(){
- if (!lastTarget) return;
- var currentText = tooltip.text();
- if (lastTarget.nodeName == 'IMG'){
- // 没有图片时候写入缓存数据:title
- var newText = $(lastTarget).parent().data('tooltipText');
- // 显示图片提示
- if (currentText != newText) {
- tooltip
- .stop(true)
- .css('opacity', 0)
- .text(newText)
- .animate({opacity: 1}, 1000);
- }
- }
- }, 200);
- // 当离开菜单,隐藏提示
- wrapper.mouseleave(function(){
- lastTarget = false;
- tooltip.stop(true).css('opacity', 0).text('');
- });
- }
补充提示的css样式
- .sc_menu_tooltip {
- display: block;
- position: absolute;
- padding: 6px;
- font-size: 12px;
- color: #fff;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border: 1px solid rgb(79, 79, 79);
- background: rgb(0, 0, 0);
- /* Make background a bit transparent for browsers that support rgba */
- background: rgba(0, 0, 0, 0.5);
- }

这个我喜欢,吼吼