#javascript #html #jquery #css #slickjs
Пытаюсь реализовать таймер в виде окружности с бордером до следующего слайда. Вроде бы продумал, как это выстроить логически: сделать svg окружность и заполнять обводку, примерно по такой формуле: (длина окружности) / (время до следующего слайда). Очень нужен совет, как реализовать данную задачу. А именно интересует: каким параметром svg реализовать интервальную заливку окружности и на какое событие slick slider применить все эти действия, наверное on afterchange? моя попытка сделать это, пытался ориентироваться на прогресс бар в виде линии https://codepen.io/st-iv/pen/KGKgmv?editors=1010 $(document).ready(function(){ var time = 2; var $bar, $slick, isPause, tick, percentTime; $slick = $('.slider'); $slick.slick({ draggable: true, adaptiveHeight: false, dots: true, mobileFirst: true, pauseOnDotsHover: true, }); $bar = $('.slider-progress .progress'); $('.slider-wrapper').on({ mouseenter: function() { isPause = true; }, mouseleave: function() { isPause = false; } }) function startProgressbar() { resetProgressbar(); percentTime = 0; isPause = false; tick = setInterval(interval, 10); } function interval() { if(isPause === false) { percentTime += 1 / (time+0.1); $bar.css({ width: percentTime+"%" }); if(percentTime >= 100) { $slick.slick('slickNext'); startProgressbar(); } } } function resetProgressbar() { $bar.css({ width: 0+'%' }); clearTimeout(tick); } startProgressbar(); }); // circle bar //Рассчитываем длину окружности по формуле (с=2πr) var circleLength = $('.progress-round__wrap circle').attr('r')*Math.PI*2; // здесь нужно будет сопоставить длину окружности со временем до перелистывания на другой слайд $('.progress-round__wrap circle').css('stroke-dasharray', circleLength*part+','+circleLength); }); $(document).ready(function(){ var time = 2; var $circlebar; $circlebar = $('.progress-round__wrap circle'); function resetCirclebar() { $circlebar.css({ width: 0+'%' }); clearTimeout(tick); } }) и может быть попробовать совместить с данным решением https://codepen.io/st-iv/pen/jeOMVm?editors=1010
Ответы
Ответ 1
Если нужно, чтобы окружность просто заполнялась синхронно с линией (как в первой ссылке), то функцию interval() достаточно заменить на следующий код: var $rbar = $('.progress circle'); var rlen = 2 * Math.PI * $rbar.attr('r'); function interval() { if (isPause === false) { percentTime += 1 / (time + 0.1); $bar.css({ width: percentTime + '%' }); $rbar.css({ 'stroke-dasharray': rlen, 'stroke-dashoffset': rlen * (1 - percentTime / 100) }); if (percentTime >= 100) { $slick.slick('slickNext'); startProgressbar(); } } } /*... и стили немного сократить:*/ .progress circle { fill: #ccc; stroke: #00d6d6; stroke-width: 10; } UPD Переписал часть кода. Что-то убрал, что-то добавил. Надеюсь, что в моём дополнении присутствует нужный функционал: $(document).ready(function() { var time = 2; var $slick, isPause, tick, percentTime = 0; $slick = $('.slider'); $slick.slick({ draggable: true, adaptiveHeight: false, dots: true, mobileFirst: true, pauseOnDotsHover: true }); $slick.on({ mouseenter: function() { isPause = true; }, mouseleave: function() { isPause = false; startProgressbar(); }, mousedown: function() { $rbar.fadeOut('slow'); percentTime = 0; }, afterChange: function(event, slick, currentSlide, nextSlide) { $('.circle-tx').text(((currentSlide ? currentSlide : 0) + 1) + '/' + slick.slideCount); } }); function startProgressbar() { clearTimeout(tick); isPause = false; tick = setInterval(interval, 20); $rbar.fadeIn('slow'); } var $rbar = $('.circle-go'); var rlen = 2 * Math.PI * $rbar.attr('r'); function interval() { if (isPause === false) { percentTime += 1 / (time + 0.1); $rbar.css({ strokeDasharray: rlen, strokeDashoffset: rlen * (1 - percentTime / 100) }); if (percentTime >= 100) { $slick.slick('slickNext'); percentTime = 0; startProgressbar(); } } } startProgressbar(); }); .slider-wrapper { display: block; width: 250px; position: relative; margin: 0 auto; } .progress-round__wrap { width: 110px; height: 110px; position: absolute; left: 0; top: 0; pointer-events: none; text-align: center; } .circle-bg { fill: rgba(255, 255, 255, 0); stroke: rgba(0, 0, 0, 0.05); stroke-width: 10; stroke-linecap: butt; } .circle-go { fill: rgba(255, 255, 255, 0); stroke: rgba(90, 230, 240, 0.75); stroke-width: 8; stroke-linecap: round; } .circle-tx { fill: rgba(255, 255, 255, 0.6); stroke: rgba(0, 0, 0, 0.3); stroke-width: 1; font: bold 50px 'Arial'; text-anchor: middle; }
Комментариев нет:
Отправить комментарий