Skip to content

Popup ポップアップ - Vant 4

📱 Popup ポップアップ

🎯 概要

ポップアップを表示するコンテナ。ダイアログや軽量通知などの表示に使用でき、複数のポップアップを重ねて表示できます 🎭

📦 導入

以下の方法でグローバル登録します。詳細はコンポーネント登録を参照してください。

js
import { createApp } from 'vue';
import { Popup } from 'vant';

const app = createApp();
app.use(Popup);

🚀 コードデモ

🔧 基本用法

v-model:show で表示を制御します ✨

html
<van-cell is-link @click="showPopup">ポップアップを表示</van-cell>
<van-popup v-model:show="show" :style="{ padding: '64px' }">コンテンツ</van-popup>
js
import { ref } from 'vue';

export default {
  setup() {
    const show = ref(false);
    
    // ポップアップを表示 🎬
    const showPopup = () => {
      show.value = true;
    };

    return {
      show,
      showPopup,
    };
  },
};

🧭 表示位置

position で表示位置を指定します。デフォルトは中央で、topbottomleftright を指定可能です 🎼

  • 上下から表示する場合は幅が画面幅に一致し、高さは内容に依存します 📏
  • 左右から表示する場合は幅・高さは指定せず、内容に依存します 📐
html
<van-cell-group>
  <van-cell is-link @click="showPopup('top')">上から表示</van-cell>
  <van-cell is-link @click="showPopup('bottom')">下から表示</van-cell>
  <van-cell is-link @click="showPopup('left')">左から表示</van-cell>
  <van-cell is-link @click="showPopup('right')">右から表示</van-cell>
</van-cell-group>

<van-popup
  v-model:show="show.top"
  position="top"
  :style="{ height: '30%' }"
/>
<van-popup
  v-model:show="show.bottom"
  position="bottom"
  :style="{ height: '30%' }"
/>
<van-popup
  v-model:show="show.left"
  position="left"
  :style="{ width: '30%', height: '100%' }"
/>
<van-popup
  v-model:show="show.right"
  position="right"
  :style="{ width: '30%', height: '100%' }"
/>
js
import { reactive } from 'vue';

export default {
  setup() {
    // 複数ポップアップの表示状態管理 🎯
    const show = reactive({
      top: false,
      bottom: false,
      left: false,
      right: false,
    });
    
    const showPopup = (position) => {
      show[position] = true;
    };

    return {
      show,
      showPopup,
    };
  },
};

❌ 閉じるアイコン

closeable で右上に閉じるアイコンを表示します。close-icon でアイコン、close-icon-position で位置を指定できます 🚪

html
<van-cell is-link @click="showPopup">閉じるアイコン</van-cell>
<van-popup
  v-model:show="show"
  closeable
  position="bottom"
  :style="{ height: '30%' }"
/>

<!-- カスタムアイコン -->
<van-popup
  v-model:show="show"
  closeable
  close-icon="close"
  position="bottom"
  :style="{ height: '30%' }"
/>

<!-- アイコン位置 -->
<van-popup
  v-model:show="show"
  closeable
  close-icon-position="top-left"
  position="bottom"
  :style="{ height: '30%' }"
/>
js
import { ref } from 'vue';

export default {
  setup() {
    const show = ref(false);
    
    // 閉じるアイコン付きポップアップを表示 ❌
    const showPopup = () => {
      show.value = true;
    };

    return {
      show,
      showPopup,
    };
  },
};

🔘 角丸ポップアップ

round で角丸スタイルを適用します 🌙

html
<van-cell is-link @click="showPopup">角丸ポップアップ</van-cell>
<van-popup
  v-model:show="show"
  round
  position="bottom"
  :style="{ height: '30%' }"
/>
js
import { ref } from 'vue';

export default {
  setup() {
    const show = ref(false);
    
    // 角丸ポップアップを表示 🎨
    const showPopup = () => {
      show.value = true;
    };

    return {
      show,
      showPopup,
    };
  },
};

👆 クリックイベント

Popup は以下のクリックイベントをサポートします 🎮

  • click: ポップアップをクリック 📱
  • click-overlay: オーバーレイをクリック 🎭
  • click-close-icon: 閉じるアイコンをクリック ❌
html
<van-cell is-link @click="showPopup">クリックイベント</van-cell>
<van-popup
  v-model:show="show"
  closeable
  position="bottom"
  :style="{ height: '30%', padding: '16px' }"
  @click="showToast('click')"
  @click-overlay="onClickOverlay"
  @click-close-icon="onClickCloseIcon"
>
  ポップアップをクリック
</van-popup>
js
import { ref } from 'vue';
import { showToast } from 'vant';

export default {
  setup() {
    const show = ref(false);
    
    // オーバーレイクリックのハンドラ 🎭
    const onClickOverlay = () => {
      showToast('click-overlay');
    };
    
    // 閉じるアインクリックのハンドラ ❌
    const onClickCloseIcon = () => {
      showToast('click-close-icon');
    };

    return {
      show,
      showToast,
      onClickOverlay,
      onClickCloseIcon,
    };
  },
};

📡 表示イベント

Popup の開閉に伴い以下のイベントが発火します ⏰

  • open: 開く(表示開始)📂
  • opened: 開いた後(アニメ終了)✨
  • close: 閉じる(非表示開始)📁
  • closed: 閉じた後(アニメ終了)🎭
html
<van-cell is-link @click="showPopup">表示イベント</van-cell>
<van-popup
  v-model:show="show"
  position="bottom"
  :style="{ height: '30%' }"
  @open="showToast('open')"
  @opened="showToast('opened')"
  @close="showToast('close')"
  @closed="showToast('closed')"
/>
js
import { ref } from 'vue';
import { showToast } from 'vant';

export default {
  setup() {
    const show = ref(false);
    
    // ポップアップ表示でイベントを確認 🎬
    const showPopup = () => {
      show.value = true;
    };

    return {
      show,
      showPopup,
      showToast,
    };
  },
};

🚀 マウント先の指定

デフォルトではコンポーネント直下にマウントされますが、teleport でマウント先を指定できます 🎯

html
<!-- body にマウント -->
<van-popup v-model:show="show" teleport="body" />

<!-- #app にマウント -->
<van-popup v-model:show="show" teleport="#app" />
js
import { ref } from 'vue';

export default {
  setup() {
    const show = ref(false);

    return {
      show,
    };
  },
};

📋 API

🎛️ Props

パラメータ説明デフォルト値
v-model:showポップアップの表示状態booleanfalse
overlayオーバーレイの表示booleantrue
position表示位置(top bottom right leftstringcenter
overlay-classオーバーレイのクラス名string | Array | object-
overlay-styleオーバーレイのスタイルobject-
durationアニメーション時間(秒)number | string0.3
z-index固定の z-index を設定number | string2000+
round角丸を有効化booleanfalse
lock-scroll背景のスクロールをロックbooleantrue
lazy-render表示時にノードをレンダリングbooleantrue
close-on-popstate履歴戻り時に自動で閉じるbooleantrue
close-on-click-overlayオーバーレイクリックで閉じるbooleantrue
closeable閉じるアイコンを表示booleanfalse
close-icon閉じるアイコン名/画像(Icon の name 相当)stringcross
close-icon-position閉じるアイコンの位置(top-left 等)stringtop-right
before-close閉じる前のコールバック(false でキャンセル)Function-
icon-prefixアイコンのクラス接頭辞(Icon の class-prefix 相当)stringvan-icon
transitionアニメーション名(transitionnamestring-
transition-appear初期表示時にトランジションを適用booleanfalse
teleportマウント先(Teleport の to 相当)string | Element-
safe-area-inset-top上部セーフエリア対応booleanfalse
safe-area-inset-bottom下部セーフエリア対応booleanfalse

🎪 Events

イベント名説明コールバックパラメータ
clickポップアップをクリック 📱event: MouseEvent
click-overlayオーバーレイをクリック 🎭event: MouseEvent
click-close-icon閉じるアイコンをクリック ❌event: MouseEvent
open開く(表示開始)📂-
close閉じる(非表示開始)📁-
opened開いた後(アニメ終了)✨-
closed閉じた後(アニメ終了)🎭-

🎨 Slots

名前説明
defaultコンテンツ(主要情報・操作) 📄
overlayオーバーレイのカスタマイズ 🎭

🏷️ 型定義

コンポーネントは以下の型定義をエクスポートします:

ts
import type {
  PopupProps,
  PopupPosition,
  PopupInstance,
  PopupThemeVars,
  PopupCloseIconPosition,
} from 'vant';

PopupInstance はコンポーネントインスタンスの型です:

ts
import { ref } from 'vue';
import type { PopupInstance } from 'vant';

const popupRef = ref<PopupInstance>();

🎨 テーマのカスタマイズ

🎭 スタイル変数

以下の CSS 変数でスタイルをカスタマイズできます。使用方法は ConfigProvider を参照してください。

名前デフォルト値説明
--van-popup-backgroundvar(--van-background-2)背景色
--van-popup-transitiontransform var(--van-duration-base)トランジション
--van-popup-round-radius16px角丸半径
--van-popup-close-icon-size22px閉じるアイコンのサイズ
--van-popup-close-icon-colorvar(--van-gray-5)閉じるアイコンの色
--van-popup-close-icon-margin16px閉じるアイコンのマージン
--van-popup-close-icon-z-index1閉じるアイコンの z-index

📚 関連ドキュメント

🔗 関連コンポーネント

Vant に基づく企業向けモバイルソリューション