円形/扇形メニューを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 を使用してフロントエンドのカラーピッカーを実装する方法

推薦する

Vue プロジェクトのパッケージ化と最適化の実装手順

目次Vueプロジェクトのパッケージ化、起動、最適化Vueプロジェクトのパッケージ化プロジェクトホステ...

Reactにおけるフックの一般的な使用法

目次1. フックとは何ですか? 2. フックはなぜ現れるのでしょうか? 3. よく使われるフックは何...

ネイティブ JavaScript でオブジェクトが空かどうかをチェックする実装例

目次ネイティブJavaScriptとはA. 新しいブラウザでnullオブジェクトをチェックするコンス...

CentOS 7.x のマスターおよびスレーブ DNS サーバーの展開

1. 準備例: 2 台のマシン: 192.168.219.146 (マスター)、192.168.21...

MySQL InnoDB インデックス拡張の詳細な説明

インデックス拡張: InnoDB は、プライマリ キー列をそのインデックスに追加することで、各セカン...

初心者向けに Docker に Jenkins をインストールする方法を詳しく説明したチュートリアル

Jenkins はオープンソース ソフトウェア プロジェクトです。Java をベースに開発された継続...

jQueryはショッピングカートの完全な機能を実現します

この記事では、ショッピングカートの完全な機能を実現するためのjQueryの具体的なコードを参考までに...

WeChatミニプログラムの基本チュートリアル:Echartの使用

序文まずは最終的な効果を見てみましょう。私が自分で作った小さなデモです。まずEChartsの公式サイ...

Centos7.3 Nginx をインストールして展開し、https を設定する方法

設置環境1. gccのインストールnginxをインストールするには、まず公式サイトからダウンロードし...

Robots.txtの詳細な紹介

robots.txt の基本的な紹介Robots.txt はプレーンテキスト ファイルであり、Web...

WeChatアプレット開発で遭遇したことのない落とし穴のまとめ

目次getApp()ページエントリファイルの先頭に変数を定義しますwx.createSelector...

Nginx と GeoIP モジュールを使用して IP の地域情報を読み取る方法

LinuxにGeoIPをインストールする yum で nginx-module-geoip をインス...

Dockerサーバーのストレージリソースプール不足問題の解決

目次1. 問題の説明2. 問題分析3. 問題解決1. Dockerのディスク使用量を確認する2. 再...

VueはPCカメラを呼び出して写真機能を実現します

この記事の例では、VueがPCカメラを呼び出して写真機能を実現する具体的なコードを参考までに共有して...