はじめに
この実験では、垂直スクロール機能を持つシンプルな画像ギャラリーを作成することで、CSS プログラミングの基本を学びます。flexbox と scroll-snap プロパティを使って、スムーズなスクロール効果を実現し、スクロールバーを非表示にし、スクロールバーのつまみをスタイルする方法を学びます。この実験を終えるころには、CSS を使ってレスポンシブでインタラクティブなウェブデザインを作成する方法をより深く理解することができるでしょう。
これは Guided Lab です。学習と実践を支援するためのステップバイステップの指示を提供します。各ステップを完了し、実践的な経験を積むために、指示に注意深く従ってください。過去のデータによると、この 中級 レベルの実験の完了率は 75%です。学習者から 100% の好評価を得ています。
垂直スクロール付き画像ギャラリー
index.html と style.css はすでに仮想マシン (VM) 内に用意されています。
このコードは、水平方向にスクロール可能な画像ギャラリーを作成します。以下の手順が行われます。
- コンテナのレイアウトは
display: flexとjustify-content: centerを使用して設定されます。 - スライドのレイアウトは
display: flexとflex-direction: columnを使用して設定されます。 scroll-snap-type: y mandatoryとoverscroll-behavior-y: containを使用して、垂直スクロール時にスナップ効果を作成します。scroll-snap-align: startを使用して要素をコンテナの先頭にスナップさせます。scrollbar-width: noneを使用し、疑似要素::-webkit-scrollbarをdisplay: noneとスタイル設定することで、スクロールバーを非表示にします。Element.scrollTo()を使用してscrollToElement関数を定義し、ギャラリーを指定されたアイテムまでスクロールさせます。.thumbnails要素はArray.prototype.map()とArray.prototype.join()を使用して作成されます。各サムネイルには画像のインデックスを持つdata-id属性が付与されます。Document.querySelectorAll()、Array.prototype.forEach()、EventTarget.addEventListener()およびscrollToElement関数を使用して、各サムネイルに'click'イベントのハンドラーを登録します。Document.querySelector()とEventTarget.addEventListener()を使用して'scroll'イベントのハンドラーを登録します。scrollThumb関数を使用して、.thumbnailsと.scrollbar要素を現在のスクロール位置に合わせて更新します。
HTML:
<div class="gallery-container">
<div class="thumbnails"></div>
<div class="scrollbar">
<div class="thumb"></div>
</div>
<div class="slides">
<div><img src="https://picsum.photos/id/1067/540/720" /></div>
<div><img src="https://picsum.photos/id/122/540/720" /></div>
<div><img src="https://picsum.photos/id/188/540/720" /></div>
<div><img src="https://picsum.photos/id/249/540/720" /></div>
<div><img src="https://picsum.photos/id/257/540/720" /></div>
<div><img src="https://picsum.photos/id/259/540/720" /></div>
<div><img src="https://picsum.photos/id/283/540/720" /></div>
<div><img src="https://picsum.photos/id/288/540/720" /></div>
<div><img src="https://picsum.photos/id/299/540/720" /></div>
</div>
</div>
CSS:
.gallery-container {
display: flex;
justify-content: center;
}
.thumbnails {
display: flex;
flex-direction: column;
gap: 8px;
}
.thumbnails img {
width: 40px;
height: 40px;
cursor: pointer;
}
.scrollbar {
width: 1px;
height: 720px;
background: #ccc;
display: block;
margin: 0 0 0 8px;
}
.thumb {
width: 1px;
position: absolute;
height: 0;
background: #000;
}
.slides {
margin: 0 16px;
display: grid;
grid-auto-flow: row;
gap: 1rem;
width: calc(540px + 1rem);
padding: 0 0.25rem;
height: 720px;
overflow-y: auto;
overscroll-behavior-y: contain;
scroll-snap-type: y mandatory;
scrollbar-width: none;
}
.slides > div {
scroll-snap-align: start;
}
.slides img {
width: 540px;
object-fit: contain;
}
.slides::-webkit-scrollbar {
display: none;
}
JavaScript:
const slideGallery = document.querySelector(".slides");
const slides = slideGallery.querySelectorAll("div");
const scrollbarThumb = document.querySelector(".thumb");
const slideCount = slides.length;
const slideHeight = 720;
const marginTop = 16;
const scrollThumb = () => {
const index = Math.floor(slideGallery.scrollTop / slideHeight);
scrollbarThumb.style.height = `${((index + 1) / slideCount) * slideHeight}px`;
};
const scrollToElement = (el) => {
const index = parseInt(el.dataset.id, 10);
slideGallery.scrollTo(0, index * slideHeight + marginTop);
};
document.querySelector(".thumbnails").innerHTML += [...slides]
.map(
(slide, i) => `<img src="${slide.querySelector("img").src}" data-id="${i}">`
)
.join("");
document.querySelectorAll(".thumbnails img").forEach((el) => {
el.addEventListener("click", () => scrollToElement(el));
});
slideGallery.addEventListener("scroll", (e) => scrollThumb());
scrollThumb();
右下隅にある「Go Live」をクリックして、ポート 8080 でウェブサービスを起動してください。その後、Web 8080 タブを更新すると、ウェブページをプレビューできます。
まとめ
おめでとうございます!垂直スクロール付き画像ギャラリーの実験を完了しました。LabEx でさらに多くの実験を行い、スキルを向上させることができます。