9
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

クリスマスメッセージプラグインをつくってみた

Last updated at Posted at 2025-12-01

先日、kintoneプラグイン開発用テンプレートを自作したので、その使用感を試しながら、クリスマス感のあるプラグインをつくってみました。

https://github.com/NoriyukiKobori/hazime-plugin-template-for-ktn

プラグインの機能

kintoneアプリでレコードの追加に成功すると、クリスマス感のあるアニメーションとメッセージが表示されます。

スクリーンショット 2025-11-29 22.06.17.png

クリスマス_k.gif

ソースコードの抜粋

index.ts

// スタイルシートの読み込み
import './main.scss';
// アニメーション関連の関数をインポート
import { createOverlay, createSnowflakes, showMessage } from './func';

((PLUGIN_ID) => {
  'use strict';

  // プラグイン設定を取得
  const config = kintone.plugin.app.getConfig(PLUGIN_ID);

  // レコード登録成功時のイベント
  kintone.events.on('app.record.create.submit.success', (event) => {
    return new Promise((resolve) => {
      // 半透明の黒いオーバーレイを表示(背後の操作を防止)
      const overlay = createOverlay();
      // 雪の結晶アニメーションを開始
      createSnowflakes();
      // 設定されたメッセージを表示
      showMessage(config.messageText);

      // 4秒後にイベントを完了
      setTimeout(() => {
        resolve(event); // kintoneイベントを解決
      }, 4000); // 3秒表示 + フェードアウト 1秒
    });
  });
})(kintone.$PLUGIN_ID);

func.ts

/**
 * オーバーレイ(半透明の背景)を作成
 */
export const createOverlay = () => {
  // div要素を新規作成
  const overlay = document.createElement('div');
  overlay.id = 'christmas-overlay';
  document.body.appendChild(overlay);
  return overlay;
};

/**
 * 雪の結晶を生成してアニメーション開始
 */
export const createSnowflakes = () => {
  // 雪の結晶の数
  const snowCount = 50;
  // 指定数だけ雪を生成
  for (let i = 0; i < snowCount; i++) {
    // div要素を新規作成
    const snow = document.createElement('div');
    snow.classList.add('snowflake');
    snow.innerHTML = '';

    // 横位置をランダムに配置(0~100vw)
    snow.style.left = Math.random() * 100 + 'vw';
    // 画面外上方にランダムに配置(-100vh ~ 0の範囲)
    snow.style.top = -(Math.random() * 100) + 'vh';
    // サイズをランダムに設定(10~30px)
    snow.style.fontSize = Math.random() * 20 + 10 + 'px';
    // アニメーション時間をランダムに設定(5~11秒)
    snow.style.animationDuration = Math.random() * 6 + 5 + 's';
    // body要素に追加して表示
    document.body.appendChild(snow);
    // アニメーション終了時に要素を削除
    snow.addEventListener('animationend', () => snow.remove());
  }
};

/**
 * メッセージを表示
 */
export const showMessage = (message: string) => {
  // div要素を新規作成
  const msg = document.createElement('div');
  msg.id = 'christmas-message';
  // メッセージテキストを設定(未設定時はデフォルトメッセージ)
  msg.textContent = message || '🎅 Merry Christmas 🎄';
  document.body.appendChild(msg);

  // 0.1秒後にフェードイン開始(opacity: 0 → 1)
  setTimeout(() => (msg.style.opacity = '1'), 100);
  // 3秒後にフェードアウト開始
  setTimeout(() => {
    msg.style.opacity = '0'; // opacity: 1 → 0
    // フェードアウト完了後(1秒後)に要素を削除
    setTimeout(() => msg.remove(), 1000);
  }, 3000);
};

main.scss

// Main styles

// === 変数定義 ===
// 各要素の重なり順を管理するz-index値
$z-index-overlay: 9998; // オーバーレイ(背景)
$z-index-snowflake: 9999; // 雪の結晶
$z-index-message: 10000; // メッセージ(最前面)

// 共通で使用する色を変数化
$color-white: #ffffff; // 白色(雪とテキストに使用)
$color-overlay-bg: rgba(0, 0, 0, 0.5); // 半透明の黒(オーバーレイ背景)
$color-text-shadow: rgba(0, 0, 0, 0.6); // テキストの影色

// === Mixins(再利用可能なスタイル) ===
// 全画面を覆うfixed配置のスタイル
@mixin fixed-full {
  position: fixed; // スクロールしても固定
  top: 0; // 上端から配置
  left: 0; // 左端から配置
  width: 100%; // 幅100%
  height: 100%; // 高さ100%
}

// 画面中央に配置するスタイル
@mixin center-transform {
  position: fixed; // スクロールしても固定
  top: 40%; // 上から40%の位置
  left: 50%; // 左から50%の位置
  transform: translate(-50%, -50%); // 自身の中心を基準に中央配置
}

// === アニメーション定義 ===
// 雪が降るアニメーション
@keyframes snow {
  0% {
    opacity: 1; // 開始時は完全に表示
  }
  100% {
    transform: translateY(200vh); // 画面の2倍下に移動
    opacity: 0; // 終了時は完全に透明
  }
}

// === アニメーションオーバーレイ ===
#christmas-overlay {
  @include fixed-full; // 全画面を覆う配置
  background-color: $color-overlay-bg; // 半透明の黒背景
  z-index: $z-index-overlay; // 雪やメッセージより背面
  pointer-events: all; // クリックイベントを遮断(背後の操作を防ぐ)
}

// === 雪の結晶 ===
.snowflake {
  position: fixed; // スクロールしても固定
  color: $color-white; // 白色で表示
  font-size: 12px; // 基本サイズ(JSで個別に上書き)
  pointer-events: none; // クリックイベントを無効化
  user-select: none; // テキスト選択を無効化
  animation: snow linear; // snowアニメーションを等速で実行
  z-index: $z-index-snowflake; // オーバーレイより前面に表示
}

// === メッセージ表示 ===
#christmas-message {
  @include center-transform; // 画面中央に配置
  width: 80%; // 画面幅の80%
  text-align: center; // テキストを中央揃え
  font-size: 43px; // 文字サイズ指定
  color: $color-white; // テキストカラー指定
  font-weight: bold; // 太字
  text-shadow: 2px 2px 8px $color-text-shadow; // 影をつける
  z-index: $z-index-message; // 最前面に表示
  opacity: 0; // 初期状態は透明(JSで制御)
  transition: opacity 1s ease; // 透明度の変化を1秒かけて滑らかに
}

ブログの方には、パッケージングしたファイルや設定画面のソースコードも掲載しております。
【kintone Advent Calendar 2025】クリスマスメッセージプラグインをつくってみた

それでは、素敵なクリスマスをお過ごしください🎅🎄☃️

9
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?