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

推薦する

MySQL で大量のデータ (数千万) を素早く削除するためのいくつかの実用的なソリューションの詳細な説明

著者は最近、仕事でパフォーマンスのボトルネックの問題に遭遇しました。MySQL テーブルには毎日約 ...

MySQL でテーブルを作成するときの NULL と NOT NULL の使用方法の詳細な説明

MySQL の仕様によっては、テーブル作成仕様にすべてのフィールドが空であってはならないという要件を...

Kubernetes を使用して Springboot または Nginx をデプロイするための詳細なチュートリアル

1 はじめに「Maven がワンクリックで Springboot を Docker リポジトリにデプ...

CSS3はテキストのレリーフ効果、彫刻効果、炎のテキストを実現します

この効果を実現するには、まず CSS のプロパティを知っておく必要があります。 text-shado...

DockerをインストールしてAlibaba Cloud Image Acceleratorを構成する方法

DockerのインストールDocker はオープンソースなので、Windows システムへのインスト...

アリババの中秋節ロゴとウェブサイトのデザインプロセス

<br />まずアイデアを考え、次にスケッチを描き、次にマウスでスケッチし、最後にフラッ...

MySQL の一般的な問題とアプリケーション スキルの概要

序文MySQL の日常的な開発やメンテナンスでは、パスワードの紛失やテーブルの破損など、避けられない...

Linux での MySQL 5.7.16 無料インストール バージョンのグラフィック チュートリアル

この記事では、参考までにMySQL 5.7.16の無料インストール版のチュートリアルを紹介します。具...

Azure Container Registry を使用してイメージを保存する際の問題

Azure Container Registry は、Docker Registry 2.0 仕様に...

複数のネットワークカードを備えた Linux システムでのルーティング構成の詳細な説明

Linux でのルーティング設定コマンド1. ホストルーティングを追加する ルートを追加 -host...

HTML 名 ID とクラスの違い_PowerNode Java アカデミー

名前タグの名前を指定します。形式 <input type="text" n...

CSSクラス名の問題の詳細な説明

数字で始まる次の CSS クラス名は有効になりません。 .1番目{ 色: 赤; }有効な CSS ク...

純粋なテキストとアイコン付きのボタンを実現するための HTML+CSS

この記事では、いくつかの基本的なページ要素の実装方法をまとめており、後で更新される予定です。まず、私...

MySQLは外部SQLスクリプトファイルのコマンドを実行します

目次1. SQLコマンドを含むSQLスクリプトファイルを作成する2. SQLスクリプトファイルを実行...

Linux での SELinux を理解する方法

目次1. SELinux の紹介2. SELinuxの基本概念2.1 仕事の種類2.2. セキュリテ...