jQuery UI Datepicker(日付選択カレンダー) の使用方法、テーマ・オプションの種類・変更方法を解説

HTML5ではinputタグのtype属性にdateを指定すると、カレンダーから日付を選択できます。
ここでは、テーマやオプションによってカスタマイズ可能な、jQuery UI Datepickerの使用方法・各種変更方法を自身の備忘録も兼ねて紹介したいと思います。
テーマのスクショもありますので、テーマ選びの参考になると思います。
機能しない!と混乱を招きやすい「Today」ボタンについても説明しております。

使用するファイル

  • HTMLファイル
  • CSSファイル(必要最低限の見た目を整える程度)
  • JSファイル

使用方法

HTMLファイル

各種読み込みと、入力フォーム、必要に応じて入力結果を表示する要素を作成します。

<head>
  <!-- 途中省略 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/base/jquery-ui.min.css"> <!-- デフォルトのテーマ -->
  <link rel="stylesheet" href="style.css"> <!-- ご自身のパスに変更 -->
</head>
<body>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
  <script src="main.js"></script> <!-- ご自身のパスに変更 --> 
</body>

JSファイル

入力フォーム要素に datepicker() メソッドを実行します。
下記はデフォルトで使用する場合の記述例ですが、オプションも追加できます(後述します)。

$('#datepicker').datepicker();  // デフォルトのまま使用する場合

テーマ

テーマの種類

テーマは下記のように多数(25個!)あります(画像が荒いですが、テーマによっては細かな模様が施されていたりします)。
各テーマの縮尺は同じにしています。つまり、テーマによって若干大きさが異なるようです。

datapicker_4×7

テーマの選択方法

テーマの選択方法は、オプション追加方法とは異なり、Datepicker の読み込み時に指定します。
リンクパス内の themes/ の後のテーマ名を変更します。
下記に各リンクを記載しております。

<head>
  <!-- 省略 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/base/jquery-ui.min.css">  <!-- テーマbaseを選択(デフォルト) -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/black-tie/jquery-ui.min.css">  <!-- テーマblack-tieを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/blitzer/jquery-ui.min.css">  <!-- テーマblitzerを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/cupertino/jquery-ui.min.css">  <!-- テーマcupertinoを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/dark-hive/jquery-ui.min.css">  <!-- テーマdark-hiveを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/dot-luv/jquery-ui.min.css">  <!-- テーマdot-luvを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/eggplant/jquery-ui.min.css">  <!-- テーマeggplantを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/excite-bike/jquery-ui.min.css">  <!-- テーマexcite-bikeを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/flick/jquery-ui.min.css">  <!-- テーマflickを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/hot-sneaks/jquery-ui.min.css">  <!-- テーマhot-sneaksを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/humanity/jquery-ui.min.css">  <!-- テーマhumanityを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/le-frog/jquery-ui.min.css">  <!-- テーマle-frogを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/mint-choc/jquery-ui.min.css">  <!-- テーマmint-chocを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/overcast/jquery-ui.min.css">  <!-- テーマovercastを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/pepper-grinder/jquery-ui.min.css">  <!-- テーマpepper-grinderを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/redmond/jquery-ui.min.css">  <!-- テーマredmondを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.min.css">  <!-- テーマsmoothnessを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/south-street/jquery-ui.min.css">  <!-- テーマsouth-streetを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/start/jquery-ui.min.css">  <!-- テーマstartを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/sunny/jquery-ui.min.css">  <!-- テーマsunnyを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/swanky-purse/jquery-ui.min.css">  <!-- テーマswanky-purseを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/trontastic/jquery-ui.min.css">  <!-- テーマtrontasticを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/ui-darkness/jquery-ui.min.css">  <!-- テーマui-darknessを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/ui-lightness/jquery-ui.min.css">  <!-- テーマui-lightnesseを選択 -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/vader/jquery-ui.min.css">  <!-- テーマvaderを選択 -->
  <!-- 省略 -->
</head>

オプション等

オプションの種類

オプションの公式ページ(英語)はこちらです。

オプション 説明 デフォルト
altFielddatepickerから選択した日付を入力する要素“”
altFormataltField に入力する日付フォーマット“”
appendText各日付入力欄の後に表示するテキスト“”
autoSize入力欄のサイズを自動化false
beforeShow入力フィールドと現在のdatepickerインスタンスを受け取り、datepickerを更新するためのオプションオブジェクトを返す関数
datepicker が表示される直前に呼び出される。
null
beforeShowDay日付をパラメーターとして受け取り、次の配列を返す必要がある関数
[0]:この日付が選択可能かどうかを示すtrue / false
[1]:日付のセルに追加するCSSクラス名
[2]:この日付のオプションのポップアップツールチップ
この関数は、 datepicker が表示される前に呼び出される。
null
buttonImageshowOnオプションが「button」または「both」に設定されている場合、 datepicker を表示のために使用するための画像のURL
設定した場合、buttonTextオプションはalt値になり非表示
“”
buttonImageOnlyボタン画像をボタン要素内ではなく単独で生成
buttonImageオプションが設定されている場合にのみ設定可
false
buttonTextshowOnオプションが「button」または「both」に設定されている場合、
datepicker を表示するボタンに表示するテキスト
“…”
calculateWeek特定の日付の年の週を計算する関数
デフォルトの実装では、ISO8601の定義が使用される。週は月曜日に始まり、年の最初の週には、その年の最初の木曜日が含まれる。
jQuery.datepicker.iso8601Week
changeMonth月をドロップダウンで表示false
changeYear年をドロップダウンで表示 false
closeTextdatepicker を閉じるボタンに表示するテキスト
showButtonPanelオプションが設定されている場合にのみ設定可
“Done”
constrainInput入力欄への入力を、dateFormatオプションで設定されたものに制限true
currentText当日ボタンに表示するテキスト
showButtonPanelオプションが設定されている場合にのみ設定可
※このボタンは、入力欄に当日をセットするのではなく、当月へのリンクボタン
例えば当月以外の月を表示している時に、当月に戻る
“Today”
dateFormat表示される日付の形式“mm/dd/yy”
dayNames曜日名の配列[ “Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday” ]
dayNamesMin最小化された曜日名の配列 [ “Su”, “Mo”, “Tu”, “We”, “Th”, “Fr”, “Sa” ]
dayNamesShort省略された曜日名の配列 [ “Sun”, “Mon”, “Tue”, “Wed”, “Thu”, “Fri”, “Sat” ]
defaultDate入力欄が空白の場合、デフォルトで表示する日付null
durationdatepickerが表示される速度
ミリ秒単位の時間
または、 “slow”, “normal”, “fast”
“normal”
firstDay週の最初の曜日を設定
0 :日曜日、 1 : 月曜日…
0
gotoCurrent当日のリンクは今日ではなく現在選択されている日付に移動false
hideIfNoPrevNextminDateおよびmaxDateオプションが設定されている場合、範囲外の月のリンクを非表示false
isRTL言語が右から左に描かれているかfalse
maxDate選択可能な最大(将来)の日付null
minDate選択可能な最小(過去)の日付null
monthNames月名の配列[ “January”, “February”, “March”, “April”, “May”, “June”, “July”, “August”, “September”, “October”, “November”, “December” ]
monthNamesShort省略された月名の配列 [ “Jan”, “Feb”, “Mar”, “Apr”, “May”, “Jun”, “Jul”, “Aug”, “Sep”, “Oct”, “Nov”, “Dec” ]
navigationAsDateFormatcurrentText、prevText、およびnextTextオプションをformatDate関数によって日付として解析するか
たとえば、ターゲットの月の名前を表示
false
nextText翌月のリンクに表示するテキスト
通常はアイコンに置換されている
“Next”
numberOfMonths一度に表示する月数1
onChangeMonthYeardatepickerが新しい月や年に移動したときに呼び出される 関数
選択した年、月、および datepicker インスタンスをパラメーターとして受け取る
null
onClosedatepicker が閉じられたときに呼び出される関数
選択された日付をテキストとして受け取り、datepickerインスタンスをパラメーターとして受け取る
null
onSelectdatepicker が選択されたときに呼び出される関数
選択した日付をテキストとして受け取り、datepickerインスタンスをパラメーターとして受け取る
null
prevText前月のリンクに表示するテキスト
通常はアイコンに置換されている
“Prev”
selectOtherMonths当月の前後に表示される他の月の日を選択可能にするかfalse
shortYearCutoffカットオフ年以下の年の値で入力された日付はすべて現在の世紀であると見なされ、それより大きい日付は前の世紀であると見なされる。“+10”
showAnimdatepicker の表示と非表示に使用されるアニメーションの名前
「show」、「slideDown」、「fadeIn」、jQueryUIエフェクトのいずれかを使用
“show”
showButtonPanel datepicker の下部左側に「今日」ボタンを、右側に datepicker を閉じる「完了」ボタン等を表示false
showCurrentAtPosnumberOfMonthsオプションで複数月を表示設定した場合、現在の月を表示する位置を定義0
showMonthAfterYearヘッダーに年の翌月を表示するかfalse
showOndatepicker が表示されるタイミング
focus:入力欄がフォーカスされた時
button : ボタンがクリックされた 時
both: またはいずれかのイベントが発生したとき時
“focus”
showOptionsshowAnimオプションにjQueryUIエフェクトを使用する場合、プロパティにアニメーションを追加可能{}
showOtherMonths他の月の日付(デフォルトでは選択不可)を表示するか
これらの日を選択可能にするには、selectOtherMonthsオプションを使用
false
showWeekその年の週を示す列を追加false
stepMonths前/次のリンクをクリックしたときに移動する月数を設定1
weekHeader年の週の列見出しに表示するテキスト
showWeekオプションを設定した場合に設定可能
“Wk”
yearRange年のドロップダウンに表示される年の範囲
-nn:+ nn:今年
c-nn:c + nn:現在選択されている年
nnnn: nnnn:絶対値
またはこれらの形式の組み合わせ
“c-10:c+10”
yearSuffix月のヘッダーの年の後に表示する追加のテキスト“”

オプション追加方法

下記はオプションを追加する場合の一例です。

$('#datepicker').datepicker({    // オプションを追加する場合 
  altFormat: "yy/mm/dd",  // 入力結果の表示方法
  altField: '#result',  // 入力結果の表示箇所
  changeYear: true,  // ドロップダウン形式
  changeMonth: true,  // ドロップダウン形式
  dateFormat: "yy/mm/dd",  // 2021/01/01
});

CODEPENでオプション追加

「Run Pen」をクリックしてください。

今回は、関数を呼び出すオプションは使用していません。

See the Pen datepicker by blue moon (@blue-moon) on CodePen.

HTMLファイル

<head>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/themes/vader/jquery-ui.min.css">
  <link rel="stylesheet" href="style.css"> <!-- ご自身のパスに変更 -->
</head>

<body>
  <div class="date"><span>Date:</span><span><input type="text" id="datepicker"></span></div>
  <div class="result"><span>Result:</span><span><input type="text" id="result"><div id="result"></div></span></div>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
  <script src="main.js"></script> <!-- ご自身のパスに変更 --> 
</body>

入力欄なしでカレンダーを最初から表示する場合

inputタグは不要なため、divタグに置き換えます。

デフォルトでは、入力フォームを選択するとdatepickerが小さなオーバーレイで開きます。
インラインカレンダーの場合は、 入力フォームはなく datepicker が開いた状態です。

<body>
  <div id="datepicker"></div>
</body>

CSSファイル

body {
  margin: 20px;
}

.date, .result {
  margin: 0 auto;
  width: 175px;
  display: flex;
  justify-content: space-between;
}

input {
  width: 110px;
  text-align: center;
}

#ui-datepicker-div {
  transform: scale(0.5) translate(-50%, -50%);  //デフォルトのカレンダーが大きかったため、調整
  left: calc(((100vw - 175px) / 2) + 56px) !important;  //入力欄と位置を揃える
}

JSファイル

$('#datepicker').datepicker({
  altField: '#result',  // 入力結果の表示箇所
  altFormat: "yy/mm/dd(D)",  // 入力結果の表示方法 Dは曜日の省略形、DDは省略なし
  currentText: "Now",  // Todayボタンテキストを置換
  dateFormat: "yy/mm/dd(D)",  // 2021/08/27(Fri)
  defaultDate: 2,  // 2日後をハイライト
  duration: 500,  // 500ミリ秒かけて表示
  firstDay: 1,  // 週を月曜日から始める
  selectOtherMonths: true,  // 当月前後の日付選択可能
  showAnim: 'slideDown',  // スライドダウンでカレンダー表示
  showButtonPanel: true,  // カレンダーにボタンを表示させるか
  showOtherMonths: true,  // 当月カレンダーに前後月の日を表示
  minDate: -1,  // 1日前から選択可能
  maxDate: '1M +20D',  // 1ヶ月と20日後まで選択可能 
});

補足説明

今回はサンプルの為、カレンダー下部の showButtonPanel は表示に設定していますが、 少し紛らわしい 「Today」ボタンも表示されます。
このボタンの何が紛らわしいのかというと、オプションの項目にも記載していますが、当日の日付選択機能をもつのではなく、当日が含まれる月へのリンクボタンだということです。

よって、個人的には showButtonPanel は表示したとしても、「Today」ボタンの方は CSSで非表示 display: none; にしてもいいのではと思ってしまいます。
もしくは、当日の日付をjavascripで取得し入力欄に表示させるというクリックイベント関数を別途作成する、という手段も考えられますが。

最後に

先日、2つの日時の差を計算する方法を投稿しました。
日付取得方法は、こちらもお役にたてるかもしれません。

タイトルとURLをコピーしました