近看到好多博客在导航里面都用了上面这种特效,本着一查到底的精神,我把他们的代码扣了下来,原以为是JS写得特效,直到扒到后一层才发面,原来是CSS3里面的东西,实现起来,比JS要简单很多。
这个写法如下:
?.nav .sub-menu li:hover .sub-menu-2{ ?? ?left:; ?? ?background:#c41d1d; ?? ?display:table; ?? ?position:absolute; ?? ?z-index:2013; ?? ?width:; ?? ?border-bottom: 4px solid #156BDA; ?? ?margin-top:-30px; }
这里面的.sub-menu-2也是一个ul,可能有人会问,这个类名能不能改成UL,答案是否定的,经本人测试,这个地方的要求指代分明,力求唯一,其实想想也不难理解,如果我们用UL来代替这个.sub-menu-2,假如这个代码执行了,那么.nav .sub-menu li下面如果有多个ul,岂不是要乱套了。
所以,即便是我们这里用了一个.sub-menu-2,也是要求这个元素是.nav .sub-menu li下面唯一的一个。
所以,我们要想把wordpress里面的wp_nav_menu做成这样的效果,我们首先要改变得就是wp_nav_menu这个函数的输出,而这个函数的默认输出如下:
<ul> <li id="menu-item-8" class="..."> <a href="#">5UCMS</a> <ul class=sub-menu> <li><a>......</a> <ul class="sub-menu"> <li>...</li> </ul> </li> </ul> </li> </ul>
一个十分完善的输出。这样的输出,其实给我们的CSS带来了很多困扰,所以我们要做得就是改变这样的输出结构。
其实,如果我们想用JS来实现,一旦改变了这个结构,工作就变得简单多了。
关于如何改变这个输出,可以参考这里:http://www.sbmzenith.com/?p=328【wp_nav_menu中的walker详解】
这里不再赘述,举例说明。
其实我们这里这个菜单的层级是有规划的,我们这里以三层为例。先写一个扩展类:
class companyMenu extends Walker_Nav_Menu
重写函数:function start_lvl
其中
?$indent = str_repeat("t", $depth); ?? ??? ?if($depth == 0){ ?? ??? ?$output .= "n$indent<ul class="sub-menu">n"; ?? ?} ?? ?else if($depth == 1){ ?? ??? ?$output .= "n$indent<ul class="sub-menu-2">n"; ?? ??? ?} ?? ?}
这里我们级顶层的ul和二级栏目中的ul不同的CLASS。
?if($depth == 0){ ?? ??? ?$output .= $indent . '<li>'; ?? ??? ?} ?? ??? ?else{ ?? ??? ?$output .= $indent . '<li' . $id . $value . $class_names .'>';?? ? ?? ??? ?}
这里我们给顶层的li一个统一的class,便于CSS控制。
然后这样调用:
?<?PHP ?? ?wp_nav_menu(array( ? ??? 'theme_location'? => '', ? ??? 'menu'??????????? => 'head-menu', ? ??? 'container'?????? => 'div', ? ??? 'container_class' => 'nav', ? ??? 'container_id'??? => 'nav', ??? 'echo'??????????? => 1, ? ??? 'fallback_cb'???? => 'wp_page_menu', ? ??? 'before'????????? => '', ? ??? 'after'?????????? => '', ? ??? 'link_before'???? => '', ? ??? 'link_after'????? => '', ? ??? 'items_wrap'????? => '<ul>%3$s</ul>', ? ??? 'depth'?????????? => 0, ? ??? 'walker'????????? => new companyMenu('') ? )); ?>
接下来就是CSS了。
游客回答:(0)