プログラミング学習#15|Udemy:HTML/CSS|FlexboxとGridの使い分け📝
こんにちは!
今日は、昨日行ったプログラミング学習の振り返りをお届けしたいと思います。HTMLとCSSの基本的な内容から、ちょっとつまずきやすいレイアウトのテクニックまで、今回もLLM先生とたくさん対話しながら学びを深めてみました。特に「これってどうしてこうなるの?」という疑問が解消されていく過程は、やっぱり面白いですね!
本日の一言
Udemy HTML/CSSの学習が完了し、いよいよ次はprogate Next.jsの勉強へ進みます!
学習が一段落すると「あ、こういうことだったのか!」と理解が深まることが多いので、このタイミングで学習ロードマップを見直して、思い切って大幅に変更することにしました。
このあたり、まだまだ技術的な理解が追いついていないので、何度も見直しが発生してしまうのはご愛嬌ということで…(笑)。
実は、Geminiと昨日の夕方からロードマップの見直しについて相談しすぎて、Google AI Studioのtoken limitationに引っかかってしまったのは内緒です(笑)。
なにはともあれ、新しい挑戦、頑張ります!
昨日の学習振り返り
昨日は、これまでUdemyで学んできたHTMLとCSSの知識を整理しつつ、LLM先生に疑問点をぶつけてみる、というスタイルで学習を進めました。自分一人で悩んでいると時間がかかってしまうことも、対話形式だとスッキリ解決することが多くて助かりますね!
HTML/CSSメモ
実は最初に、UdemyのHTML/CSS実践コースで取っていたメモをLLM先生に渡して、「これをベースにもっと分かりやすく、学びが深まるようにまとめてほしい!」とお願いしてみたんです。LLM先生はまず内容を理解し、カテゴリ分けするところからスタート。そして、それぞれの項目について、より正確な情報や補足説明、時には「これはちょっと誤解があるかも?」という鋭い指摘も交えながら、会話していました。
🤖 LLMの思考プロセス:
ゴール: 初心者がWebデザイナー/エンジニアを目指すためのHTML/CSS学習メモを整理・明確化する。
現状分析: メモは「index(HTML系)」「CSS」「その他」に大まかに分類されている。
改善方針:
HTMLの各タグ(`nav`, `section`など)の役割をより正確に。
CSSのプロパティ(`grid-template-rows`, `display: block`, `gap`など)の挙動を具体的に。
クラス名の付け方や、`width`プロパティと`display`プロパティの関係など、初心者が混乱しやすいポイントを丁寧に解説。
この思考プロセス自体が、初心者が内容を整理する上でとても参考になりますよね。例えば、`nav`タグは単なる「見出し用」ではなく「ナビゲーションリンクのグループ化」であること、クラス名が数字で始まってもHTML5ではOKだけどCSSセレクタで注意が必要なことなど、細かいけれど重要なポイントを再確認できました。
💡 学びのポイント:
学習メモも、LLMに見てもらうことで新たな発見や誤解の修正につながりますね!特に、自分では「これで合ってるはず」と思い込んでいる部分を客観的に指摘してもらえるのは大きいです。
`<span>`タグって、結局いつ使うの?
学習メモの改善とは別に、具体的な疑問もぶつけてみました。まずは、よく使うけど「これで合ってるのかな?」と時々不安になる`span`タグについて。
👤 User: spanってどの時に使うものだっけ?
🤖 LLMの回答(要約):
`span`タグは、主にこんな時に使われますよ!
テキストの一部分にCSSでスタイルを適用したい時:
例:文章中の一部の単語だけ色を変えたい、太字にしたい。
テキストの一部分をJavaScriptで操作したい時:
例:特定の単語をクリックしたら何かアクションを起こしたい。
アイコンフォントや小さな画像をテキスト内に挿入する時:
Font Awesomeのようなアイコンフォントで、`<i>`タグの代わりに`<span>`が使われることも。
`span`タグ自体には特別な意味はなく(ノンセマンティックなタグと呼ばれます)、`div`タグと似ていますが、`span`はインライン要素、`div`はブロックレベル要素という大きな違いがあります。ざっくり言うと、`span`は文章の途中にそのまま入れられるけど、`div`は改行されてひとつの塊になるイメージですね。
💡 学びのポイント:
`span`は「行の中のちょっとした一部分」に対して何かをしたい時に便利なタグ、と覚えておくと良さそうです。ただし、`<em>`(強調)や`<strong>`(重要性)のような、意味を持つ適切なHTMLタグがある場合は、そちらを優先するのがセオリーですね!
フォームの`<label>`タグ、なぜ必要? `p`タグじゃダメ?
次に質問したのは、HTMLのフォーム要素について。フォームの入力項目を`p`タグで囲んで、それにクラスを付けてスタイルを当てることはよくありますが、なぜわざわざ`<label>`タグも使うのか、という点です。
👤 User: formの中になぜpタグのclass以外に、labelタグをつけるか?
これ、私も昔「見た目が整えばいいのでは?」なんて思っていた時期がありました(笑)。
🤖 LLMの回答(要約):
`p`タグと`<label>`タグは、役割が全然違うんですよ!
`p`タグの役割:
「段落」を表すブロックレベル要素です。
フォーム内で入力項目とその説明を視覚的にグループ化するためによく使われます。
`class`属性は、CSSでスタイルを適用したり、JavaScriptで操作したりするために使います。
`<label>`タグの役割とメリット:
アクセシビリティ向上: スクリーンリーダー(視覚障碍者がウェブページの内容を音声で聞くための支援技術)が、入力コントロール(`<input>`など)と`<label>`を結びつけて読み上げてくれます。「〇〇の入力欄」というように、何を入力すべきか明確に伝わるんですね。
ユーザビリティ向上: `<label>`のテキスト部分をクリック(またはタップ)すると、関連付けられた入力コントロールに自動的にフォーカスが移動します。これは、クリック範囲が小さいラジオボタンやチェックボックスで特に便利です!ユーザーはラベル全体をクリックできるので、操作性が格段に向上するんです。
明確な意味付け: `<label for="inputId">テキスト</label>` と `<input type="text" id="inputId">` のように、`label`の`for`属性と入力コントロールの`id`属性を一致させることで、両者が明確に関連付けられていることをコード上でも示せます。
つまり、`p`タグ(と`class`)は主に見た目や大まかな構造のため、`<label>`タグは入力項目とその説明を意味的・機能的に関連付け、誰にとっても使いやすいフォームにするためにあるんですね。これは大きな違いです!
💡 学びのポイント:
`<label>`タグは、まさに縁の下の力持ち!目立たないけれど、ウェブサイトの使いやすさ(ユーザビリティ)と、より多くの人が情報にアクセスしやすくすること(アクセシビリティ)に大きく貢献しているんですね。
`margin: 0 0 0 auto;`で右寄せになるのはなぜ?`auto`の魔法
CSSでよく使う`margin`プロパティ。特に`margin: auto;`は中央揃えの常套手段ですが、「なぜそうなるの?」を改めてLLM先生に聞いてみました。今回は右寄せのケースです。
👤 User: `margin: 0 0 0 auto;`でなぜ右端にいくのか?というかautoって何がautoなのか?
🤖 LLMの回答(要約):
これはCSSのレイアウトにおける重要な概念ですね!
`margin`プロパティのショートハンド:
`margin`プロパティに値を4つ指定すると、`margin: top right bottom left;` の順で解釈されます。
なので、`margin: 0 0 0 auto;` は `margin-top: 0; margin-right: 0; margin-bottom: 0; margin-left: auto;` と同じ意味になります。
`auto`の意味(水平マージンの場合):
ブロックレベル要素(`div`, `p`, `h1`など、または`display: block;`が指定された要素)に対して、水平方向の`margin-left`または`margin-right`(あるいは両方)に`auto`を指定すると、ブラウザはその要素の利用可能な水平方向の余白を自動的に計算して割り当てます。
ちなみに、`margin-left: auto;` かつ `margin-right: auto;` で、要素に`width`が指定されていれば、利用可能な水平スペースが左右のマージンに均等に分配され、要素は中央揃えになります。これが `margin: 0 auto;` でおなじみの中央揃えの仕組みですね!
💡 学びのポイント:
`margin`の`auto`は、まるで魔法のように残りスペースを「よしなに」分配してくれる便利なやつ!特にブロックレベル要素の水平方向の配置では必須の知識ですね。
ここでさらに、ユーザーから追加の質問が。
👤 User: `margin 0 auto;`だと左右だけどそれと同じ話か。理解した。
あともう一つ質問。
なぜformのときはpタグで囲むの?divじゃだめなわけ?
🤖 LLMの回答(要約):
はい、`margin: 0 auto;` で中央揃えになるのは、今説明した`auto`の働きによるものです!
そして、formの要素を`p`タグで囲むか`div`タグで囲むかについてですね。結論から言うと、`div`タグで囲んでも全く問題ありませんし、多くのケースで`div`が使われます。
`p`タグを使う理由(またはそうすることがある理由):
視覚的なグルーピングとデフォルトスタイル: `p`タグは上下にマージンがデフォルトで設定されていることが多く、手軽に項目間を区切れます。
構造の単純化(小規模なフォームの場合): 各項目を「1つの入力項目とその説明」=「1つの段落」と捉える考え方です。
`div`タグを使う場合(そして多くの場合、こちらが推奨される理由):
意味的な中立性: `div`は特定の意味を持たない汎用的なコンテナなので、各入力項目を「段落」と見なすのが不自然な場合に適しています。
スタイリングの柔軟性: `p`のデフォルトマージンが邪魔になる場合など、`div`ならCSSで完全にスタイルをコントロールできます。`display: flex;` や `display: grid;` を使って複雑なレイアウトを組むのも容易です。
構造の明確化(複雑なフォームの場合): `div`に適切な`class`名を付けて構造化する方が、コードの可読性や保守性が高まります。
どちらを使うかはケースバイケースですが、現代のウェブ制作では`div`で囲む方がより一般的で柔軟な方法と言えるでしょう。ただし、先ほど説明した**`<label>`タグの適切な使用は、どちらで囲むにしても非常に重要**です!
💡 学びのポイント:
`p`も`div`も、フォームの項目を囲むのに絶対的な正解はありません!手軽さなら`p`、柔軟性や複雑な構造なら`div`、といった使い分けですね。そして、どんな時もユーザーのための`<label>`を忘れずに!
FlexboxとGrid、どっち使えばいいの?永遠のテーマ(?)に終止符!
CSSレイアウトの二大巨頭、FlexboxとGrid。便利だけど、どっちをいつ使えばいいのか分からなくなること、ありますよね…。
👤 User: display: flexを使うタイミングがだんだんgrid使ってたらわからなくなってきたんだけど、わかりやすく教えてもらえる?
🤖 LLMの回答(要約):
すごくシンプルに言うと、得意な方向性が違います!
Flexbox (`display: flex`): 一次元(1方向)のレイアウトが得意
要素を「行」方向(横並び)または「列」方向(縦並び)のどちらか一方向に沿って並べるのが得意です。
並べた要素間のスペース配分(均等割り、端寄せなど)や、揃え位置(中央揃え、上/下揃えなど)を柔軟にコントロールできます。
コンテンツの量に応じてサイズが伸び縮みするような、柔軟なレイアウトに向いています。
Grid Layout (`display: grid`): 二次元(2方向)のレイアウトが得意
要素を「行」と「列」で構成される格子状(グリッド)に配置するのが得意です。
縦横両方の位置やサイズを厳密に決めて、要素を配置することができます。
ページ全体の大きな骨組みや、タイル状のレイアウトなど、あらかじめ決められた枠組みに要素をはめ込むようなレイアウトに向いています。
使い分けのイメージと具体例:
Flexbox を使うと便利な場面:
ナビゲーションメニュー: メニュー項目を横一列に並べたり、ロゴを左端、メニューを右端に寄せたり。
ボタンの横並び: フォームの送信ボタンとキャンセルボタンを横に並べて右寄せにしたり。
カード型UIの内部: カードのヘッダー、コンテンツ、フッターを縦一列に並べたり。
ちょっとした中央揃え: `justify-content: center; align-items: center;` で簡単に縦横中央揃え。
アイテム数が可変の場合: タグリストなどを折り返しつついい感じに並べたい (`flex-wrap: wrap;`)。
Grid を使うと便利な場面:
ページ全体のレイアウト: ヘッダー、サイドバー、メインコンテンツ、フッターといったページの主要な区画を配置。
タイル状・グリッド状のデザイン: 写真ギャラリーや商品リストなど、要素をきれいに格子状に並べたい。
フォームのラベルと入力欄の整列: ラベルと入力欄を縦横きれいに揃えたい。
要素の重ね合わせ: グリッドエリアを使って、要素を部分的に重ねて表示したい。
判断のヒント:
「一列(または一行)に並べて、その中での配置や間隔を調整したい」 → まずは Flexbox を考える。
「行と列で構成される格子状のレイアウトを作りたい」「ページの大きな骨組みを作りたい」 → まずは Grid を考える。
そして、重要なのは、どちらか一方しか使ってはいけない、ということは全くないということです!実際には、FlexboxとGridを組み合わせて使うことが非常に多いです。例えば、ページ全体の大きなレイアウトはGridで作り、その中のナビゲーションメニューやカードの内部レイアウトはFlexboxで作る、といった感じです。
💡 学びのポイント:
Flexboxは「一列お任せ!」、Gridは「きっちり区画整理!」とイメージすると分かりやすいかもしれません。そして、迷ったら両方使っちゃえ!の精神も大事ですね!
この説明の後、ユーザーからも納得の声が!
👤 User: メニューのタグ要素を使うときに確かに使ってたわ!ありがとう!
そうなんです!ナビゲーションメニューはFlexboxの得意技の代表例。具体的な使用場面と結びつくと、一気に理解が深まりますよね。
`<img>`タグを中央揃えにする方法、いろいろあるのね!
続いては、`img`タグの扱いや中央揃えに関する復習です。
👤 User:
▼復習
■リンク
相対パス:上の階層: ..
imgタグはinline要素になっているため、display:blockなど指定しないといけない。
■縦方向の中央揃え
└1つめ
display: grid;
place-items: center;
└2つめ
display: flex;
justify-content: center;
align-items: center;
└3つめ
・親要素
position: relative;
・子要素
position: absolute;
top: 0; bottom: 0; left: 0; right: 0;
margin: auto;
└4つめ
・親要素
position: absolute; (※これは relative の間違いか、あるいは特定のケースですね)
・子要素
position: absolute;
top: 50%; left: 50%;
transform: translate(-50%, -50%);
🤖 LLMの回答(要約)と補足:
復習内容、素晴らしいですね!いくつか補足します。
`img`タグについて:
`img`タグはインラインレベル要素です(厳密には「置換インライン要素」と呼ばれ、`width`や`height`を持つことができる特殊なインライン要素です)。
`display: block;` に必ずしも「しないといけない」わけではありません。
`display: block;` を指定するのは、例えば以下のような目的がある場合です。
画像をブロック要素として扱い、前後に改行を入れたい。
`width: 100%;` を効かせて親要素の幅いっぱいに広げたい。
`margin: 0 auto;` で水平方向の中央揃えをしたい。
テキストの途中に小さなアイコン画像を挿入するなど、インライン要素として扱いたい場合は`display: block;`を指定する必要はありません。状況に応じて使い分けましょう!
縦方向の中央揃え:
1. Grid (`place-items: center;`): 親要素に高さを指定しなくても、アイテムが1つの場合はそのアイテムの高さに基づいて中央揃えになります。
2. Flexbox (`align-items: center;`): 親要素に`height`が指定されている(または内容によって高さが決まっている)必要があります。
3. `position: absolute;` + `margin: auto;`: この方法で意図通りに中央揃えするには、子要素に明示的な`width`と`height`が指定されている必要があります。
4. `position: absolute;` + `transform: translate(-50%, -50%);`: 子要素のサイズが固定でなくても使える非常に柔軟な方法です。親要素は`position: relative;` (または`absolute`, `fixed`, `sticky`) になっている必要がありますね。
💡 学びのポイント:
`img`タグを中央揃えにする方法は一つじゃない!それぞれの方法に特徴と前提条件があるので、状況に応じて最適なものを選べるようになると強いですね。
相対パスとビューポート単位、基本だけど奥が深い!
最後に、相対パスとビューポート単位の復習です。
👤 User:
■ブラウザの高さに対して考える際のデザイン
viewport:ブラウザの表示領域
vw: viewport width
vh: viewport height
└100分の1で表現
🤖 LLMの回答(要約)と補足:
相対パス `../`: 正確には「1つ上の階層」を指します。例えば、`../images/pic.jpg`は、現在のファイルがある場所から1つ上の階層にある`images`フォルダの中の`pic.jpg`を指します。
ビューポート単位:
`1vw` は、ビューポートの幅の1% を意味します。
`1vh` は、ビューポートの高さの1% を意味します。
例えば、`height: 100vh;` と指定すると、要素の高さは常にブラウザの表示領域の高さ全体になります。`width: 50vw;`なら、ブラウザの表示領域の幅の半分になります。
基本的なことですが、正確に理解しておくことは大切ですね!
💡 学びのポイント:
相対パスの`../`は「一個上の階層ね!」、`1vw`は「画面幅の1%ね!」と、具体的なイメージで覚えておくと間違いにくいですね!
応援よろしくお願いします。 📣
CSSのレイアウト関連は、一度理解したつもりでも、いざ使おうとすると「あれ?どっちだっけ?」となりがちなので、繰り返し復習して、実際に手を動かして身につけていくのが大事だなと改めて感じました。一歩ずつですが、着実に前に進んでいきたいです!
ここまで読んでいただき、ありがとうございます!
この挑戦を「面白い!」「応援したい!」と思っていただけたら、記事への「スキ」や学習費用の支援として「チップ」をいただけると励みになります🙏
ぜひコメントでアドバイスをいただいたり、同じような挑戦をされている方と情報交換できたら嬉しいです!
日々の進捗や気づきはX(Twitter)でも発信しています。気軽にフォローして交流してください! Xアカウント: @UcHHW8ffyQHk0yN
いいなと思ったら応援しよう!
挑戦へのご支援、大変嬉しいです!開発資金にさせていただきます!
今後ともよろしくお願いします!