子比美化:仿盒子萌风格菜单 UI 实现

图片[1]-子比美化:仿盒子萌风格菜单 UI 实现 - 奇想博客网

​⚠️ 修改前排雷警告

​本教程第一步需要修改主题底层核心 PHP 文件。在进行任何操作前,请务必通过宝塔面板或 FTP 备份 /wp-content/themes/zibll/inc/functions/zib-header.php 文件! 养成良好的备份习惯是所有站长的基本修养。

​🚀 部署步骤

第一步:修改核心 PHP(解除层级限制与注入控制器)

我们需要修改负责输出移动端菜单的底层函数,解除深度的封印,并把我们的特效切换按钮的 HTML 骨架放进去。

1、​进入宝塔面板,找到路径:/wp-content/themes/zibll/inc/functions/zib-header.php

​2、​在该文件中搜索 function zib_nav_mobile,找到整个函数的起始位置。

​3、将原有的 zib_nav_mobile 函数完整替换为以下代码:

替换前:

function zib_nav_mobile($location = 'mobilemenu')
{
    $menu = '';
    $args = array(
        'container'      => false,
        'echo'           => false,
        'fallback_cb'    => false,
        'depth'          => 2,
        'items_wrap'     => '<ul class="mobile-menus theme-box">%3$s</ul>',
        'theme_location' => $location,
        'walker'         => new zib_walker_nav_menu(),
    );

    $m_layout = _pz('mobile_header_layout', 'center');

    $menu .= in_array('m_menu', zib_get_theme_mode_button_positions()) ? '<a href="javascript:;" class="toggle-theme toggle-radius"><i class="fa fa-toggle-theme"></i></a>' : '';

    if ('center' != $m_layout) {
        $menu .= zib_get_search_link('class=toggle-radius');
    }
    $wp_nav_menu = wp_nav_menu($args);

    if (!$wp_nav_menu) {
        $args['theme_location'] = 'topmenu';
        $wp_nav_menu            = wp_nav_menu($args);
    }

    if (!$wp_nav_menu && is_super_admin()) {
        $wp_nav_menu = '<ul class="mobile-menus theme-box"><li><a href="' . admin_url('nav-menus.php') . '" class="loaderbt">添加导航菜单</a></li></ul>';
    }
    $menu .= $wp_nav_menu;

    if (_pz('article_nav', true) && _pz('article_nav_mobile_nav_s', true)) {
        $menu .= '<div class="posts-nav-box" data-title="文章目录"></div>';
    }

    $sub = zib_header_user_box('mobile');

    echo $menu . $sub;
}

替换后:

function zib_nav_mobile($location = 'mobilemenu')
{
    $menu = '';
    $args = array(
        'container'      => false,
        'echo'           => false,
        'fallback_cb'    => false,
        'depth'          => 0, // 核心修改:将默认的2改为0,允许无限层级子菜单输出
        'items_wrap'     => '<ul class="mobile-menus theme-box">%3$s</ul>',
        'theme_location' => $location,
        'walker'         => new zib_walker_nav_menu(),
    );

    $m_layout = _pz('mobile_header_layout', 'center');

    // 已物理屏蔽原生自带的月亮切换按钮,防止前端 JS 冲突
    // $menu .= in_array('m_menu', zib_get_theme_mode_button_positions()) ? '<a href="javascript:;" class="toggle-theme toggle-radius"><i class="fa fa-toggle-theme"></i></a>' : '';

    if ('center' != $m_layout) {
        $menu .= zib_get_search_link('class=toggle-radius');
    }
    
    $wp_nav_menu = wp_nav_menu($args);

    if (!$wp_nav_menu) {
        $args['theme_location'] = 'topmenu';
        $wp_nav_menu            = wp_nav_menu($args);
    }

    if (!$wp_nav_menu && is_super_admin()) {
        $wp_nav_menu = '<ul class="mobile-menus theme-box"><li><a href="' . admin_url('nav-menus.php') . '" class="loaderbt">添加导航菜单</a></li></ul>';
    }

    // ==========================================
    // 插入自定义模块:环境特效控制器 HTML
    // ==========================================
    $theme_switcher_html = '
    <div class="boxmoe-theme-switcher">
        <div class="switcher-track">
            <span class="switch-btn active" data-effect="none">Pure</span>
            <span class="switch-btn" data-effect="snow">Snow</span>
            <span class="switch-btn" data-effect="sakura">Sakura</span>
        </div>
    </div>';

    // 组合菜单包裹(外加一层独特的 class 以便独立控制 CSS)
    $menu .= $theme_switcher_html . '<div class="qxbkw-boxmoe-menu">' . $wp_nav_menu . '</div>';

    if (_pz('article_nav', true) && _pz('article_nav_mobile_nav_s', true)) {
        $menu .= '<div class="posts-nav-box" data-title="文章目录"></div>';
    }

    $sub = zib_header_user_box('mobile');

    echo $menu . $sub;
}

第二步:添加全套 CSS 样式(重塑外观)

进入 WordPress 后台 -> 子比主题设置 -> 全局&功能 -> 自定义代码 -> 自定义 CSS 样式,添加以下代码。

(注:这里包含了雪花自带的冰雪发光效果和樱花花瓣的纯 CSS 绘制逻辑,全程硬件加速,丝滑不卡顿。)

/* =========================================================
   移动端菜单仿盒子萌 UI & 动态特效美化
   ========================================================= */

/* 1. 顶部特效切换器面板 */
.boxmoe-theme-switcher { display: flex; justify-content: center; margin-bottom: 15px; }
.boxmoe-theme-switcher .switcher-track { display: flex; background: #ffffff; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 50px; padding: 2px; width: 80%; }
.boxmoe-theme-switcher .switch-btn { flex: 1; text-align: center; font-size: 13px; color: #666; padding: 6px 0; border-radius: 50px; cursor: pointer; font-weight: 600; transition: all 0.3s ease; }
.boxmoe-theme-switcher .switch-btn.active { background: #5eb2ff !important; color: #ffffff !important; box-shadow: 0 2px 10px rgba(94, 178, 255, 0.3); }

/* 2. 菜单大黑框外壳与顶级胶囊选项 */
.qxbkw-boxmoe-menu { border: 2px solid #000000 !important; border-radius: 12px !important; padding: 10px 0 !important; margin: 0 15px 25px 15px !important; background: #ffffff !important; }
.qxbkw-boxmoe-menu .mobile-menus.theme-box { border: none !important; background: transparent !important; box-shadow: none !important; margin: 0 !important; padding: 0 !important; }
.qxbkw-boxmoe-menu > ul > li { list-style: none !important; margin: 5px 15px !important; }
.qxbkw-boxmoe-menu > ul > li > a { border: 1px solid transparent !important; border-radius: 50px !important; padding: 10px 20px !important; font-weight: 600 !important; color: #333 !important; display: flex !important; align-items: center; transition: all 0.3s ease; }
.qxbkw-boxmoe-menu > ul > li.active > a, .qxbkw-boxmoe-menu > ul > li.open > a, .qxbkw-boxmoe-menu > ul > li.current-menu-item > a, .qxbkw-boxmoe-menu > ul > li.open-submenu > a { border: 1px solid #333 !important; color: #5eb2ff !important; }
.qxbkw-boxmoe-menu li a i, .qxbkw-boxmoe-menu li a img, .qxbkw-boxmoe-menu li a svg { margin-right: 12px !important; }

/* 3. 多级菜单排版修复 (打散原生并排,恢复垂直树状) */
.qxbkw-boxmoe-menu .sub-menu { display: none; padding-left: 20px !important; margin-top: 5px !important; border: none !important; background: transparent !important; box-shadow: none !important; flex-direction: column !important; }
.qxbkw-boxmoe-menu .sub-menu li { list-style: none !important; margin: 2px 0 !important; width: 100% !important; display: block !important; float: none !important; padding: 0 !important; }
.qxbkw-boxmoe-menu .sub-menu li a { width: 100% !important; box-sizing: border-box !important; padding: 10px 15px !important; font-weight: 400 !important; color: #555 !important; font-size: 14px !important; border: none !important; border-radius: 8px !important; display: block !important; background: transparent !important; white-space: normal !important; text-align: left !important; }
.qxbkw-boxmoe-menu .sub-menu li.active > a, .qxbkw-boxmoe-menu .sub-menu li.current-menu-item > a { color: #5eb2ff !important; background: rgba(94, 178, 255, 0.1) !important; }

/* 4. 手风琴折叠交互:右侧动态翻转箭头 */
.qxbkw-boxmoe-menu .menu-item-has-children > a i.fa-angle-right, .qxbkw-boxmoe-menu .menu-item-has-children > a .icon-angle-right { display: none !important; }
.qxbkw-boxmoe-menu .menu-item-has-children > a { position: relative; }
.qxbkw-boxmoe-menu .menu-item-has-children > a::after { content: ""; position: absolute; right: 20px; top: 50%; width: 8px; height: 8px; border-right: 2px solid #888; border-bottom: 2px solid #888; transform: translateY(-60%) rotate(45deg); transition: all 0.3s ease; }
.qxbkw-boxmoe-menu .menu-item-has-children.open-submenu > a::after { transform: translateY(-30%) rotate(225deg); border-color: #5eb2ff; }
.qxbkw-boxmoe-menu .sub-menu .sub-menu { padding-left: 15px !important; margin-left: 15px !important; border-left: 1px dashed rgba(0, 0, 0, 0.1) !important; margin-top: 2px !important; margin-bottom: 5px !important; }
.qxbkw-boxmoe-menu .sub-menu .sub-menu li a { font-size: 13px !important; color: #888 !important; padding: 8px 10px !important; }

/* 5. 环境特效展示层 (防遮挡设计) */
.qxbkw-effect-layer { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; pointer-events: none; z-index: 99999; overflow: hidden; }

/* ❄️ 雪花物理下落动画 (带横向风力偏移) */
@keyframes fall-snow { 
    0% { transform: translate3d(0, -10vh, 0) rotate(0deg); opacity: 0; } 
    10% { opacity: 0.8; } 
    80% { opacity: 0.8; } 
    100% { transform: translate3d(20vw, 110vh, 0) rotate(360deg); opacity: 0; } 
}
.snow-item { position: absolute; top: -10vh; background-color: #e2f0ff; border-radius: 50%; box-shadow: 0 0 4px rgba(226, 240, 255, 0.8); animation: fall-snow linear infinite; opacity: 0.8; }

/* 🌸 樱花物理下落动画 (带横向风力偏移) */
@keyframes fall-sakura { 
    0% { transform: translate3d(0, -10vh, 0) rotate(0deg); opacity: 0; } 
    10% { opacity: 0.6; } 
    80% { opacity: 0.6; } 
    100% { transform: translate3d(40vw, 110vh, 0) rotate(1080deg); opacity: 0; } 
}
.sakura-item { position: absolute; top: -10vh; background-color: #ffb7c5; border-radius: 15px 2px 15px 2px; box-shadow: 0 0 4px rgba(255, 183, 197, 0.4); animation: fall-sakura linear infinite; opacity: 0.6; }

第三步:添加 JS 交互逻辑(注入灵魂)

最后,同样在子比后台的 自定义 javascript 代码处,添加负责生成环境特效和接管菜单点击交互的 JS 代码。

(注:本代码已针对风向物理引擎做了偏移补偿修正,解决了常规特效代码导致的“屏幕左侧空缺”问题,确保全屏均衡下落。)

// =========================================================
// 环境特效生成与菜单高级折叠逻辑控制
// =========================================================
$(document).ready(function() {
    
    /* ----------------------------------------------------
       模块一:Pure / Snow / Sakura 环境特效控制器
       ---------------------------------------------------- */
    const $switchBtns = $('.boxmoe-theme-switcher .switch-btn');
    let currentEffect = localStorage.getItem('qxbkw_effect') || 'none'; // 记忆用户偏好

    function updateUI(effect) {
        $switchBtns.removeClass('active');
        $('.boxmoe-theme-switcher .switch-btn[data-effect="' + effect + '"]').addClass('active');
    }

    // 核心算法:生成高密度动态粒子
    function applyEffect(effect) {
        $('.qxbkw-effect-layer').remove(); // 切换前强制清理旧图层释放内存
        if (effect === 'none') return; 

        const $layer = $('<div class="qxbkw-effect-layer"></div>').appendTo('body');

        if (effect === 'snow') {
            for (let i = 0; i < 60; i++) {
                const duration = Math.random() * 6 + 6; 
                const delay = Math.random() * 10; 
                // 核心修复:起始点向左扩张至 -20vw,抵消风力造成的左边界空白
                const left = Math.random() * 120 - 20; 
                const size = Math.random() * 4 + 4; 
                
                $layer.append(`<div class="snow-item" style="left:${left}vw; width:${size}px; height:${size}px; animation-duration:${duration}s; animation-delay:-${delay}s;"></div>`);
            }
        } 
        else if (effect === 'sakura') {
            for (let i = 0; i < 70; i++) { 
                const duration = Math.random() * 5 + 6; 
                const delay = Math.random() * 10; 
                // 核心修复:樱花风速大,起始点进一步扩张至 -40vw
                const left = Math.random() * 140 - 40; 
                const size = Math.random() * 5 + 7; 
                
                $layer.append(`<div class="sakura-item" style="left:${left}vw; width:${size}px; height:${size * 1.2}px; animation-duration:${duration}s; animation-delay:-${delay}s;"></div>`);
            }
        }
    }

    $switchBtns.on('click', function(e) {
        e.preventDefault(); 
        const effect = $(this).attr('data-effect'); 
        updateUI(effect);
        applyEffect(effect);
        localStorage.setItem('qxbkw_effect', effect);
    });

    updateUI(currentEffect);
    applyEffect(currentEffect);

    /* ----------------------------------------------------
       模块二:多级菜单防冲突与手风琴折叠算法
       ---------------------------------------------------- */
    $('.qxbkw-boxmoe-menu .menu-item-has-children > a').on('click', function(e) {
        e.preventDefault(); 
        const $parentLi = $(this).parent('li');
        const $subMenu = $(this).siblings('.sub-menu');

        // 状态一:折叠动作
        if ($parentLi.hasClass('open-submenu')) {
            $subMenu.slideUp(300); 
            $parentLi.removeClass('open-submenu');
            // 高级逻辑:折叠父级时,顺带重置深层嵌套子菜单的状态
            $parentLi.find('.open-submenu').removeClass('open-submenu').find('.sub-menu').slideUp(300);
        } 
        // 状态二:展开动作
        else {
            // 高级逻辑:展开当前项时,静默收起同级的其他已展开菜单
            $parentLi.siblings('.open-submenu').removeClass('open-submenu').find('.sub-menu').slideUp(300);
            $subMenu.slideDown(300); 
            $parentLi.addClass('open-submenu');
        }
    });
});

💡 最终效果与总结

盒子萌的Light/Dark/Auto是主题颜色切换,分别是白间、夜间、跟随系统。

但我发现在当子比白间和夜间的logo不一样时,用Light/Dark/Auto切换主题logo不会跟着切换,所以我就把那三个按钮改成了全局环境特效控制器。

如果你在部署过程中遇到任何问题,欢迎在下方评论区交流讨论!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容