フロントの人の雑多メモ

【CSS】mix-blend-modeが効かない、デザイン通りにならないときの対処法

【CSS】mix-blend-modeが効かない、デザイン通りにならないときの対処法

CSSでスクリーンや乗算などのブレンドモード(描画モード)を指定できるプロパティ「mix-blend-mode」がデザイン通りにならないときの対処法をご紹介します。

例として、この記事では

この背景

背景

このを重ねて

車

このフレアスクリーンで重ねます。

フレア

Photoshopで「フレア」を「スクリーン」にするとこのようになります。

Photoshopでの見た目

デザイン通りにならない例

実際に「mix-blend-mode」を使って組んでみます。

まずはこちらをご覧ください。

車には正しくmix-blend-modeが効いていますが、背景画像には効いていません

HTML構造はざっくりこんな感じ。

<div class="bg">
	<!-- 背景 -->
	<img src="bg.jpg">
	<div class="cars">
		<!-- 車 -->
		<img src="img/cars.png">
		<div class="flare">
			<!-- フレア -->
			<img src="img/flare.jpg">
		</div>
	</div>
</div>

.carsというdivタグの中に、車とフレアを入れています。

そしてCSSで.flareに「mix-blend-mode」をかけています。

.flare {
	mix-blend-mode: screen;
}

CSS全体を見たい方はこちら(開く)

.bg {
	position: relative;
	overflow: hidden;
}
.cars {
	display: flex;
	justify-content: center;
	align-items: center;
	position: absolute;
	top: 10%;
	left: 10%;
	width: 80%;
	height: 80%;
	z-index: 1;
}
.flare {
	display: flex;
	justify-content: center;
	align-items: center;
	position: absolute;
	top: 10%;
	left: 10%;
	width: 80%;
	height: 80%;
	mix-blend-mode: screen;
	z-index: 2;
}

デザイン通りになる例

次にこちらをご覧ください。

デザイン通りになってると思います!

HTML構造はざっくりこんな感じ。

<div class="bg">
	<!-- 背景 -->
	<img src="bg.jpg">
	<div class="cars">
		<!-- 車 -->
		<img src="img/cars.png">
	</div>
	<div class="flare">
		<!-- フレア -->
		<img src="img/flare.jpg">
	</div>
</div>

先程と違い、背景と車とフレアを同じ階層に配置しています。(CSSは変えていません)

なぜか?

「mix-blend-mode」が効かないときはスタックコンテキストが原因かも知れません。

スタックコンテキストとは、positionにrelativeやabsoluteを使い、かつz-indexを指定したときなど、特定の条件を満たしたときに生成される階層構造のことです。

今回の場合「背景・車・フレア」が、同じスタックコンテキストに属する必要があります。

「デザイン通りにならない例」では.carsというdivタグの中に、車とフレアを入れていましたが
.carsにはabsoluteとz-indexが指定されているので、背景とは違うスタックコンテキストに属していたのです。

という訳で「mix-blend-mode」が効かない!という方は、HTML構造を変えてみたりして、要素同士が同じスタックコンテキストに属するように調整してみてください!

コメント

内容を確認の上、個人情報などは省いて掲載させていただきます。

直接送信されます。確認の上、「送信」してください。

シェア

Twitterでシェア Facebookでシェア LINEでシェア はてなブックマークでシェア