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

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

<img src="https://qiita-image-store.s3.amazonaws.com/0/57442/3954c40e-350d-fde7-4b4d-32b18cfdc778.png" width="400">

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

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

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

```html:HTML
<div class="box">
	<p>
		CSS Gradient
	</p>
</div>
```

```css:CSS
.box {
	width: 300px;
	height: 300px;
	background-image: linear-gradient(orange 0, gold 100%);
}
```

<img width="314" alt="スクリーンショット 2016-10-30 13.54.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/57442/77172938-eebf-2902-21b0-4de52040b140.png">


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

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

```html:HTML
<div class="box">
	<p>
		CSS Gradient
	</p>
</div>
```

```css:CSS
.box {
	width: 300px;
	height: 300px;
	background-image: linear-gradient(orange 50%, gold 0);
}
```

<img width="313" alt="スクリーンショット 2016-10-30 14.07.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/57442/36a1647a-be68-214b-906f-9be7b572176f.png">

この指定方法はハックではなく、[W3Cの仕様](https://drafts.csswg.org/css-images/#color-stop-syntax)として、前のカラーストップより小さい位置を指定した場合は自動的に最大の位置となるように調整されるようになっています。

>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.

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

### テクニックの応用

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

```html: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:CSS
.box {
	width: 100%;
	line-height: 1.5em;
	background-image: 
		linear-gradient(#FFF 50%, #DDD 0);
	background-size: auto 3em;
}
```

<img width="1018" alt="スクリーンショット 2016-10-30 14.10.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/57442/ea9a1de8-56b0-5766-9a64-8cffaca078e6.png">

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

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

`background`プロパティには複数の`linear-gradient`が指定できます。
そのため、１つの要素で複数の色の組み合わせを表現する事ができます。

```html:HTML
<div class="box">
	<p>
		CSS Gradient
	</p>
</div>
```

```css: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);
}
```

<img width="311" alt="スクリーンショット 2016-10-30 14.14.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/57442/339fb9d5-1087-a12b-0c16-d608047f5130.png">

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

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

前述のテクニックを応用して冒頭に掲載した作文風のCSSを作ってみました。ソースコードはちょっと長めなので[こちら](https://github.com/masaki-ohsumi/SakubunCSS/blob/master/sakubun.css)をご参照ください。

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

- 縦と横の罫線を`linear-gradient`で描画する
- Ruby要素が指定された場合はふりがなとして配置する
- 明朝体のフォントを表示する

## ただ、１点問題が・・・

文章が多い場合は横スクロールバーが表示されるようになっているのですが、横スクロールした際に罫線の表示が途切れてしまうという問題が残りました。
罫線は`background-image`で表示しているのですが、どうもスクロールして表示される領域では`background-image`が適用されないようです。
一方、縦方向にスクロールして表示される領域は`background-image`が適用されます。
横スクロールはあまり利用されない事からブラウザ側の対応がされていないのかもしれません。
この辺の知見はあまりないので、もしご存知の方がいましたら、ご教示頂けると有難いです。

## 参考

本稿でご紹介したテクニックはオライリーの[CSSシークレット](https://www.oreilly.co.jp/books/9784873117669/)にも記載されているので、興味のある方はご一読ください。