プロジェクトの再構築からプロジェクトにおける CSS3 カスタム変数の使用について話す

プロジェクトの再構築からプロジェクトにおける CSS3 カスタム変数の使用について話す

CSS3変数について

変数を宣言するときは、変数名の前に 2 つのハイフン ( -- ) を追加します。

体{
    --色:赤;
}

上記のコードでは、カスタム変数が body セレクターで宣言されています: --color

デフォルトの意味がない点を除けば、色などの正式な属性と違いはありません。したがって、CSS 変数は「CSS カスタム プロパティ」とも呼ばれます。これは、変数とカスタム CSS プロパティが実際には同じものであるためです。
さらに、あらゆる種類の値を CSS 変数に「入れる」ことができ、CSS 変数は「どこにでも」配置できます

もちろん、ネット上には似たような紹介がたくさんあるので、それはさておき、本題に入りましょう!

ただし、グローバルユニバーサルカラー/サイズ値、Web ページのスキニングなどのいくつかの基本的なアプリケーションについては、この記事では説明しません。これらについては、ご自身で調べてください。


原因 - 「タブ」のリファクタリング

私がコミュニティ Web サイト向けに実施したプロジェクトに、プロモーション用の「タブ」コンポーネントがあったことを覚えています。

表示1

<div class="main-left-bottoms">
    <div id="タブ">
        <ul>
            <li class="on"><a name="anchor">クラブ活動</a></li>
            <li>コミュニティの方向性</li>
            <li>社長メッセージ</li>
            <li>人材戦略</li>
        </ul>
        <div>
            <p>YouCクラブは設立以来、クラブメンバーの課外活動を充実させ、仕事と休息を組み合わせるという目標を達成するために、数多くの活動を行ってきました。これは確かに効果的であることが事実によって証明されています。 <br>
                例えば、
            <オル>
                <li>母の日に、私たちは<a href="http://www.50004.com/play52/fabebbfffcfa/XMzYwMzUwNjM4MA==/">を開催しました。
                    「親孝行・母の日」イベント</a>(動画の読み込みが少し遅い場合があります)を開催し、大盛況でした。</li>
                <li>冬至の時期に、学校と寮の合同で<a href="http://sfxy.nyist.edu.cn/info/1068/3802.htm">「冬至団子作り」というイベントを開催しました。みんなとても楽しんでいました。</li>
                <li>また、余暇には、病院主催の「老人ホーム訪問」活動にも積極的に参加し、素晴らしい経験をしました。</li>
            </ol>
        </div>
        <div class="hide">
            <p>&nbsp;&nbsp;YouC Studio は 2009 年に設立され、<span id="fffffyear"></span> 年の歴史を誇ります。 <br>&nbsp;&nbsp;この数年間の開発を経て、コミュニティはPHP、Java、JavaWebなど、さまざまな分野で才能を輩出してきました。
                ビッグデータなど。 。 。 <font color="red">このクラブの現在の主流の学習方向は、JavaWeb、つまりバックエンドの実装であり、Webサイト開発に重点を置いています。 </font> <br>&nbsp;&nbsp;コミュニティは、対応する交換活動を通じてプロジェクトの開発を完了することがよくあります。
                メンバーは知識を高めるために、時々競技会に参加し、良い成績を収めています。 <br><br>
                <font color="#ff7f50"> 具体的な個人プランについては、右のQRコードをスキャンして先輩に聞いてください! </font></p>
        </div>
        <スクリプト>
            document.getElementById('fffffyear').innerHTML = (new Date().getFullYear() - 2009) + '';
        </スクリプト>
        <div class="hide">
            <br><br>
            <p>人々は絶えず参加したり去ったりしていますが、YouC は今もここにいて、皆さんを待っています。そして、YouC の未来はさらに明るいものになると私は固く信じています。 </p> <p>——社長の願い</p>
        </div>
        <div class="hide">
            <br>
            <p>ぜひ、YouC に参加してください。ここでは、素晴らしい知識体験ができます。想像力豊かな先輩たちが、知識の探求、スキルの習得、実践的なプロジェクトの実行、面接の準備などを指導します。 </font><br>
                ここでは、想像を超える幸せが見つかります! ! ! </p>
        </div>
    </div>
</div>
.main-left-bottoms{幅: 100%;最小高さ: 280px;上マージン: 10px;}
.main-left-bottoms h1{color: orangered;font-style: italic;}
.main-left-bottoms #タブ{幅: 99%;パディング:5px;最小高さ: 280px;}
.main-left-bottoms #tabs ul{list-style:none;display:block;min-height:30px;line-height:30px;border-bottom:2px red solid;}
.main-left-bottoms #tabs ul li{cursor:pointer;float:left;list-style:none;height:28px;line-height:28px;margin:0 3px;border:2px groove orangered;border-bottom:none;display:inline-block;width:65px;text-align:center;font-weight: bold;color: black;padding: 0 10px;}
.main-left-bottoms #タブ ul li.on{border-bottom:2px solid skyblue;}
.main-left-bottoms #タブ div{min-height: 199px;line-height:25px;border-top:none;padding:0.3125em;overflow:hidden;}
#タブ div p{フォントサイズ: 0.838rem;}
#タブ div ol li{フォントサイズ: 0.875rem;マージン上部: 5px;}
#tabs div ol li a{color: lightcoral;text-decoration: none;}
#タブ div ol li a:hover{color: orange;}
.main-left-bottoms .hide{display:none;}

次に、JS を使用して、div クリック要素の外側の (同じレベルの) 要素にクラス名 hide を追加します。非常に簡単です。

その後、もっと学び、「ユーザー エクスペリエンス」にますます注意を払うようになると、ブラウザーが、ユーザーがページ、タブ、リストのいずれであっても、終了する前に閲覧した場所を「記憶」できたらどうなるだろうかと考えました。それは素晴らしいですね。
そこで、ブラウザの状態リストを支援してページ全体の切り替えと保存の効果を実現するために、Ajax を使用しようとしました (ここをクリック)。これは確かに良い方法ですが、CSS シリーズの記事を徐々に開始した後、私はさらに「貪欲」になりました。JavaScript なしでこの効果を実現できるでしょうか? —— ::ターゲット!

(これについては後ほど特別記事で取り上げる予定なので、ここで言及するのは少々やりすぎでしょう…)


その後、CSS3 で「カスタム変数」属性が導入されました。たまたま公式サイトのページが Vue で再構築されたので、この部分を CSS3 変数を使ってやり直すことを考えました。

タブ切り替えを実現するCSS3変数

表示2

上記の一見スムーズに見えるタブ切り替え効果は、実は非常にシンプルです (vue+scss を使用して完成)。
知っておくべきこと:JSにはスタイル操作変数用のAPIが3つあります

  • 変数の読み取り: elem.style.getPropertyValue()
  • 変数を設定する: elem.style.setProperty()
  • 変数を削除する: elem.style.removeProperty()
<div class="タブナビゲーションバー">
    <ナビ>
        <a v-for="(v, i) in list" :key="v" :class="{ active: index === i }" @click="select(i)">タイトル{{i + 1}}</a>
    </nav>
    <div>
        <ul ref="タブ" :style="`--tab-count: ${list.length}`">
            <li v-for="(v, i) in list" :key="v" :style="`--bg-color: ${v}`">私はコンテンツ {{i + 1} です}</li>
        </ul>
    </div>
</div>
.タブナビゲーションバー{
    ディスプレイ: フレックス;
    オーバーフロー: 非表示;
    境界線の半径: 10px;
    幅: 300ピクセル;
    高さ: 200px;
    ナビゲーション{
        ディスプレイ: フレックス;
        高さ: 40px;
        背景色: #f0f0f0;
        行の高さ: 40px;
        テキスト配置: 中央;
        {
            フレックス: 1;
            カーソル: ポインタ;
            遷移: すべて 300 ミリ秒;
            &。アクティブ {
                背景色: #3c9;
                色: #fff;
            }
        }
    }
    div {
        フレックス: 1;
        ul {
            --タブインデックス: 0;
            --tab-width: calc(var(--tab-count) * 100%);
            --tab-move: calc(var(--tab-index) / var(--tab-count) * -100%);
            ディスプレイ: フレックス;
            flex-wrap: nowrap;
            幅: var(--tab-width);
            高さ: 100%;
            変換: translate3d(var(--tab-move), 0, 0);
            遷移: すべて 300 ミリ秒;
        }
        li {
            ディスプレイ: フレックス;
            コンテンツの中央揃え: 中央;
            アイテムの位置を中央揃えにします。
            フレックス: 1;
            背景色: var(--bg-color);
            フォントの太さ: 太字;
            フォントサイズ: 20px;
            色: #fff;
        }
    }
}

<ul>--tab-indexを定義して、タブの現在のインデックスを示します。ボタンをクリックすると、 --tab-indexの値がリセットされ、DOM 内の<ul>の位置を移動せずに指定されたタブを表示できるようになります。 DOM を操作せずに<ul>を移動できるのは--tab-moveが定義されているからです。 calc()によって--tab-index--tab-moveの関係を計算し、 transform:translate3d()を操作して<ul>を移動します。

エクスポートデフォルト{
    データ() {
        戻る {
            インデックス: 0,
            リスト: ["#09f", "#f90", "#66f", "#f66"]
        };
    },
    メソッド: {
        選択(i) {
            this.index = i;
            this.$refs.tabs.style.setProperty("--tab-index", i);
        }
    }
};

さらに、タブの背景色を表すために<li>--bg-colorを定義することも、テンプレートの割り当て方法として比較的簡潔で、 <li :style="backgroundColor:${color}">と記述するよりも見栄えがよい方法です。複数の属性が変数の割り当てに依存している場合は、変数を使用してスタイルに割り当てる方が便利です。これらの属性は CSS ファイルで計算して割り当てることができるため、JS で属性の計算作業の一部を共有し、レンダリング パフォーマンスを大幅に向上させることができます。


上記のケースでは、あなたを満足させるには明らかに不十分だと思いますので、

CSS3 カスタム変数を使用して「代替」読み込みバーを実現する

表示3

<ul class="ストリップロード">
	<li style="--line-index: 0"></li>
	<li style="--line-index: 1"></li>
	<li style="--line-index: 2"></li>
	<li style="--line-index: 3"></li>
	<li style="--line-index: 4"></li>
	<li style="--line-index: 5"></li>
</ul>

.ストリップロード{
    ディスプレイ: フレックス;
    コンテンツの中央揃え: 中央;
    アイテムの位置を中央揃えにします。
    幅: 200ピクセル;
    高さ: 200px;
    li {
        --time: calc(var(--line-index) * 200ms);
        境界線の半径: 3px;
        幅: 6px;
        高さ: 30px;
        背景色: #f66;
        アニメーション: beat 1.5s easy-in-out var(--time) infinite;
        & + li {
            左マージン: 5px;
        }
    }
}
@keyframes ビート {
    0%、
    100% {
        変換: scaleY(1);
    }
    50% {
        変換: scaleY(.5);
    }
}

var()計算関数は、アニメーションの遅延としてカスタム変数とともに使用されるため、各要素には独自の遅延時間があります。CSS3 変数は、以前の CSS の:nth-child(N)によって発生したコードの冗長性を大幅に簡素化します。


クールなマウストラッキング効果

偶然にも、私がこの記事を書く前に、コミュニティのバックエンドの上級者が、元の送信ボタンの代わりにクールなボタンを作ることを提案しました。

低い

変更後の効果はおそらく次のようになります。

表示4

実は「最初のバージョン」の背景色は linear-gradient+animation+hue-rotate を使っていたのですが、先輩に派手すぎると言われてしまいました… ふふ、試してみてもいいですよ。

実際、アイデアは比較的シンプルです。まず、ボタンをレイアウトして色を付け、次に疑似要素を使用してマウスの位置をマークし、ボタン内の疑似要素の座標を表す--x--yを定義し、JS を使用してボタン上のマウスの offsetX と offsetY を取得してそれぞれ--x--yに割り当て、次に疑似要素に放射状グラデーションの背景色を追加すれば完了です。クールなマウス ホバー トラッキング効果が作成されます。

<ボタンクラス="track-btn">
	<span>若者よ、私をクリックすれば私はあなたに力を与えるでしょう</span>
</ボタン>
.トラックボタン{
	マージン: 0;
	パディング: 0;
	/*カスタム境界線*/
	境界線: 0;
	/*クリック時のデフォルトの青い枠線効果を削除します*/
	アウトライン: なし;
	-webkit-appearence: なし;
	オーバーフロー: 非表示;
	位置: 相対的;
	境界線の半径: 25px;
	高さ: 49.9px;
	背景色: #66f;
	カーソル: ポインタ;
	行の高さ: 50px;
	テキスト配置: 中央;
	フォントの太さ: 太字;
	フォントサイズ: 18px;
	色: #fff;
	パディング: 0 20px;
	スパン {
		位置: 相対的;
		ポインタイベント: なし;
	}
	&::前に {
		--サイズ: 0;
		位置: 絶対;
		左: var(--x);
		上: var(--y);
		幅: var(--size);
		高さ: var(--size);
		背景画像: 放射状グラデーション(円の最も近い側、#09f、透明);
		コンテンツ: "";
		変換: translate3d(-50%, -50%, 0);
		遷移: 幅 200 ミリ秒の緩和、高さ 200 ミリ秒の緩和。
	}
	&:hover::before {
		--サイズ: 200px;
	}
}
const btn = document.getElementsByClassName("track-btn")[0];

btn.addEventListener("mousemove", e => {
	btn.style.setProperty("--x", `${e.offsetX}px`);
	btn.style.setProperty("--y", `${e.offsetY}px`);
});

さらに素晴らしいアニメーションを追加することもできます。


現実と展望

前述のとおり、CSS3 変数はどこにでも配置できます。実際、「あまり知られていない」 ::rootも、変数を個別に保存するための「純粋な領域」として使用できます。

// スタイル内の CSS3 変数値を参照/変更します。documentElement.style.setProperty("name", value)

CSS でカスタム変数を変更する場合は、現在、それらを同じ「ターゲット」に配置することをお勧めします。例えば:

#角度{
	--角度: "";
}
#角度:チェック済み{
	 --angular: "角度";
}

今日のほとんどの Web サイトでは、ページの応答性に基づいて、レイアウト内の項目間のデフォルトの間隔、およびページ上のさまざまなセクションすべてのデフォルトのパディング、フォント サイズ、さらにはタイポグラフィ レイアウトが定義されています。しかし、多くの場合、異なる「外部リンク CSS ファイル」を切り替えたり、対応するすべてのプロパティ値を狭い範囲で変更することしかできません。しかし、これによって 1 つのことが起こります。「次のメディア臨界値」に達する前に、常にいくつかの「偶発的な」距離が存在することになります。たとえば、 document.documentElement.clientWidth || document.body.clientWidth;の特定の範囲内では、要素間の間隔は大きくなりますが、小さい画面ではスペースが足りず、余白が多すぎると、その前または後で間隔が「突然変化」します。

:根 { 
	--サイズ: 1.5em; 
} 
@media (最小幅: 30em) { 
	:根 { 
		--サイズ: 2em; 
	} 
} 
。容器 {
	マージン: 0 自動; 
	最大幅: 60em; 
	フォントサイズ: var(--size); 
}

また、js でページ サイズの変更を監視して、 --sizeの値をリアルタイムで変更することもできます。変数が多いほど、コードを節約できます。 —— 従来は、scss / less ライブラリを導入することによってのみこれを実現できました。

カスタム プロパティは、一部のシナリオでプリプロセッサ変数を正しく使用できない scss/less のギャップを埋めます。ただし、互換性の観点から見ても、現在の開発の観点から見ても、多くの場合、プリプロセッサ変数を使用する方が依然としてよりエレガントな選択です。多くのサイトでは、しばらくの間、動的テーマのカスタム プロパティと静的テンプレートのプリプロセッサ変数の両方を組み合わせて使用​​し続けると思われます。

これで、プロジェクトの再構築から始めて、プロジェクトで CSS3 カスタム変数を使用する方法についての記事は終了です。プロジェクトでの CSS3 カスタム変数の使用の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

<<:  Linux 環境に MySQL 8.0 をインストールするプロセスの紹介

>>:  エンコードが utf-8 に設定されている場合に Web ページが文字化けする問題の解決策

推薦する

Vueでキャッシュされたページを管理する方法

目次問題1: 破壊1. 破壊する方法2. いつ破壊するか2.1 解決策1: route.queryを...

MySQLのorder byとlimitを混在させる際の落とし穴の詳細な説明

MySQL では、ソートには order by を、ページングには limit をよく使用します。最...

canvas.toDataURL image/png エラー処理方法の推奨

問題の背景:再生中のビデオのスクリーンショットを撮る必要があります。ビデオはビデオタグを使用して再生...

nginx + セカンダリドメイン名 + https サポートを使用する

ステップ1: Alibaba Cloudプライマリドメイン名にセカンダリドメイン名を追加する2 番目...

個人履歴書を作成するための HTML の簡単な実装

履歴書コード: XML/HTML コードコンテンツをクリップボードにコピー<!DOCTYPE ...

登録ページを実装するためのJS、CSS、HTML

HTML と CSS で実装された登録ページ テンプレート。早速、コードを見てみましょう。更新: ...

HTML フォーム送信アクションと URL ジャンプアクションの違い

フォームのアクションは URL ジャンプとは異なります。フォームはバックグラウンドにデータを渡すこと...

Vueはタブルーティング切り替えコンポーネントのメソッド例を実装します

序文この記事では、vue に付属している vue-router.js ルーティングを使用してページン...

単純なCSSの詳細に惚れ込むと、重要ではないものの、効率性が向上する可能性がある

CSS の将来は非常に楽しみです。一方では、まったく新しいページ レイアウト方法であり、他方では、ク...

MySQLのインストールと設定に関する詳細なチュートリアル

目次インストール不要のMySQLバージョン1. インストール パッケージをダウンロードします。 2....

クエリプロファイラを使用して MySQL ステートメントの実行時間を表示する方法

前回の記事では、MySQL ステートメントの実行時間をチェックする 2 つの方法を紹介しました。今日...

JavaScript の setTimeout と setTimeinterval の使用例の説明

どちらの方法も、一定時間後に JavaScript コードを実行するために使用できますが、それぞれに...

JS で美しい条件式を書く方法についての簡単な説明

目次複数の条件文複数属性オブジェクトスイッチステートメントを置き換えるデフォルトパラメータとデストラ...

MySQL 5.7.17 winx64 のインストールと設定のチュートリアル

今日、MySQL データベースをコンピューターに再度インストールしました。システムを再インストールす...