コピペOK! 画像やブロックを境界として、文字色を変える方法。

こんな感じに、ブロックや写真を境にして文字色を変えているページを最近よく見るので、実装方法を書いてみました。
cssだけでやろうとすると、中々保守が大変そうだったのでjQueryのコード数行を使って実装してみたいと思います。手順としては

  1. (html)同じ文字ブロック要素を2つ用意
  2. 片方の文字ブロックは写真(または背景要素のブロック)の上に配置
  3. 2の方の文字設定を、overflow:hiddenに設定
  4. jQueryで2つの文字ブロックの位置を同じにする。

ファイル構成はこんな感じです。

TitleColorChange

css

styye.css

js

script.js

img

top.png

index.html

非常にシンプルな構成ですね。

index.htmlのコード

それではhtmlから他のファイルを読み込んでいますが、最低限のものしか書いてません。
container要素に注目してください。title_white と title_blackの二つを使っていますね。

<!DOCTYPE html>
<html lang="jp">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Title Color Change</title>
    <!-- jquery & iScroll -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/iScroll/5.2.0/iscroll.min.js"></script>
    <!-- original -->
    <link rel="stylesheet" href="./css/style.css">
    <script src="./js/script.js"></script>
</head>

<body>
    <div class="container">
        <h2 class="title_black title">境目で文字の色が変わります。</h2>
        <div class="container__img-wrapper">
            <h2 class="title_white title">境目で文字の色が変わります。</h2>
            <img src="./img/top.png" alt="">
        </div>
    </div>
</body>

</html>

style.cssのコード

cssも至ってシンプル。blackは位置指定してますが、写真の上に来るように適当にずらしているだけです。
注目して欲しいのは、title_whiteの親要素の.container__img-wrapperにoverflow:hodden;をつけている点です。これによって、title_whiteがコンテナーの外に出た時に勝手に消えます。

.container {
    display: flex;
}
.container__img-wrapper {
    overflow: hidden;/*これで文字が写真外から出た時に消えるようにする。 */
}
.title_white {
    position: relative;
    color: #fff;
}
.title_black {
    z-index:-1;/*重ね合わせの優先順位を最下位にする。*/
    position: relative;
    left: 10%;
    top: 100px;
    white-space: nowrap;
}

script.jsのコード

こちらは全てjQueryで書いています。単純に片方の座標を取得して、もう片方に代入するというコードです。
mvhにtitle_blackの座標を代入し、whiteに代入しているだけです笑
2つ同じコードがあるのは、横スクロールした時に文字の位置が変わるため、動的にtitleの位置を動かすためです。

$(function () {
//読み込み時。
var mvh = $('.title_black').offset();
$('.title_white').offset({
top: mvh.top,
left: mvh.left
});

})

///titleのいち変更_横スクロール時
$(window).resize(function() {
  var mvh = $('.title_black').offset();
$('.title_white').offset({
  top: mvh.top,
  left: mvh.left
});
})

まとめ・補足

cssだけで文字位置を調整することも可能なんですが、jqueryの方が個人的に良いと思います。
実は僕も最初はcssだけでやっていたのですが、windowsのChromで見た時に何故かズレていたりしました^^;
本実装方法では座標を一致させているのでまず、デバイスや環境によってずれることはありません。

ぜひjQueryで実装してみてください^^