CountDown カウントダウン - Vant 4
⏰ CountDown カウントダウン
⏳ 紹介
時間は流れる水のように貴重です、CountDown カウントダウンコンポーネントはあなた専用の時間管理士です!⏰ それはミリ秒単位でカウントダウンを表示でき、休むことのない時間の番人のようです。
刺激的なイベントのカウントダウン 🎉、緊張感のある認証コードのカウントダウン 📱、その他時間のアラートが必要な様々なシーンでも、CountDown は親切なアシスタントのように正確に計時し、一秒一秒を儀式感いっぱいに演出します!
📦 導入
以下の方法でグローバルにコンポーネントを登録します。詳細な登録方法についてはコンポーネントの登録を参照してください。
import { createApp } from'vue'; import { CountDown } from'vant'; const app = createApp(); app.use(CountDown);🎯 コードデモ
🔧 基本的な使い方 - あなたの時間の旅を始めましょう
目覚まし時計を設定するのと同じくらい簡単です!time 属性でカウントダウンの総時間(ミリ秒単位)を設定すると、CountDown は正確な時計のように一秒ずつカウントダウンを始めます。
import { ref } from'vue'; exportdefault { setup() { const time = ref(30 * 60 * 60 * 1000); return { time }; }, };🎨 カスタムフォーマット - 時間に美しい衣装を着せましょう
時間も美しく表示する必要があります!format 属性を使用すると、デザイナーのようにカウントダウン用の専門的な表示形式をカスタマイズでき、時間が最も優雅な姿でユーザーの目の前に現れます。
⚡ ミリ秒レベルのレンダリング - 究極の時間精度を追求
よりスムーズなカウントダウン体験を求めていますか?デフォルトでは、カウントダウンは一秒ごとに更新され、心拍のように安定しています。しかし、millisecond 属性を有効にすると、高精度のタイマーに変身し、ミリ秒単位で動き、ユーザーに究極の滑らかな視覚体験をもたらします!
🎭 カスタムスタイル - あなたの創造力を解放
デフォルトのスタイルに不満ですか?問題ありません!スロット機能を使用すると、アーティストのように自由に創作し、ユニークなカウントダウンインターフェイスを作成できます。timeData オブジェクトはあなたのカラーパレットのように、すべての時間データを含み、あなたの創造性を存分に発揮できます!
🎮 手動制御 - 時間の支配者になりましょう
時間のリズムを完全に制御したいですか?ref でコンポーネントのインスタンスを取得すると、時間魔法の3つのスペルを手に入れます:start(開始)、pause(一時停止)、reset(リセット)。リモコンのように、あなたの指先で時間を踊らせましょう!
import { showToast } from'vant'; exportdefault { setup() { const countDown = ref(null); conststart = () => { countDown.value.start(); }; constpause = () => { countDown.value.pause(); }; constreset = () => { countDown.value.reset(); }; constonFinish = () => showToast('カウントダウン終了'); return { start, pause, reset, onFinish, countDown, }; }, };API
Props
| パラメータ | 説明 | タイプ | デフォルト値 |
|---|---|---|---|
| time | カウントダウン時間、単位ミリ秒 | number | string | 0 |
| format | 時間フォーマット | string | HH:mm:ss |
| auto-start | 自動的にカウントダウンを開始するかどうか | boolean | true |
| millisecond | ミリ秒レベルのレンダリングを有効にするかどうか | boolean | false |
format フォーマット
| フォーマット | 説明 |
|---|---|
| DD | 日数 |
| HH | 時間 |
| mm | 分 |
| ss | 秒数 |
| S | ミリ秒(1桁) |
| SS | ミリ秒(2桁) |
| SSS | ミリ秒(3桁) |
Events
| イベント名 | 説明 | コールバック引数 |
|---|---|---|
| finish | カウントダウンが終了したときにトリガーされます | - |
| change | カウントダウンが変化したときにトリガーされます | currentTime: CurrentTime |
Slots
| 名前 | 説明 | パラメータ |
|---|---|---|
| default | カスタムコンテンツ | currentTime: CurrentTime |
CurrentTime フォーマット
| 名前 | 説明 | タイプ |
|---|---|---|
| total | 残りの総時間(単位ミリ秒) | number |
| days | 残りの日数 | number |
| hours | 残りの時間 | number |
| minutes | 残りの分 | number |
| seconds | 残りの秒数 | number |
| milliseconds | 残りのミリ秒 | number |
メソッド
ref を使用して CountDown インスタンスを取得し、インスタンスメソッドを呼び出すことができます。詳細についてはコンポーネントインスタンスメソッドを参照してください。
| メソッド名 | 説明 | パラメータ | 戻り値 |
|---|---|---|---|
| start | カウントダウンを開始します | - | - |
| pause | カウントダウンを一時停止します | - | - |
| reset | カウントダウンをリセットします、auto-start が true の場合、リセット後に自動的にカウントダウンが開始されます | - | - |
型定義
コンポーネントは以下の型定義をエクスポートしています:
importtype { CountDownProps, CountDownInstance, CountDownCurrentTime, } from'vant';CountDownInstance はコンポーネントインスタンスの型で、以下のように使用します:
import { ref } from'vue'; importtype { CountDownInstance } from'vant'; const countDownRef = ref<CountDownInstance>(); countDownRef.value?.start();テーマカスタマイズ
スタイル変数
コンポーネントはカスタムスタイルに使用できる以下の CSS 変数を提供しています。使用方法については ConfigProvider コンポーネント を参照してください。
| 名称 | デフォルト値 | 説明 |
|---|---|---|
| --van-count-down-text-color | var(--van-text-color) | - |
| --van-count-down-font-size | var(--van-font-size-md) | - |
| --van-count-down-line-height | var(--van-line-height-md) | - |
❓ よくある質問
iOS システムでカウントダウンが効かない?
iOS でカウントダウンが効かない問題に遭遇した場合は、Date オブジェクトを作成する際にnew Date('2020-01-01')のような書き方を使用していないか確認してください。iOS はハイフンで区切られた日付形式をサポートしていません。正しい書き方はnew Date('2020/01/01')です。
この問題の詳細な説明:stackoverflow。
🌟 ベストプラクティス
パフォーマンス最適化の提案
// 必要がない限り、ミリ秒レベルのレンダリングを避けてください
<van-count-down
:time="time"
:millisecond="false" // デフォルトで十分です、パフォーマンスが向上します
format="HH:mm:ss"
/>
// 大量のカウントダウンコンポーネントの場合、スロットリングを使用します
import { throttle } from 'lodash-es';
const handleChange = throttle((currentTime) => {
console.log('カウントダウン変化:', currentTime);
}, 100);ユーザーエクスペリエンスの最適化
// 音声アラートを追加
const onFinish = () => {
// 警告音を再生
const audio = new Audio('/sounds/countdown-finish.mp3');
audio.play();
// 振動フィードバック(モバイル端末)
if (navigator.vibrate) {
navigator.vibrate([200, 100, 200]);
}
};
// 視覚フィードバック
const getCountdownClass = (seconds) => {
if (seconds <= 10) return 'countdown-urgent';
if (seconds <= 30) return 'countdown-warning';
return 'countdown-normal';
};💡 使用テクニック
動的カウントダウンシーン
// サーバー時間同期
const syncServerTime = async () => {
const response = await fetch('/api/server-time');
const serverTime = await response.json();
const localTime = Date.now();
const timeDiff = serverTime - localTime;
// カウントダウンを調整
const adjustedTime = targetTime - timeDiff;
return Math.max(0, adjustedTime);
};
// ネットワーク再接続後の同期
window.addEventListener('online', () => {
syncServerTime().then(time => {
countDownRef.value?.reset();
// 時間を再設定
});
});多言語時間フォーマット
const formatByLocale = (locale) => {
const formats = {
'zh-CN': 'DD天 HH:mm:ss',
'en-US': 'DD days HH:mm:ss',
'ja-JP': 'DD日 HH:mm:ss'
};
return formats[locale] || formats['zh-CN'];
};🔧 よくある問題と解決策
時間精度の問題
// Q: なぜカウントダウンが正確でないのですか?
// A: 不正確な時間計算の使用を避けてください
// ❌ 間違った方法
const endTime = new Date('2024-12-31 23:59:59');
const now = new Date();
const time = endTime - now; // 不正確な可能性があります
// ✅ 正しい方法
const getAccurateTime = async () => {
const response = await fetch('/api/server-time');
const serverTime = await response.json();
const endTime = new Date('2024-12-31T23:59:59Z').getTime();
return Math.max(0, endTime - serverTime);
};ページ切り替え後にカウントダウンが停止する
// Page Visibility API を使用してページ切り替えを処理
let pausedTime = 0;
document.addEventListener('visibilitychange', () => {
if (document.hidden) {
// ページが非表示のときに時間を記録
pausedTime = Date.now();
} else {
// ページが表示されたときに時間を同期
if (pausedTime) {
const elapsed = Date.now() - pausedTime;
// カウントダウンを調整
syncCountdown(elapsed);
}
}
});メモリリークの防止
// コンポーネントが破棄されたときにタイマーをクリーンアップ
onUnmounted(() => {
if (countDownRef.value) {
countDownRef.value.pause();
}
});🎨 デザインのインスピレーション
創造的なカウントダウンスタイル
/* ネオン効果 */
.neon-countdown {
color: #00ffff;
text-shadow:
0 0 5px #00ffff,
0 0 10px #00ffff,
0 0 15px #00ffff;
animation: neon-flicker 2s infinite alternate;
}
/* ページめくり効果 */
.flip-countdown {
perspective: 1000px;
}
.flip-countdown .digit {
transform-style: preserve-3d;
transition: transform 0.6s;
}
/* プログレスリングカウントダウン */
.circular-countdown {
position: relative;
width: 120px;
height: 120px;
}
.circular-countdown svg {
transform: rotate(-90deg);
}
.circular-countdown .progress-ring {
stroke-dasharray: 377; /* 2 * π * 60 */
stroke-dashoffset: 377;
animation: countdown-progress linear;
}テーマバリエーション
// 緊急カウントダウンテーマ
const urgentTheme = {
'--van-count-down-text-color': '#ff4444',
'--van-count-down-font-size': '24px',
'--van-count-down-font-weight': 'bold'
};
// エレガントなカウントダウンテーマ
const elegantTheme = {
'--van-count-down-text-color': '#666',
'--van-count-down-font-size': '16px',
'--van-count-down-font-family': 'serif'
};🚀 高度な機能拡張
カスタムカウントダウンコンポーネント
<template>
<div class="advanced-countdown">
<van-count-down
ref="countDown"
:time="time"
:format="format"
@change="handleChange"
@finish="handleFinish"
>
<template #default="{ currentTime }">
<div class="time-blocks">
<div class="time-block">
<span class="number">{{ currentTime.days }}</span>
<span class="label">日</span>
</div>
<div class="time-block">
<span class="number">{{ currentTime.hours }}</span>
<span class="label">時</span>
</div>
<div class="time-block">
<span class="number">{{ currentTime.minutes }}</span>
<span class="label">分</span>
</div>
<div class="time-block">
<span class="number">{{ currentTime.seconds }}</span>
<span class="label">秒</span>
</div>
</div>
</template>
</van-count-down>
</div>
</template>📚 関連リンク
技術ドキュメント
- Vue 3 リアクティブの原理 - リアクティビティの深い理解
- JavaScript タイマーのベストプラクティス - タイマーの最適化
- Web Performance API - パフォーマンスモニタリング
デザインリソース
- Material Design Time - 時間コンポーネントのデザインガイドライン
- Apple HIG Time - iOS 時間デザインガイド
- Ant Design Time - エンタープライズ用時間コンポーネント
関連コンポーネント
- Progress プログレスバー - 進捗表示コンポーネント
- Circle リングプログレスバー - 円形の進捗表示
- Skeleton スケルトンスクリーン - ローディングプレースホルダーコンポーネント
- Loading ローディング - ローディング状態コンポーネント
- DatePicker 日付ピッカー - 日付と時間の選択
- Calendar カレンダー - カレンダーコンポーネント