ホームページ ウェブフロントエンド htmlチュートリアル CSS_html/css_WEB-ITnose のロジックについて

CSS_html/css_WEB-ITnose のロジックについて

Jun 21, 2016 am 08:54 AM

この記事は、元の著者である @csswizardry の同意を得て、彼のブログの記事「Cyclomatic Complexity: Logic in CSS」を翻訳したものです。元々は私の個人ブログ「The Taste of Chewing」で公開されました。さらに、@hax 先輩はこの記事の元の著者の理論を嘲笑しました。そこで私は一文を付け加えたいと思います。本を信じるよりは、本をまったく持たないほうが良いのです。読者の皆さんはご自身で比較検討してみてください~

これまで長い間、CSS にはロジックがないと述べてきました。これは、CSS には制御フローがなく、それに類似したものも存在しないことを意味します。他のプログラミング言語が CSS を編成する方法。 CSS には本質的にロジックが欠如しているため、プリプロセッサの出現につながりました。ただし、業界では CSS プリプロセッサについてさまざまな意見があります。プリプロセッサを支持する人は、CSS に欠けている機能を補うと信じています。一方、プリプロセッサに反対する人は、CSS は本来の設計では論理的であるべきではないと信じています。本質的に論理的ではありません。プリプロセッサの概念はまったく導入されるべきではありません。

しかし、最近、独特の考え方が突然頭に浮かびました。 CSS にはロジックがあるような気がします。実際にそのように考えている人はほとんどいません。おそらくこれが、CSS にはロジックが欠けていると私たちが常に考える最大の理由です。

複合セレクターは、本体部分 + 条件部分 として理解できることがわかりました。まず例を見てみましょう:

  1. div.sidebar .login-box a.btn span {
  2. /*...*/
  3. }
コードをコピー

この複合セレクターでは、メイン部分は span で、条件部分は IF (.btn 内) AND IF (a) AND IF (.login- 内) です。ボックス) AND IF (.sidebar 内) AND IF (div 上)。

言い換えると、セレクターの各部分は、セレクターを解析するときに満たされる (または満たされない) 必要がある if ステートメントです。この微妙で新しい理解を得て、今までに書いた CSS コードを振り返ってみると、セレクターが適切に記述されているかどうかが効率に直接影響することがわかります。本当に次のロジックを書くのでしょうか? (疑似コード):

  1. @if doesn't(span) {
  2. @if is-inside(.btn) {
  3. @if is-on (a) {
  4. @if is-inside(.login-box) {
  5. @if is-inside(.sidebar) {
  6. @if is-on ( div) {
  7. # これを実行します。
  8. }
  9. }
  10. }
  11. }
  12. }
  13. }
コードをコピー

おそらくそうではありません。これはあまりにも間接的で冗長に思えます。これを書くだけで十分かもしれません:

  1. @if doesn't(.btn-text) {
  2. # Do this.
  3. }
コードをコピー

セレクターに制限のレイヤーを追加するたびに、実際には if ステートメントを追加することになります。これは循環的複雑性を引き起こす可能性があります。

循環的複雑度

ソフトウェア工学では、循環的複雑度はプログラムの複雑さの尺度であり、通常、プログラム内の制御フロー (if、else、while など) の数をカウントします。 。プログラム内の制御フローが増えるほど、循環的な複雑さは高くなります。循環的複雑度が高くなるほど、コードが失敗につながる可能性のある潜在的な問題を推測するのが難しくなるため、当然、循環的複雑度はできるだけ低くする必要があります。変更、保守、再利用が難しいため、より多くのコードの実行結果と副作用を考慮する必要があります。また、テストコードを書くのもより困難になります

循環的複雑さの観点から CSS 解析プロセスを考える。 、ブラウザがスタイルをレンダリングしていることがわかります。これまでに多くの決定を下す必要がありました。セレクター内で if ステートメントを作成するほど、セレクター

循環的複雑度が高くなります。これは、作成するセレクターの品質が低下することも意味します。このセレクターのルールを満たすためには、より多くの一致が必要になります。条件。同時に、不必要な if ステートメントを導入しすぎると不正確なマッチング (誤検知) が発生するため、私たちが作成するセレクターは明確さと再利用性に欠けます .btn 内にスパンをネストして多くの制約を記述するよりも、このスパンを記述する新しいクラス .btn-text を作成する方が良い方法です。これは、より単純で、簡潔で、堅牢です (@if ステートメントが増えると、セレクター ルールが満たされる可能性が低くなります)。

ブラウザーが作成したセレクターを右から左に解釈する方法に注目する価値があります。セレクターを作成するときに最初に頭に浮かぶ疑問が「これはスパン要素ですか?」である場合、通常はセレクターを冗長にしすぎます。別の角度から考えて、明確かつ正確なセレクター ルールを作成し、冗長な条件ステートメントを完全に放棄する必要があります。

あまりにも広範なルールを記述しないでください。その結果、作成したセレクターが一致の開始時に多数の DOM 要素を選択し、その後、より多くの条件ステートメントを使用して一致したオブジェクトを徐々に削除する必要があります。より良いアプローチは、セレクターのルール解析の開始時から可能な限り少数の要素と一致するようにすることです。

循環的複雑性は CSS にとって比較的高レベルの原則ですが、作成するセレクターに含まれるロジックを考慮するためにそれを使用すると、より優れたコードを作成できる可能性があります。

いくつかの分かりやすい小さなルール

セレクターを最小限にします: セレクターにルールを追加するたびに、余分な if ステートメントを追加することになります。これらの if ステートメントを声に出して読み、追加する必要があるかどうかを慎重に検討してください。作成するセレクターは常に合理的かつ簡潔にする必要があります。 循環的複雑さが最小化されていることを保証します: Parker などのツールを使用して、作成したセレクターの循環的複雑さをテストします (参考ドキュメント: セレクターごとの識別子) このチェック条件が必要ない場合は、セレクター には入れないでください。CSS で入れ子構造を使用する必要がある場合もありますが、ほとんどの場合はそうではなく、インセプション ルールを完全に信頼することさえできません。 右側からセレクターを記述する方法を検討します: 一致する必要がある要素のタイプから始めて、正しい一致を完了するために余分な CSS コードをできるだけ少なく記述します。 明確な目的を持ってセレクターを作成します

: ページを適切に表示するために偶然作成されたコードではなく、作成するセレクターが実際に必要なものであることを確認してください。

セレクターは CSS 構造の最も基本的な部分であり、作成するコードが合理的かつ簡潔であることを確認してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

< Progress>の目的は何ですか 要素? < Progress>の目的は何ですか 要素? Mar 21, 2025 pm 12:34 PM

この記事では、HTML< Progress>について説明します。要素、その目的、スタイリング、および< meter>との違い要素。主な焦点は、< Progress>を使用することです。タスクの完了と< Meter> statiの場合

< datalist>の目的は何ですか 要素? < datalist>の目的は何ですか 要素? Mar 21, 2025 pm 12:33 PM

この記事では、HTML< Datalist>について説明します。オートコンプリートの提案を提供し、ユーザーエクスペリエンスの改善、エラーの削減によりフォームを強化する要素。

< meter>の目的は何ですか 要素? < meter>の目的は何ですか 要素? Mar 21, 2025 pm 12:35 PM

この記事では、html< meter>について説明します。要素は、範囲内でスカラーまたは分数値を表示するために使用され、Web開発におけるその一般的なアプリケーション。それは差別化< Meter> < Progress>およびex

ビューポートメタタグとは何ですか?レスポンシブデザインにとってなぜそれが重要なのですか? ビューポートメタタグとは何ですか?レスポンシブデザインにとってなぜそれが重要なのですか? Mar 20, 2025 pm 05:56 PM

この記事では、モバイルデバイスのレスポンシブWebデザインに不可欠なViewportメタタグについて説明します。適切な使用により、最適なコンテンツのスケーリングとユーザーの相互作用が保証され、誤用が設計とアクセシビリティの問題につながる可能性があることを説明しています。

HTML5< time>を使用するにはどうすればよいですか 日付と時刻を意味的に表す要素? HTML5< time>を使用するにはどうすればよいですか 日付と時刻を意味的に表す要素? Mar 12, 2025 pm 04:05 PM

この記事では、html5< time>について説明します。セマンティックデート/時刻表現の要素。 人間の読み取り可能なテキストとともに、マシンの読みやすさ(ISO 8601形式)のDateTime属性の重要性を強調し、Accessibilitを増やします

HTML5フォーム検証属性を使用してユーザー入力を検証するにはどうすればよいですか? HTML5フォーム検証属性を使用してユーザー入力を検証するにはどうすればよいですか? Mar 17, 2025 pm 12:27 PM

この記事では、ブラウザのユーザー入力を直接検証するために、必要、パターン、MIN、MAX、および長さの制限などのHTML5フォーム検証属性を使用して説明します。

< iframe>の目的は何ですか タグ?使用する際のセキュリティ上の考慮事項は何ですか? < iframe>の目的は何ですか タグ?使用する際のセキュリティ上の考慮事項は何ですか? Mar 20, 2025 pm 06:05 PM

この記事では、< iframe>外部コンテンツをWebページ、その一般的な用途、セキュリティリスク、およびオブジェクトタグやAPIなどの代替案に埋め込む際のタグの目的。

HTML5のクロスブラウザー互換性のベストプラクティスは何ですか? HTML5のクロスブラウザー互換性のベストプラクティスは何ですか? Mar 17, 2025 pm 12:20 PM

記事では、HTML5クロスブラウザーの互換性を確保するためのベストプラクティスについて説明し、機能検出、プログレッシブエンハンスメント、およびテスト方法に焦点を当てています。

See all articles