告诉我,我怎样才能像这个视频一样重复块外观的效果?
目前我有这样的事情。
外观是通过 clip-path 属性实现的。我想不出复制溶解效果的方法。
当您单击缩略图时,滑块本身会打开部分,而不仅仅是图片。那些。你戳一个缩影,里面有一段内容。
这是我的 HTML
<body>
<div class="men-block">
<img src="img/slider/men.png" alt="#">
</div>
<div class="wrapper" id="content">
<div class="wrap" id="slider">
<div class="images">
<div class="pict">
<div class="list" style="background-image: url(img/slider/1.jpg); background-position: top center; background-size: cover;" id="_0"></div>
</div>
<div class="pict">
<div class="list" style="background-image: url(img/slider/2.jpg); background-position: top center; background-size: cover;" id="_1"></div>
</div>
<div class="pict">
<div class="list" style="background-image: url(img/slider/3.jpg); background-position: top center; background-size: cover;" id="_2"></div>
</div>
<div class="pict">
<div class="list" style="background-image: url(img/slider/1.jpg); background-position: top center; background-size: cover;" id="_3"></div>
</div>
</div>
</div>
<!-- /.wrap -->
</div>
<!-- /.wrapper -->
<div class="sections">
<section class="item open" id="one" data-bg="url(img/slider/1.jpg)" data-id="_0"></section>
<!-- /.one -->
<section class="item close sec" data-bg="url(img/slider/2.jpg)" data-id="_1">
</section>
<!-- /.one -->
<section class="item close sec" data-bg="url(img/slider/3.jpg)" data-id="_2"></section>
<!-- /.one -->
<section class="item close sec" data-bg="url(img/slider/1.jpg)" data-id="_3"></section>
<!-- /.one -->
</div>
<!-- /.sectios -->
</body>
这是我的scss:
body {
position: relative;
}
.wrapper {
z-index: 5;
}
.wrap {
width: 100%;
}
.item {
background-position: center;
background-repeat: no-repeat;
background-size: cover;
-webkit-clip-path: circle(13.9% at 50% 50%);
clip-path: circle(13.9% at 50% 50%);
}
.sec {
height: 100vh;
width: 100vw;
position: absolute;
top: 0;
}
#one {
background-image: url(../img/slider/1.jpg);
height: 100vh;
-webkit-clip-path: circle(70.9% at 50% 50%);
clip-path: circle(70.9% at 50% 50%);
}
.close {
opacity: 0;
z-index: 1;
}
.shadow{
box-shadow: 0 0 16px 16px white inset;
-webkit-border-radius: 20px;
-moz-border-radius: 20px;
border-radius: 20px;
}
.sections {
min-height: 100vh;
background-size: cover;
background-position: center;
}
.slider {
z-index: 10;
overflow: auto;
white-space: nowrap;
}
.list {
display: inline-block;
margin-left: 8rem;
margin-right: 8rem;
width: 30rem;
height: 35rem;
border-radius: 1rem;
opacity: 0.9;
&:hover {
cursor: pointer;
}
}
.men-block {
position: absolute;
bottom: -50px;
left: 30%;
z-index: 10;
width: 150px;
img{
width: 100%;
}
}
.cut-wrap{
position: relative;
height: 500px;
margin-top: 200px;
}
#content {
position: absolute;
right: -5%;
top: 22.5%;
height: 500px;
width: 1000px;
}
#slider{
width: 100%;
height: 100%;
position: relative;
overflow:hidden;
-webkit-transition: transform 1.5s;
-moz-transition: transform 1.5s;
-ms-transition: transform 1.5s;
-o-transition: transform 1.5s;
transition: transform 1.5s;
}
#slider .left,.right{
width: 50px;
height: 50px;
box-sizing: border-box;
position: absolute;
top:40%;
cursor: pointer;
border: 1px solid #4d4d4d;
}
#slider .left{
left: 0;
}
#slider .right{
right: 0;
}
#slider .left img{
width: 50px;
height: 50px;
}
#slider .right img{
width: 50px;
height: 50px;
transform: rotate(180deg);
}
#slider .images .pict{
float: left;
}
.item{
&-header{
display: flex;
justify-content: space-around;
align-items: center;
&__item{
width: 50px;
height: 50px;
background-color: darkviolet;
}
}
&-content{
display: flex;
justify-content: center;
align-items: center;
flex: 1 0 auto;
&__item{
width: 100px;
height: 100px;
margin-left: 20px;
margin-right: 20px;
background-color: rosybrown;
}
}
&-footer{
display: flex;
justify-content: space-between;
align-items: center;
flex: 0 0 auto;
&__item{
width: 20px;
height: 60px;
background-color: yellowgreen;
}
}
}
这是我的js:
function list() {
const open = $('.list'); /* переменная открывает блок */
open.on('click', function () {
/* блок, на который мы тыкнули прячем в конец слайдера */
$(this).parent().appendTo('.images').fadeOut;
const parent = $(this);
let prevOpen = $('section.open'),
sectionItem = $('section.item'),
slider = $('#slider'),
nextSection = $('[data-id='+parent.attr('id')+']');
/* Отодвигаем секцию сослайдами через 500мс на 75% по Х при клике на блок open */
setTimeout(function () {
slider.css({"transform": "translateX(75%)"});
}, 600);
/*Возвращаем секцию в начальное положение*/
open.mouseenter(function () {
slider.css({"transform": "translateX(0)"});
});
/* делаем я-index меньше, чем у активного, что бы не было проблем с появлением изображений */
prevOpen.css({
"z-index": "1"
});
/* Ставим ищем нужную секцию по дата атрибуту */
if ( parent.attr('id') === nextSection.attr('data-id') ) {
nextSection.removeClass('close').addClass('open ').css({
"background-image": nextSection.attr("data-bg")
});
/* увеличиваем область видимости для эффекта появления секции */
nextSection.css({"clip-path": "circle(70.9% at 50% 50%)", "transition" : "clip-path 1.5s"});
/* прячем слайдер и отодвигаем его вправо */
let wrapper = $('.wrapper');
wrapper.css({"opacity" : "0", "transition" : "opacity 0.5s"});
setTimeout(function () {
wrapper.css({"opacity" : "1", "transition" : "opacity 1.5s"});
}, 1500);
}
/* добавляем бэкграунд текущего блока обертке, что бы при смене активног элемента у нас не было белого фона */
$('.sections').css({
'background-image': prevOpen.attr("data-bg")
});
/* Всем секциям, не являющимся открытой мы меняем классы на нужные */
sectionItem.not(nextSection).removeClass('open ').addClass('close').css({"clip-path": "circle(7.9% at 50% 50%)", "transition" : "clip-path 3s"});
});
}
list();
/* Бесконечный слайдер с возможностью прокрутки колесом мыши (на счет тач устройств пока не известно) */
function cut() {
const speed = 500;
let pictW,imgW,n,pict,img,currentM,end=true;
pict = $('#slider .pict');
img = $('#slider .images');
pictW = parseInt(pict.width());
n = pict.length;
imgW=(n+1)*pictW;
img.width(imgW);
currentM = -pictW;
/* Меняем слайды колесиком мыши */
$('#slider').bind({
mouseenter: function() {
$(this).on('wheel', (function(e) {
e.preventDefault();
if (e.originalEvent.deltaY < 0) {
if(end) {
end=false;
currentM = currentM + pictW;
img.animate({
marginLeft: currentM
}, speed, function () {
end = true;
$('.pict').last().prependTo('.images');
currentM = currentM - pictW;
img.css('marginLeft',currentM);
});
}
} else {
if(end) {
end=false;
currentM = currentM - pictW;
img.animate({
marginLeft: currentM
}, speed, function () {
end = true;
$('.pict').first().appendTo('.images');
currentM = currentM + pictW;
img.css('marginLeft',currentM);
});
}
}
}));
}
});
}
cut ();
当您单击滑块时,下一张图像中的蒙版会根据背景缩放,给人一种淡化的印象。
为此,您必须创建一个简单的 CSS 掩码作为 png 文件并为其设置动画。
一个小演示的示例,没有滑块和其余代码。
代码笔
Время ожидания не соответствует примеру из-за setTimeout функции, но это должно быть легко настраиваемым. Если Вы хотите решение для всех браузер, нужно не забыть настроить правильные префиксы (в примере префиксы для webkit).
Все-таки решил попробовать, только пошел другим путем.
Все только на масках(mask-image) с градиентами. Zoom не обошелся без mask.png. Так и не пришло ничего в голову - как сделать прямоугольник с градиентом.
Здесь можно видео взять(или просто посмотреть), а здесь файлы, там только пути переписать надо.
Собственно на картинке путь, которым пошел:
1 - слой основного изображения(именно он меняется, но не сразу)
1.1 - временный слой - создается при клике. В месте клика(за иконкой) позиционируется маска вместе с новым изображением(изображение разумеется сразу на все полотно). Маска сразу же начинает расширяться. По окончании заменяем задний фон, с одновременным удалением временного слоя. Вообще надо было его постоянным сделать и установить opacity: 0.
2 - с этим слоем и так все ясно, разделил его просто маской с градиентом, можно и png было сделать. С ним очень легко подобрать нужные фоновые изображения, не надо заморачиваться на счет размеров, масок и т.п. Все равно снизу сзади ничего не видно.
В настройках slider-setting.js (в html я только слои декларировал), добавляем к каждой картинке свой brightness, им затемняем/осветляем передний план и персонажа на дороге, в общем играем с освещенностью.
В итоге получаем нужную форму.
Слайдер, правда, так и не доделал, но для эксперимента кое-как работает.
Автор вопроса, и авторы ответов как-то все усложнили. Ведь сделать это можно с помощью простых анимаций и свойства css
-webkit-filter: