<div class="options">
<div class="option active" style="--optionBackground:url(https://cloud-static.com/gallery/1001/11.jpg);">
<div class="shadow"></div>
<div class="label">
<div class="icon">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M7.5 1.25a.75.75 0 0 1 .75.75v.5a.75.75 0 0 1-1.5 0V2a.75.75 0 0 1 .75-.75M3.08 3.08a.75.75 0 0 1 1.062 0l.216.217a.75.75 0 0 1-1.061 1.06l-.216-.216a.75.75 0 0 1 0-1.06m8.839 0a.75.75 0 0 1 0 1.061l-.216.216a.75.75 0 1 1-1.06-1.06l.215-.216a.75.75 0 0 1 1.061 0M1.25 7.5A.75.75 0 0 1 2 6.75h.5a.75.75 0 0 1 0 1.5H2a.75.75 0 0 1-.75-.75m3.108 3.143a.75.75 0 0 1 0 1.06l-.216.216a.75.75 0 0 1-1.061-1.06l.216-.216a.75.75 0 0 1 1.06 0" clip-rule="evenodd"/><path fill="currentColor" d="M16.286 22C19.442 22 22 19.472 22 16.353c0-2.472-1.607-4.573-3.845-5.338C17.837 8.194 15.415 6 12.476 6C9.32 6 6.762 8.528 6.762 11.647c0 .69.125 1.35.354 1.962a4.351 4.351 0 0 0-.83-.08C3.919 13.53 2 15.426 2 17.765C2 20.104 3.919 22 6.286 22zM9.81 5.004a3.5 3.5 0 0 0-4.426 5.322c.46-2.437 2.165-4.43 4.427-5.322"/></svg>
</div>
<div class="info">
<div class="main">@阿木Admao</div>
<div class="sub">#雨季 #小镇 #生活</div>
</div>
</div>
</div>
<div class="option" style="--optionBackground:url(https://cloud-static.com/gallery/1001/santorini-4263036_1280.jpg);">
<div class="shadow"></div>
<div class="label">
<div class="icon">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-width="1.5"><circle cx="15" cy="4" r="2"/><circle cx="6" cy="18" r="3"/><circle cx="18" cy="18" r="3"/><path stroke-linecap="round" d="M18.5 10h-2.026c-1.22 0-1.831 0-2.38-.227c-.55-.227-.983-.657-1.85-1.518l-.576-.574c-.785-.78-1.178-1.17-1.642-1.127c-.465.042-.78.497-1.411 1.406L7.388 9.727c-.642.925-.963 1.388-.835 1.843c.13.455.646.68 1.678 1.13l1.476.644c1.364.595 2.046.893 2.374 1.493c.328.6.21 1.335-.024 2.804L12 18"/></g></svg>
</div>
<div class="info">
<div class="main">@阿木Admao</div>
<div class="sub">#雨季 #小镇 #生活</div>
</div>
</div>
</div>
<div class="option" style="--optionBackground:url(https://cloud-static.com/gallery/1001/santorini-4996846_1280.jpg);">
<div class="shadow"></div>
<div class="label">
<div class="icon">
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M12.66 2.58c-.38-.33-.95-.33-1.33 0C6.45 6.88 4 10.62 4 13.8c0 4.98 3.8 8.2 8 8.2s8-3.22 8-8.2c0-3.18-2.45-6.92-7.34-11.22M7.83 14c.37 0 .67.26.74.62c.41 2.22 2.28 2.98 3.64 2.87c.43-.02.79.32.79.75c0 .4-.32.73-.72.75c-2.13.13-4.62-1.09-5.19-4.12a.75.75 0 0 1 .74-.87"/></svg>
</div>
<div class="info">
<div class="main">@Iteresuselle</div>
<div class="sub">#雨季 #小镇 #生活</div>
</div>
</div>
</div>
<div class="option" style="--optionBackground:url(https://cloud-static.com/gallery/711718052693_.pic.jpg);">
<div class="shadow"></div>
<div class="label">
<div class="icon">
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 256 256"><path fill="currentColor" d="M128 187.85a72 72 0 0 0 8 4.62V232a8 8 0 0 1-16 0v-39.53a72 72 0 0 0 8-4.62m70.1-125.26a76 76 0 0 0-140.2 0A71.71 71.71 0 0 0 16 127.8C15.9 166 48 199 86.14 200a72.2 72.2 0 0 0 33.86-7.53v-35.53l-43.58-21.78a8 8 0 1 1 7.16-14.32L120 139.06V88a8 8 0 0 1 16 0v27.06l36.42-18.22a8 8 0 1 1 7.16 14.32L136 132.94v59.53a72.2 72.2 0 0 0 32 7.53h1.82c38.18-1 70.29-34 70.18-72.2a71.71 71.71 0 0 0-41.9-65.21"/></svg>
</div>
<div class="info">
<div class="main">@Idiefe</div>
<div class="sub">#雨季 #小镇 #生活</div>
</div>
</div>
</div>
<div class="option" style="--optionBackground:url(https://cloud-static.com/gallery/671718052688_.pic.jpg);">
<div class="shadow"></div>
<div class="label">
<div class="icon">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="currentColor" d="M2 12C2 6.477 6.477 2 12 2c.463 0 .54.693.143.933a6.5 6.5 0 1 0 8.924 8.924c.24-.396.933-.32.933.143c0 1.138-.19 2.231-.54 3.25H22a.75.75 0 0 1 0 1.5H2a.75.75 0 0 1 0-1.5h.54A9.987 9.987 0 0 1 2 12m3 6.25a.75.75 0 0 0 0 1.5h14a.75.75 0 0 0 0-1.5zm3 3a.75.75 0 0 0 0 1.5h8a.75.75 0 0 0 0-1.5zM19.9 2.307a.483.483 0 0 0-.9 0l-.43 1.095a.484.484 0 0 1-.272.274l-1.091.432a.486.486 0 0 0 0 .903l1.091.432a.48.48 0 0 1 .272.273L19 6.81c.162.41.74.41.9 0l.43-1.095a.484.484 0 0 1 .273-.273l1.091-.432a.486.486 0 0 0 0-.903l-1.091-.432a.484.484 0 0 1-.273-.274z"/><path fill="currentColor" d="M16.033 8.13a.483.483 0 0 0-.9 0l-.157.399a.484.484 0 0 1-.272.273l-.398.158a.486.486 0 0 0 0 .903l.398.157c.125.05.223.148.272.274l.157.399c.161.41.739.41.9 0l.157-.4a.484.484 0 0 1 .272-.273l.398-.157a.486.486 0 0 0 0-.903l-.398-.158a.484.484 0 0 1-.272-.273z"/></svg>
</div>
<div class="info">
<div class="main">@Inatethi</div>
<div class="sub">#雨季 #小镇 #生活</div>
</div>
</div>
</div>
</div>
HTML
格式化
支持Emmet,输入 p 后按 Tab键试试吧!
<head> ... </head>
<body>
</body>
SCSS
格式化
$optionDefaultColours: #ED5565,#FC6E51,#FFCE54,#2ECC71,#5D9CEC,#AC92EC;
body {
display:flex;
flex-direction:row;
justify-content:center;
align-items:center;
overflow:hidden;
height:100vh;
font-family: 'Roboto', sans-serif;
transition:.25s;
background: #232223;
color:white;
.credit {
position: absolute;
bottom:20px;
left:20px;
color:inherit;
}
.options {
display:flex;
flex-direction:row;
align-items:stretch;
overflow:hidden;
min-width:600px;
max-width:900px;
width:calc(100% - 100px);
height:400px;
@for $i from 1 through 4 {
@media screen and (max-width:798px - $i*80) {
min-width:600px - $i*80;
.option:nth-child(#{6-$i}) {
display:none;
}
}
}
.option {
position: relative;
overflow:hidden;
min-width:60px;
margin:10px;
//border:0px solid --defaultColor;
background:var(--optionBackground, var(--defaultBackground, #E6E9ED));
background-size:auto 120%;
background-position:center;
cursor: pointer;
transition:.5s cubic-bezier(0.05, 0.61, 0.41, 0.95);
@for $i from 1 through length($optionDefaultColours) {
&:nth-child(#{$i}) {
--defaultBackground:#{nth($optionDefaultColours, $i)};
}
}
&.active {
flex-grow:10000;
transform:scale(1);
max-width:600px;
margin:0px;
border-radius:40px;
background-size:auto 100%;
.shadow {
box-shadow:inset 0 -120px 120px -120px black, inset 0 -120px 120px -100px black;
}
.label {
bottom:20px;
left:20px;
.info >div {
left:0px;
opacity:1;
}
}
/*&:active {
transform:scale(0.9);
}*/
}
&:not(.active) {
flex-grow:1;
border-radius:30px;
.shadow {
bottom:-40px;
box-shadow:inset 0 -120px 0px -120px black, inset 0 -120px 0px -100px black;
}
.label {
bottom:10px;
left:10px;
.info >div {
left:20px;
opacity:0;
}
}
}
.shadow {
position: absolute;
bottom:0px;
left:0px;
right:0px;
height:120px;
transition:.5s cubic-bezier(0.05, 0.61, 0.41, 0.95);
}
.label {
display:flex;
position: absolute;
right:0px;
height:40px;
transition:.5s cubic-bezier(0.05, 0.61, 0.41, 0.95);
.icon {
display:flex;
flex-direction:row;
justify-content:center;
align-items:center;
min-width:40px;
max-width:40px;
height:40px;
border-radius:100%;
background-color:white;
color:var(--defaultBackground);
svg {
width: 1em;
height: 1em;
}
}
.info {
display:flex;
flex-direction:column;
justify-content:center;
margin-left:10px;
color:white;
white-space: pre;
>div {
position: relative;
transition:.5s cubic-bezier(0.05, 0.61, 0.41, 0.95), opacity .5s ease-out;
}
.main {
font-weight:bold;
font-size:1.2rem;
}
.sub {
transition-delay:.1s;
}
}
}
}
}
}
JS
格式化
// 获取所有带有 .option 类的元素
var options = document.querySelectorAll('.option');
// 为每个.option元素添加点击事件监听器
options.forEach(function(option) {
option.addEventListener('click', function() {
// 移除所有 .option 元素的 'active' 类
options.forEach(function(opt) {
opt.classList.remove('active');
});
// 为当前点击的元素添加 'active' 类
this.classList.add('active');
});
});