イラストアルバムだけをご覧になりたい方は目次に★マークが付いている部分をタップしてください。
すぐにジャンプできますよ!
昨今のAI学習に伴う騒動は、多くの人に個人でWebサイトを持つ可能性について議論を呼び起こしました。
ただ、AI学習から逃げるためだけではなく、せっかくなら楽しいデザインを盛り込めると良いと思います。
このJavaScriptによる画像アルバムはイラストや画像化された小説などを綺麗に陳列できることに加えて、クローラーも避けやすいです。
JavaScriptを理解するのが難しいクローラーもいるので、多少なら検索除けの効果も期待できるということです。
でも見る人にとっては楽しいものですから、一石二鳥かもしれない。
ここでは、実際のイラストアルバムをお見せしつつ、html・css・JavaScriptの順番でコードをお見せします。
同時にコードの解説も加えていきます。
イラストを並べると言ってもいろんな形があると思うんですよね。
1枚1枚掲示してギャラリー風にしても良いでしょう。
その一方で、こうやってアルバムを陳列すれば、多数の画像を省スペースに並べることができます。
では、そろそろ本題に移りますね。
まずは完成品の提示です。
これはイラストレーターのKyabia様による画像をアルバム化したものです。
「前のページ」と「次のページ」を押すと、アニメーションとともに画像が切り替わるようになっています。
アニメーションの見せ方はいろいろありますが、あまり凝ったものにしても煩わしさを感じさせてしまいます。
気付くか気付かないか程度に、さらりと動かす方が私は好きかな。
このHTML構造は画像をページ単位で切り替えるアルバムを作成するための土台です。
ボタンをタップすると、JavaScriptによって表示される画像が切り替わります。
そんなに難しいものではないので、ちょっとhtmlコードをご覧ください。
イラストアルバムを作るhtml
<div class="feinalbum-container" id="feinalbum3">
<div class="feinalbum">
<div class="feinalbum-page">
<img src="/paint/フィーネa.jpg" alt="Image 3">
</div>
<div class="feinalbum-page">
<img src="/paint/フィーネb.jpg" alt="Image 4">
</div>
<div class="feinalbum-page">
<img src="/paint/フィーネc.jpg" alt="Image 4">
</div>
</div>
<button class="feinalbum-prev">前のページ</button>
<button class="feinalbum-next">次のページ</button>
</div>
このコードが何を意味しているのか、簡単にHTMLの説明をしてみます。
一つのアルバムに格納するイラスト数はどれくらいでしょうね?
感覚的なものも大きいですが、私としては多くても10枚くらいが適切かと思います。
それでも10冊のアルバムを並べれば、100枚のイラストを1つのWebページに展示できるのですよ。
そして個人サイトのページ数を10とするなら、合計で1000枚のイラストを、いとも簡単にAI除けしつつ展示できることになります。
手間を惜しまないのであれば、全ての画像にウォーターマークを付けてあげればさらに良いですね。
これはSEOとも深く関わってくるので、すぐに回答が出るようなものではないでしょう。
でも、次のような工夫をすることで、イラストを守りつつ検索エンジンに対処することも、可能かと思いますよ?
これらに加えて、相互リンクなどもやっていただければ。
ただ検索エンジンに引っかかっては困る二次創作もあるでしょうから、一概には言えませんよね。
こちらもイラストレーターのKyabia様による画像をアルバム化したものです。
他に画像の展示はどんなアイデアがありますかね?
マジでリアルの個展会場のような室内を演出するという手もあり、それはCSSで実現可能です。
ただ、レスポンシブデザインにする必要があるので、横への広がりに工夫が必要かと。
同じイラストギャラリーでも、見せ方がひと味違うと、それだけでも注目を集めることができるでしょう。
このCSSが既に長い…いきなりチャレンジするというより、個人のポートフォリオサイトや簡単なブログを作ることから始めてみると良いですよね。
「ハンズオンプロジェクト」などと呼ばれるのですが、実際にコーディングしてみることが最も効果的です。
簡単な文字装飾から始め、徐々に難易度を上げていくと挫折を防げます。
デザインの模写も素晴らしい練習方法です。
好きなサイトやインスピレーションを得たデザインを自分で再現してみるのです。
この過程で、実際のWeb制作で使われているテクニックを学ぶことができます。
って…あれ?
これはイラスト上達への道と似たような側面があるかも…
とりあえず、このアルバムのCSSを見てみましょうか。
イラストアルバムを作るalbum.css
.feinalbum-container {
margin: 20px;
text-align: center;
}
.feinalbum {
width: 100%;
max-width: 600px;
height: 0;
padding-bottom: 75%;
perspective: 1000px;
position: relative;
overflow: hidden;
margin: auto;
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
border: 1px solid #dcdcdc;
border-radius: 5px;
background-color: #f8f8f8;
}
.feinalbum-page {
width: 100%;
height: 100%;
position: absolute;
backface-visibility: hidden;
transition: transform 0.8s ease-in-out, box-shadow 0.8s ease-in-out;
display: flex;
align-items: center;
justify-content: center;
transform-style: preserve-3d;
background-color: #ffffff;
border: 1px solid #e0e0e0;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
border-radius: 5px;
transform-origin: center;
}
.feinalbum-page-hidden {
transform: rotateY(-150deg) scale(0.98);
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
}
.feinalbum-page img {
width: 95%;
height: auto;
object-fit: contain;
}
button {
margin: 10px;
padding: 8px 12px;
border: none;
background-color: #7FDBB6;
color: #4B3E3E;
font-size: 14px;
cursor: pointer;
border-radius: 5px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
transition: background-color 0.3s, transform 0.3s;
}
button:hover {
background-color: #65C9A9;
transform: translateY(-2px);
}
button:active {
background-color: #4CB38B;
transform: translateY(0);
}
.feinalbum-hidden {
display: none;
}
.feinalbumcontainer
このクラスはアルバム全体を包む外枠に適用されています。
.feinalbum
アルバムの本体部分に適用されます。
width 100%
で幅をコンテナ全体に広げますが、maxwidth 600px
で幅の最大値を600ピクセルに制限しています。height 0
とpaddingbottom 75%
で高さを0にしてアスペクト比を設定し、画面幅に応じた高さを確保しています。.feinalbumpage
各ページに適用されるクラスです。
まずはwidth 100%
とheight 100%
でページの幅と高さを設定します。
.feinalbumpagehidden
このクラスはページが見えなくなるときに適用されます。
.feinalbumpage img
ページ内の画像に適用されるクラスです。
button
ページ移動ボタンに適用されるクラスです。
buttonhover
ボタンにマウスが乗ったときのスタイルを設定します。
buttonactive
ボタンがクリックされたときのスタイルを設定します。
.feinalbumhidden
このクラスは表示されないページに適用されます。
display none
でページを非表示にします。
3D効果を付けるために使われるCSSプロパティです。
このプロパティは、3D空間内の要素の視点の深さ、つまり「視覚的な距離」を設定します。
簡単に仕様を説明しましょうか。
perspectiveの書き方
.container {
perspective: 1000px;
}
この例では、containerクラスが持つ要素に3D効果を付けるための視点の深さを1000ピクセルに設定しています。
この視点の深さにより、要素が回転したときに奥行き感が強調されます。
イラストアルバムのperspective
前述のように「perspective: 1000px」というCSSプロパティは、3D効果を付けるために使われています。
この値は「視点の深さ」を設定していることも書きました。
1000pxという大きな数字にする理由は、視点の深さを広く取ることで、3D効果がより自然に見えるようにするためです。
視点の深さが大きいと、3D効果がやや控えめで、奥行き感が自然になります。
逆に、視点の深さを小さくすると、3D効果が強調され、オブジェクトが急激に遠近感を感じさせるようになります。
例えば、視点の深さを500pxに設定した場合、回転や移動がより極端に感じられ、ページの回転が強く見えるかも?
感じ方の違いかな…
とりあえず私は視点の深さを1000pxにすることが多いけど、これだと少し緩やかで自然な3D効果に見えるのです。
やたらと親子関係を作ったりすると難解になってきますが、1行1行でフォントやカラー、奥行きなどを順番に設定しているだけです。
英数字ばかりのプログラミングみたいな画面を見るとうんざりしちゃうかもしれないけど、一つ一つは単純なんですよ?
こちらはイラストレーターの御堂りく様による画像をアルバム化したものです。
ここだな…どうしようかな…
JavaScriptですよ。
私も学生時代はさんざん悩んだからね。
今でも悩むことはありますが、多くは学生時代に自分が残したコードを使っているから、大幅な時間短縮ができているだけです。
このサイトのコードを持って行っても良いですよ?
御自身のサイトのディレクトリに合わせてコードを変更して頂ければ、よほど独特な環境でない限りは動作すると思います。
このコードはイラストアルバムのページを切り替える仕組みを作っています。
とてもシンプルに説明すると、こんな感じですよ。
まずはコードを書かず、日本語での説明チャレンジです。
つまり、このコードはユーザーが「前へ」や「次へ」ボタンをクリックしたときに、アルバムのページをスムーズに切り替えるための仕組みを作っているということになります。
では、実際のJavaScriptをご覧ください。
イラストアルバムを作るalbum.js
function setupFeinalbum(albumId) {
let currentPage = 0;
const album = document.getElementById(albumId);
const pages = album.querySelectorAll('.feinalbum-page');
const prevButton = album.querySelector('.feinalbum-prev');
const nextButton = album.querySelector('.feinalbum-next');
prevButton.addEventListener('click', () => {
showPage(currentPage - 1);
});
nextButton.addEventListener('click', () => {
showPage(currentPage + 1);
});
function showPage(index) {
if (index < 0 || index >= pages.length) return;
pages[currentPage].classList.add('feinalbum-page-hidden');
setTimeout(() => {
pages[currentPage].classList.add('feinalbum-hidden');
currentPage = index;
pages[currentPage].classList.remove('feinalbum-hidden');
setTimeout(() => {
pages[currentPage].classList.remove('feinalbum-page-hidden');
adjustImageSize(pages[currentPage]);
}, 50);
}, 600);
}
function adjustImageSize(page) {
const img = page.querySelector('img');
img.style.width = '100%';
img.style.height = '100%';
img.style.objectFit = 'contain';
img.style.objectPosition = 'center';
}
pages.forEach((page, index) => {
if (index !== currentPage) {
page.classList.add('feinalbum-page-hidden');
page.classList.add('feinalbum-hidden');
} else {
page.classList.remove('feinalbum-hidden');
adjustImageSize(page);
}
});
showPage(0);
}
document.addEventListener('DOMContentLoaded', () => {
const albumContainers = document.querySelectorAll('.feinalbum-container');
albumContainers.forEach((container, index) => {
setupFeinalbum(`feinalbum${index + 1}`);
});
});
ざざーっと、コードを説明しましょうか。
1行ずつ説明文を付けたつもりですが、ループ処理の部分はかえって分かりにくいかも?
ここまで紹介してきたhtml・css・JavaScriptは、クラスやIDという目印みたいなものを使って、相互に連携して動いています。
htmlのクラスやIDを見て、cssはデザインを行い、JavaScriptは動きをコントロールしている。
それらがエラーなく動作してこそ、イラストアルバムが綺麗に動作します。
特にCSSの部分を調整して頂ければ、見た目の印象を大きく変えることもできますよ。
ボタンの大きさを変えるとかね?
最後に、これらのイラストを譲ってくださったKyabia様、御堂りく様、本当にありがとうございました。
この場を借りて、御礼申し上げます。
アナザーエデンの強敵戦やストーリーコンテンツのリスト、お勧めバッジなどを掲載したコーナーです。
期間限定のない普通のRPGですので、初心者でも安心して続けていけるゲームとなっています。
もっとも重要なグラスタについては、場所別に網羅した表があります。
個人でウェブサイトを作るにはどうすればいいか。
HTML・CSS・JavaScriptの書き方はもちろん、無料かつ広告なしでホームページを作る方法を掲載したコーナーです。
Webデザインやレイアウトについても書いてあります。
ゲームとパソコンだけじゃなく、アウトドアも趣味なんです。
このコーナーでは魚釣りの記録とか、魚料理のレシピ、はたまたサイクリングなどなど。
アウトドアに関連するコンテンツが詰め込まれています。