3-2. header部分のCSSを書く
このチャプターでは、header
要素のCSSを記述していきます。
余白を調整する
とりあえずまずはheader
要素の下側、main
要素との間に余白を入れます。
/* ============================ */
/* .header
/* ============================ */
.header {
margin-bottom: 40px;
}
margin-bottom
として、下側のみ40pxの余白を入れます。
ページタイトルにスタイルをあてる
つづいてh1
要素にスタイルをあてていきます。
今回h1
とh2
の見出しにはGoogle Fontsを使用するので、CSSを記述する前にまずGoogle Fontsを読み込む準備をします。
Google Fontsを読み込む
Google Fontsのサイトに行き、使用するフォントを選択します。今回は「Fascinate Inline」というフォントを使用します。
使用するフォントページの右上にある「Get font」ボタンをクリックします。
つづいて、「Get embed code」ボタンをクリックします。
「Web」タブを選択すると、埋め込むコードとCSSが表示されます。
コードの埋め込み方法は2とおりあります。
<link>
:HTML文書のhead
要素内に記述する@import
:HTML文書のhead
要素内にstyle
要素で記述、またはCSSファイルに記述
今回は@import
を使用し、CSSファイル内でGoogle Fontsを読み込みます。どちらを使用しても、フォント表示のCSSは同じです。
CSSファイルの@charset "utf-8";
のすぐ下の行に、以下を記述します。
@charset "utf-8";
/* font@google */
@import url('https://fonts.googleapis.com/css2?family=Fascinate+Inline&display=swap');
@import url('');
は外部のCSSファイルを読み込むための記述です。url()
は以下のような指定が可能です。また、括弧内のくくりは'...'
でも"..."
でもどちらでも構いません。
また、@import
は@charset
に続いてCSSの最初に読み込ませるのが一般的です。
/* 絶対URL */
@import url('https://fonts.googleapis.com/css2?family=Fascinate+Inline&display=swap');
/* 相対パス */
@import url('./style_parts.css');
@import url('../style_parts.css');
/* ルートパス */
@import url('/css/style_parts.css');
基本的には、Google Fontsなど外部サービスを読み込む場合に使用することがほとんどかと思います。
h1要素にスタイルをあてる
h1
要素のCSSを記述します。.header
のあとに追加します。
ここでは下方向の余白、文字色、フォントサイズ、テキストの配置場所などを指定しています。
h1 {
margin-bottom: 10px;
color: #eb5b00;
font-size: 2.5em;
font-weight: 400;
font-style: normal;
font-family: 'Fascinate Inline', system-ui;
text-align: center;
}
順番が入れ替わっていますが、以下の3つはGoogle Fontsで指定されているCSSをそのまま記述します。
font-weight
プロパティfont-style
プロパティfont-family
プロパティ
font-weightプロパティ
font-weight
プロパティは、フォントのウェイト(太さ)を指定します。normal
(初期値)やbold
という指定のほか、フォントによって複数のウェイトが用意されている場合は、100〜900(100刻み)の数値で指定することもあります(Google Fontsは数値での指定が一般的です)
normal
の指定は数値では400、bold
の指定は数値では700に該当します。
font-styleプロパティ
font-style
プロパティは、フォントのスタイルを指定します。指定できる値は以下です(フォントにそれぞれのスタイルが用意されていることが前提です)
normal
:通常体(初期値)italic
:筆記体(イタリック体 / フォントにitalic
がない場合はoblique
に変換)oblique
:斜体(フォントにoblique
がない場合はitalic
に変換)
これらは主に英字体に対して適用されます。
text-alignプロパティ
text-align
プロパティは、テキスト(表のセル内テキストも含む)の水平(横)方向の位置を指定します。指定できるのは以下の値です。
left
:左寄せ(初期値)center
:中央寄せright
:右寄せ
単位em
について
この項目の最後に、font-size
プロパティの値で指定しているem
という単位について解説します。em
はpx
や%
と同様にCSSで使用できる単位のひとつです。相対的な単位で、その要素にあてられている「フォントサイズ」の値を基準とし、「基準値にem
の値を掛け合わせた数値」が表示される値になります。
1emはフォントサイズの基準値とイコールになります。body
要素のフォントサイズを基準とする場合、そのフォントサイズが1remであれば、「1rem = 16px = 1em」になります。
以下のHTMLとCSSを例として解説します。HTML文書はbody
要素内のみ記述しています。
<body>
<p>テキスト①</p>
<p class="text2">テキスト②</p>
<div class="box">
<p>テキスト③</p>
<p class="text2">テキスト④</p>
</div>
</body>
body {
font-size: 1rem;
}
.text2 {
font-size: 1.2em;
}
.box {
font-size: 20px;
}
この結果は以下のようになります。
計算式と表示される値はつぎのとおりです(計算の結果値はおおよその数値)
body
要素内のフォントサイズは1rem=16px(基準値)- テキスト①:16px(
body
要素から継承されたフォントサイズ) - テキスト②:16px * 1.2 = 19.2px
- テキスト①:16px(
.box
要素内のフォントサイズは20px
(body
要素から継承されたフォントサイズを上書き /.box
要素内の基準値)- テキスト③:20px(
.box
要素から継承されたフォントサイズ) - テキスト④:20px * 1.2 = 24px
- テキスト③:20px(
em
はCSSの単位として、単位を指定するほぼすべてのプロパティで使用可能ですが、font-size
の指定にとくに向いている単位です。見出しなどで使用する場合は、「本文のフォントサイズに対してだいたい1.2倍くらいの大きさ」というように、なんとなくの感覚値として指定しやすいかとおもいます。
なお、em
の値には0.9以下も指定可能です。この場合、フォントサイズは基準値よりも小さくなります。
この状態でstyle.css
を保存し、index.html
をブラウザで開くと、以下のように表示されます。キャプチャ画像はこれまでのブラウザ表示幅ではなく、コンテンツにフォーカスして撮影しています。
h1
見出しのフォントがGoogle Fontsで指定したフォントに変わり、設定した色なども反映されています。また、header
要素の下側余白も確認できます。
プロフィールアイコンにスタイルをあてる
つづいてプロフィールアイコンにスタイルをあてていきます。
CSSの記述は以下です。h1
のCSSに続いて記述します。
.prof_icon {
margin: 0 auto 20px;
width: fit-content;
border-radius: 50%;
overflow: hidden;
}
プロフィール画像を表示するためのfigure
要素を画像幅で中央配置します。margin
の一括指定で、下側に20pxの余白も追加しています。また、画像はCSSで角を丸めています。
widthプロパティの値fit-contentとは
先に解説したように、width
プロパティは要素の横幅を指定します。また、height
は要素の高さを指定します。このwidth
やheight
の値には、「数値+単位」のほかに、fit-content
という値を設定することができます。
fot-content
は、この値を指定した要素が内包するコンテンツ(子要素)から幅を自動的に算出します。この値は、要素の表示幅(ブラウザの画面サイズ)に合わせて可変します。
プロフィールアイコンの画像はHTML文書では以下のように指定しているので、画像サイズである80pxを算出し、width
の値に自動的に当てはめます。
<figure class="prof_icon"><img src="./images/icon.png" alt="プロフィールのアイコン" width="80" height="80"></figure>
CSSを記述していると、レスポンシブなどちゃんとした要素の値を指定することが難しいという場面もでてきますが、そういったときにwidth: fit-content;
という指定はとても便利です。
border-radiusプロパティ
border-radius
プロパティは、要素の角(正確には外角)を指定した数値分丸めます。正方形の要素の場合は、上記のように値を50%と指定することで正円にできます。
border-radius
プロパティは、値の指定方法により角丸にかなりデザイン的なバリエーションを持たせることが可能です。ここでは、標準的なもののみ紹介します。
/* 4方向すべて同じ値で丸める */
border-radius: 10px;
/* 正方形の要素を正円に丸める */
border-radius: 50%;
/* 左上10px、右上0、右下10px、左下5px */
border-radius: 10px 0 10px 5px;
/* 左上と右下10px、右上と左下10% */
border-radius: 10px 10%;
/* 左上5px、右上と左下4px、右下10px */
border-radius: 5px 4px 10px;
/* 最初の半径の値10% / 半径の値20px */
border-radius: 10% / 20px;
なお、border-radius
はこのプロパティを適用した要素の子要素には継承されません(影響を与えません)
本ハンズオンの例の場合、このままでは子要素であるimg
要素は角が四角のままです。これを解消するため、つぎに紹介するoverflow
プロパティを記述します。
overflowプロパティ
overflow
プロパティは、要素が内包するコンテンツ(子要素)が要素のパディング領域よりはみ出す場合に、その挙動を指定します。overflow
は横(水平)方向と縦(垂直)方向の一括指定プロパティで、それぞれはoverflow-x
overflow-y
という個別のプロパティでも指定可能です。
指定できる値はいずれも以下です。
visible
:はみ出したコンテンツはそのままはみ出た状態で表示する(初期値)hidden
:はみ出したコンテンツは隠す(パディング領域で切り取られる)scroll
:はみ出したコンテンツは隠す(パディング領域で切り取られる)が、スクロール表示によりはみ出した要素もスクロールで表示される(コンテンツがはみ出していなくてもスクロールバーは表示される)auto
:コンテンツがはみ出している場合は隠す(パディング領域で切り取られる)が、スクロール表示によりはみ出した要素もスクロールで表示される(コンテンツがはみ出していなければスクロールバーは表示しない)
他にclip
という値もありますが、すこしややこしいのでここでは説明を割愛します。
この状態でstyle.css
を保存し、index.html
をブラウザで開くと、以下のように表示されます。
プロフィールアイコンに角丸などのスタイルがあたっていることが確認できます。
なお、プロフィールアイコン下の説明文には、本ハンズオンではCSSはとくにあてていません。必要に応じて、ご自身でCSSを記述してください。
CSS変数(カスタムプロパティ)を利用する
header
要素のCSSとしては以上になりますが、この状態で少しCSSをカスタマイズします(この項目は必須の作業ということではないので、読み飛ばしても問題ありません)
これまでベース、header
要素とCSSを記述していて、何度か同じ色(カラーコード)を指定しました。つぎのmain
要素のCSSでも色指定を行いますが、指定のたびにカラーコードを探してコピペするのはすこし手間でめんどうです。
そこで、カラーコードを変数として定義して、プロパティの値として何度も利用できるようにします。カラーコードを変数にすると、色を変更するときは変数のカラーコード一箇所を変更するだけで済むので、メンテナンス性も向上します。
CSS変数(カスタムプロパティ)は、以下のように記述します。
:root {
--blackColor: #000; /* 変数: 値; */
}
.text_black {
color: var(--blackColor); /* color: #000; と同じ */
}
.bg_white {
background-color: var(--blackColor); /* background-color: #000; と同じ */
}
変数は擬似クラスの:root
(html
要素に該当)で指定します。
変数の接頭辞は、ハイフンをふたつ並べた--
ではじめます。続く文字は任意の半角英数とハイフンを組み合わせます。変数は値の代わりになるものなので、一見してわかりやすいものにするとよいです。
値はCSSの値として有効なものであれば、数値+単位などカラーコード以外でも指定可能です。また、変数と値の間には「コロン(:
)」を入れ、値の終わりは「セミコロン(;
)」を入れます。:root
に指定する変数は複数記述して問題ありません。
定義した変数の呼び出しは、var()
プロパティで行います。var(変数)
とすると、定義した値が代入されます。
ここでは、カラーコードを変数として定義します。変数の定義はCSSファイルのはじめのほう、リセットCSSのあとくらいに記述するとよいです。
/* ============================ */
/* base
/* ============================ */
:root {
--baseColor: #143d60;
--subColor: #eb5b00;
--whiteColor: #fefefe;
--bgColor: #fdfbee;
}
ここではベースの文字色、リンクなどの補助色、白色(main
要素のCSSで使用します)、背景色を変数として定義しました。
つづいて、#
からはじまるカラーコードの値を記述していた箇所を変数に置き換えます。
/*(略)*/
/* ============================ */
/* base
/* ============================ */
/*(略)*/
body {
color: var(--baseColor);
/*(略)*/
background-color: var(--bgColor);
}
/* ============================ */
/* link
/* ============================ */
/*(略)*/
a:link,
a:visited {
color: var(--baseColor);
/*(略)*/
text-decoration-color: var(--subColor);
}
a:hover,
a:active {
color: var(--subColor);
/*(略)*/
}
/* ============================ */
/* .wrapper
/* ============================ */
/*(略)*/
/* ============================ */
/* .header
/* ============================ */
/*(略)*/
h1 {
margin-bottom: 10px;
color: var(--subColor);
/*(略)*/
}
/*(略)*/
書き換えが完了したらstyle.css
を保存し、index.html
をブラウザで開いてレイアウトや色に変わりがないことを確認します。
CSS変数は指定しすぎると逆に管理が大変になりますが、繰り返し使用するカラーコードやレイアウトを統一するための余白や角丸など、使い方次第ではとても便利な機能です。
ここまでに記述したコード
ここまで記述したCSSファイルの中身です。
@charset "utf-8";
/* font@google */
@import url('https://fonts.googleapis.com/css2?family=Fascinate+Inline&display=swap');
/* ============================ */
/* reset
/* ============================ */
body, p, h1, h2, h3, ul, li, figure, small {
margin: 0;
padding: 0;
}
* {
box-sizing: border-box;
}
img {
vertical-align: middle;
max-width: 100%;
height: auto;
}
/* ============================ */
/* base
/* ============================ */
:root {
--baseColor: #143d60;
--subColor: #eb5b00;
--whiteColor: #fefefe;
--bgColor: #fdfbee;
}
html {
scroll-behavior: smooth;
}
body {
color: var(--baseColor);
font-size: 1rem;
font-family: 'Hiragino Kaku Gothic ProN', 'Hiragino Sans', Meiryo, sans-serif;
line-height: 1.8;
background-color: var(--bgColor);
}
/* ============================ */
/* link
/* ============================ */
a {
transition: all 0.3s;
}
a:link,
a:visited {
color: var(--baseColor);
text-decoration-line: underline;
text-decoration-color: var(--subColor);
/* text-decoration: underline var(--subColor); /* Safari以外は一括指定でも可 */
}
a:hover,
a:active {
color: var(--subColor);
text-decoration: none;
}
/* ============================ */
/* .wrapper
/* ============================ */
.wrapper {
margin: 40px auto;
width: 90%;
max-width: 550px;
/* width: min(90%, 550px); /* ←まとめてこのように書くこともできます */
}
/* ============================ */
/* .header
/* ============================ */
.header {
margin-bottom: 40px;
}
h1 {
margin-bottom: 10px;
color: var(--subColor);
font-size: 2.5em;
font-weight: 400;
font-style: normal;
font-family: 'Fascinate Inline', system-ui;
text-align: center;
}
.prof_icon {
margin: 0 auto 20px;
width: fit-content;
border-radius: 50%;
overflow: hidden;
}
CSSを書くことにより、だいぶ「レイアウトをつくっている」という感じが出てきたのではないでしょうか。
次はmain
要素にCSSをあてていきます。
参考情報など
このチャプターで解説したCSSのプロパティや値などについて、詳細を知りたい場合は、以下MDN (MDN Web Docs)のドキュメントなどもご覧ください。
- @import - CSS: カスケーディングスタイルシート | MDN
- font-weight - CSS: カスケーディングスタイルシート | MDN
- font-style - CSS: カスケーディングスタイルシート | MDN
- text-align - CSS: カスケーディングスタイルシート | MDN
- fit-content - CSS: カスケーディングスタイルシート | MDN
- border-radius - CSS: カスケーディングスタイルシート | MDN
- overflow - CSS: カスケーディングスタイルシート | MDN
- CSS カスタムプロパティ(変数)の使用 - CSS: カスケーディングスタイルシート | MDN
- var() - CSS: カスケーディングスタイルシート | MDN