研究室のホームページをゼロから作ってみた話

# 緒言

　こんにちは，無事に大学院へ進学し，修士1年になりました．今回は自分が配属された研究室のホームページをゼロから作ってみた体験を振り返り，これから研究室のホームページを作ってみたい，と考えている方に向けて解説します．
　この記事を読めば一通り形になるところまで作れます．そこからはデザインを変更したり，アニメーションに拘ってみたり，と様々なアレンジが可能です．今回はシンプルなHTMLとCSSとJavaScirptのみで構成される静的サイト，かつ，必要なツールも汎用的なエディタのみであるため，思っていたよりもハードルは低いように感じました．是非，挑戦してみてください．

# 開発環境

* Windows 11 Home 24H2
* Visual Studio Code 1.100.3
* Live Server 5.7.9

# 作り始めた動機

　自分が配属された研究室のホームページは約10年くらい更新されておらず，勉強も兼ねて作り直してみよう，と考えたことがきっかけでした．学部生の頃に研究室を選ぶため，何個か候補に挙がった研究室のホームページを見ていたのですが，長く更新されていないことは少し不安に感じました．研究内容に興味を持って現在の研究室を選んだものの，やはり研究室のホームページは研究内容や研究実績を効果的に発信し，研究室に魅力を感じてもらう手段として重要であるように思います．
　さて，研究室のホームページを更新することになりましたが，最初から作った方がシンプル，かつ，メンテナンスの観点からも好ましいため，折角なら今まで触れる機会が少なかったホームページの作り方を勉強することも兼ねてゼロから作ってみることに決めました．

# 事前の準備
　まずは研究室のホームページを本格的に作っていく前段階として必要な素材を集める他，全体的な構成まで大雑把に決めておきます．

## コンテンツ
　何個か研究室のホームページを見て特に掲載されることが多いコンテンツを調べました．その傾向から考えた基本的な構成は以下の通りです．これらに対応するページを個別に作っていきます．ただし，ヘッダーやフッター等，なるべく共通化できる部分は共通化しました．

* ホーム
* 研究内容
* 研究実績
* お知らせ
* メンバーの紹介
* アクセス情報
* 関連リンク

## 素材
　その他，研究室の紹介文や写真，研究内容，研究実績，教授のプロフィール等，研究室のホームページを作る上で必要な素材は教授や秘書の方と相談しながら送ってもらいました．連絡を取り合う上で少し時間は掛かってしまいましたが，具体的に集めた素材は以下の通りです．

* 教授の顔写真
* 教授のプロフィール
* 研究室のロゴ
* 研究室の写真
* 研究室の紹介文
* 研究内容
* 研究実績

# 制作の手順
　ここから研究室のホームページを作る手順に関して解説します．まずは全体的なレイアウトを作った後，細かい構成やアニメーションの付け方も簡単に解説します．

## 基本的な知識
　読み飛ばしてもらっても構いませんが，前提として必要な知識を確認します．まず，HTMLでホームページの構造を記述し，CSSでデザインを整え，必要に応じてJavaScriptやCSSでアニメーションを実装します．また，スマホからのアクセスが増加する昨今，レスポンシブウェブデザインを取り入れることは特に重要です．ファイルはローカルで管理し，ブラウザで表示を確認しながら制作しますが，完成したらサーバーにアップロードして公開します．
　余談ですが，本来の意味や英語圏の表現においてホームページはウェブサイトを開いたら最初に表示されるページのことを指します．しかし，日本語の表現においてホームページはウェブサイトと同義であることも多いため、混同しないように注意が必要です．今回は日本語の表現に合わせてホームページはウェブサイトのことを指し，トップページはウェブサイトを開いたら最初に表示されるページのことを指します．

## 全体的なレイアウト

　ここではトップページを例に挙げますが，どのページも同様です．まずは大雑把にレイアウトを組みます．後々ヘッダーやフッター等は共通化し，PHPで読み込む予定ですが，今回は静的サイトなので割愛します．

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="XJbedpJ" data-pen-title="layout" data-user="ricelectric" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ricelectric/pen/XJbedpJ">
  layout</a> by ryo (<a href="https://codepen.io/ricelectric">@ricelectric</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

## ヘッダーの作り方

　次にヘッダーのデザインを考えてみます．左側に研究室のロゴ，右側にグローバルナビゲーションを配置しました．スマホで表示されることも想定し，画面幅が狭い場合は代わりにハンバーガーメニューが表示されるように作りました．これをクリックすることで左側から右側にメニューが展開されます．この切り替わる境目，ブレイクポイントは全体的なレイアウトのバランスも踏まえて考えました．また，マウスのカーソルを合わせた際に下線が表示されるようなアニメーションも実装してみました．

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="RNPLNxR" data-pen-title="header" data-user="ricelectric" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ricelectric/pen/RNPLNxR">
  header</a> by ryo (<a href="https://codepen.io/ricelectric">@ricelectric</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

## フッターの作り方

　併せてフッターのデザインも考えてみます．今回は中央に研究室の所属，名称を掲載しました．これをクリックすればトップページに戻ります．また，最下部にコピーライトを表示しておきます．

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="QwbqbpY" data-pen-title="footer" data-user="ricelectric" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ricelectric/pen/QwbqbpY">
  footer</a> by ryo (<a href="https://codepen.io/ricelectric">@ricelectric</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

## 文章のデザインを決める

　文章のタイトルやサブタイトルのレイアウトを示します．まずは非常にシンプルなデザインで作ってみましたが，後々アレンジするのも手です．

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="WbvZwPq" data-pen-title="text" data-user="ricelectric" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ricelectric/pen/WbvZwPq">
  text</a> by ryo (<a href="https://codepen.io/ricelectric">@ricelectric</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

## 表の作り方

　簡単な表の作り方を示します．要素と要素の間に線を引くため，隣接セレクタを使って記述しました．他に間接セレクタ，直下セレクタ，といった書き方もあることを知り，勉強になりました．

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="EajwjMW" data-pen-title="list" data-user="ricelectric" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ricelectric/pen/EajwjMW">
  list</a> by ryo (<a href="https://codepen.io/ricelectric">@ricelectric</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

## ボタンの作り方

　無難なボタンの作り方を示します．マウスのカーソルを合わせた際に背景色と文字色が変化するようなアニメーションも実装してみました．

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="PwqJqLX" data-pen-title="button" data-user="ricelectric" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ricelectric/pen/PwqJqLX">
  button</a> by ryo (<a href="https://codepen.io/ricelectric">@ricelectric</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

## 画像の載せ方

　画像の載せ方を解説します．レイアウトが崩れてしまうことを防ぐため，縦横比を固定し，食み出した部分は自動でトリミングされるように記述しました．画像のサイズを指定する必要もありますが，スマホで表示されることを想定し，相対値で指定しました．ただし，極端な拡大，縮小を防ぐため，最大幅や最小幅も併せて指定することが望ましいです．

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="EajwVpL" data-pen-title="image" data-user="ricelectric" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ricelectric/pen/EajwVpL">
  image</a> by ryo (<a href="https://codepen.io/ricelectric">@ricelectric</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

## 地図の載せ方

　最後にGoogleマップの埋め込み方を解説します．まずはGoogleマップで地名を検索し，共有ダイアログを開いて埋め込み用のコードを取得するだけなので非常に簡単です．ここで注意ですが，スクリーンショットを公開することは原則として禁止されているようなので必ず前述の手順で埋め込みましょう．この方が位置や縮尺を調整できる他，最新の地図に自動で更新されるため，便利です．スマホで表示されることを想定し，画面幅が変化しても見やすいように縦横比を固定しました．

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="RNPLPgx" data-pen-title="map" data-user="ricelectric" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ricelectric/pen/RNPLPgx">
  map</a> by ryo (<a href="https://codepen.io/ricelectric">@ricelectric</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://public.codepenassets.com/embed/index.js"></script>

## 表示の確認

　今回は[*こちら*](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer)のプラグインをインストールし，簡易的なローカルウェブサーバを立ち上げて表示を確認しました．ファイルを更新したら自動でブラウザに反映されるため，とても効率的に開発できます．以下のサイトを参考に導入しました．

https://monomonotech.jp/kurage/memo/m220525_vscode_liveserver.html

# 基本形が完成

　ここまでのコンテンツを組み合わせることでホームページの基本形は完成します．それぞれのページを順番に見ていきましょう．なお，それぞれのファイルはGitHubに公開したので[*こちら*](https://github.com/ricelectric/laboratory-website)からダウンロードできます．また，デモサイトも[*こちら*](https://ricelectric.github.io/laboratory-website/)から確認できます．

## ホーム

　まずはトップページから．ボタンを押すことで各ページにジャンプします．ここでは研究室の概要に加えて研究室のニュースを直近3件だけ載せます．素っ気ないようでしたら画像や動画を載せるのも手です．

![index.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/654bd3d2-10ac-4298-8707-26efed4f38ff.png)

## 研究内容

　次に研究内容を解説するページです．研究室にとって特に重要かもしれません．研究室によって大きく異なるところであるため，あくまでも参考例として示します．

![about.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/2470167e-eab7-4b8a-8842-33533979725f.png)

## 研究実績

　研究実績を一覧で紹介するページです．ここでは年度ごとに取り纏め，論文のタイトル，著者名や雑誌名，出版年などを掲載します．

![research.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/06f47a35-6c13-47a7-a485-a30d3ff02d72.png)

## お知らせ

　研究室のニュースを掲載するページです．トップページにおいては直近3件だけ載せましたが，こちらのページにおいては全件を載せます．

![news.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/d858c8d3-4849-41be-ada8-22fda030f67e.png)

## メンバー紹介

　研究室のメンバーを紹介するページです．なお，教授のプロフィールについては別途ページを用意し，そちらに掲載しました．そのリンクを貼って誘導します．ほとんど作り方は同じなので割愛します．

![members.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/9986bc3d-b438-4af0-a23b-df5d464e1771.png)

## アクセス情報

　研究室の所在地や最寄り駅，連絡先などを掲載するページです．なお，メールアドレスを公開する場合はアットマークを別の文字に置き換えて注記を入れる，エンティティ化する，画像として公開する，といったスパム対策が必要です．

![access.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951963/6b4b1592-48b9-4976-b4c0-0a503beebd25.png)

# 感想

　記事を書く過程で解説しやすいように手順は少し前後してしまった部分もありますが，大きな相違はないため，ご了承ください．初心者だからこそ，基本的なところで割と苦戦しましたが，生成AIも上手く活用し，理解が深まったように思います．最初は難しそうに思っていたアニメーションもCSSやJavaScriptを用いて実装できたことは嬉しい誤算です．最後に全体を通じて良かった点，難しかった点を振り返ってみます．

## 良かった点

* 全体的にシンプルなデザイン
* モダンに見えるアニメーション
* 生成AIを活用して効率的に学習

## 難しかった点

* レイアウトの組み方
* レスポンシブウェブデザイン

# 結言

　割り切って作れば思っていたよりも短期間で作れたように思います．また，作りながら必要な知識も徐々に習得できました．スムーズに進めるため，最初から凝ったデザインで作らないこと，教授や秘書の方と連絡を取って必要な素材を事前に集めること，スマホにおける表示も前提にレイアウトを考えることは特に重要であったように思います．これから研究室のホームページを作ってみたい，と考えている方にとって何らかの参考になれば幸いです．
　なお，今回は基本的なホームページの作り方に絞って解説しました．ここからデザインやアニメーションに拘ったところは本題から少し逸れるように感じたので別の記事に書く予定です．以上，研究室のホームページをゼロから作ってみた話でした．