
2025.03.27
「過去1年でインシデントが増加」と回答した人は約8割 大規模化かつ高速化するDDoS攻撃から企業を守る、最新セキュリティ
CSS Gridのススメ(全1記事)
リンクをコピー
記事をブックマーク
鹿野壮 氏(以下、鹿野):では始めていきます。私は先ほど登壇したICSの池田と一緒に働いている鹿野です。九州大学を卒業していて、TwitterのIDは@tonkotsuboy_comでやっています。愛猫がめちゃくちゃかわいいです。よろしくお願いいたします。
本日のテーマは「古きを捨てて新しきを得るためのCSS」で、GitHubに本日使うサンプルファイルをプッシュしているので、気になる方は後ほどダウンロードして見てください。
ではさっそく本題です。CSSは便利な機能が次々と追加されています。なので今まで当たり前だと自分たちが思っていた手法を見直すことで、より便利にWeb開発をすることが可能になりました。
今回はCSS Gridのおすすめという話と、ボタンブラウザで使えるようになった便利な機能の2つのお話をしていきます。
まずはCSS Gridのおすすめから。さっそく、今プッシュしているサンプルファイルは1.0、1.1、1.2といった構成になっています。その中の1.0のGridというサンプルファイルを見てみると、ものすごくかわいい猫ちゃんが出てきました。
こういったレイアウトを私たちが作りたいと思った場合。ちょっとだけ古いやり方としては、フレックスボックスを使ってやっていました。どういうコードを書くかというと、今この右上がHTMLコードになっていて、その下がそれを実現するCSSコードです。
そこにdisplay: flexを指定して、その下にvisualの、このかわいい猫の写真に対してwidth:50パーセントと書きました。右側の要素は2つまとめて右側に寄せたいのでlogoとparagraph「今日のうにちゃん」と書いているテキストの要素をまとめてrightというクラスで囲んでいます。
こうすることで、メインの下の要素はvisualとrightになったので、左右に寄せられたようなレイアウトになりました。rightの中もさらにdisplay: flexを使っておりまして、flex-directionをcolumnとすることで縦方向にフレックスボックスのレイアウトを適用することが可能です。
通常モードはflex-directionはrowなので横方向に並ぶんですが、flex-directionをcolumnとすることで縦に並びます。その中のlogoとparagraphの高さをそれぞれ80パーセントと20パーセントとすれば、ボックスでレイアウトできます。
できるんですが、フレックスボックス使用時、rightは文章的に意味のある要素ではありません。レイアウトを実現したいがための、言ってしまえば無駄な要素です。これをCSS Gridを使うと、こういったものを使わずにこのレイアウトとまったく同じものが実現できるようになります。
ではやってみましょう。まずはこの無駄だと言った
ここからがCSS Gridのポイントです。CSS Gridでは、この全体の要素をどういう行と列に分けるかを考えながらレイアウトをしていきます。今回は左側に大きな画像、右側にロゴと右下にテキストがあるレイアウトです。これをよく見ると2行2列のレイアウトとみなすことができるんですね。これをCSS Gridで実現していきます。
どうやって実現するのかというと、grid-templateプロパティを使って、どういう行列に分離するかを定義していくわけです。今は行列の名前だけを定義しました。行列を2行2列に分割して左上の領域から名前を付けていったんです。
左上はvisual右上はlogoという名前で、左下、右下と名前を付けていきます。ここが1行目を表しているので、ここに80パーセントの行の高さを示すわけです。2行目も同様に2行目の高さを示します。ここをスラッシュで分離して、あとは同じように列の幅を1列目が50パーセント、2列目も50パーセントと設定すれば、目的のレイアウトが実現できて……いませんね。失礼しました。
今はまだ、親のコンテナ要素に対して行列を設定しただけです。あとは子どもの要素をどのようにレイアウトしていくのかを設定していきます。今回は、visualとlogoとparagraphの3要素をそれぞれレイアウトしたいので、visualとlogoとparagraphにgrid-areaプロパティというものを設定します。
grid-areaプロパティにそれぞれ配置したい領域を指定することで……すみません、まだ無駄なレイアウトが残っていましたね。配置したいレイアウトを指定することで、このようにCSS Gridでできるようになります。これがCSS Gridのものすごく基本的なところです。フレックスボックスと違って、わざわざレイアウトのためにHTMLコードを分離する必要がないメリットがあります。
続いては1.2についてです。こういうボックスのレイアウトをやっていきたいと思います。これは親の要素に対してボックスが可変しながら、ボックス間の隙間が固定で20ピクセル空いてるようなものです。これはフレックスボックスで実現しようとすると、けっこう面倒くさいです。 上側にあるのがHTMLコード、下側にあるのがそれを実現しているフレックスボックスのコードになります。ネガティブマージンを使ったりしながら面倒くさいレイアウトをしないといけません。 これもCSS Gridを使えばすぐにできます。ここまでdisplay: flexを使っていたところをdisplay: gridでCSS Gridに変更。先ほどのgrid-templateプロパティというものを使ってセル名とかをcell cell cellと書いてもいいんですが、面倒くさいのです。そこで、このように同じ列が続く場合はrepeat値というものを使うことができます。 repeat値を使って2つの行を作ってください。高さは100ピクセルにしましょうか。下の部分に4列続けてください。4列の列の大きさは1fr、これはフレックスボックスでも出てきたfrという単位ですね。とある領域を同じ分だけ分割してくださいという意味で、こういうふうにすれば実現ができます。子どもの要素はそれぞれ100パーセントにしておきましょうか。 すみません、キャッシュが効いていて動かないんですけど、これで先ほどの2行4列のレイアウトができました。先ほどの隙間を空けたいのはgapプロパティを使うんですね。このgapプロパティで20ピクセルと設定をすれば、これだけでボックス間の隙間をレイアウトすることができます。 ちなみにこのgapプロパティは本当に便利で、フレックスボックスを使わずにCSS Gridを使うときにかなり大きな強みとなるプロパティです。ちなみにこのgapプロパティはフレックスボックスに逆輸入されようとしていて、Firefoxの最新バージョンやGoogle Chromeの今開発バージョンで、フレックスボックスのgapも使えるようになったりしています。(※Chrome 84から正式に対応しました) gapはCSS Gridの便利な機能です。 続いては、CSS Gridの最後ですね。CSS Gridをけっこう覚えてきたので、こういうレイアウトを作りたいなと思ったときがあるとします。このようにテキストと画像が1セットになっていて、それが横並びになっているようなレイアウトです。 これをCSS Gridで実現しようとするときに、我々はCSS Gridを少し学んでいくと、こういうコードを書かないといけないことがわかります。containerの直下にテキスト・画像、テキスト・画像、テキスト・画像といったものです。なんでかというと、CSS Gridの影響範囲はこのcontainerクラスの直下の要素だけなんですね。 本当は文章の意味付けをするために何かしらこのテキストと画像は何かboxとかで囲みたいわけじゃないですか。でもそれができなかったんです。それが最近出てきたCSS Gridと組み合わせて、ものすごく強力なdisplay: contentsを使うと実現できるようになります。 また上にHTMLコード、下にCSSクラスがあります。今は、display: gridを使って2行3列のレイアウトをしてくださいと言っていますが、このboxクラスで囲まれているから思い通りのレイアウトにはなりません。こういうときはこの各boxクラスを見た目上無視してあげて大丈夫です。 見た目上無視するときに使うのが、子どもの要素に設定するdisplay: contentsで、これを設定すると元通りになりました。これは、display: contentsが設定された要素がHTMLコードとしてはありますが、見た目上は消えてくださいねと指定をすることができます。 これをやることでCSS Gridを使いつつ、かつセマンティックなコーディング、タグ付けをすることができるのがdisplay: contentsのメリットです。これもIE 11を除く全モダンブラウザで使うことができるようになっています。 ここからは後半の話です。モダンブラウザはIE 11を除く全ブラウザで使えるようになったので、その機能について紹介していきます。我々はこういったフォーム作成について考えてみましょう。よくあるレガシーなフォームですね。 ラベルの中に<input>タグがあるレイアウトです。私たちがやりたいのは、このテキストフォームにフォーカスをあてたときに<label>タグを丸ごと……例えば名前と住所の2つともを囲んでスタイリングをしたいケースを考えてみます。従来のCSSで考えてみたときに、この<input>タグに対してフォーカス疑似要素を付けて、上にHTMLコードと下にCSSスタイルがあります。 <input>に対して、このフォーカスを付けてできるかなと思ってやってみると、今は<input>にしかスタイルが当たってくれません。なぜなら今は<input>にしか当ててないからです。じゃあここをlabel:focusとかにして見ても、これも当たりません。 じゃあ自分の子ども要素の<input>にフォーカスが当たったときに、このラベル含めて丸ごとスタイルを当てたいときは、今まではJavaScriptを使う方法しかありませんでした。JavaScriptを使うとJavaScriptでこのラベルにjs-focusというクラスが当たって初めて色が付くようにするCSSの定義をしていきます。 JavaScriptはどう書くかというと<input>タグを全部キャッチにする。その中の<input>タグにフォーカスがあたったら<input>タグの親要素、今回でいえば<label>タグですね。親要素に対してjs-focusというクラスを設定してくださいみたいなことをやると、初めて目的のコードが実現できます。これはけっこう面倒くさいですよね。 これが今ではJavaScriptを全部消してfucos-withinを使うと、JavaScriptを書いていませんが目的のレイアウトが実現できるようになっています。これは<label>の自分自身の要素、または自分自身の子孫要素、この場合は<input>タグですね。 自分自身が自分自身の子孫要素にフォーカスが当たったときにスタイルを変更してくださいという命令ができます。これもChromium版のEdgeを含むすべてのモダンブラウザで使える非常に便利な機能です。こういったものをJavaScriptを使わずに実現可能になりました。 次に、我々がこういうレイアウトを作りたいと思った場合です。ヒヨコの画像はウインドウサイズを小さくしたときは、画面サイズに応じて小さくなります。今はウインドウサイズを700ピクセルと指定していますが、700ピクセル以上は大きくならないような要素を考えてみましょう。 こういった作業を今まではどうしていたかというと、レスポンシブなレイアウトを作るときは一定以上は大きくならないでくださいねみたいなレイアウトをよくやっていました。 <img>タグに対して幅100パーセントにする。でも横幅の最大は700ピクセルにしてください。こういった命令が必要だったわけです。これが最近でたmin関数を使うと、こう書くことができます。min(700px, 100パーセント)と指定すると、目的のレイアウトが実現できました。 これは、700ピクセルと100パーセントのうちどちらか小さいほうを採用してくださいねという関数です。画面サイズを小さくしたときに、今<img>タグは700ピクセルと100パーセントだと、画面サイズが700ピクセルより小さいので100パーセントのほうが小さい値になります。なので今は100パーセントのレイアウトです。 逆に画面サイズを700ピクセルより大きくすると、今度は700ピクセルが小さい値になるので、700ピクセルが採用される。これがmin関数です。ちなみにこれはmax関数やclamp関数といって、2つを合わせたような使い方もできます。つい先日のFirefoxのバージョンアップによって対応したので、今は全モダンブラウザで使える状態です。できたてほやほやの新しい関数と言えるでしょう。 ちなみにこれを応用していくと、こういった絶対に10文字しか入らないようなテキストの表現とかもできます。この画面サイズを小さくすると、それに応じてフォントサイズが画面サイズ100vw(viewport width)を分割するようにもできます。これがmin関数です。 このように最近のCSSの機能はどんどん増えています。今まで使っていたCSSコードの見直しや新しい機能を取り入れることで、開発スピードをどんどん上昇させることができて作業が楽にすることができます。 積極的に新しい機能を取り入れて作業時間を減らしていく。それによって、コンテンツのブラッシュアップに時間をかけて、早く仕事を終わらせて家に帰るようにしましょう。 ご清聴ありがとうございました。ICS MEDIAやTwitterでも情報を発信しているので、ぜひこちらもご覧いただければと思います。以上です。
CSS Gridを使ったボックスレイアウト
CSS Gridを使った画像レイアウト
CSS Gridを使ったフォーム作成
CSS Gridを使った画像サイズの指定
CSSには便利な機能が増えていく
関連タグ:
2025.03.21
マネージャーの「自分でやったほうが早い」という行動で失うもの 効率・スピード重視の職場に足りていない考え方
2025.03.25
減点を恐れてモチベ低下、果ては離職も… あらゆる“会社の害虫”を大繁殖させる「ラスボス」の正体
2025.03.24
最悪の場合、組織を死に至らせる“会社の害虫”とは 誤った意思決定や品質不祥事を招く要因
2025.03.19
組織をダメにする“害虫”の正体は間違った思い込み AIやDXなど手段のみにこだわるダメ上司の見極め方
2025.03.25
ムダな仕事がなくならない“マッチョな職場”を変えるには 近年の過度な「KPI主義」が組織に与えた影響
2025.03.24
気づけばモラル崩壊……人材育成に無頓着な企業の末路 業績アップや採用にもつながる“人への投資”の重要性
2025.01.07
1月から始めたい「日記」を書く習慣 ビジネスパーソンにおすすめな3つの理由
2025.03.24
AIの進化が行き着く先は「イノベーター」へ ChatGPT開発者サム・アルトマン氏 × 孫正義氏が語る、人工知能変革期の未来
2025.03.21
査定時期に上司から1年前の失敗を指摘される理不尽 変えられない過去を議論する「成果主義」の弊害
2025.03.19
フェデラー氏が語る「ただの1ポイント」の哲学 ウィンブルドン敗北から学んだ失敗からの立ち直り方
2025.03.21
マネージャーの「自分でやったほうが早い」という行動で失うもの 効率・スピード重視の職場に足りていない考え方
2025.03.25
減点を恐れてモチベ低下、果ては離職も… あらゆる“会社の害虫”を大繁殖させる「ラスボス」の正体
2025.03.24
最悪の場合、組織を死に至らせる“会社の害虫”とは 誤った意思決定や品質不祥事を招く要因
2025.03.19
組織をダメにする“害虫”の正体は間違った思い込み AIやDXなど手段のみにこだわるダメ上司の見極め方
2025.03.25
ムダな仕事がなくならない“マッチョな職場”を変えるには 近年の過度な「KPI主義」が組織に与えた影響
2025.03.24
気づけばモラル崩壊……人材育成に無頓着な企業の末路 業績アップや採用にもつながる“人への投資”の重要性
2025.01.07
1月から始めたい「日記」を書く習慣 ビジネスパーソンにおすすめな3つの理由
2025.03.24
AIの進化が行き着く先は「イノベーター」へ ChatGPT開発者サム・アルトマン氏 × 孫正義氏が語る、人工知能変革期の未来
2025.03.21
査定時期に上司から1年前の失敗を指摘される理不尽 変えられない過去を議論する「成果主義」の弊害
2025.03.19
フェデラー氏が語る「ただの1ポイント」の哲学 ウィンブルドン敗北から学んだ失敗からの立ち直り方
【仕事に直結】頭がいいとは?|知見の幅と高さで決まる。【東大卒 ベンチャー企業社長が語る】
2025.01.18 - 2025.01.18
退職をチャンスに捉える企業文化のつくり方
2025.03.10 - 2025.03.10
青木耕平さんとザッソウ(#156〜158)
2025.02.05 - 2025.03.19
片付けパパ対談【特別編】豊かな人生を過ごすための「投資」&「交渉術」 ~チャンスを逃さず信頼関係も育むコツ~
2025.02.10 - 2025.02.10
グローバルの経営理論に学ぶ、企業アルムナイ成功への示唆〜中央大学ビジネススクール 犬飼知徳教授
2025.02.18 - 2025.02.18