这是一款js和CSS网格变换图片画廊特效。该图片画廊使用响应式网格布局,当用户点击小网格中的图片时,它会被以动画的方式移动到大网格上进行展示,效果非常炫酷。
使用方法
HTML代码
<fieldset id="gallery" class="hub">
<div>
<input type="radio" id="image-1" name="gallery" value="image-1" checked>
<img src="./img/1.jpg" alt="" />
<label for="image-1">Cyber Wolf</label>
</div>
<div>
<input type="radio" id="image-2" name="gallery" value="image-2">
<img src="./img/2.jpg" alt="" />
<label for="image-2">Flying cars</label>
</div>
<div>
<input type="radio" id="image-3" name="gallery" value="image-3">
<img src="./img/3.jpg" alt="" />
<label for="image-3">Flying cars 2</label>
</div>
<div>
<input type="radio" id="image-4" name="gallery" value="image-4">
<img src="./img/4.jpg" alt="" />
<label for="image-4">Flying cars 3</label>
</div>
<div>
<input type="radio" id="image-5" name="gallery" value="image-5">
<img src="./img/5.jpg" alt="" />
<label for="image-5">Cyber T-Rex</label>
</div>
<div>
<input type="radio" id="image-6" name="gallery" value="image-6">
<img src="./img/6.jpg" alt="" />
<label for="image-6">Cyber Raptor</label>
</div>
<div>
<input type="radio" id="image-7" name="gallery" value="image-7">
<img src="./img/7.jpg" alt="" />
<label for="image-7">Cyber freeway</label>
</div>
</fieldset>
CSS代码
@import "https://unpkg.com/open-props/easings.min.css";
@layer demo.view-transition {
::view-transition-group(*) {
animation-duration: .5s;
animation-timing-function: var(--ease-5);
}
.hub > * {
@media (prefers-reduced-motion: no-preference) {
&:nth-child(1) {
view-transition-name: gallery-item-1;
}
&:nth-child(2) {
view-transition-name: gallery-item-2;
}
&:nth-child(3) {
view-transition-name: gallery-item-3;
}
&:nth-child(4) {
view-transition-name: gallery-item-4;
}
&:nth-child(5) {
view-transition-name: gallery-item-5;
}
&:nth-child(6) {
view-transition-name: gallery-item-6;
}
&:nth-child(7) {
view-transition-name: gallery-item-7;
}
}
}
@layer demo.layout {
.hub {
display: grid;
gap: 1rem;
grid-template-columns: repeat(5, 15vw);
grid-template-rows: repeat(3, 15vw);
&.portrait {
grid-template-columns: repeat(3, 20vw);
grid-template-rows: repeat(5, 20vw);
}
/* selected promotion */
> :has(:checked) {
grid-column: 1 / 4;
grid-row: 1 / 4;
}
/* pile the label, input and image */
> * {
display: grid;
> * {
grid-area: 1/1;
}
> label {
opacity: 0;
cursor: pointer;
-webkit-tap-highlight-color: transparent;
}
> input {
border-radius: 0;
outline-offset: 5px;
outline-color: deeppink;
outline-color: color(display-p3 1 0 1);
}
}
}
}
@layer demo.support {
* {
box-sizing: border-box;
margin: 0;
}
html {
block-size: 100%;
color-scheme: dark light;
}
body {
min-block-size: 100%;
font-family: system-ui, sans-serif;
display: grid;
place-content: center;
}
fieldset {
border: none;
padding: 0;
margin: 0;
}
img {
max-inline-size: 100%;
}
html {
view-transition-name: none;
}
}