まずは html / CSS でレイアウトを決める
スケジュールの内容はDBから取得するとして、ローカル段階での作成は以下を目標とする。
- PCでは表組み。スマホではリスト表示
- 祝日表示
- 翌月/次月操作
- 複数設置可能
/* html */
<div class="cal"></div>
実際は想定した内容をモックアップとして作成した上でコードを書くんだけれど省略。
なのでhtml自体はjavascriptで吐き出しするためラッパーだけ設置。また複数設置も視野に入れ、classセレクタで。
/* CSS */
.calender_switcher,
.calender-head,
.calender-body {
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.calender_switcher *,
.calender-head *,
.calender-body * {
-webkit-box-sizing: inherit;
box-sizing: inherit;
}
.calender_switcher {
display: table;
table-layout: fixed;
width: 100%;
background: #f5f5f5;
padding: 10px;
}
.calender_switcher li {
display: table-cell;
vertical-align: middle;
text-align: center;
}
.calender_switcher li:first-child { text-align: left; }
.calender_switcher li:nth-child(2) { width: 70%; }
.calender_switcher li:last-child { text-align: right; }
.calender_switcher a {
display: inline-block;
width: 36px;
height: 36px;
background: #fff;
text-align: center;
cursor: pointer;
position: relative;
}
.prevCal::before,
.nextCal::before {
display: block;
position: absolute;
top: 50%;
left: 50%;
-webkit-transform: translate(-50%,-50%);
transform: translate(-50%,-50%);
}
.prevCal::before { content: "<"; }
.nextCal:before { content: ">"; }
@media (max-width: 768px) {
.calender_switcher { margin: 0 0 10px; }
.calender-head,
.calender-body li.sp { display: none; }
.calender-body { border-top: 1px #ccc solid; }
.calender-body li:not( .sp ) {
display: table;
table-layout: fixed;
width: 100%;
border-bottom: 1px #ccc solid;
padding: 1em 0;
}
.calender-body li > * {
display: table-cell;
vertical-align: middle;
}
.calender-body li .num { width: 2em; }
.calender-body li span { width: 2.5em; }
}
@media (min-width: 769px) {
.calender-head,
.calender-body {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
border-left: 1px #ccc solid;
}
.calender-head {
border-top: 1px #ccc solid;
}
.calender-head li,
.calender-body li {
width: 14.2857%;
border-bottom: 1px #ccc solid;
border-right: 1px #ccc solid;
text-align: center;
padding: 1em;
}
.calender-body li { min-height: 7em; }
.calender-head li span,
.calender-body li span { display: none; }
.calender-body li .holiday-name { margin: 0 0 0 .5em; }
.calender-body li em { display: block; }
}
- .calender_switcher・・・前月、次月のボタンと現在の月表示
- .calender-head・・・曜日
- .calender-body・・・カレンダー本体
すべてリストタグ(ul)で実装。switcherとheadは単なる横並びで処理(スマホ時headは非表示)。
カレンダー本体のセル(li)は以下のようにした。
/* calender-body内セルのhtml抜粋 */
/* 表組みの際の空白のセル(スマホ時非表示) */
<li class="sp"></li>
/* 通常の日のセル */
<li class="">
<strong class="num">1</strong> /* 日付 */
<span>Mon</span> /* スマホ用曜日 */
<em></em> /* スケジュール */
</li>
/* 祝日がある日のセル */
<li class="holiday">
<strong class="num">23</strong>
<span>Tue</span>
<strong class="holiday-name">天皇誕生日</strong> /* 祝日名 */
<em></em>
</li>
祝日をどうするか
調べるとGoogleのAPIから引っ張ってくるのが多いが、アカウントが必要になる。
もし受注案件だと登録させる手間が必要になるし、説明も何かと面倒なのでさらに検索。
祝日を取得出来る「holiday_jp-js」
手軽に取得出来るのでこれに決定。感謝しつつ使用させていただきます。
ダウンロードして「holiday_jp.min.js」を読み込ませておく。
作者さんのサイト