Edited at

懐かしの作文をCSSグラデーションで表現する

More than 1 year has passed since last update.

CSSには、グラデーションを生成するためのlinear-gradientというプロパティがありますが、今回はそのlinear-gradientを使って、誰もが子どもの頃に書いた作文風のCSSを作りました。

せっかくなので、linear-gradientの使い方も含めてTipsを書き残しておこうと思います。


まずはCSSグラデーションの基本的な使い方

まずはlinear-gradientで線形グラデーションのおさらいです。linear-gradientには、(orange 0, gold 100%)のように色のコードと色の占める割合を設定します。この色コードと割合の組み合わせをカラーストップと言います。


HTML

<div class="box">

<p>
CSS Gradient
</p>
</div>


CSS

.box {

width: 300px;
height: 300px;
background-image: linear-gradient(orange 0, gold 100%);
}

スクリーンショット 2016-10-30 13.54.09.png


CSSグラデーションテクニックその1

2つのカラーストップのうち、2つ目のカラーストップの位置を0にすると、なんと1つ目の色から即座に色が切り替わるようになります。そのため、グラデーションではなく、2色の矩形を表現する事ができます。


HTML

<div class="box">

<p>
CSS Gradient
</p>
</div>


CSS

.box {

width: 300px;
height: 300px;
background-image: linear-gradient(orange 50%, gold 0);
}

スクリーンショット 2016-10-30 14.07.34.png

この指定方法はハックではなく、W3Cの仕様として、前のカラーストップより小さい位置を指定した場合は自動的に最大の位置となるように調整されるようになっています。


If a color stop has a position that is less than the specified position of any color stop before it in the list, set its position to be equal to the largest specified position of any color stop before it.


2つの色の割合を50%と50.1%など極力近い値で指定しても同じ効果を得られますが、0で指定した方がDRYなコードになります。


テクニックの応用

上記のテクニックを使用すると、linear-gradientで縞々を表現する事もできます。


HTML

<div class="box">

<p>
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui. Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem. Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc,
</p>
</div>


CSS

.box {

width: 100%;
line-height: 1.5em;
background-image:
linear-gradient(#FFF 50%, #DDD 0);
background-size: auto 3em;
}

スクリーンショット 2016-10-30 14.10.53.png

擬似クラスのnth-child(odd)などを使う場合は行ごとに要素で囲んでいる必要がありますが、linear-gradientを使った場合は要素で囲む必要がないのがメリットです。


CSSグラデーションテクニックその2

backgroundプロパティには複数のlinear-gradientが指定できます。

そのため、1つの要素で複数の色の組み合わせを表現する事ができます。


HTML

<div class="box">

<p>
CSS Gradient
</p>
</div>


CSS

.box {

width: 300px;
height: 300px;
background-image:
linear-gradient(rgba(255,255,255,.5) 50%, rgba(0,0,0,.5) 0),
linear-gradient(to right, orange 50%, gold 0);
}

スクリーンショット 2016-10-30 14.14.34.png

最初に指定したグラデーションから順に前面に表示される事に気をつけてください。


この特徴を活かして作文風のCSSをつくる

前述のテクニックを応用して冒頭に掲載した作文風のCSSを作ってみました。ソースコードはちょっと長めなのでこちらをご参照ください。

作文を表現するにあたり、以下がポイントになります。


  • 縦と横の罫線をlinear-gradientで描画する

  • Ruby要素が指定された場合はふりがなとして配置する

  • 明朝体のフォントを表示する


ただ、1点問題が・・・

文章が多い場合は横スクロールバーが表示されるようになっているのですが、横スクロールした際に罫線の表示が途切れてしまうという問題が残りました。

罫線はbackground-imageで表示しているのですが、どうもスクロールして表示される領域ではbackground-imageが適用されないようです。

一方、縦方向にスクロールして表示される領域はbackground-imageが適用されます。

横スクロールはあまり利用されない事からブラウザ側の対応がされていないのかもしれません。

この辺の知見はあまりないので、もしご存知の方がいましたら、ご教示頂けると有難いです。


参考

本稿でご紹介したテクニックはオライリーのCSSシークレットにも記載されているので、興味のある方はご一読ください。