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

封装导航栏

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);

使用

相关推荐
Mintopia3 分钟前
🧠 AIGC + 区块链:Web内容确权与溯源的技术融合探索
前端·javascript·全栈
晓得迷路了6 分钟前
栗子前端技术周刊第 103 期 - Vitest 4.0、Next.js 16、Vue Router 4.6...
前端·javascript·vue.js
Mintopia7 分钟前
🚀 Next.js Edge Runtime 实践学习指南 —— 从零到边缘的奇幻旅行
前端·后端·全栈
GISer_Jing13 分钟前
不定高虚拟列表性能优化全解析
前端·javascript·性能优化
Predestination王瀞潞28 分钟前
WEB前端技术基础(第三章:css-网页美化的衣装-上)
前端·css
鹏多多32 分钟前
深度解析React中useEffect钩子的使用
前端·javascript·react.js
超级大只老咪32 分钟前
CSS基础语法
前端
冰暮流星33 分钟前
css之box-sizing属性
前端·javascript·css
倚肆37 分钟前
CSS ::before 和 ::after 伪元素详解
前端·css
华洛39 分钟前
聊一下如何稳定的控制大模型的输出格式
前端·产品经理·ai编程