[CSS3]面倒なCSS3、linear-gradientを使いやすくまとめてみた

[CSS3]面倒なCSS3、linear-gradientを使いやすくまとめてみた

イメージ

こんにちはLatinです。
今年も残す所、あと11ヶ月となってしまいましたが、やり残しのないよう頑張ろうと思っております。

今回はCSS3のグラデーションにまつわるエントリーです。

ハッキリ言って面倒くさい!

さてCSS3のグラデーション「linear-gradient」なんですが、はっきり言って面倒です・・・。
今はCSS3のジェネレータもたくさんあるので、それらを使うのもいいのですが、足りない分のベンダープレフィックスを探したり、filter やら毎回ググるのが非常に面倒!

且つ、ボタンなどに、gradient と border-radius を併記した場合、IE9 での表示が若干おかしくなってしまいます。

詳細は下記に記載しますが、今後サクッと使えるように備忘録がてら、簡単にまとめておこうと思います。

CSS スニペット(修正前)

.btn {
    border-radius: 4px;
    border: 1px solid #4D9437;    
    -webkit-box-shadow: inset 0 1px 1px #ffffff;
    -moz-box-shadow: inset 0 1px 1px #ffffff;
    box-shadow: inset 0 1px 1px #D4EBB2;
    
    background: #7DBB3C; /* Old browsers */
    background: -moz-linear-gradient(top, #a2d93f 0%, #388235 100%); /* FF3.6+ */
    background: -webkit-gradient(linear, left top, left bottom, color-stop(1.00, #388235), color-stop(0.00, #a2d93f)); /* Chrome,Safari4+ */
    background: -webkit-linear-gradient(top, #a2d93f 0%, #388235 100%); /* Chrome10+,Safari5.1+ */
    background: -o-linear-gradient(top, #a2d93f 0%, #388235 100%); /* Opera 11.10+ */
    background: -ms-linear-gradient(top, #a2d93f 0%, #388235 100%); /* IE10+ */
    background: linear-gradient(to bottom, #a2d93f 0%, #388235 100%); /* W3C */
    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#a2d93f', endColorstr='#388235', GradientType=0); /* IE7,8,9 */
}

各ブラウザでの表示を見てみます。

Chrome、Firefox共に異常なし。

IE6 には残念ながら使えません。background-color が適用されています。

「filter」を用いる事で IE7 でもグラデーションを適用する事ができます。
border-radius はなし。

「filter」を用いる事で IE8 でもグラデーションを適用する事ができます。
border-radius はなし。

おっと・・・

はい、出ました。おかしいですね・・・。
IE系の gradient には 「filter」を記述するのが通例となっていますが、
border-radius と併記していた場合、こんな事になっちまいます。

厳密には gradient も border-radius も効いているのですが、要素の背景にまでグラデーションが適用されてしまっています。

ここで IE9 ハックを使用して、「filter」を解除させます。
これにより「filter」を使ったグラデーションは解除され、残った border-radius が適用されます。

/* IE9のfilterを解除する */
.btn:not(:target){ filter: none\9;}

CSS スニペット(修正後)

.btn {
    border-radius: 4px;
    border: 1px solid #4D9437;    
    -webkit-box-shadow: inset 0 1px 1px #ffffff;
    -moz-box-shadow: inset 0 1px 1px #ffffff;
    box-shadow: inset 0 1px 1px #D4EBB2;
    
    background: #7DBB3C; /* Old browsers */
    background: -moz-linear-gradient(top, #a2d93f 0%, #388235 100%); /* FF3.6+ */
    background: -webkit-gradient(linear, left top, left bottom, color-stop(1.00, #388235), color-stop(0.00, #a2d93f)); /* Chrome,Safari4+ */
    background: -webkit-linear-gradient(top, #a2d93f 0%, #388235 100%); /* Chrome10+,Safari5.1+ */
    background: -o-linear-gradient(top, #a2d93f 0%, #388235 100%); /* Opera 11.10+ */
    background: -ms-linear-gradient(top, #a2d93f 0%, #388235 100%); /* IE10+ */
    background: linear-gradient(to bottom, #a2d93f 0%, #388235 100%); /* W3C */
    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#a2d93f', endColorstr='#388235', GradientType=0); /* IE7,8,9 */
}

/* IE9のfilterを解除する */
.btn:not(:target){ filter: none\9;}

結果的に、IE9 ではグラデーションを"捨てる"結果となってしまいましたが、
角丸とグラデーション、どちらを取るかの判断になる事が多いのではないか?と思っていたりもします。

IE9 で gradient と border-radius を同時に活きにするには、CSS3 Pie などのライブラリを用いる方法があるようですが、 レスポンスが悪くなるかも(?)という懸念もあり実案件では使っていません。

この辺は案件に応じて・・・といった所なんでしょうか。

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ