在菜单中添加第一个/最后一个CSS类


15

没有javascript技巧,有可能吗?像这样:

<ul class="my_menu">
  <li class="first"> ... </li>
  <li> ... </li>
  <li> ... </li>
  <li class"with_sub"> ... 
    <ul class="my_menu_sub">
      <li class="first"> ... </li>
      <li> ... </li>
      <li> ... </li>
      <li class="last"> ... </li>
    </ul>
  </li>
  <li> ... </li>
  <li> ... </li>
  <li class="last"> ... </li>
</ul>

1
javascript使用有什么问题?它们是核心功能吗?还是可以将其视为渐进式增强?
轻微的绒毛,2010年

Answers:


14

更好,更简单的方法:

function add_first_and_last($items) {
  $items[1]->classes[] = 'first-menu-item';
  $items[count($items)]->classes[] = 'last-menu-item';
  return $items;
}

add_filter('wp_nav_menu_objects', 'add_first_and_last');

1
漂亮又简单。我喜欢!
乔纳森·沃尔德

我看到此代码适用于自定义导航菜单(我看到它在自定义菜单小部件中工作),但不适用于主要导航栏中使用的菜单(在二十一测试中进行过测试)。应该吗 还是那是不同的代码?或只是一个不同的过滤器?谢谢!
埃文·马特森

2
这将适用于单级菜单,但可能不适用于更复杂的菜单,因为此时此菜单包含所有项目,而不是顶级项目。
拉斯特

6

这是一个粗略的代码段,用于修改菜单输出并将first / last添加到first和last类(ul此阶段未应用外部,因此不计算在内)。注意-需要使用PHP5strripos()

add_filter( 'wp_nav_menu_items', 'first_last_class' );

function first_last_class( $items ) {

    $first = strpos( $items, 'class=' );

    if( false !== $first )
         $items = substr_replace( $items, 'first ', $first+7, 0 );

    $last = strripos( $items, 'class=');

    if( false !== $last )
         $items = substr_replace( $items, 'last ', $last+7, 0 );

    return $items;
}

我对如何使其处理嵌套列表有些困惑,但是至少应该可以让您入门。


6

这是仅将第一个/最后一个类添加到父菜单项的功能。对于大多数CSS样式,这就是必需的。

function nav_menu_add_classes( $items, $args ) {
    //Add first item class
    $items[1]->classes[] = 'menu-item-first';

    //Add last item class
    $i = count($items);
    while($items[$i]->menu_item_parent != 0 && $i > 0) {
        $i--;
    }
    $items[$i]->classes[] = 'menu-item-last';

    return $items;
}
add_filter( 'wp_nav_menu_objects', 'nav_menu_add_classes', 10, 2 );

1
正是我想要的。谢谢。wp_nav_menu不会自动执行此操作有点令人惊讶
yitwail 2012年

我同意。我相信Wordpress bugtracker暂时有一个功能请求,但是什么也没有。至少存在适当的过滤器,因此我们可以添加这些类;)。
Chaoix 2012年

1
谢谢。正在寻找可以在菜单浏览器中使用的计数器。您的答案允许。刚刚添加了$ item-> number = $ i; 并把它放在助行器中 谢谢!!!
BasTaller 2014年

5

在wordpress 3中了解有关新的Menus API的更多信息。您可以手动给任何元素所属的类。而且,一旦掌握了菜单,就可以使菜单编辑变得很有趣。


2
这就是方法,只需在管理员中打开导航菜单屏幕,然后将类添加到第一项和最后一项即可。当然,如果用户移动了这些菜单项,则必须重新分配类别,但是我认为这是最有效/最佳的答案(因为不涉及编码)。
t31os 2010年

5

如果您有嵌套菜单

function add_first_and_last($items) {
    // first class on parent most level
    $items[1]->classes[] = 'first';
    // separate parents and children
    $parents = $children = array();
    foreach($items as $k => $item){
        if($item->menu_item_parent == '0'){
            $parents[] = $k;
        } else {
            $children[$item->menu_item_parent] = $k;
        }
    }
    // last class on parent most level
    $last = end(array_keys($parents));
    foreach ($parents as $k => $parent) {
        if ($k == $last) {
            $items[$parent]->classes[] = 'last';
        }
    }
    // last class on children levels
    foreach($children as $child){
        $items[$child]->classes[] = 'last';
    }
    // first class on children levels
    $r_items = array_reverse($items, true);
    foreach($r_items as $k => $item){
        if($item->menu_item_parent !== '0'){
            $children[$item->menu_item_parent] = $k;
        }
    }
    foreach($children as $child){
        $items[$child]->classes[] = 'first';
    }
    return $items;
}
add_filter('wp_nav_menu_objects', 'add_first_and_last');

我喜欢Ismaelj答案的简单性,但是如果您想要子菜单类,则需要更多。


2

如果不需要IE8或更低版本的支持,请不要忘记也可以使用纯CSS:

.my_menu > :first-child,
.my_menu > :last-child {
    /* some styles */
}

jQuery浏览器的支持甚至更好,但是听起来您正在尝试避免这种情况。


我使用的,因为最后的孩子现在IE 9支持过了,我再也不会那么在乎即8,7 ..
亚历

2

这是一些更好的代码,用于添加第一个和最后一个菜单项类,其中包括对嵌套子菜单的支持。

add_filter( 'wp_nav_menu_objects', 'tgm_filter_menu_class', 10, 2 );
/**
 * Filters the first and last nav menu objects in your menus
 * to add custom classes.
 *
 * This also supports nested menus.
 *
 * @since 1.0.0
 *
 * @param array $objects An array of nav menu objects
 * @param object $args Nav menu object args
 * @return object $objects Amended array of nav menu objects with new class
 */
function tgm_filter_menu_class( $objects, $args ) {

    // Add first/last classes to nested menu items
    $ids        = array();
    $parent_ids = array();
    $top_ids    = array();
    foreach ( $objects as $i => $object ) {
        // If there is no menu item parent, store the ID and skip over the object
        if ( 0 == $object->menu_item_parent ) {
            $top_ids[$i] = $object;
            continue;
        }

        // Add first item class to nested menus
        if ( ! in_array( $object->menu_item_parent, $ids ) ) {
            $objects[$i]->classes[] = 'first-menu-item';
            $ids[]          = $object->menu_item_parent;
        }

        // If we have just added the first menu item class, skip over adding the ID
        if ( in_array( 'first-menu-item', $object->classes ) )
            continue;

        // Store the menu parent IDs in an array
        $parent_ids[$i] = $object->menu_item_parent;
    }

    // Remove any duplicate values and pull out the last menu item
    $sanitized_parent_ids = array_unique( array_reverse( $parent_ids, true ) );

    // Loop through the IDs and add the last menu item class to the appropriate objects
    foreach ( $sanitized_parent_ids as $i => $id )
        $objects[$i]->classes[] = 'last-menu-item';

    // Finish it off by adding classes to the top level menu items
    $objects[1]->classes[] = 'first-menu-item'; // We can be assured 1 will be the first item in the menu :-)
    $objects[end( array_keys( $top_ids ) )]->classes[] = 'last-menu-item';

    // Return the menu objects
    return $objects;

}

你可以找到要点这里和相关的教程在这里



0

纯CSS,对我有用。这也将与子菜单一起使用

ul.nav>li:last-of-type a

仅在IE9及更高版本中有效,这几乎排除了我所做的所有事情:)
Milo 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.