linear-gradient()
: 線形グラデーション CSSの設定値
このページで解説するコードの実行結果。
10
20
30
40
50
60
70
80
90
100
100
100
100
100
100
100
100
100
100
100
90
80
70
60
50
50
50
50
50
50
HTML
& CSS
このページの実行結果には、以下のコードをデフォルトとして使用している。
linear-gradient()
関数の概要
background-image
プロパティにlinear-gradient()
関数を設定すると、線形なグラデーションになる。
複数の色はカンマ「,
」で指定する。
下は「上半分をred
」「下半分をyellow
」にする例。(red
とyellow
の境目は真ん中)
.sample { background-image: linear-gradient( red, yellow ); }
<div class="sample"></div>
yellow
の後ろに(カンマではなく)スペースでつなげて50%
と書くと「上半分をred
とyellow
で分け」、「下半分はyellow
」になる。
つまり、red
とyellow
の境目が「上から25%(1/4)の位置」に来る。
.sample { background-image: linear-gradient( red, yellow 50% ); }
25%
にすると「yellow
だけの領域が(上から)25%の場所から始まる」ということ。
よって、red
とyellow
の境目は「上から12.5%(1/8)の位置」になる。
.sample { background-image: linear-gradient( red, yellow 25% ); }
この設定は数値(+ 単位)でも指定できる。
このボックスの高さは200px
である。よって、yellow 100px
と指定するとyellow 50%
と同じことになる。
.sample { background-image: linear-gradient( red, yellow 100px ); }
yellow 50px
とすると、(50px
÷ 高さ200px
= 0.25
= 25%
なので)yellow 25%
と同じことになる。
.sample { background-image: linear-gradient( red, yellow 50px ); }
次に、red 50%
とする。(yellow
には無指定)
この場合「上から50%はred
だけの領域」となるので、red
とyellow
の境目が上から75%(3/4)の位置に来る。
.sample { background-image: linear-gradient( red 50%, yellow ); }
red 75%
とすると、境目が上から7/8の位置に来る。
.sample { background-image: linear-gradient( red 75%, yellow ); }
red 150px
はred 75%
と指定するのと同じ。(150px
÷ 高さ200px
= 0.75
= 75%
なので)
.sample { background-image: linear-gradient( red 150px, yellow ); }
最後に両方指定した場合。
red 40%, yellow 60%
とする。
「0 ~ 40%」のところはred
のみ、「60% ~ 100%」のところはyellow
のみとなる。
残った「40% ~ 60%」の領域のみがグラデーションになる。
.sample { background-image: linear-gradient( red 40%, yellow 60% ); }
下はred, yellow
のみの指定。上の結果の方が滲んでいる領域が少ない。
.sample { background-image: linear-gradient( red, yellow ); }
まとめる。sample-0-100
クラスが無指定(デフォルト)の状態。
.sample-0-10 { background-image: linear-gradient( red , yellow 10% ); } .sample-0-20 { background-image: linear-gradient( red , yellow 20% ); } .sample-0-30 { background-image: linear-gradient( red , yellow 30% ); } .sample-0-40 { background-image: linear-gradient( red , yellow 40% ); } .sample-0-50 { background-image: linear-gradient( red , yellow 50% ); } .sample-0-60 { background-image: linear-gradient( red , yellow 60% ); } .sample-0-70 { background-image: linear-gradient( red , yellow 70% ); } .sample-0-80 { background-image: linear-gradient( red , yellow 80% ); } .sample-0-90 { background-image: linear-gradient( red , yellow 90% ); } .sample-0-100 { background-image: linear-gradient( red , yellow ); } .sample-10-100 { background-image: linear-gradient( red 10%, yellow ); } .sample-20-100 { background-image: linear-gradient( red 20%, yellow ); } .sample-30-100 { background-image: linear-gradient( red 30%, yellow ); } .sample-40-100 { background-image: linear-gradient( red 40%, yellow ); } .sample-50-100 { background-image: linear-gradient( red 50%, yellow ); } .sample-60-100 { background-image: linear-gradient( red 60%, yellow ); } .sample-70-100 { background-image: linear-gradient( red 70%, yellow ); } .sample-80-100 { background-image: linear-gradient( red 80%, yellow ); } .sample-90-100 { background-image: linear-gradient( red 90%, yellow ); } div { width: 3em; /* 幅 */ }
<div class="sample-0-10"> 0 <br> 10 </div> <div class="sample-0-20"> 0 <br> 20 </div> <div class="sample-0-30"> 0 <br> 30 </div> <div class="sample-0-40"> 0 <br> 40 </div> <div class="sample-0-50"> 0 <br> 50 </div> <div class="sample-0-60"> 0 <br> 60 </div> <div class="sample-0-70"> 0 <br> 70 </div> <div class="sample-0-80"> 0 <br> 80 </div> <div class="sample-0-90"> 0 <br> 90 </div> <div class="sample-0-100"> 0 <br> 100 </div> <div class="sample-10-100"> 10 <br> 100 </div> <div class="sample-20-100"> 20 <br> 100 </div> <div class="sample-30-100"> 30 <br> 100 </div> <div class="sample-40-100"> 40 <br> 100 </div> <div class="sample-50-100"> 50 <br> 100 </div> <div class="sample-60-100"> 60 <br> 100 </div> <div class="sample-70-100"> 70 <br> 100 </div> <div class="sample-80-100"> 80 <br> 100 </div> <div class="sample-90-100"> 90 <br> 100 </div>
10
20
30
40
50
60
70
80
90
100
100
100
100
100
100
100
100
100
100
その2。
.sample-0-100 { background-image: linear-gradient( red , yellow ); } .sample-10-90 { background-image: linear-gradient( red 10%, yellow 90% ); } .sample-20-80 { background-image: linear-gradient( red 20%, yellow 80% ); } .sample-30-70 { background-image: linear-gradient( red 30%, yellow 70% ); } .sample-40-60 { background-image: linear-gradient( red 40%, yellow 60% ); } .sample-50-50 { background-image: linear-gradient( red 50%, yellow 50% ); } .sample-40-50 { background-image: linear-gradient( red 40%, yellow 50% ); } .sample-30-50 { background-image: linear-gradient( red 30%, yellow 50% ); } .sample-20-50 { background-image: linear-gradient( red 20%, yellow 50% ); } .sample-10-50 { background-image: linear-gradient( red 10%, yellow 50% ); } .sample-0-50 { background-image: linear-gradient( red , yellow 50% ); } div { width: 3em; /* 幅 */ }
<div class="sample-0-100"> 0 <br> 100</div> <div class="sample-10-90"> 10 <br> 90 </div> <div class="sample-20-80"> 20 <br> 80 </div> <div class="sample-30-70"> 30 <br> 70 </div> <div class="sample-40-60"> 40 <br> 60 </div> <div class="sample-50-50"> 50 <br> 50 </div> <div class="sample-40-50"> 40 <br> 50 </div> <div class="sample-30-50"> 30 <br> 50 </div> <div class="sample-20-50"> 20 <br> 50 </div> <div class="sample-10-50"> 10 <br> 50 </div> <div class="sample-0-50"> 0 <br> 50 </div>
100
90
80
70
60
50
50
50
50
50
50
repeating-linear-gradient()
関数
復習。red
とyellow
で半分に分ける。
.sample { background-image: linear-gradient( red, yellow ); }
最後のyellow
を50%
にすると、下部50%はyellow
になる。
.sample { background-image: linear-gradient( red, yellow 50% ); }
linear-gradient
をrepeating-linear-gradient
に変更すると繰り返しになる。
50%
を指定しているので、2回繰り返す。
.sample { background-image: repeating-linear-gradient( red, yellow 50% ); }
これは100px
を指定するのと同じである。(高さ200px
の50%
は100px
)
.sample { background-image: repeating-linear-gradient( red, yellow 100px ); }
50px
を指定すると4回繰り返す。(高さ200px
÷ 50px
= 4回)
※ これは25%
と指定するのと同じ。
.sample { background-image: repeating-linear-gradient( red, yellow 50px ); }
割り切れない値を設定すると、途中で切れる。(高さ200px
÷ 80px
= 2回 あまり 40px
)
.sample { background-image: repeating-linear-gradient( red, yellow 80px ); }
複数の色を指定
3色の色を指定する。それぞれ1/3に分ける。
.sample { background-image: linear-gradient( red, yellow, green ); }
blue
を加えて4色にする。それぞれ25%に分けられる。
.sample { background-image: linear-gradient( red, yellow, green, blue ); }
yellow 75%
と指定する。「上部の75%をred
とyellow
で半分に分け」、「残りの25%をgreen
とblue
が分ける」ことになる。
.sample { background-image: linear-gradient( red, yellow 75%, green, blue ); }
加えてred 50%
にする。上部50%がred
、50%~75%がyellow
、残りにgreen
とblue
になる。
.sample { background-image: linear-gradient( red 50%, yellow 75%, green, blue ); }
もちろん、同じ色を複数回指定しても良い。
red, yellow, yellow
は、
.sample { background-image: linear-gradient( red, yellow, yellow ); }
red, yellow 50%
と同じである。
.sample { background-image: linear-gradient( red, yellow 50% ); }
しかし、ややこしいので推奨しない。
repeating-linear-gradient
に複数指定
復習。 linear-gradient
の3色指定。
.sample { background-image: linear-gradient( red, yellow, green ); }
最後のgreen
を50%
にすると、下部50%はgreen
になる。
.sample { background-image: linear-gradient( red, yellow, green 50% ); }
linear-gradient
をrepeating-linear-gradient
に変更すると繰り返しになる。
.sample { background-image: repeating-linear-gradient( red, yellow, green 50% ); }
ちなみにrepeating-linear-gradient
を使う場合、開始と終了の色を同じにすると見た目が良い。
最後のgreen
をred
に変更してみる。
.sample { background-image: repeating-linear-gradient( red, yellow, red 50% ); }
三回繰り返すには、33%
にする。
.sample { background-image: repeating-linear-gradient( red, yellow, red 33% ); }
たとえば、yellow 10%
にしたり、
.sample { background-image: repeating-linear-gradient( red, yellow 10%, red 33% ); }
orange
を足してみたりするとパターンが変わる。
.sample { background-image: repeating-linear-gradient( red, yellow, orange, red 33% ); }
傾ける
下記で説明することをまとめておく。
deg | to | デフォルト |
---|---|---|
0deg | to top | |
45deg | to top right | |
90deg | to right | |
135deg | to bottom right | |
180deg | to bottom | ○ |
225deg | to bottom left | |
270deg | to left | |
315deg | to top left |
まず復習。
.sample { background-image: linear-gradient( red, yellow ); }
傾けるには、色の前に傾ける角度を指定する。(その後ろにカンマ「,
」が必要。)
とりあえず、横に傾ける。90°(90deg
)を指定。
.sample { background-image: linear-gradient( 90deg, red, yellow ); }
180deg
。逆さまになりそうだが、そうでもないらしい。無指定と同じ
.sample { background-image: linear-gradient( 180deg, red, yellow ); }
270deg
。90deg
とは左右逆になっている。
.sample { background-image: linear-gradient( 270deg, red, yellow ); }
30°ずつ傾けてみる。なんと、0deg
or360deg
の時に逆さまになっている。つまり、逆さまから始まり、逆さまで終わる。
.deg0 { background-image: linear-gradient( 0deg, red, yellow ); } .deg30 { background-image: linear-gradient( 30deg, red, yellow ); } .deg60 { background-image: linear-gradient( 60deg, red, yellow ); } .deg90 { background-image: linear-gradient( 90deg, red, yellow ); } .deg120 { background-image: linear-gradient( 120deg, red, yellow ); } .deg150 { background-image: linear-gradient( 150deg, red, yellow ); } .deg180 { background-image: linear-gradient( 180deg, red, yellow ); } .deg210 { background-image: linear-gradient( 210deg, red, yellow ); } .deg240 { background-image: linear-gradient( 240deg, red, yellow ); } .deg270 { background-image: linear-gradient( 270deg, red, yellow ); } .deg300 { background-image: linear-gradient( 300deg, red, yellow ); } .deg330 { background-image: linear-gradient( 330deg, red, yellow ); } .deg360 { background-image: linear-gradient( 360deg, red, yellow ); } div { width: 70px; /* 幅 */ height: 70px; /* 高さ */ }
<div class="deg0"> 0deg </div> <div class="deg30"> 30deg </div> <div class="deg60"> 60deg </div> <div class="deg90"> 90deg </div> <div class="deg120"> 120deg </div> <div class="deg150"> 150deg </div> <div class="deg180"> 180deg </div> <div class="deg210"> 210deg </div> <div class="deg240"> 240deg </div> <div class="deg270"> 270deg </div> <div class="deg300"> 300deg </div> <div class="deg330"> 330deg </div> <div class="deg360"> 360deg </div>
to
を使った指定
to right
にすると、左から右へ。90deg
と同じ。
.sample { background-image: linear-gradient(to right, red, yellow); }
to left
にすると、右から左へ。270deg
と同じ。
.sample { background-image: linear-gradient(to left, red, yellow); }
to top
にすると、下から上へ。0deg
と同じ。
.sample { background-image: linear-gradient(to top, red, yellow); }
to bottom
にすると、上から下へ。180deg
と同じ。(デフォルト=無指定と同じ)
.sample { background-image: linear-gradient(to bottom, red, yellow); }
縦方向と横方向の2つを設定することもできる。
to top right | 45deg と同じ |
to bottom right | 135deg と同じ |
to bottom left | 225deg と同じ |
to top left | 315deg と同じ |
.top { background-image: linear-gradient( to top , red, yellow ); } .top-right { background-image: linear-gradient( to top right , red, yellow ); } .right { background-image: linear-gradient( to right , red, yellow ); } .bottom-right { background-image: linear-gradient( to bottom right , red, yellow ); } .bottom { background-image: linear-gradient( to bottom , red, yellow ); } .bottom-left { background-image: linear-gradient( to bottom left , red, yellow ); } .left { background-image: linear-gradient( to left , red, yellow ); } .top-left { background-image: linear-gradient( to top left , red, yellow ); } div { width: 8em; /* 幅 */ height: 5em; /* 高さ */ }
<div class="top"> to top </div> <div class="top-right"> to top right </div> <div class="right"> to right </div> <div class="bottom-right"> to bottom right </div> <div class="bottom"> to bottom </div> <div class="bottom-left"> to bottom left </div> <div class="left"> to left </div> <div class="top-left"> to top left </div>
色を混ぜる
これと
.sample { background-image: linear-gradient( red, yellow ); }
これを
.sample { background-image: linear-gradient( 90deg, #333, white ); }
混ぜてみる。
混ぜるには、linear-gradient()
をカンマ「,
」でつなぐ。
.sample { background-image: linear-gradient( red, yellow ), linear-gradient( 90deg, #333, white ); }
1つ目の設定が優先され、混ざらない。 これは「色が半透明」でないから。
半透明にするには、色をrgba()
関数で指定する必要がある。
red
は rgb( 255, 0, 0 )
である。
カラーコード | r | g | b | rgb() |
---|---|---|---|---|
red | 255 | 0 | 0 | rgb( 255, 0, 0 ) |
これを使って書き直す。
.sample { background-image: linear-gradient( rgb( 255, 0, 0 ), yellow ); }
これをrgba()
にして、不透明度を0.4
(40%)にする。
.sample { background-image: linear-gradient( rgba( 255, 0, 0, 0.4 ), yellow ); }
これをlinear-gradient( 90deg, #333, white );
に重ねる。
.sample { background-image: linear-gradient( rgba( 255, 0, 0, 0.4 ), yellow ), linear-gradient( 90deg, #333, white ); }
上部のred
は半透明であるので、下の色が透けて見える。
左側が暗く、右側が明るいので、上部左側が暗く、上部右側が明るく見える。
下部のyellow
は不透明なので黄色に見える。
このように、3色(のような)グラデーションを作ることができた。
さらなる実験
次に、重ねる順番を変えてみる。モノクロを上にする。(半透明ではないのでモノクロになる)
.sample { background-image: linear-gradient( 90deg, #333, white ), linear-gradient( red, yellow ); }
モノクロを半透明(0.3
)にする。
カラーコード | r | g | b | rgb() | rgba( , 0.3 ) |
---|---|---|---|---|---|
#333 | 51 | 51 | 51 | rgb( 51, 51, 51 ) | rgba( 51, 51, 51, 0.3 ) |
white | 255 | 255 | 255 | rgb( 255, 255, 255 ) | rgba( 255, 255, 255, 0.3 ) |
.sample { background-image: linear-gradient( 90deg, rgba( 51, 51, 51, 0.3 ), rgba( 255, 255, 255, 0.3 ) ), linear-gradient( red, yellow ); }
回転を90deg
から60deg
に変えると少し和らぐ
.sample { background-image: linear-gradient( 60deg, rgba( 51, 51, 51, 0.3 ), rgba( 255, 255, 255, 0.3 ) ), linear-gradient( red, yellow ); }
transparent
を使ってみる。
transparent
は完全な透明であり、rgba()
で表すとrgba( n, n, n, 0 )
と同じである。(透明なのでn
が何であっても関係ない)
よって、これ(red
)と
.sample { background-image: linear-gradient( to top right, transparent 20%, red ); }
これ(lime
)と
.sample { background-image: linear-gradient( to top left , transparent 20%, lime ); }
これ(blue
)を合わせると
.sample { background-image: linear-gradient( to bottom , transparent 20%, blue ); }
こうなる。(red
→lime
→blue
の順)
.sample { background-image: linear-gradient( to top right, transparent 20%, red ), linear-gradient( to top left , transparent 20%, lime ), linear-gradient( to bottom , transparent 20%, blue ); }
重ねる順番で結果が変わることに注意。(lime
→red
→blue
の順)
.sample { background-image: linear-gradient( to top left , transparent 20%, lime ), linear-gradient( to top right, transparent 20%, red ), linear-gradient( to bottom , transparent 20%, blue ); }
20%
、to bottom
のところを少し変えて調整してみる。
.sample { background-image: linear-gradient( to top left , transparent 40%, lime ), linear-gradient( to top right, transparent 10%, red ), linear-gradient( 220deg , transparent, blue ); }