Как правильнее сверстать подобный блок?
В макете есть блок с карточками и таким эффектом при наведении
Я сверстал его на flex-box таким образом:
html
<div class="works__items-row">
<a class="works__item" href="">
<img class="works__item-img" src="./images/works/01.png" alt="">
</a>
<a class="works__item" href="">
<img class="works__item-img" src="./images/works/01.png" alt="">
</a>
class="works__items-row">
<a class="works__item" href="">
<img class="works__item-img" src="./images/works/01.png" alt="">
</a>
<a class="works__item" href="">
<img class="works__item-img" src="./images/works/01.png" alt="">
</a>
</div>
scss:
.works {
&__items-row {
display: flex;
flex-direction: row;
overflow: hidden;
}
&__item {
flex-basis: 25%;
max-width: $base * 120;
max-height: $base * 120;
background-color: $accent;
background-image: url("../images/works/icon.svg");
background-repeat: no-repeat;
background-position: center center;
}
&__item-img {
flex: $base*120;
max-width: 100%;
max-height: 100%;
object-fit: cover;
transition: all .5s;
&:hover {
opacity: .6;
}
}
}
Но мне кажется, что вот так задавать works__item задний фон и управлять прозрачностью картинки решение слишком негибкое. Допустим, я захочу добавить вторую иконку скажем с лайками или количеством комментариев к работе и не смогу это сделать. Как в таком случае мне нужно переделать верстку?
Ответы (2 шт):
Автор решения: yourBadApple
→ Ссылка
.works__item {
position: relative;
}
.works__item-img {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 2;
}
.layer {
position: absolute;
opacity: 0;
z-index: 3;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.works__item:hover .layer {
opacity: 1;
}
.eye-icon {
background-image: url("../images/works/icon.svg");
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%;
-50%);
}
<a class="works__item" href="">
<div class="layer"><span class="eye-icon"></span></div>
<img class="works__item-img" src="./images/works/01.png" alt="">
</a>
Автор решения: De.Minov
→ Ссылка
Я бы выполнил следующим образом.
.works {
display: flex;
flex-direction: row;
flex-wrap: wrap;
width: 100%;
}
.works .works__item {
display: block;
width: calc(100% / 4); /* Т.е. 4 блока по ширине */
position: relative;
/* Уберём действия ссылки */
color: inherit;
text-decoration: none;
cursor: pointer;
}
.works .works__item::before { /* Хак, чтобы блок был квадратный пропорционально */
content: '';
display: block;
width: 100%;
height: 0;
padding-top: 100%;
z-index: -1;
}
.works .works__item img,
.works .works__item::after {
display: block;
width: 100%;
height: 100%;
position: absolute;
left: 0;
top: 0;
}
.works .works__item::after {
content: '';
background: rgba(51,71,119,.65) url('//i.imgur.com/LCgqjSx.png') no-repeat center center / 2em auto;
opacity: 0;
z-index: 2;
transition: opacity .2s ease;
}
.works .works__item:hover::after {
opacity: 1;
}
.works .works__item img {
object-fit: cover;
z-index: 1;
}
<div class="works">
<a class="works__item" href="#">
<img class="works__item-img" src="//i.imgur.com/QbUlKak.png">
</a>
<a class="works__item" href="#">
<img class="works__item-img" src="//i.imgur.com/fXOr4pR.png">
</a>
<a class="works__item" href="#">
<img class="works__item-img" src="//i.imgur.com/QbUlKak.png">
</a>
<a class="works__item" href="#">
<img class="works__item-img" src="//i.imgur.com/fXOr4pR.png">
</a>
<a class="works__item" href="#">
<img class="works__item-img" src="//i.imgur.com/fXOr4pR.png">
</a>
<a class="works__item" href="#">
<img class="works__item-img" src="//i.imgur.com/QbUlKak.png">
</a>
<a class="works__item" href="#">
<img class="works__item-img" src="//i.imgur.com/fXOr4pR.png">
</a>
<a class="works__item" href="#">
<img class="works__item-img" src="//i.imgur.com/QbUlKak.png">
</a>
</div>
