概要
<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>
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>
スタイリング
デフォルトでは、秒スピンボタンは表示されません。秒の選択を有効にするには、show-seconds
プロパティをtrue
に設定して、秒選択スピンボタンを有効にします。show-seconds
がfalse
(または指定されていない)の場合、返される値には、時刻文字列の秒の部分が常に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>
デフォルトでは、現在選択されている時刻が、ロケールの言語でフォーマットされ、時刻コンポーネントの上部に表示されます。
hide-header
プロパティを使用して、このヘッダーを非表示にできます。これは選択された時刻を視覚的に非表示にするだけで、スクリーンリーダーのユーザーがaria-live
リージョンとして利用できるようにしておくことに注意してください。
ボーダーとパディング
ボーダーとパディングのある時刻コントロールが必要ですか?Bootstrapのボーダーおよびパディングユーティリティクラスを使用して、ボーダーとパディングを追加します。
<template>
<b-time class="border rounded p-2" locale="en"></b-time>
</template>
デフォルトスロット
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()
this.value = now.toTimeString().slice(0, 8)
},
clearTime() {
this.value = ''
}
}
}
</script>
イベント
'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' |
コンテキストプロパティlocale
、hour12
、および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>
hourCycle
の理解
世界中で使用されている主な時刻表記(時計)には、12時間制と24時間制の2つのタイプがあります。hourCycle
プロパティを使用すると、特定のロケールで使用されている時計の種類にアクセスできます。時間サイクルタイプには、以下の表に示すいくつかの異なる値を使用できます。hourCycle
は、時刻'00:00:00'
(1日の始まり)が、特定のロケールのユーザーにどのように表示/フォーマットされるかを示します。'context'
イベントには、解決されたhourCycle
値が含まれています。
hourCycle | 説明 |
'h12' | 1 ~12 を使用する時間システム。12時間制で、午前0時が12:00 amから始まります。 |
'h23' | 0 ~23 を使用する時間システム。24時間制で、午前0時が0:00から始まります。 |
'h11' | 0 ~11 を使用する時間システム。12時間制で、午前0時が0:00 amから始まります。 |
'h24' | 1 ~24 を使用する時間システム。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時間ユーザーインターフェースを強制するには、プロパティ hour12
を true
に設定します。24時間ユーザーインターフェースを強制するには、プロパティ hour12
を false
に設定します。プロパティ 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 も必要です。
参照