時刻

BootstrapVueのカスタム<b-time>コンポーネントは、WAI-ARIAに準拠した時刻選択ウィジェットを生成します。このウィジェットは他のコンポーネントを制御したり、カスタマイズされた時刻ピッカー入力を作成するために使用できます。

v2.6.0以降のBootstrapVueで利用可能です

概要

<b-time>はWAI-ARIAアクセシビリティに準拠しており、キーボード操作(矢印、ページアップ/ダウン、ホーム、エンドキー)用に最適化されています。国際化もサポートしており、ロケールが指定されていない場合は、ブラウザまたはページのロケールをデフォルトで使用します。

カスタムフォームコントロール入力として時刻ピッカーが必要な場合は、代わりに<b-form-timepicker>コンポーネントを使用してください。

<template>
  <b-row>
    <b-col md="auto">
      <b-time v-model="value" locale="en" @context="onContext"></b-time>
    </b-col>
    <b-col>
      <p>Value: <b>'{{ value }}'</b></p>
      <p class="mb-0">Context:</p>
      <pre class="small">{{ context }}</pre>
    </b-col>
  </b-row>
</template>

<script>
  export default {
    data() {
      return {
        value: '',
        context: null
      }
    },
    methods: {
      onContext(ctx) {
        this.context = ctx
      }
    }
  }
</script>

<!-- b-time.vue -->

v-modelの戻り値

<b-time>は常にHH:mm:ss形式の文字列を返します。これは、ネイティブブラウザの<input type="time">コントロールが返す形式と同じです。値は'00:00:00'から'23:59:59''h23'時間サイクル構文を使用した24時間制)の範囲になります。

時刻が選択されていない場合、<b-time>は空の文字列('')を返します。

無効および読み取り専用の状態

disabledプロパティを設定すると、<b-time>コンポーネントのすべてのインタラクティブ性が削除されます。readonlyプロパティを設定すると、時刻の選択は無効になりますが、スピンボタンはフォーカス可能なままになります。

<template>
  <div>
    <b-form-group
      label="Select time interactive state"
      v-slot="{ ariaDescribedby }"
    >
      <b-form-radio-group
        v-model="state"
        :aria-describedby="ariaDescribedby"
        aria-controls="ex-disabled-readonly"
      >
        <b-form-radio value="disabled">Disabled</b-form-radio>
        <b-form-radio value="readonly">Readonly</b-form-radio>
        <b-form-radio value="normal">Normal</b-form-radio>
      </b-form-radio-group>
    </b-form-group>

    <b-time
      id="ex-disabled-readonly"
      :disabled="disabled"
      :readonly="readonly"
    ></b-time>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        state: 'disabled'
      }
    },
    computed: {
      disabled() {
        return this.state === 'disabled'
      },
      readonly() {
        return this.state === 'readonly'
      }
    }
  }
</script>

<!-- b-time-disabled-readonly.vue -->

スタイリング

秒スピンボタンの有効化

デフォルトでは、秒スピンボタンは表示されません。秒の選択を有効にするには、show-secondsプロパティをtrueに設定して、秒選択スピンボタンを有効にします。show-secondsfalse(または指定されていない)の場合、返される値には、時刻文字列の秒の部分が常に00に設定されます。

<template>
  <b-time v-model="value" show-seconds locale="en"></b-time>
  <div class="mt-2">Value: '{{ value }}'</div>
</template>

<script>
  export default {
    data() {
      return {
        value: ''
      }
    }
  }
</script>

<!-- b-time-show-seconds.vue -->

上部の選択された時刻ヘッダーの非表示

デフォルトでは、現在選択されている時刻が、ロケールの言語でフォーマットされ、時刻コンポーネントの上部に表示されます。

hide-headerプロパティを使用して、このヘッダーを非表示にできます。これは選択された時刻を視覚的に非表示にするだけで、スクリーンリーダーのユーザーがaria-liveリージョンとして利用できるようにしておくことに注意してください。

ボーダーとパディング

ボーダーとパディングのある時刻コントロールが必要ですか?Bootstrapのボーダーおよびパディングユーティリティクラスを使用して、ボーダーとパディングを追加します。

<template>
  <b-time class="border rounded p-2" locale="en"></b-time>
</template>

<!-- b-time-border-padding.vue -->

デフォルトスロット

defaultスロットを使用して、時刻インターフェースの下部にオプションのコンテンツを提供します。このスロットは、「今すぐ」や「リセット」などのボタンを追加するために使用できます。

<template>
  <b-time v-model="value" show-seconds locale="en">
    <div class="d-flex" dir="ltr">
      <b-button
        size="sm"
        variant="outline-danger"
        v-if="value"
        @click="clearTime"
      >
        Clear time
      </b-button>
      <b-button
        size="sm"
        variant="outline-primary"
        class="ml-auto"
        @click="setNow"
      >
        Set Now
      </b-button>
    </div>
  </b-time>
</template>

<script>
  export default {
    data() {
      return {
        value: null
      }
    },
    methods: {
      setNow() {
        const now = new Date()
        // Grab the HH:mm:ss part of the time string
        this.value = now.toTimeString().slice(0, 8)
      },
      clearTime() {
        this.value = ''
      }
    }
  }
</script>

<!-- b-time-default-slot.vue -->

イベント

inputイベント

'input'イベントは、v-modelを更新するときに発生します。イベントには、文字列として選択された時刻である単一の引数があります。値は、'HH:mm:ss'形式の文字列(または時刻が選択されていない場合は空の文字列)です。有効な値は、'00:00:00'から23:59:59'の範囲です。

show-secondsプロパティが設定されていない場合、時刻値の秒の部分は常に'00'になります。

disabledまたはreadonlyプロパティが設定されている場合、'input'イベントは発行されません

contextイベント

'context'イベントは、ユーザーが時刻を選択したとき、またはユーザーがスピンボタンのいずれかの値を変更したときに常に発行されます。また、コンポーネントが作成されたとき(DOMに挿入される直前)、または解決されたロケールが変更されたときにも発行されます。

このイベントは、disabledまたはreadonlyプロパティが設定されている場合(時刻コンポーネントが作成されたときの最初の発行を除く)は発行されません。

'context'イベントには、次のプロパティを持つコンテキストオブジェクトが唯一の引数として渡されます。

プロパティ 説明
value 現在の値(HH:mm:ss文字列)、または時刻が選択されていない場合は空の文字列''
formatted 現在の値は解決されたロケールでフォーマットされます。時刻が選択されていない場合は、label-no-timeプロパティの値になります
hours 現在選択されている時間(常に24時間制、h23'形式)は数値として、または時間が選択されていない場合はnullとして返します。
minutes 現在選択されている分の値は数値として、または分が選択されていない場合はnullとして返します。
seconds 現在選択されている秒の値は数値として、または秒が選択されていない場合はnullとして返します。
locale 時刻ピッカーによって解決されたロケール。これは要求されたロケールと異なる場合があります
isRTL ロケールがRTL(右から左)の場合、trueになります。
hour12 インターフェイスが12時間形式を使用しているかどうかを示すブール値
hourCycle スピンボタンに使用される時間サイクルのタイプを表す文字列:'h11''h12''h23'、または'h24'

コンテキストプロパティlocalehour12、およびhourCycleの詳細については、国際化セクションを参照してください。

国際化

時刻インターフェースの国際化は、Intl.DateTimeFormatおよびIntl.NumberFormatを介して提供されます。ただし、時刻コントロールの要素に適用されるラベル(aria-label、選択されたステータスなど)は除きます。これらのラベルについては、独自の翻訳を提供する必要があります。使用可能なロケールはブラウザに依存します(すべてのブラウザがすべてのロケールをサポートしているわけではありません)。

デフォルトでは、<b-time>はブラウザのデフォルトロケールを使用しますが、localeプロパティを使用して使用するロケール(またはロケール)を指定できます。プロパティは、単一のロケール文字列、またはロケール文字列の配列(最も優先されるロケールから優先度が低いロケールの順にリスト)のいずれかを受け入れます。

発行された'context'イベントには、時刻コントロールが解決したロケールが含まれます(これは、Intlでサポートされているロケールによっては、要求されたロケールと同じではない場合があります)。

Node.jsを使用している場合のサーバー側レンダリング(SSR)では、使用しているNode.jsランタイムがIntlと使用するロケールをサポートしていることを確認してください。詳細については、Node Intlサポートドキュメントを参照してください。

<template>
  <b-row>
    <b-col cols="12" class="mb-3">
      <label for="example-locales">Locale:</label>
      <b-form-select id="example-locales" v-model="locale" :options="locales"></b-form-select>
    </b-col>
    <b-col md="auto">
      <b-time
        v-model="value"
        v-bind="labels[locale] || {}"
        :locale="locale"
        show-seconds
        @context="onContext"
      ></b-time>
    </b-col>
    <b-col>
      <p>Value: <b>'{{ value }}'</b></p>
      <p class="mb-0">Context:</p>
      <pre class="small">{{ context }}</pre>
   </b-col>
  </b-row>
</template>

<script>
  export default {
    data() {
      return {
        value: '',
        context: null,
        locale: 'en-US',
        locales: [
          { value: 'en-US', text: 'English US (en-US)' },
          { value: 'de', text: 'German (de)' },
          { value: 'ar-EG', text: 'Arabic Egyptian (ar-EG)' },
          { value: 'zh', text: 'Chinese (zh)' }
        ],
        labels: {
          de: {
            labelHours: 'Stunden',
            labelMinutes: 'Minuten',
            labelSeconds: 'Sekunden',
            labelIncrement: 'Erhöhen',
            labelDecrement: 'Verringern',
            labelSelected: 'Ausgewählte Zeit',
            labelNoTimeSelected: 'Keine Zeit ausgewählt'
          },
          'ar-EG': {
            labelHours: 'ساعات',
            labelMinutes: 'الدقائق',
            labelSeconds: 'ثواني',
            labelAmpm: 'صباحا مساء',
            labelAm: 'ص',
            labelPm: 'م',
            labelIncrement: 'زيادة',
            labelDecrement: 'إنقاص',
            labelSelected: 'الوقت المحدد',
            labelNoTimeSelected: 'لا وقت المختار'
          },
          zh: {
            labelHours: '小时',
            labelMinutes: '分钟',
            labelSeconds: '秒',
            labelAmpm: '上午下午',
            labelAm: '上午',
            labelPm: '下午',
            labelIncrement: '增量',
            labelDecrement: '减量',
            labelSelected: '选定时间',
            labelNoTimeSelected: '没有选择时间'
          }
        }
      }
    },
    methods: {
      onContext(ctx) {
        this.context = ctx
      }
    }
  }
</script>

<!-- b-time-i18n.vue -->

hourCycleの理解

世界中で使用されている主な時刻表記(時計)には、12時間制と24時間制の2つのタイプがあります。hourCycleプロパティを使用すると、特定のロケールで使用されている時計の種類にアクセスできます。時間サイクルタイプには、以下の表に示すいくつかの異なる値を使用できます。hourCycleは、時刻'00:00:00'(1日の始まり)が、特定のロケールのユーザーにどのように表示/フォーマットされるかを示します。'context'イベントには、解決されたhourCycle値が含まれています。

hourCycle 説明
'h12' 112を使用する時間システム。12時間制で、午前0時が12:00 amから始まります。
'h23' 023を使用する時間システム。24時間制で、午前0時が0:00から始まります。
'h11' 011を使用する時間システム。12時間制で、午前0時が0:00 amから始まります。
'h24' 124を使用する時間システム。24時間制で、午前0時が24:00から始まります。

ネイティブHTML5の<input type="date">'h23'形式で時刻値を返し、<b-time>'h23'形式でv-modelを返します。この値は、選択したロケールに応じて、<b-time>コンポーネントのGUI(スピンボタン)を介してユーザーに表示される内容と異なる場合があります。

注: IE 11 はロケールの hourCycle 値の解決をサポートしていません。そのため、解決された hour12 値に基づいて、h12 または h23 のいずれかを想定します。

12時間または24時間インターフェースの強制

12時間入力と24時間入力は、クライアントブラウザのデフォルトロケール(または locale プロパティから解決されたロケール)によって決定されます。12時間ユーザーインターフェースを強制するには、プロパティ hour12true に設定します。24時間ユーザーインターフェースを強制するには、プロパティ hour12false に設定します。プロパティ hour12 のデフォルトは null であり、解決されたロケールを使用して使用するインターフェースを決定します。

hour12 プロパティの設定は、時間スピンボタンのフォーマットのために解決される hourCycle に影響します。これにより、時間スピンボタンの形式は影響を受ける可能性がありますが、フォーマットされた時間文字列の結果は、特定のロケールに対するクライアントの Intl.DateTimeFormat のサポートの制限により、'h12 または 'h23' 形式を示す場合があります。したがって、ロケールのデフォルトの時刻/時間形式を表示するために、hour12 プロパティを null (デフォルト) に設定したままにすることを強くお勧めします

アクセシビリティ

<b-time> は、aria-live リージョン、ロール、aria ラベル、ショートカットキー、およびほとんどのスクリーンリーダーで動作するための完全なキーボードナビゲーションなど、多くのアクセシビリティ機能を提供します。

キーボードナビゲーション

  • 現在選択されているスピンボタンの値を増やします
  • 現在選択されているスピンボタンの値を減らします
  • Home 選択されているスピンボタンを最小値に設定します
  • End 選択されているスピンボタンを最大値に設定します
  • PageUp 選択されているスピンボタンの値を、スピンボタンのステップよりも大きな値で増やします
  • PageDown 選択されているスピンボタンの値を、スピンボタンのステップよりも大きな値で減らします
  • コンポーネント内の次のスピンボタンにフォーカスを移動します
  • コンポーネント内の前のスピンボタンにフォーカスを移動します

いくつかの label-* プロパティは画面には表示されませんが、スクリーンリーダーのユーザーのためにカレンダー内のさまざまな要素にラベルを付けるために使用されます。たとえば、label-selected プロパティは、選択された値を表示する要素に追加されます。

日付ピッカーを国際化する場合、国際的なスクリーンリーダーのユーザーが正しいプロンプトと説明を聞くことができるように、label-* プロパティを適切な翻訳文字列で更新することも重要です。

実装上の注意

<b-time> コンポーネントは、カスタム BootstrapVue コンポーネント <b-form-spinbutton> に基づいています。

<b-time> は、Bootstrap のボーダーおよびフレックスユーティリティクラス、ボタン (btn-*) クラス、および form-control クラスとともに使用します。適切なスタイリングには、BootstrapVue のカスタム SCSS/CSS も必要です。

参照

コンポーネントリファレンス

<b-time>

v2.6.0+

プロパティ

すべてのプロパティのデフォルト値はグローバルに構成可能です。

プロパティ
(クリックで昇順にソート)
タイプ
(クリックで昇順にソート)
デフォルト
説明
aria-labelledby
文字列このコンポーネントのラベルを提供する要素のID。`aria-labelledby`属性の値として使用されます
disabled
ブール値false`true`に設定すると、コンポーネントの機能が無効になり、無効状態になります
footer-tag
v2.22.0+
文字列'footer'フッターのデフォルトタグの代わりにレンダリングするHTMLタグを指定します
header-tag
v2.22.0+
文字列'header'フッターのデフォルトタグの代わりにレンダリングするHTMLタグを指定します
hidden
ブール値false
hide-header
ブール値false設定すると、選択された時間ヘッダーを視覚的に非表示にします
hour12
ブール値null三状態のプロパティ。`true` の場合、インターフェースを12時間形式に強制します。`false` の場合、インターフェースを24時間形式に強制します。`null` の場合、現在のロケールが12時間または24時間インターフェースを決定します(デフォルト)
id
文字列レンダリングされたコンテンツに `id` 属性を設定するために使用され、必要に応じて追加の要素IDを生成するためのベースとして使用されます
label-am
文字列'午前''午前'が選択されている場合にAM/PMスピンボタンに表示するテキスト
label-ampm
文字列'午前/午後'`AM/PM` スピンボタンの `aria-label` 属性の値
label-decrement
文字列'減らす'スピンボタンの `-` ボタンの `aria-label` 属性の値
label-hours
文字列'時間'`時間`スピンボタンの `aria-label` 属性の値
label-increment
文字列'増やす'スピンボタンの `+` ボタンの `aria-label` 属性の値
label-minutes
文字列'分'`分`スピンボタンの `aria-label` 属性の値
label-no-time-selected
文字列'時刻が選択されていません'時刻が選択されていない場合に表示する文字列
label-pm
文字列'午後''午後'が選択されている場合にAM/PMスピンボタンに表示するテキスト
label-seconds
文字列'秒'`秒` スピンボタンの `aria-label` 属性の値
label-selected
文字列'選択された時刻'時刻が選択された場合の非表示の sr-only 文字列
locale
Array または Stringコンポーネントが使用するロケール(またはロケール)。ロケールの配列を渡す場合、ロケールの順序は最も優先されるものから最も優先度の低いものになります。提供されない場合、クライアントのデフォルトのロケールがデフォルトになります
minutes-step
Number または String1分スピンボタンのステップ値。60で均等に割り切れる値にする必要があります
readonly
ブール値falseフォームコントロールに `readonly` 属性を設定します
seconds-step
Number または String1秒スピンボタンのステップ値。60で均等に割り切れる値にする必要があります
show-seconds
ブール値falsetrue の場合、秒スピンボタンを表示します。`false` の場合、秒スピンボタンは表示されず、時刻の秒の部分は常に `0` になります
value
v-model
文字列''初期選択された時刻の値。`HH:mm:ss` 文字列を受け入れます。有効な値の範囲は `00:00:00` から `23:59:59` です

v-model

プロパティ
イベント
valueinput

スロット

名前
説明
default 時間コンポーネントの下部にカスタムコントロールを配置するために使用されます

イベント

イベント
引数
説明
context
  1. context - コンテキストオブジェクト。詳細については、ドキュメントを参照してください
内部モデルの状態、またはロケールが更新されるたびに発生します。コンポーネントが最初に作成されたときにも発生します
input
  1. value - 選択された時刻を `HH:mm:ss` 文字列として示します。時刻が選択されていない場合は空の文字列になります
v-model を更新するイベント

個々のコンポーネントのインポート

次の名前付きエクスポートを使用して、個々のコンポーネントをプロジェクトにインポートできます

コンポーネント
名前付きエクスポート
インポートパス
<b-time>BTimebootstrap-vue

import { BTime } from 'bootstrap-vue'
Vue.component('b-time', BTime)

Vue.js プラグインとしてインポート

このプラグインには、上記の個々のコンポーネントがすべて含まれています。プラグインには、コンポーネントエイリアスも含まれています。

名前付きエクスポート
インポートパス
TimePluginbootstrap-vue

import { TimePlugin } from 'bootstrap-vue'
Vue.use(TimePlugin)