左側垂直導航欄,右側內容區。點擊左側菜單鏈接,**左側菜單不刷新/保持狀態**,右側區域加載對應頁面。
<div class="container-fluid">
<div class="row">
<nav class="col-md-2 d-none d-md-block bg-light sidebar">
<div class="sidebar-sticky">
<ul class="nav flex-column">
<li class="nav-item">
<a class="nav-link" href="page1.html" target="contentFrame">頁面 1</a>
</li>
<li class="nav-item">
<a class="nav-link" href="page2.html" target="contentFrame">頁面 2</a>
</li>
</ul>
</div>
</nav>
<main class="col-md-9 ml-sm-auto col-lg-10 px-md-4">
<iframe name="contentFrame" src="dashboard.html"
style="width:100%; height:calc(100vh - 56px); border:none;"></iframe>
</main>
</div>
</div>
優點: 實現極簡、頁面完全隔離 (CSS/JS 不衝突)、瀏覽器原生支持歷史/刷新。
缺點: **URL 不變** (無法分享/收藏具體頁面)、跨域受限、高度自適應麻煩、SEO 不友好、打印/滾動體驗差、移動端適配困難。
<div id="content">...</div>。
// Vue 3 + Vue Router 4 示例
// App.vue
<!-- 這裡動態加載路由組件 -->
// router/index.js
const routes = [
{ path: '/', redirect: '/dashboard' },
{ path: '/dashboard', component: () => import('@/views/Dashboard.vue') },
{ path: '/users', component: () => import('@/views/Users.vue') },
// 懶加載,按需下載 JS
]
優點: **無刷新切換、URL 同步 (History 模式)、組件復用、狀態保持 (keep-alive)、代碼分割懶加載、TypeScript 支持、生態豐富、移動端完美適配**。
缺點: 需學習前端框架、首屏加載稍大 (可 SSR/SSG 優化)、SEO 需額外配置 (Nuxt/Next.js)。
$('.nav-link').click(function(e) {
e.preventDefault();
var url = $(this).attr('href');
$('#content-area').load(url + ' #content-fragment', function() {
// 回調中重新綁定 JS 事件、初始化插件
});
// 手動 pushState 更新 URL
history.pushState(null, '', url);
});
缺點: **JS/CSS 污染、事件重綁麻煩、無組件化、狀態管理混亂、歷史狀態同步難、本質是「貧血的 SPA」**。
| 項目類型 | 推薦方案 | 理由 |
|---|---|---|
| 傳統 Java Web 維護/無前端資源 | Sitemesh / 服務端模板 | 零前端改造、利用現有後端技術棧 |
| 內部管理系統/工具類/快速原型 | iframe | 開發極快、隔離性好、體驗要求不高 |
| **新項目/長期迭代/對體驗有要求** | Vue/React + Router (SPA) | **現代標準、體驗最佳、生態成熟、可持續演進** |
| 需 SEO/內容型站點 | Next.js / Nuxt.js (SSR/SSG) | 首屏渲染、SEO 友好、同構直出 |
**Bootstrap 側邊欄固定、內容動態加載:iframe 最簡單但體驗差,Sitemesh 需後端強綁定。** **新項目請直接上 Vue/React + Router 構建 SPA**,獲得最佳開發體驗、用戶體驗與長期可維護性。僅在極度受限的存量系統維護中考慮 iframe/Sitemesh。