早速ですが、皆さんは下の画像のようなことをしたいと思ったことはないでしょうか?
そう、お気づきだと思いますが、テキストの色が中途半端な位置で変わっています。
え?これ画像でしょ?と思われた方、そうです、これは画像です。
しかし、これと同じことをCSSでもできます!
今回はその方法をご紹介していきます。
まず、HTMLのソースは以下になります。
- <div class="wrap">
- <div class="img"><img src="img/demo.jpg" alt=""></div>
- <p class="txt">
- <span class="txt_white">Better microphone doesn't make <br>your voice sound better.</span>
- <span class="txt_black">Better microphone doesn't make <br>your voice sound better.</span>
- </p>
- </div>
まずここで注目していただきたいのが、.txt内のspanが2重になっていること。
そして、それぞれのspanに.txt_whiteと.txt_blackが付与されていること。
今回のHTMLでは、ここが重要になってきます。
次にCSSのソースは以下になります。
- .wrap {
- width: 1000px;
- margin: 0 auto;
- position: relative;
- }
- .img {
- padding-left: 18%;
- }
- .txt .txt_white {
- display: block;
- font-size: 42px;
- position: absolute;
- top: 50px;
- left: 0;
- color: #fff;
- }
- .txt .txt_black {
- display: block;
- font-size: 42px;
- position: absolute;
- top: 50px;
- left: 0;
- color: #000;
- white-space: nowrap;
- width: 18%;
- overflow: hidden;
- }
それでは解説していきましょう。
まず、.wrapで大事なのが、position:relative;。
理由は後ほどご説明致します。
次に、.imgですが、padding-left:18%;のみになります。
今回はbox-sizing:border-box;を入れておりませんので、こうすることによって.imgのコンテンツ幅は82%となります。
もし、box-sizing:border-box;を入れている場合は、width:82%;でmargin-left:18%;でもOKです!
そして今回の要の.txt_whiteと.txt_blockを見ていきましょう。
まず、両方ともdisplay:block;でブロック要素にします。
その上で、position:absolute;にし、topとleftプロパティに同じ値を入れます。
そうすることによってこの2つの要素が同じ位置で重なります。
この時点では、下に記述されている、.txt_black要素が上に表示されるので、.txt_whiteが下に隠れて、文字色は黒色に見えます。
ここからが今回1番大事なポイントです。
.txt_blackのみ、white-space:nowrap;、width:18%;、overflow:hidden;を設定します。
まず、white-space:nowrap;でテキストがコンテンツ幅を超えても折り返さないようにします。
そして、width:18%;でコンテンツ幅を設定します。今回の場合は画像以外の余白部分がコンテンツ幅になるように設定しています。
その上で、overflow:hidden;でコンテンツ幅を超えたら表示されないようにします。
そうすることにより、幅18%(画像以外の余白部分)を超えたら黒文字が表示されなくなり、そこから先は下に隠れている白文字が表示され、文字色が切り替わっているように見えるというわけです。
これで、こういったデザインが上がってきても、「どうしよう…画像にしようか…でも、更新があると手間がかかるし…」と悩むこともなくなると思います!
「山口を、記録する。」山口オフィスのメンバーより毎週ブログを書いております。内容としては山口県オススメスポットの紹介や技術のアウトプットなどです。ぜひご覧ください。
REC.