使用原生前端技术封装一个组件

封装导航栏

html 复制代码
<header>
    <nav>
        <ul>
            <li><a href="index.html"><i class="fas fa-home"></i> 主页</a></li>
            <li>
                <a href="#"><i class="fas fa-theater-masks"></i> 非遗项目</a>
                <ul class="sub-menu">
                    <li><a href="projects.html#beijing"><i class="fas fa-theater-masks"></i> 京剧</a></li>
                    <li><a href="projects.html#jianzhi"><i class="fas fa-scissors"></i> 剪纸</a></li>
                </ul>
            </li>
            <li>
                <a href="#"><i class="fas fa-user-friends"></i> 传承人</a>
                <ul class="sub-menu">
                    <li><a href="heritage.html#zhangsan"><i class="fas fa-user-friends"></i> 张三</a></li>
                    <li><a href="heritage.html#lisi"><i class="fas fa-user-friends"></i> 李四</a></li>
                </ul>
            </li>
            <li>
                <a href="#"><i class="fas fa-calendar-alt"></i> 活动</a>
                <ul class="sub-menu">
                    <li><a href="events.html#festival"><i class="fas fa-calendar-alt"></i> 非遗文化节</a></li>
                    <li><a href="events.html#workshop"><i class="fas fa-tools"></i> 工作坊</a></li>
                </ul>
            </li>
            <li>
                <a href="#"><i class="fas fa-info-circle"></i> 关于我们</a>
                <ul class="sub-menu">
                    <li><a href="about.html"><i class="fas fa-info-circle"></i> 关于我们</a></li>
                    <li><a href="news.html"><i class="fas fa-newspaper"></i> 非遗新闻</a></li>
                </ul>
            </li>
            <li>
                <a href="#"><i class="fas fa-user-circle"></i> 用户中心</a>
                <ul class="sub-menu">
                    <li><a href="login.html"><i class="fas fa-sign-in-alt"></i> 登录</a></li>
                    <li><a href="register.html"><i class="fas fa-user-plus"></i> 注册</a></li>
                </ul>
            </li>
        </ul>
    </nav>
</header>
js 复制代码
class NavBar extends HTMLElement {
    constructor() {
        super();
        this.attachShadow({ mode: 'open' });
        this.loadTemplate();
    }

    async loadTemplate() {
        try {
            const response = await fetch('/template/navbar-template.html'); // 路径根据实际调整
            const text = await response.text();
            const template = document.createElement('template');
            template.innerHTML = text;
            // 创建 link 元素并添加样式表
            const link = document.createElement('link');
            link.rel = 'stylesheet';
            link.href = '/css/navbar.css'; // 替换为你的组件样式文件路径
            // 插入样式和模板内容到 Shadow DOM
            this.shadowRoot.appendChild(link);
            this.shadowRoot.appendChild(template.content.cloneNode(true));
        } catch (err) {
            console.error('加载模板失败:', err);
        }
    }
}

customElements.define('nav-bar', NavBar);

使用

相关推荐
utmhikari17 分钟前
【AI原生】借助AI之力优化个人博客前端样式
前端·css·hexo·next·个人博客·ai-native·vibe coding
小凯在掘金1 小时前
为什么箭头函数不能作为构造函数?
前端·javascript
JustHappy2 小时前
「vConsole MCP🛠️」我让 AI 直接看见任何 H5 的日志和请求帮你 debug
前端·javascript·程序员
codeGoogle2 小时前
Vue3 UIKit 实战:把聊天、会话、主题和移动端适配全部封装好
前端
大龄秃头程序员3 小时前
iOS Method Swizzling 的工程化实践:如何处理多重交换与第三方冲突
前端
liangshanbo12153 小时前
Webpack 文件指纹面试题整理
前端·webpack·node.js
xieter3 小时前
【技术精选】Node.js 核心事件循环机制与异步 I/O 深度剖析 (2026-10-02)
前端·javascript
计算机魔术师4 小时前
Ethan Mollick 谈点与群:智能体自组织为何让管理假设失效
前端
故七月4 小时前
GEO 信源评估体系:如何判断一条网页信源能否被大模型采信
前端·网络·人工智能
liangshanbo12154 小时前
Webpack 常见 Plugin 面试题
前端·webpack·node.js