円形/扇形メニューを2分で実装する方法を教えます(基本バージョン)

円形/扇形メニューを2分で実装する方法を教えます(基本バージョン)

序文

このプロジェクトでは円形のメニューが必要です。オンラインで検索しましたが、適切なものが見つからなかったので、非常にシンプルなものを自分で作成し、後で最適化します。

このコンポーネントは react に基づいていますが、原理は同じです。

拡張効果は以下のとおりです。

成し遂げる

css(レス)

@centerIconサイズ: 30px;

.flex(@justify: flex-start, @align: center) {
    コンテンツの正当化: @justify;
    項目の位置を揃える: @align;
    ディスプレイ: フレックス;
}
.sector-menu-wrapper {
    位置: 相対的;
    幅: @centerIconSize;
    マージン: 自動;

    .center-icon {
        .flex(中央);
        幅: @centerIconSize;
        高さ: @centerIconSize;
        境界線の半径: 50%;
        背景: rgba(0, 0, 0, 0.3);
        色: 白;
        カーソル: ポインタ;
    }

    .セクター項目{
        位置: 絶対;
        .flex(中央);
        幅: @centerIconSize;
        高さ: @centerIconSize;
        境界線の半径: 50%;
        背景: rgba(0, 0, 0, 0.3);
        カーソル: ポインタ;
        色: 白;
        上: 0;
        左: 0;
        遷移: すべて線形 0.5 秒。
        変換: translate(0, 0);
        // 表示: なし;
        可視性: 非表示;
    }

    .セクターリスト{
        &.セクターリストアクティブ{
            遷移: すべて線形 0.5 秒。
            .セクター項目{
                .flex(中央);
                遷移: すべて線形 0.5 秒。
                変換: translate(0, 0);
                可視性: 可視;

                &:最初の子 {
                    変換: translate(0, -@centerIconSize * 1.5);
                }
        
                &:n番目の子(2) {
                    変換: translate(-@centerIconSize * 1.5, 0);
                }
        
                &:n番目の子(3) {
                    変換: translate(0, @centerIconSize * 1.5);
                    
                }
            }
        }
    }
}

セクターメニュー.js

'react' から React をインポートします。

エクスポートデフォルトクラスSectorMenuはReact.Componentを拡張します{
    状態 = {
        方向: '左'、
        セクターメニュー表示: false、
        センターアイコンサイズ: 30,
        セクターアイテムサイズ: 30,
    }

    /**
     * ラジアルメニューを表示 */
    セクターメニューを表示 = () => {
        const { セクターメニュー表示 } = this.state;
        this.setState({
            セクターメニュー表示: !セクターメニュー表示,
        })
    }

    onClickSectorMenuItem = (インデックス) => {
        const { セクターメニュー項目関数 } = this.props;
        if (!sectorMenuItemFunctions || typeof(sectorMenuItemFunctions[index]) !== 'function') {
            戻る;
        }
        セクターメニュー項目関数[インデックス]();
    }

    getSectorJsx = () => {
        const { セクターメニュー項目 } = this.props;

        if (!sectorMenuItems || !Array.isArray(sectorMenuItems) || sectorMenuItems.length === 0) {
            戻る;
        }

        const スタイル = {};
        const { セクターメニュー表示 } = this.state;

        セクターメニューアイテム.map((item, i) => { を返す
            // 定数スタイル = {
            // 変換: translate(0, -centerIconSize * 2);
            // };

            戻り値 (<div
                className={`sector-item ${sectorMenuVisible && 'sector-item-active'}`}
                スタイル={スタイル}
                onClick={() => this.onClickSectorMenuItem(i)}
                キー={i}
            >
                {アイテム}
            </div>)
        });
    }
    与える() {
        const { セクターメニュー表示 } = this.state;
        戻る (
            <div className="セクターメニューラッパー">
                <div className="center-icon" onClick={this.showSectorMenu}>
                    {
                        セクターメニュー表示? 'x' : '···'
                    }
                </div>
                <div className={`sector-list ${sectorMenuVisible && 'sector-list-active'}`}>
                    セクションJsxの取得
                </div>
            </div>
        )
    }
}

電話

<セクターメニュー
    セクターメニュー項目={['A1', 'A2', 'A3']}
    セクターメニュー項目関数={[関数() {console.log(0)}, 関数() {console.log(1)}, 関数() {console.log(2)}]}
/>

期待する

もともと柔軟なディストリビューションを書きたかったのですが、位置の計算方法で行き詰まってしまいました。プロジェクトの時間が限られているので、別の日に時間を見つけて最適化します。

  1. セクターメニュー項目の柔軟なレイアウト
  2. SectorMenu の位置を柔軟に表示します (左、右、上、下など)

落とし穴

遷移アニメーションは、sector-item クラスで display:none を使用したために機能しなかったことに気付きました。代わりに visibility プロパティを使用する必要がありました。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

<<:  選択ドロップダウンボックスの値をIDに渡してコードを実装する方法

>>:  react-color を使用してフロントエンドのカラーピッカーを実装する方法

推薦する

NFS サーバーの原理と、その構築、構成、展開の手順を簡単に分析します。

目次NFS サービスの概要NFS とは何ですか? NFS マウントの原則NFS サーバーはデータ転送...

MySql COALESCE 関数の使用コード例

COALESCE は、各パラメータ式 (expression_1、expression_2、...、...

vue v-for ループ オブジェクトの属性

目次1. ループオブジェクト内の値2. ループオブジェクト3. キーと値のループ1. ループオブジェ...

MySQLで数千万のテストデータを素早く作成する方法

述べる:この記事で扱うデータ量は 100 万です。数千万のデータが必要な場合は、量を増やすだけで済み...

VMware 仮想マシンのインストール Linux システムのグラフィック チュートリアル

この記事では、LinuxシステムのVMwareインストールの具体的な手順を参考までに紹介します。具体...

MySQLからデータをインポートする際の不正なフォーマット、インポートの遅延、データ損失などの問題を迅速に解決します。

遅い問題を完全に解決したい場合は、MySQL を MySQL 8.0 にアップグレードすることをお勧...

MySql データベース クエリの特殊コマンド

まずMySQLのインストールMySQLソフトウェアをダウンロードし、インストールパスを変更しますMy...

ウェブデザイン経験

<br />著者はかつてWebデザインの初心者でしたが、継続的な探求と実践を通じて、今で...

Vueはアンカー配置機能を実装します

この記事では、アンカー配置を実装するためのVueの具体的なコードを例として紹介します。具体的な内容は...

Docker のホスト間コンテナ通信オーバーレイ実装プロセスの詳細な説明

サーバーも 2 つあります。準備:コンテナのホスト名を設定する consul: kv タイプのストレ...

ユニークインデックスの S ロックと X ロックによる MySQL デッドロック ルーチンの理解

「初心者向けソースコードからの MySQL デッドロック問題の理解」では、MySQL ソースコードを...

Vue スキャフォールディングでのレンダリングを理解する

Vue スキャフォールディングでは、エントリ ファイル main.js の新しい Vue コードに、...

MySQLシリーズ15 MySQL共通設定とパフォーマンスストレステスト

1. 一般的なMySQLの設定以下のすべての構成パラメータは、32G のメモリを搭載したサーバーに基...

win10 64 ビット システムに複数の JDK バージョンをインストールする際の切り替え問題と解決策の概要

コンピューターにmyeclipse2017とidea2017がインストールされているため、ideaが...

動的な色切り替えの実装コードをサポートするために、CSS で SVG 画像を参照します。

表示する svg 画像を追加すると、React はファイルが見つからないというメッセージを表示します...