この記事はCSS アドベントカレンダー 2019の19日目の記事です。
フリーランスでデザインやイラストをしている becolomochi と申します。
HTML/CSS で書籍の図を作ったので、図版担当の視点で作成時のテクニック的なものを書きます。
どちらかというと技術系同人誌向けの内容になります。
何の本か & なぜやるのか
プログラミング初学者向けの書籍 『Railsの教科書』(著者:五十嵐邦明さん 発行:達人出版会さん)を Rails のバージョンアップで改版するため、このタイミングで図を HTML/CSS で書き換えたいとのことでした。
以下のリンクで今改版中の内容を見ることができます。
メリット
図を HTML/CSS で書くメリットとしては、
- 図のパーツをコードで管理できるので管理が楽(な気がしました。)
- コードなので差分を GitHub で確認しやすい
- ベースをデザイナーが作る必要はあるが、HTML さえ分かれば分担できる
- 今後の改版で図を直す必要が出てきても著者さん側で直接修正できる
『Railsの教科書』では HTML/CSS で作成した図がだいたい40個くらいあったようです。
※数え間違いしていなければ……
デザイナーの私がベースとなる20個程度を作成し、残りの半分の図をコピペと調整で著者さんが作成しています。
デメリット
デメリットを挙げるとすると、
- 複雑な図は作れない(なので、Illustrator で作った画像もあります)
- できあがった図はカラーモードが RGB なので紙版をフルカラーで印刷する場合は色味が変わってしまう
が挙げられるかなと思います。
HTML を画像化にするには
- HTML/CSS で図をつくる<- この記事ではここについて書きます。
- puppeteerでスクショを保存(すばらしき自動化〜〜)
- 図が中央に来るようにトリミング(これからの作業になります※12/19現在)
HTML/CSS で図をつくる
puppeteerが Chronium ベースということで、Chrome で表示さえきちんとできていれば問題ない!
クロスブラウザとか気にしなくて済む!
普段のコーディング作業から比べると安心して進められたと感じていますw
サンプル
私が作った部分のコミットコメントがダサダサでお恥ずかしいのですが、
GitHub のこのディレクトリ以下に図が入っています。
rails_textbook/_figures/assets at master · igaiga/rails_textbook
- 図のサンプル一覧を作りました。figure-sample.html clone なりしていただけると見れます。
- CSS は SCSS で gulp でコンパイルしています(相談して一番慣れているやり方にさせてもらいました)
デザイナーとして個人的に気をつけたこと
- テキストの増減にも耐えられるであろう CSS にする
- CSS でトリッキーな装飾はしない
- 必要に迫られたときだけ絶対値指定する。その場合は HTML 側で style 属性を使う
2つ目は、今後ブラウザのバージョンが上がったときに表示が崩れる可能性あるためなのですが、
正直なところ今後どうなるか少し心配しています……
3つ目は、矢印の位置を合わせたいときにやってみています。
今後もし位置の調整をしたいときにわざわざ SCSS をいじらなくても済むようにしています。
例えばこれで矢印になるのですが、(コード全体はこちら)
<divclass="arrow-right is-memo arrow-right__position"style="top: 170px;"></div>
style 属性で、親要素を基準にして上から170pxのところに来るように絶対値指定しています。
CSSで矢印を作る
さきほどの図で矢印を例に出しましたが、
div に付与した3つのクラスにはそれぞれ以下のような装飾を持たせています。
arrow-right
矢印の形状を指定するクラスis-memo
メモ用の色(水色)を指定クラスarrow-right__position
位置を絶対値指定する必要があるときのクラス
これがかいてあるコードはココです。
rails_textbook/_arrow-right.scss at master · igaiga/rails_textbook
arrow-right
クラスの矢印の形状を作るのは beforeとafterの疑似要素で作りました。
大きさや色を変えるのも画像よりコードでやったほうが楽ですし。
上記リンクから必要なところだけ抜き出したものは以下です。
$arrow-right-width-value:30px;$arrow-right-height-value:50px;.arrow-right{height:$arrow-right-height-value;&::before,&::after{display:inline-block;content:'';}&::before{// 胴体の棒の部分width:$arrow-right-width-value+$arrow-right-height-value;height:45%;background:$arrow-color;}&::after{// 三角の部分width:$arrow-right-height-value;height:$arrow-right-height-value;border:$arrow-right-height-value/2solidtransparent;border-left-color:$arrow-color;margin-bottom:-$arrow-right-height-value/4;}}
SCSSを細かく見てみる
$arrow-right-width-value:30px;$arrow-right-height-value:50px;
で、一応でですが縦と横の初期値を設定しています。
height:$arrow-right-height-value;&::before,&::after{display:inline-block;content:'';}
ここで矢印全体の高さを設定し、beforeとafterの疑似要素を召喚しました。
(display プロパティは block でもいいのですが、他でインラインにする必要があってこうなっています)
&::before{// 胴体の棒の部分width:$arrow-right-width-value+$arrow-right-height-value;// こう書かなくても良かったかも…ccheight:45%;background:$arrow-color;}
before 疑似要素で棒の幅と高さ、色を指定しています。
&::after{// 三角の部分width:$arrow-right-height-value;height:$arrow-right-height-value;border:$arrow-right-height-value/2solidtransparent;border-left-color:$arrow-color;margin-bottom:-$arrow-right-height-value/4;}
最後に after 疑似要素で三角の部分を表現しています。
高さの変数 $arrow-right-height-value
を基準にして、正方形のボックスを作り、正方形の半分のサイズの透明のborderを指定し、leftだけ色を付けると三角が現れます。
リセット CSS は ressを使っているので、以下が効いてます。
box-sizing: border-box;
これをつけるとボックスの内側に border がつき、上のサンプルがちゃんと矢印風の表示になってくれます。
パーツの半透明化
説明する部分を強調するため、他のパーツを半透明にできます。
サンプルHTML
<divclass="box opacity"><h2class="box__headline">リクエスト</h2>
...
</div>
SCSSはこれ
.opacity{opacity:0.3;}
opacity
というクラスをつけるだけで半透明化するようになりました。簡単ですね!
矢印の長さがボックスに追随するよ
右側の赤い矢印にご注目ください。
内容が増えるとちゃんと伸びます。
サンプルHTML
<divclass="wrapper"><divclass="box"><h2class="box__headline">リクエスト</h2>
...
</div><divclass="box app-box relative"><h2class="box__headline">Rails App</h2>
...
<divclass="arrow arrow__position-right-top"></div></div><divclass="box"><h2class="box__headline">レスポンス</h2>
...
</div></div>
SCSS
.arrow__position-right-top{// 右上から大きく表示する$position-value:-40px;position:absolute;right:20px;top:$position-value;margin-top:0;height:calc(100%-#{$position-value*1.6});}
wrapper に position: relative
を指定してあり、矢印の height を 100% から余白の分を引くようにするとできるようです〜。
ファイル構造を作る
アイコンは Font Awesomeのアイコンです。色をつけると見違えるように図っぽくなりますね。
ファイル構造はulの入れ子で進めようと書いてみたところ、入れ子になりすぎてコード量が半端なくなってしまったので margin-left で疑似的な階層をつくりました。Web サイトならコードの意味が大事ですが、今回はコードは適当でも図さえちゃんとしていればいいので。。。
サンプル HTML
<divclass="files__column"><divclass="files__item is-1">
1階層
</div><divclass="files__item is-2">
2階層
</div><divclass="files__item is-3">
3階層
</div>
...
</div>
まとめ
HTML/CSS で図を作るなんてなかなか無い案件なのでめちゃくちゃ楽しかったです!!!
ちょっと大変だなーと思ったのが、図の中にコードを載せることですね。
タグのエスケープが必要になるところをそんなに量が多くないからと手動で書き換えてました。半端にアナログ野郎ですみません……。
この記事で書いたことが最善とは思っていません。
もっといい方法があったらぜひ教えていただけますと……
表紙も作って販売が決まれば、達人出版会さんから電子書籍(EPUB, PDF)が発売されます。
Railsの教科書 - 達人出版会
2020年2月29日・3月1日に開催される技術書典8の1日目(2/29)でも紙版を頒布予定とのことです。
※電書版はフルカラーですが、紙版の本文はモノクロになるそうです。
デザイン担当からの告知になってしまいましたが、こちらもどうぞよろしくお願いします〜。