Anaguraプロジェクトの複数サイト(Hub、Blog、Dict-DB、Khokh Sudar、Linguistics)で、ナビゲーションとフッターを統一するため、JavaScriptによる動的生成システムを実装した。
課題:
各サイトで手動でナビゲーションリンクを管理していたため、リンク追加や変更のたびに、すべてのHTMLファイルを編集する必要があった。これは非効率で、エラーも発生しやすい。
解決策:
anagura-nav.jsに、すべてのナビゲーションデータを一元管理する配列を作成:
const NAVIGATION_DATA = [
{
id: 'hub',
title: { ja: 'ハブ', mn: 'Төв', en: 'Hub' },
url: '/anagura/',
description: { ja: 'プロジェクトのハブ', mn: '...', en: '...' }
},
{
id: 'blog',
title: { ja: 'ブログ', mn: 'Блог', en: 'Blog' },
url: '/blog/',
description: { ... }
},
// ... 他のサイト
];
このデータから、各ページのナビゲーションバーとフッターのリンクを動的に生成する。言語も自動検出される(<html lang="ja">属性から)。
関連サイトリストの自動生成:
サイドバーの「関連サイト」リストも、同じデータから生成される。現在のページを除外し、残りのサイトをリスト表示:
function generateRelatedSites(currentSiteId) {
const lang = document.documentElement.lang || 'ja';
const sites = NAVIGATION_DATA.filter(site => site.id !== currentSiteId);
const html = sites.map(site => `
<li><a href="${site.url}">${site.title[lang]}</a></li>
`).join('');
return `<ul>${html}</ul>`;
}
フッターの著作権表示の統一:
すべてのサイトで、同じフッターテキストをJavaScriptで生成:
function generateFooterCopyright() {
const year = new Date().getFullYear();
return `© ${year} Itako999. All rights reserved.`;
}
これにより、年号が自動的に更新され、機械可読性も向上する。
Sticky/Scrolling Footer問題の解決:
フッターが短いページでは画面下部に固定され、長いページではコンテンツの最後に表示されるようにする必要があった。Flexboxで解決:
body {
display: flex;
flex-direction: column;
min-height: 100vh;
}
.site-content {
flex: 1;
}
.site-footer {
flex-shrink: 0;
}
FOUT(Flash of Unstyled Content)の解決:
Webフォントの読み込み中、システムフォントが表示されてしまう問題を、フォントプリロードで解決:
<link rel="preload" href="/fonts/NotoSans.woff2" as="font" type="font/woff2" crossorigin>
現在、すべてのAnaguraサイトは統一されたナビゲーションシステムを使用している。新しいサイトを追加する際は、NAVIGATION_DATA配列に1つのエントリを追加するだけで、すべてのサイトに自動的に反映される。