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

封装导航栏

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

使用

相关推荐
李剑一几秒前
别再瞎写 Cesium 可视化!热力图 + 四色图源码全公开,项目直接复用!
前端·vue.js·cesium
SuperEugene2 分钟前
Vue3 + Vue Router + Pinia 路由守卫规范:beforeEach 应做 / 不应做,避死循环、防重复请求|状态管理与路由规范篇
开发语言·前端·javascript·vue.js·前端框架
Greg_Zhong3 分钟前
Css知识之伪类和伪元素
前端·css
Mintopia4 分钟前
GPT-5.3-Codex 底层逻辑是什么,为什么编码强?
前端·人工智能·ai编程
Mintopia6 分钟前
Opus 模型凭什么收费贵,与其他模型对比理由是什么?
前端·人工智能
东东__net7 分钟前
js逆向与谷歌加密库
开发语言·前端·javascript
程序员小郭8315 分钟前
Spring Ai 05 ChatClient Advisor 实战(日志、提示词增强、内容安全)
java·开发语言·前端
m0_5027249516 分钟前
腾讯地图tlbs-multi-marker动态更新marker图标
前端·javascript·vue.js·地图
IT_陈寒20 分钟前
SpringBoot 项目启动慢?这5个优化技巧让你的应用快50%
前端·人工智能·后端
GISer_Jing30 分钟前
React核心语法:组件化与声明式编程
前端·react.js·前端框架