最終更新日
記事公開日

【CSSアニメーション】2つ重ねた画像を両方ともクロスフェード

お客さん

ちょっとおしゃれなデザインにしたいから、2つの画像フレームが少しだけ重なるようなレイアウトにしたいの。

ついでに、その画像フレームの中の写真が次々にフェードエフェクトで切り替わるようにしたいんだけど、どうすればいい?

隊員1号

了解です!

CSSアニメーションを使用した方法をご紹介します↓

【CSSアニメーション】2つ重ねた画像を同時にクロスフェード

SAMPLE

/* -----------------------------------------------------
              フレーム
----------------------------------------------------- */
#flame {
	width:640px;
	height:480px;
	background:#eee;
	position:relative;
}
#lf {
	position:absolute;
	top:0;
	left:0;
	width:70%; /* 448px */
	padding-bottom:46.7%; /* 299px */
	z-index:30;
	overflow:hidden;
}
#rf {
	position:absolute;
	bottom:0;
	right:0;
	width:60%; /* 384px */
	padding-top:40%; /* 256px */
	z-index:20;
}

/* -----------------------------------------------------
     アニメーション(左)画像3枚
----------------------------------------------------- */
.lf_fead {
	list-style-type:none;
	margin:0;
	padding:0;
}
.lf_fead li {
	position:relative;
}
.lf_fead li img {
	position:absolute;
	top:0;
	left:0;
	max-width:100%;
	vertical-align:bottom;
}
.lf_fead li:nth-child(n+2) img {
	animation-duration:12s;
	animation-timing-function:ease-in;
	animation-iteration-count:infinite;
	animation-delay:0s;
	opacity:0;
}
.lf_fead li:nth-child(2) img {
	animation-name:lfmt2;
}
.lf_fead li:nth-child(3) img {
	animation-name:lfmt3;
}
.lf_fead li:nth-child(4) img {
	animation-name:lfmt4;
}

@keyframes lfmt2 {

	20% {
		opacity:0;
	}
	25% {
		opacity:1;
	}
	100% {
		opacity:1;
	}
}
@keyframes lfmt3 {

	55% {
		opacity:0;
	}
	60% {
		opacity:1;
	}
	100% {
		opacity:1;
	}

}
@keyframes lfmt4 {

	90% {
		opacity:0;
	}
	95% {
		opacity:1;
	}
	100% {
		opacity:1;
	}

}

/* -----------------------------------------------------
     アニメーション(右)画像2枚
----------------------------------------------------- */
.rf_fead {
	list-style-type:none;
	margin:0;
	padding:0;
}
.rf_fead li {
	position:relative;
}
.rf_fead li img {
	position:absolute;
	bottom:0;
	right:0;
	max-width:100%;
	vertical-align:bottom;
}
.rf_fead li:nth-child(n+2) img {
	animation-duration:6s;
	animation-timing-function:ease-in;
	animation-iteration-count:infinite;
	animation-delay:0.5s;
	opacity:0;
}
.rf_fead li:nth-child(2) img {
	animation-name:rfmt2;
}
.rf_fead li:nth-child(3) img {
	animation-name:rfmt3;
}

@keyframes rfmt2 {

	20% {
		opacity:0;
	}
	40% {
		opacity:1;
	}
	100% {
		opacity:1;
	}

}
@keyframes rfmt3 {

	70% {
		opacity:0;
	}
	90% {
		opacity:1;
	}
	100% {
		opacity:1;
	}

}
<html>
<body>

	<div id="flame">

		<!-- 左フレーム -->
		<ul id="lf" class="lf_fead">
		<li><img src="./image/momo.jpg"></li>
		<li><img src="./image/muscat.jpg"></li>
		<li><img src="./image/nasi.jpg"></li>
		<li><img src="./image/momo.jpg"></li>
		</ul>

		<!-- 右フレーム -->
		<ul id="rf" class="rf_fead">
		<li><img src="./image/melon.jpg"></li>
		<li><img src="./image/pine.jpg"></li>
		<li><img src="./image/melon.jpg"></li>
		</ul>

	</div>
	
</body>
</html>

※エフェクトの関係上、最後の画像は一枚目と同じ画像を差し込む必要があるのでご注意ください。

画像を一ヵ所に重ねて、アニメーションで一枚ずつ非表示→表示としているだけの仕組みです。

あえてバラバラに動くようにアニメーションの開始時間をずらしてあります。

CSSもフレームごとに分けて作成していますので、構成は分かりやすいかと思います。

ぜひ、色々いじってみてください。

この記事のURLをコピー

メールアドレスは公開されませんのでご安心ください。また、* が付いている欄は必須項目となります。

内容に問題なければ、下記の「コメントを送信する」ボタンを押してください。

関連情報

運営者プロフィール
運営者のプロフィール画像
隊員1号

IT系フリーランスとして10年の経験を持つレスキュー隊。HTML・CSS・JS・PHPなど幅広いスキルを持つ。

詳しいプロフィール