Подскажите, как я могу повторить эффект появления блока, как на этом видео?
На данный момент имею что-то вот такое.
Появление реализовано через свойство clip-path. Не могу додуматься как мне повторить эффект растворения.
Сам слайдер при клике на миниатюры открывает секции, а не просто картинки. Т.е. тыкаешь на миниатюру, появляется секция со своим контентом.
Здесь используемые изображения
Это мой HTML
Это мой 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 ();
Ответы
Ответ 1
Когда вы нажимаете на слайдер, маска со следующего изображения масштабируется н
фоне, создавая впечатление затухания.
Чтобы сделать это, вы должны создать простую CSS-маску png-файлом и анимировать её.
Пример небольшой демонстрации, без слайдера и остального вашего кода.
codepen
setTimeout(function() {
let animation = document.getElementById('slide1');
animation.setAttribute("style", "-webkit-mask-size:300%;");
}, 1000)
setTimeout(function() {
let animation = document.getElementById('slide1');
animation.setAttribute("style", "-webkit-mask-size:20%;");
}, 3000)
* {
box-sizing: border-box;
}
html,
body,
.wrapper {
height: 100%;
margin: 0;
position: relative;
}
.men-block {
position: absolute;
bottom: -50px;
left: 30%;
z-index: 10;
width: 150px;
}
.men-block>img {
width: 100%;
}
.landscape {
max-width: 100%;
}
.landscape.closed {
position: absolute;
top: 0;
/* opacity:0;*/
-webkit-mask-image: url("https://i.ibb.co/p2vyKt4/mask.png");
-webkit-mask-repeat: no-repeat;
-webkit-mask-size: 20%;
-webkit-mask-position: center;
transition: all 3s;
}
.wrapper {
background: url('https://treehouse-code-samples.s3.amazonaws.com/CSS-DD/codepen/blog/mask-demo-lg.jpg');
background-repeat: no-repeat;
}
Время ожидания не соответствует примеру из-за setTimeout функции, но это должно быть легко настраиваемым.
Если Вы хотите решение для всех браузер, нужно не забыть настроить правильные префиксы (в примере префиксы для webkit).
Ответ 2
Все-таки решил попробовать, только пошел другим путем.
Все только на масках(mask-image) с градиентами.
Zoom не обошелся без mask.png.
Так и не пришло ничего в голову - как сделать прямоугольник с градиентом.
Здесь можно видео взять(или просто посмотреть), а здесь файлы, там только пути переписать надо.
Собственно на картинке путь, которым пошел:
1 - слой основного изображения(именно он меняется, но не сразу)
1.1 - временный слой - создается при клике. В месте клика(за иконкой) позиционируетс
маска вместе с новым изображением(изображение разумеется сразу на все полотно). Маска сразу же начинает расширяться. По окончании заменяем задний фон, с одновременным удалением временного слоя. Вообще надо было его постоянным сделать и установить opacity: 0.
2 - с этим слоем и так все ясно, разделил его просто маской с градиентом, можно
png было сделать. С ним очень легко подобрать нужные фоновые изображения, не надо заморачиваться на счет размеров, масок и т.п. Все равно снизу сзади ничего не видно.
В настройках slider-setting.js (в html я только слои декларировал), добавляем к каждо
картинке свой brightness, им затемняем/осветляем передний план и персонажа на дороге, в общем играем с освещенностью.
В итоге получаем нужную форму.
Слайдер, правда, так и не доделал, но для эксперимента кое-как работает.
Ответ 3
Автор вопроса, и авторы ответов как-то все усложнили. Ведь сделать это можно с помощью простых анимаций и свойства css -webkit-filter:
.block{
-webkit-filter: blur(0px);
-moz-filter: blur(0px);
-o-filter: blur(0px);
-ms-filter: blur(0px);
filter: blur(0px);
width: 30%;
position: fixed;
left: 50%;
top: 50%;
margin-left: -10%;
margin-top: -10%;
animation: 2s animate infinite;
border-top-left-radius: 10%;
border-top-right-radius: 10%;
}
@keyframes animate{
from{
-webkit-filter: blur(0px);
-moz-filter: blur(0px);
-o-filter: blur(0px);
-ms-filter: blur(0px);
filter: blur(0px);
}
to{
-webkit-filter: blur(100px);
-moz-filter: blur(100px);
-o-filter: blur(100px);
-ms-filter: blur(100px);
filter: blur(100px);
opacity: 0;
width: 100%;
margin-left: -50%;
margin-top: -50%;
}
}
Комментариев нет:
Отправить комментарий