LoginSignup
1
2

More than 1 year has passed since last update.

モダンなデザインで軽量なJavaScriptのコンテキストメニューのライブラリーを作った

Last updated at Posted at 2021-05-24

どんなものを作ったのか

Fluent Designに影響を受けた、モダンで美しく軽量なJavaScriptのコンテキストメニューのライブラリー「modernContext.js」を作りました。

コンテキストメニューが表示されるときにはちゃんとアニメーションも付いています!また、背景はブラーがかかった半透明のデザインです。

ライトモードのときのスクリーンショット

また、ダークモードをサポートしています。ブラウザーがダークモードに設定されている場合、自動で黒を基調としたデザインに切り替わります。

ダークモードのときのスクリーンショット

なぜ作ったのか

ネットでコンテキストメニューのライブラリーを探すとたくさん出てくるものの古いデザインのものが多く、カッコいいもの(とくにFluent Designのような見た目のもの)はなかなか見つかりませんでした。

また、依存しているものがなく単体で動作してほしい(jQueryやだ)ということもあり、自作しました。

対応ブラウザー

WindowsとAndroidのChromeとFirefoxで動作確認しています。SafariやiOS版のChromeについては、動作確認していません。

使い方

npmパッケージとして配布しています。

npm install modern-context

また、単体のJavaScriptファイルとしても配布していますので、お好きな方をどうぞ。

詳しい使い方はGitHubのREADMEドキュメントに書いてありますが、軽く説明します。

// npmパッケージを使う場合
import { Context } from "modern-context";
// 単体のJSファイルを使う場合
import { Context } from "./dist/modern-context.min.js"

// コンテキストメニューの中身を定義
const contents = [
    {
        type: "item",
        label: "Alert",
        callback: () => {
            alert("Clicked!");
        }
    },
    {
        type: "separator"
    },
    {
        type: "item",
        label: "No Callback"
    },
];
// コンテキストメニューの初期化
const context = new Context("#target", contents);

非常にシンプルです。

new Context("#target", contents)の第1引数はターゲットとする要素です。この場合はid="target"が設定された要素を右クリックすると、コンテキストメニューが表示されます。

第2引数はコンテキストメニューの中身の情報で、オブジェクトの配列になっています。第2引数は省略可能です。

配列に入っているオブジェクトはアイテムとセパレーターの2種類です。アイテムは文字どおりアイテム、セパレーターはアイテム間の区切り線です。アイテムをグループ化したいときにセパレーターを使います。

アイテムの場合、各プロパティーは次のような意味です。

{
    type: "item", //固定。アイテムを指定しているいうことを表す
    label: "Alert", //ラベル。コンテキストメニューにはこのテキストが表示される
    callback: () => { //コールバック関数。アイテムがクリックされたときに実行される。省略可能
        alert("Clicked!");
    }
}

また、セパレーターの場合、次のようになっています。

{
    type: "separator" //固定。セパレーターを指定しているということを表す
}

セパレーターはtype以外の他のプロパティーを指定しても無視されます。

使い方はこんな感じです。ほかにも、インスタンスの作成後にアイテムやセパレーターを追加する関数もあります。詳細はドキュメントを確認してください。

カスタマイズ

CSS変数で見た目をカスタマイズできます。

プロパティー名 デフォルト値 説明
--mc-text-color #333333 (ダークモードのときはwhite) コンテキストメニューの文字色
--mc-background-color rgba(255, 255, 255, 0.7) (ダークモードのときはrgba(51, 51, 51, 0.7)) コンテキストメニューの背景色
--mc-corner-radius 0.25em コンテキストメニューの角の丸みの半径
--mc-font-family sans-serif フォント

更新履歴

2023/02/18

modernContext.jsのv2.0リリースとnpmパッケージの公開に合わせて、記事を更新しました。なお、v2.0はv1系との互換性はありませんので、ご注意ください。

1
2
2

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
1
2