先週の記事「テーブル左上隅のセルだけ消す」の最後で、セル内斜線をCSSだけで入れるのは難しそうと書いたけど、CSS3のtransform属性を使って一応できました。太い境界線の「斜めの色の差」でなく、ちゃんとした斜「線」。Chrome/Chromium43、Firefox39、IE10で動作確認しました(下の画像はChrome)。
ソースは次項に書きます。現状での制約として
- CSS3のtransform属性が「実験段階」で、未対応ブラウザ等の問題がある
- 斜線を引くセルの横幅・高さは絶対値で固定。そこから値を計算してCSSに書く
- ブラウザによっては線の位置が少しずれたり、ギザギザになる
一つ目のCSS3普及は、いずれ時間が解決するかと。二つ目は、JavaScriptを援用して動的にCSSを書き換えれば対応可能かも。問題は三つ目で、ブラウザのレンダリングによるとしか…。Firefoxでは、ギザギザにならず滑かな斜線でした。
transform属性の各種ブラウザの対応状況はMozilla Developer Network : transformを参照。Chromeはベンダープレフィクス-webkitが必要となってますが、最近のバージョンでは不要でした。
ソースと実際の例
ブラウザが対応していれば、下のテーブルの左上隅セルに、右上がりの対角線が引かれてると思います。ソースとして、スタイルシートとTABLEタグの部分を抜粋。
| column1 | column2
|
| row1 | a | b
|
| row2 | c | d
|
| column1 | column2
|
| row1 | a | b
|
| row2 | c | d
|
原理は次のとおりです。
- 斜線を引くセル内に、空のDIV要素を挿入
- DIV要素のサイズをセルいっぱいに広げる(height: 100%; width: 100%;)
- DIV要素の上側だけに線を付ける(border-top: solid gray 1px;)
- transform属性でDIV要素を縦方向に斜めに変形(スキュー、またはシアー、せん断とも)+移動。DIV上側の線がセルの対角線になるよう、matrixパラメータを入力。セル中央が原点なので、セル縦サイズの半分を縦方向の移動量にする(明日、少し補足します)
CSSで左上隅セルを指定する際に疑似クラス(first-child)を使ってます。transformが有効なブラウザなら当然使えると思うので。
その他の例
先ほどの右上がり斜線に対し、右下がりの場合。matrix第2引数の正負を入れ替えるだけ。これで縦方向の歪みの向きが逆になります。
| column1 | column2
|
| row1 | a | b
|
| row2 | c | d
|
| column1 | column2
|
| row1 | a | b
|
| row2 | c | d
|
↓ 右上がり・右下がり両方の斜線をクロスさせる場合。ちょっと面倒で、斜線の実体であるDIV要素をもう一つ作り絶対配置で重ねます。ブラウザによっては、重ねたDIV要素の位置がなぜか微妙にズレるので(Firefoxがそう)、ぴったり合わせたければ移動量や拡大率の調整が必要。
|
| column1 | column2
|
| row1 | a | b
|
| row2 | c | d
|
|
| column1 | column2
|
| row1 | a | b
|
| row2 | c | d
|
↓ 何の役に立つか分かりませんが三角に塗る例。これは簡単で、斜線の実体であるDIV要素に色を付けるだけです。セルからはみ出さないよう、セルにoverflow: hiddenを設定します。
| column1 | column2
|
| row1 | a | b
|
| row2 | c | d
|
|
| column1 | column2
|
| row1 | a | b
|
| row2 | c | d
|
明日は、補足としてmatrixパラメータの算出過程について書きます。