CSS3アニメーションでつくるインターフェイス表現

第6回 画像をパネルに分けてアニメーションで切り替える

この記事を読むのに必要な時間:およそ 11.5 分

今回のお題は,画像を縦のパネルに分けて切り替えるアニメーションだ。数字のボタンを押すと,分かれたパネルが伸縮してクロスフェードするサンプル1)⁠Sliding Image Panels with CSS3の表現を参考にして,HTMLやCSSの構成を改めるとともに,とくにCSSのコードはできるかぎり絞り込んだ。仕組みがわかりやすくなるよう心がけた。

サンプル1 CSS3: Sliding image panels

画像とキャプションを切り替える

<body>要素に書くコードは,つぎのように単純な構成で始めよう。type属性を"radio"とした<input><label>の要素がボタンとなる。キャプションはh3要素の中に,<span>要素でタイトルclass属性"img-title")と説明書きclass属性"img-caption")をそれぞれ加えた。これらの<h3>要素はさらに<div>要素class属性"img-titles")に含めてある。注目してほしいのは<img>要素がないことだ。画像は空の<div>要素class属性"bg-img")にCSSで背景として加えるからだ。

<div class="container">
    <input id="select-img-1" name="radio-set-1" type="radio" checked/>
    <label for="select-img-1" class="label-img-1">1</label>
    <input id="select-img-2" name="radio-set-1" type="radio" />
    <label for="select-img-2" class="label-img-2">2</label>
    <input id="select-img-3" name="radio-set-1" type="radio" />
    <label for="select-img-3" class="label-img-3">3</label>
    <input id="select-img-4" name="radio-set-1" type="radio" />
    <label for="select-img-4" class="label-img-4">4</label>
    <div class="bg-img">
    </div>
    <div class="img-titles">
        <h3><span class="img-title">Child</span><span class="img-caption">Single emperor penguin chick</span></h3>
        <h3><span class="img-title">Adult</span><span class="img-caption">Single penguin on a piece of ice</span></h3>
        <h3><span class="img-title">Family</span><span class="img-caption">Emperor penguin with chicks</span></h3>
        <h3><span class="img-title">Children</span><span class="img-caption">Emperor penguin chicks</span></h3>
    </div>
</div>

この<body>要素の記述に対して,後に掲げるコード1<style>要素を与える。これで,ボタンを押せば画像とキャプションはとりあえず切り替わる図1)⁠ただし,切り替えの効果はまだ加えていない。

図1 ボタンで画像とキャプションが切り替わる

図1 ボタンで画像とキャプションが切り替わる

画像とキャプションが切り替わる仕組みを,先に確かめておこう。選ばれたラジオボタンtype属性"radio"の<input>要素)は,:checked擬似クラスでとれる。そこで,つぎに抜き書きしたコードのとおり,対応した画像のURLをurl()関数background-imageプロパティに定めた。

#select-img-1:checked ~ .bg-img {
    background-image: url(images/image_001.png);
}
#select-img-2:checked ~ .bg-img {
    background-image: url(images/image_002.png);
}
#select-img-3:checked ~ .bg-img {
    background-image: url(images/image_003.png);
}
#select-img-4:checked ~ .bg-img {
    background-image: url(images/image_004.png);
}

キャプションの要素class属性"img-title"と"img-caption")は,つぎのように初めはすべてopacityプロパティで透明にしておく。そして,やはり選ばれたラジオボタンに応じたキャプションの<h3>要素を一般兄弟(間接)セレクタ~:nth-child()擬似クラスで取り出して不透明にすればよい。

.img-title, .img-caption {

    opacity: 0;

}

#select-img-1:checked ~ .img-titles h3:nth-child(1) span,
#select-img-2:checked ~ .img-titles h3:nth-child(2) span,
#select-img-3:checked ~ .img-titles h3:nth-child(3) span,
#select-img-4:checked ~ .img-titles h3:nth-child(4) span {
    opacity: 1;
}

<style>要素の定めは,つぎのコード1にまとめたとおりだ。なお,CSSにベンダープレフィックスを付けなくて済むように,<script>要素で-prefix-freeを読み込んでいる(第1回のベンダープレフィックスと-prefix-freeの項参照)⁠また,Google FontsのOswaldを使った(第5回のGoogle Fontsと回り込みの解除参照)⁠

コード1 ボタンのクリックで画像とキャプションを切り替える

<script src="lib/prefixfree.min.js" type="text/javascript"></script>
<link href="https://fonts.googleapis.com/css?family=Oswald:400,700" rel="stylesheet" type="text/css">
<style>
body {
    font-family: "Palatino Linotype", "Book Antiqua", Palatino, serif;
    background: aliceblue;
}
.container {
    width: 400px;
    height: 267px;
    position: relative;
    margin: 0 auto;
    text-align: center;
    border: 15px solid white;
    box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.1);
}
.container label {
    font-style: italic;
    width: 100px;
    height: 30px;
    cursor: pointer;
    color: white;
    line-height: 24px;
    font-size: 20px;
    float: left;
    position: relative;
    margin-top: 230px;
    z-index: 100;
}
.container label::before {
    content: '';
    width: 24px;
    height: 24px;
    background: rgba(135, 206, 235, 0.9);
    position: absolute;
    left: 50%;
    margin-left: -12px;
    border-radius: 50%;
    box-shadow: 0px 0px 0px 4px rgba(255, 255, 255, 0.3);
    z-index: -1;
}
.container label:after {
    content: '';
    width: 1px;
    height: 267px;
    background: linear-gradient(to bottom, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1));
    position: absolute;
    bottom: -20px;
    right: 0px;
}
.container input {
    display: none;
}
.bg-img {
    width: 400px;
    height: 267px;
    position: absolute;
}
#select-img-1:checked ~ .bg-img {
    background-image: url(images/image_001.png);
}
#select-img-2:checked ~ .bg-img {
    background-image: url(images/image_002.png);
}
#select-img-3:checked ~ .bg-img {
    background-image: url(images/image_003.png);
}
#select-img-4:checked ~ .bg-img {
    background-image: url(images/image_004.png);
}
.img-title, .img-caption {
    font-weight: normal;
    color: white;
    z-index: 100;
    position: absolute;
    width: 100%;
    left: 0px;
    opacity: 0;
    top: 90px;
}
.img-title {
    left: 0px;
    font-family: "Oswald", sans-serif;
    font-size: 48px;
    letter-spacing: 3px;
}
.img-caption {
    margin-top: 100px;
    letter-spacing: 0px;
    background: rgba(130, 195, 217, 0.9);
    font-size: 14px;
    padding: 4px 0px;
    font-style: italic;
}
#select-img-1:checked ~ .img-titles h3:nth-child(1) span,
#select-img-2:checked ~ .img-titles h3:nth-child(2) span,
#select-img-3:checked ~ .img-titles h3:nth-child(3) span,
#select-img-4:checked ~ .img-titles h3:nth-child(4) span {
    opacity: 1;
}
</style>

著者プロフィール

野中文雄(のなかふみお)

ソフトウェアトレーナー,テクニカルライター,オーサリングエンジニア。上智大学法学部卒,慶応義塾大学大学院経営管理研究科修士課程修了(MBA)。独立系パソコン販売会社で,総務・人事,企画,外資系企業担当営業などに携わる。その後,マルチメディアコンテンツ制作会社に転職。ソフトウェアトレーニング,コンテンツ制作などの業務を担当する。2001年11月に独立。Web制作者に向けた情報発信プロジェクトF-siteにも参加する。株式会社ロクナナ取締役(非常勤)。

URLhttp://www.FumioNonaka.com/

著書

コメント

コメントの記入