Skip to content
This page has been auto-translated and may contain errors.View in English

CSSの仕組み

docs.scrimba.com

プレーンなHTMLページはすでにブラウザ独自のスタイルが適用されて到着します。リンクは青色で下線が引かれ、テキストは黒色のセリフなしフォント、見出しはサイズが段階的に小さくなります。CSSはその生の構造を取り、代わりにどのように見えるべきかを決定する方法です。しかし、色を1つ変更したりボックスを1つ移動したりする前に、スタイルがまずどのようにしてページに到達するのか、そして2つのルールが同じ要素について意見が異なるときに何が起こるのかを知る必要があります。

CSSをページに関連付ける

CSSをページに追加する方法は3つあり、違いはほぼどこにスタイルを書くかの問題です。

1つ目は**インラインスタイル**で、要素にstyle属性を使って直接書きます。

html
<p style="color: teal;">1つのティール色の段落です。</p>

これは1つの段落だけをスタイル指定します。2番目の方法はページの<head>内の内部<style>ブロックで、一度に多くの要素をスタイル指定できます。3番目で、使うべき方法は、ページにリンクされた別のCSSファイルです。そのファイルにスタイルを1回書き、それにリンクするすべてのページがそれを取得します。衣料品店に例えるなら、1人ずつ衣装を説明する代わりに、ドレスコードを1回書き、誰もがそれに従うようなものです。

CSSはページに3つの方法で到達し、すべてが同等ではありません。インラインスタイルはstyle属性でエレメント自身に置かれ、その1つのエレメントのみに影響します。**内部スタイルシート**は<head>内の<style>ブロックで、ページ全体のエレメントをターゲットできます。外部スタイルシートは<head>からリンクされる.cssファイルです。

html
<link rel="stylesheet" href="styles.css">

外部スタイルシートをデフォルトとして使用してください。スタイル指定をマークアップ全体に散らばらせるのではなく1か所に保つので、構造はHTMLに、プレゼンテーションはCSSに留まります。これはCSSとは何かで説明されているのと同じ分離です。ブラウザはまたファイルをキャッシュするので、ページ間を移動する訪問者はスタイルを1回ダウンロードして再利用でき、ボタンスタイルなどのルールを1回書いて、すべてのボタンにコピーするのではなく使用できます。

3つのメカニズムがCSSを関連付け、それぞれこの章の後で会うカスケードの場所にマップします。インラインスタイル(エレメント上のstyle属性)はそのエレメント単独に適用され、競合では非常に高い重みを持ちます。これはそれに頼ることが傷つける理由です。スタイルシートから生きよく上書きするのは難しいです。内部<style>ブロックは1つのドキュメントにスコープされます。<link rel="stylesheet">でリンクされた外部スタイルシートは、スッキリさせる理由以上の本番デフォルトです。

外部ファイルは3つのことを同時に提供します。関心の分離、マークアップとスタイル指定が独立して変わること。HTTPキャッシング、戻ってくる訪問者が各HTMLレスポンスに埋め込まれたスタイルを再フェッチするのではなく、すべてのページ全体で既にダウンロードされたファイルを再利用することができます。そして再利用、1つの作成されたルールがサイト全体を処理することです。トレードオフは別のリクエストです。最初のペイント用に時々非常に小さい重要なスタイルがインラインに入れられることもありますが、一般的なルールは成り立ちます。外部スタイルシートで作成し、インラインスタイルを習慣ではなく目的の例外として扱ってください。

外部アプローチは全体では以下の通りです。スタイルシートをリンクするHTMLファイルと、スタイルシート自身です。

html
<!-- index.html -->
<head>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <p class="intro">サイトへようこそ。</p>
</body>
css
/* styles.css */
.intro {
  color: teal;
  font-size: 1.25rem;
}
JunoCSSをページに関連付ける CSSを追加する3つの方法があります。エレメント上でstyleを使う方法、<style>ブロックを使う方法、<link>でリンクする別ファイルを使う方法です。別ファイルを使ってください。スタイルを1回書き、それにリンクするすべてのページが同じように見えます。
JunoCSSをページに関連付ける インラインスタイルは1つのエレメントに当たり、<style>ブロックは1つのページを覆い、外部.cssファイルはサイト全体を覆います。外部ファイルをデフォルトにしてください。プレゼンテーションをマークアップから除外し、ブラウザがキャッシュし、1つのルールがマッチするすべてのエレメントに対応します。インラインスタイルは日常ではなく例外です。
JunoCSSをページに関連付ける 外部スタイルシートで作成してください。分離、キャッシング、そして再利用が一度に実現します。インラインスタイルはカスケードで高い重みを持つので、後で上書きするのは大変です。それらを意図的な例外として保ってください。インラインしようとする唯一の時間は、最初のペイント用の小さい重要スタイルのブロックで、それでもCSSの大量部分はリンクされたファイルに留まります。

ルールの構造

CSSは**ルール**として書かれ、すべてのルールは同じ形をしています。カードをスタイル指定する1つはこちらです。

css
.card {
  color: navy;
  padding: 16px;
}

前の.cardセレクタです。このルールが適用される要素を選びます。この場合、cardクラスを持つ何もかもです。中括弧内のすべてはルール宣言ブロックです。color: navy;のような中の各行は1つの宣言です。プロパティ(color)とそれが持つ値(navy)で、コロンで区切られセミコロンで終わります。ルール全体を文として読んでください。「すべてのカード、色を紺にしてパディングを16ピクセルにしてください。」

すべてのルールは同じパーツから組み立てられ、それらに名前を付けるとCSSの残りはさらに簡単に会話できます。

css
.card {
  color: navy;
  padding: 16px;
}

セレクタ.card)はルールがターゲットする要素を選びます。中括弧は宣言ブロックを保持します。その中、各property: value;ペアは宣言です。colorはプロパティ、navyは値、コロンはそれらに参加し、セミコロンはそれを終了します。セミコロンは宣言間の区切り文字なので、最後のものは技術的には必要ありませんが、とにかく保ってください。後で次の宣言を追加することが1行の変更になる代わりに2行になります。セレクタがマッチするエレメント、そしてそれがどの程度具体的なのかは、セレクタ章の主題です。

文法は小さく、正確に述べる価値があります。後のすべてのコンセプトはこれらの用語で定義されるため。ルールは**セレクタ**(ルールが適用されるエレメントを決定するパターン)の後に宣言ブロック(中括弧)が続くものです。ブロック内には宣言のリストが座り、それぞれはプロパティがコロンで値と組み合わされセミコロンで終了します。

css
.card {
  color: navy;
  padding: 16px;
}

ここでの正確さはデバッグで支払うことになります。不正な形式の宣言、例えば誤ったプロパティや無効な値は、パーサによるそれ自体で廃棄され、ブロックの残りはまだ適用されます。CSSは宣言ごとにフェイルします。ルールごとではなく。これが1つのタイプミスが静かに1行を下すのではなく、カード全体を壊さない理由です。セミコロンは終止符ではなく区切り文字なので、最後の宣言の後はオプションですが、それを保つと別の行を追加する日に壊れたルールを防ぎます。そしてあなたがそれを忘れて上に追加します。次にカスケードに会ったら、「どの宣言が勝つか」はいつもこの宣言レベルで、プロパティごとに作動することを覚えておいてください。

Junoルールの構造 ルールはセレクタと中括弧内の宣言セットです。.cardのようなセレクタがエレメントを選び、color: navy;のような各宣言はプロパティと値がそれらの間にコロンがあり終わりにセミコロンがあります。それらのパーツに名前を付けることができれば、読むすべてのルールが同じように見えます。
Junoルールの構造 セレクタ、宣言ブロック、およびその内部のproperty: value;宣言。これがすべてのルールです。セミコロンは宣言を分離するので、最後のものにも保ってください。次の行を追加するのは1行の編集のままです。セレクタがマッチする方法とそれがどの程度具体的かは、セレクタ章で次に来ます。
Junoルールの構造 ルールはセレクタとproperty: value;宣言のブロックであり、CSSは宣言ごとにフェイルします。1つの無効な行は下されブロックの残りは生き残ります。これが迷った1つのスタイルを静かに削除し、カードを壊さない理由です。後続のセミコロンを保ち、宣言を追加することはあなたをかまれることはありません。

カスケード

時々2つのルールが同じエレメントをスタイル指定しようとし、CSSはどちらが勝つかを決定する方法が必要です。その決定は**カスケード**で、CSSのCの由来です。

css
.card {
  color: navy;
}

.card {
  color: teal;
}

両方のルールがカードをターゲットし、両方が色を設定します。カードは最後のため、ティール色で終わります。2つのルールが同じ強さを持つとき、後に書かれたものが勝ちます。順序は重要で、水のようにファイルを下るフロー、これはカスケードという名前の由来です。2つ目のタイブレーカーもあります。より具体的なセレクタはより一般的なものを打ちます。より一般的なルールがそれより後に来ても、カードに正確にターゲットされたルールはより広いルールを上書きできます。セレクタ章でその特異性に詳しく会うでしょう。

複数のルールが同じエレメント上で同じプロパティを設定するとき、**カスケード**は勝者を選ぶプロセスです。2つの要因がここで決定します。特異性とソースオーダー。

css
.card {
  color: navy;
}

.card {
  color: teal;
}

これら2つのルールは同一の特異性を持つので、ソースオーダーはタイを破り、後のルールが勝ちます。カードはティール色です。特異性が異なるときですが、それはオーダーに優先順位を取ります。より一般的なルールがファイルの後に来る場合でも、より具体的なセレクタはより一般的なものを打ちます。より具体的が勝ちます。特異性タイで、後のものが勝ちます。これはファイルの後の方にオーバーライドをスタックするのが断片的な習慣である理由であり、なぜセレクタ章からの特異性の理解があればカスケードを推測ゲームではなく予測可能にするのかは。

**カスケード**は1つのエレメント上の1つのプロパティのための競合する宣言を解決するアルゴリズムで、1つの宣言が立っている状態で残るまでの結果として順序付けられたクライテリアセットを通り抜けます。

css
.card {
  color: navy;
}

.card {
  color: teal;
}

最も一般的な2つのクライテリアは特異性(ブラウザがセレクタから計算する重み)とソースオーダー(タイで後のものが勝ちます)、そして上の例はその2つ目を回ります。同等の特異性、そのため後のtealが勝ちます。しかしそれら2つはより大きな順序内に座ります。カスケードは最初にオリジンと重要性でソートします。ブラウザデフォルトスタイル、それからあなたの作者スタイル、それからすべてのユーザースタイル、通常対重要のレイヤーがトップにあります。!importantとマークされた宣言はより高いバンドにジャンプします。これが正確にそれが存在する理由であり、正確にそれを避けるべき理由です。!importantは通常の順序を去ることによって勝ちます。正しいことによってではなく、それはオーバーライドではなくエスケープハッチです。そして1つの!importantが現れたら、次の修正は多くの場合別のものです。それはあなたが管理しないスタイル、例えばインラインスタイルまたはサードパーティウィジェットを倒すためにだけそれに到達します。そしてその他の場合は特異性と順序がする仕事をさせてください。あなたがボックスモデルに会い多くのルールを層にし始めるとき、この順序はその結果を予測可能に保つものです。

Junoカスケード カスケードは、2つのルールが同じものをスタイル指定するときのCSSがファイトをどのように解決するかです。ルールが同じくらい強いなら、後に書かれたものが勝ちます。ですから順序が計上します。より具体的なセレクタはより一般的なものを上書きすることもでき、その部分はセレクタ章で来ています。
Junoカスケード ルールが衝突するとき、特異性は最初に決定し、ソースオーダーがタイを破ります。より具体的が勝ち、均等なマッチで後のルールが勝ちます。ファイルの下部にオーバーライドを積み重ねることは機能するまで機能します。これはセレクタ章でカスケードを信じる前に読む価値がある特異性である理由です。
Junoカスケード カスケードはオリジンと重要性でまずソートし、それから特異性、それからソースオーダーで、これをプロパティごとに解決します。!importantは正しいことによってではなく、バンドをジャンプすることによって勝ちます。ですからそれをあなたが管理しないスタイルを倒すためのエスケープハッチとして扱ってください。日常的なオーバーライドではなく。1つの!importantは次を産生する傾向があります。

継承

ボックスに色を設定し、その内部のテキストは多くの場合その色も回ります。それらを直接スタイル指定したことはないのにですが。その受け渡しは**継承**と呼ばれます。

css
.site-header {
  color: white;
  font-family: Georgia, serif;
}

ヘッダーの内部のテキストのすべての部分、見出し、リンク、タグライン、その白い色とそのフォントをピックアップします。それら自身のルールなしで、colorfont-familyは継承されたプロパティのためです。しかしすべてが受け渡すわけではありません。paddingのようなスペーシングプロパティは継承しません。ヘッダーに入れたパディングはヘッダーに留まり、その内部のエレメントに現れません。粗いガイドとして、テキスト関連のスタイルは子にフローし、スペーシングと境界線のようなボックス関連のスタイルはその場に留まります。

いくつかのプロパティは自動的にその値を子孫要素に受け渡します。そしていくつかはしません。その行動は**継承**で、どのプロパティが継承するかを知るのはたくさんの繰り返されたルールを保存します。

css
.site-header {
  color: white;
  font-family: Georgia, serif;
}

テキスト関連プロパティ継承:colorfont-familyfont-sizeline-height、そして類似のすべてが子孫にフローし、ですからコンテナに1回設定するとその内部のすべてをスタイル指定します。ボックス関連プロパティはしません。paddingmarginborder、そしてbackgroundはあなたがそれを設定したエレメントにだけ適用します。あなたがその値が通常はしないことを継承する場合、inheritキーワードはそれを強制します。親からプロパティの計算された値を取ります。継承とカスケードは一緒に動く別のシステムです。カスケードはエレメント上の勝利宣言を決定し、継承はその宣言がそのプロパティをすべてそれに設定しないときに子が何にフォールバックするかです。タイポグラフィはこれに重く頼り、タイポグラフィ章がそれで構築されます。

**継承**はエレメント上にカスケードされた値を持たないプロパティがそのエレメントの親からその値を取るメカニズムです。各CSSプロパティは継承またはそうでないとして定義されます。ほとんどのテキストプロパティ(colorfont-familyfont-sizeline-heighttext-align)継承します。ほとんどのボックスプロパティ(paddingmarginborderbackground)は、すべての子孫にスペーシングを継承するのは使用不可能になるため、しません。

css
.site-header {
  color: white;
  font-family: Georgia, serif;
}

4つの明示的なキーワードはデフォルトが望むものではないときに宣言ごとにこれを制御します。inheritは継承されていないプロパティでも親の計算された値を取ります。initialはプロパティの仕様デフォルトにリセットします。unsetは継承されたプロパティについてはinheritとして機能し、残りについてはinitialとして機能します。そしてrevertはブラウザのデフォルトスタイル指定にロールバックします。より大きな画像は継承とカスケードが一緒にエレメントの計算された値を生成することです。カスケードは存在する勝利宣言を選択し、存在しないところ、継承されたプロパティは親から描きます。継承されていないものはその初期値に落ちます。プロパティ、そしてすべてのエレメントに1つの計算された値が、レイアウトと塗装は実際に消費するものです。そしてカスタムプロパティ章は直接継承に頼って、デザイントークンをコンポーネントツリー全体で流します。

Juno継承 継承はテキストスタイルがボックス内のエレメントに流れ落ちるものです。ヘッダーにcolorまたはfont-familyを設定し、内部のテキストは無料でピックアップします。paddingのようなスペーシングは受け渡されず、あなたが入れたその場に留まります。粗いルール。テキストスタイルは子に移動し、ボックススタイルはその場に留まります。
Juno継承colorfont-familyのようなテキストプロパティは子孫に継承されます。paddingborderのようなボックスプロパティはしません。コンテナに1回スタイル指定すると、その内部のすべてのテキスト関連が従います。あなたが通常は継承しない値が必要なとき、inheritキーワードは親から引きます。
Juno継承 各プロパティは定義によって継承またはそうでないかです。テキストプロパティは継承し、ボックスプロパティはしません。キーワードinheritinitialunset、そしてrevertはあなたが宣言ごとにそれをオーバーライドすることを許可します。継承とカスケードは一緒にプロパティごとにエレメントごとに1つの計算された値を解決します。そしてその値は、レイアウトと塗装が実際に使用するものです。