Страницы

Поиск по вопросам

Показаны сообщения с ярлыком svg-animation. Показать все сообщения
Показаны сообщения с ярлыком svg-animation. Показать все сообщения

понедельник, 30 марта 2020 г.

Как сделать чтобы анимация вызванная :hover продолжалась до конца, независимо от положения мыши?

#html #css3 #svg #анимация #svg_animation




body {
  margin: 0;
  padding: 0;
  background-color: #8e3a89;
  display: -webkit-flex;
  display: -moz-flex;
  display: -ms-flex;
  display: -o-flex;
  display: flex;
  justify-content: center;
  align-items: center;
}

.svg {
  margin: 10px;
  width: 150px;
  height: 150px;
}

.sas {
  fill: none;
  stroke: #fff;
  stroke-width: 3;
  stroke-dasharray: 2550;
}

.svg:hover .sas {
  animation: animate 3s;
}

@keyframes animate {
  0% {
    stroke-dashoffset: 2550;
  }
  100% {
    stroke-dashoffset: 0;
  }
}


Ответы

Ответ 1



body { margin: 0; padding: 0; background-color: #8e3a89; display: -webkit-flex; display: -moz-flex; display: -ms-flex; display: -o-flex; display: flex; justify-content: center; align-items: center; } .svg { margin: 10px; width: 150px; height: 150px; border: 1px solid red; } .sas { fill: none; stroke: #fff; stroke-width: 3; stroke-dasharray: 2550; stroke-dashoffset: 0; }


воскресенье, 29 марта 2020 г.

Сделать при scroll пунктирный <path> растущим

#javascript #jquery #css #svg #svg_animation


Ниже то, что я сделал до сих пор .

Это отлично работает, но я хочу сделать анимацию, которая немного сложнее для меня. 



// Получить идентификатор элемента  и длину 
var myline = document.getElementById("myline");
var length = myline.getTotalLength();
circle = document.getElementById("circle");
// Начальная позиция рисования
myline.style.strokeDasharray = length;

// Скройте треугольник, смещая черту. Удалите эту линию, чтобы показать треугольник
перед прокруткой
myline.style.strokeDashoffset = length;

// Найти процент прокрутки при scroll (используя свойства кросс-браузера) и сместить
тире настолько же, сколько и процент прокрутки
window.addEventListener("scroll", myFunction);

function myFunction() {
  // What % down is it?
  var scrollpercent = (document.body.scrollTop + document.documentElement.scrollTop)
/ (document.documentElement.scrollHeight - document.documentElement.clientHeight);
  // Длина offset до dashes
  var draw = length * scrollpercent;

  // Переверните рисование (при прокрутке вверх)
  myline.style.strokeDashoffset = length - draw;

  //получить точку в длине
  endPoint = myline.getPointAtLength(draw);
  circle.setAttribute("cx", endPoint.x);
  circle.setAttribute("cy", endPoint.y);

}
body {
  height: 2000px;
  background: #f1f1f1;
}

#circle {
  fill: red;
}

#mySVG {
  position: fixed;
  top: 15%;
  width: 100vw;
  height: 100vh;
  margin-left: -50px;
}

.st0 {
  fill: none;
  stroke-dashoffset: 3px;
  stroke: red;
  stroke-width: 5;
  stroke-miterlimit: 10;
  stroke-dasharray: 20;
}

Scroll down this window to draw my path.

Scroll back up to reverse the drawing.

Sorry, your browser does not support inline SVG. Мой вопрос: можем ли мы сделать линию пунктирной? Я знаю, что путь растет, используя strokeDasharray Но все же, есть ли способ достичь этого? Если нет, то, пожалуйста, предложите другой способ. Я не ищу - "разместить пунктирную линию над линией, которую вы хотите нарисовать, и придать ей цвет вашего фона".


Ответы

Ответ 1



Есть способ сделать это. Вы можете использовать пунктирную линию в качестве маски для анимированной линии. // Get the id of the element and the length of var myline = document.getElementById("myline"); var length = myline.getTotalLength(); circle = document.getElementById("circle"); // The start position of the drawing myline.style.strokeDasharray = length; // Hide the triangle by offsetting dash. Remove this line to show the triangle before scroll draw myline.style.strokeDashoffset = length; // Find scroll percentage on scroll (using cross-browser properties), and offset dash same amount as percentage scrolled window.addEventListener("scroll", myFunction); function myFunction() { // What % down is it? var scrollpercent = (document.body.scrollTop + document.documentElement.scrollTop) / (document.documentElement.scrollHeight - document.documentElement.clientHeight); // Length to offset the dashes var draw = length * scrollpercent; // Reverse the drawing (when scrolling upwards) myline.style.strokeDashoffset = length - draw; //get point at length endPoint = myline.getPointAtLength(draw); circle.setAttribute("cx", endPoint.x); circle.setAttribute("cy", endPoint.y); } body { height: 2000px; background: #f1f1f1; } #circle { fill: red; } #mySVG { position: fixed; top: 15%; width: 100vw; height: 100vh; margin-left: -50px; } .st0 { fill: none; stroke-dashoffset: 3px; stroke: red; stroke-width: 5; stroke-miterlimit: 10; stroke-dasharray: 20; } .mask-style { stroke: white; stroke-width: 7; }

Scroll down this window to draw my path.

Scroll back up to reverse the drawing.

Sorry, your browser does not support inline SVG. Источник

пятница, 20 марта 2020 г.

Как в SVG сделать так, чтобы при использовании use работали градиенты из defs?

#html5 #svg #svg_animation #svg_спрайт


К примеру у меня есть подготовленный документ с SVG-спрайтами, в котором я объявляю
каждую иконку через . Но когда я использую эти иконки через  у меня не
работают градиенты из , как я понял это из-за #shadow-root. 

Как сделать чтобы они заработали?

Пример кода:




  
    
      
      
    
  

      
    
    
    
    
    
    

    




Ответы

Ответ 1



Первая неточность - не указан второй цвет в градиенте, допустим я выбрал stop-color="gold", вы можете выбрать любой другой цвет Лучше не указывать style="display:none", так как применение и так скрывает содержание SVG до вызова его командой Остальное смотрите в моем коде


Ответ 2



В качестве бонуса несколько примеров анимации градиента В основном применяется анимация атрибута offset
Пример заполнения круга с помощью градиента Вращение градиента

Мерцание элемента в SVG-картинке

#css #html5 #svg #css_animation #svg_animation


Внутри SVG-файла есть элемент, например ..., внутри него ещё много
всего.
 Как сделать, чтобы opacity у всего содержимого внутри blink постоянно циклично менялось,
например с 0.5 на 1, и опять на 0.5? 
    


Ответы

Ответ 1



SVG анимация Если нужно анимировать все элементы, которые находятся внутри группы, то можно добавить команду анимации перед закрывающим групповым тегом CSS анимация Обратите внимание на то, что одна и та же css анимация animation: fade 800ms infinite; применена к разным группам с разными условиями. Элементы первой группа мерцают постоянно. Элементы второй группы мерцают при наведении. #blink { animation: fade 800ms infinite; } @keyframes fade { 0% { fill-opacity: 0.5; } 12% { fill-opacity: 1; } 100% { fill-opacity: 0.5; } } #circleBlink:hover { animation: fade 0.5s infinite; } Hover me

понедельник, 2 марта 2020 г.

Как создать этот SVG эффект?

#svg #svg_animation


Как мне создать SVG анимацию, как на этой странице http://edwindejongh.co/? Посоветуйте,
пожалуйста, какие-нибудь ресурсы или объясните, что я должна сделать, чтобы воссоздать
такую же страницу?
    


Ответы

Ответ 1



Загляните в стили и скрипты сайта!!! F12 в Chrome Как для старта: setTimeout(function(){ $('.intro__boxes').addClass('animate'); setTimeout(function(){ $('.intro__boxes').addClass('no-transitions'); $('.intro__boxes').addClass('fade-out'); setTimeout(function(){ $('.intro__boxes').removeClass('animate'); setTimeout(function(){ $('.intro__boxes').removeClass('no-transitions'); $('.intro__boxes').removeClass('fade-out'); intro.init(); }, 10); }, 1000); }, 25000); }, 100); * { box-sizing: border-box; } html, body { padding: 0; margin: 0; width: 100%; height: 100%; } .rect { x: 50%; y: 50%; stroke: black; stroke-width: 2px; fill: none; transform-origin: 50% 50% 0; transition: all 25s linear; } .rect1 { opacity: 0.3; transform: translate3d(-50%, -50%, 0) rotate(-15deg) scale(1); } .animate .rect1 { opacity: 0.4; transform: translate3d(-50%, -50%, 0) rotate(-11deg) scale(1.2); } .rect2 { opacity: 0.5; transform: translate3d(-50%, -50%, 0) rotate(0deg) scale(1); } .animate .rect2 { transform: translate3d(-50%, -50%, 0) rotate(10deg) scale(1.2); } .rect3 { opacity: 0.6; transform: translate3d(-50%, -50%, 0) rotate(-75deg) scale(1); } .animate .rect3 { transform: translate3d(-50%, -50%, 0) rotate(-80deg) scale(1.5); } .rect4 { opacity: 0.8; transform: translate3d(-50%, -50%, 0) rotate(-60deg) scale(0.77); } .animate .rect4 { transform: translate3d(-50%, -50%, 0) rotate(-75deg) scale(1.34); } .rect5 { transform: translate3d(-50%, -50%, 0) rotate(-45deg) scale(0.77); } .animate .rect5 { transform: translate3d(-50%, -50%, 0) rotate(-75deg) scale(1.49); } .rect6 { transform: translate3d(-50%, -50%, 0) rotate(-60deg) scale(1); } .animate .rect6 { transform: translate3d(-50%, -50%, 0) rotate(-90deg) scale(2); } .rect7 { transform: translate3d(-50%, -50%, 0) rotate(-75deg) scale(1); } .animate .rect7 { transform: translate3d(-50%, -50%, 0) rotate(-125deg) scale(2.66); } .intro__boxes.no-transitions .rect { transition-duration: 0s; } .mask { fill: #01051a; } .intro__boxes { position: absolute; z-index: 1; width: 100%; height: 100%; opacity: 1; perspective: 600px; background: linear-gradient(to right, #18f2e0 0%, #183df2 100%); transition: opacity 1s cubic-bezier(0.15, 0.005, 0.155, 1); } .intro__boxes.animate { opacity: 1; } .intro__boxes.fade-out { opacity: 0; }


среда, 26 февраля 2020 г.

SVG изображение меняет размер после применения transform rotate

#javascript #svg #svg_animation


Я сделал SVG с машиной (image), которая следует за мышью и держит ее переднюю часть
к центру круга.  

Это очень хорошо работает в Windows (проверено на Chrome, Firefox, Edge). 

Проблема 

Когда положение машины меняется и начинается вращение, машина меняет размер без причины.
Это происходит (я думаю) на устройствах IOS (протестировано на Macbook - Safari и iPhone
- Safari & Chrome).

Положение просто изменяется, устанавливая x и y изображения. Вращение (которое, я
думаю, вызывает проблему) изменяется путем установки атрибута transform.

image.setAttributeNS(null, 'x', (xy.x - (12 * 0.25)));
image.setAttributeNS(null, 'y', (xy.y - (5.4 / 2)));
image.setAttributeNS(null, 'transform', 'rotate(' + (180 - angle) + ',' + xy.x +
',' + xy.y + ') '); 


Я сделал fiddle, где при нажатии на кнопку происходит перемещение  машины на другую
позицию . Пожалуйста, попробуйте это в Safari и Chrome, чтобы увидеть разницу.       
    


Ответы

Ответ 1



Пожалуйста, сообщите мне, - если это то движение машины, которое вам необходимо: var circle = document.getElementById("circle"); var radius = 100 / (2 * Math.PI); var xmlns = "http://www.w3.org/2000/svg"; var procent = 100 / (360 / 15); var offset = 0 - procent / 2; let angle = 0 function rotateCar(){ requestAnimationFrame(rotateCar); angle +=.5; car.setAttributeNS(null, 'transform', `rotate(${angle},21,21)`); } rotateCar() .wrapper { height: 300px; width: 300px; border: 1px solid black; }
В случае, если вы хотите центрировать автомобиль на дорожке, вы можете сделать что-то вроде этого: Вы оборачиваете изображение в группу. Внутри группы машина позиционируется так, чтобы она была в центре. Далее вы вращаете группу. var circle = document.getElementById("circle"); var radius = 100 / (2 * Math.PI); var xmlns = "http://www.w3.org/2000/svg"; var procent = 100 / (360 / 15); var offset = 0 - procent / 2; let angle = 0 function rotateCar(){ requestAnimationFrame(rotateCar); angle +=.5; car.setAttributeNS(null, 'transform', `rotate(${angle},21,21)`); } rotateCar() .wrapper { height: 300px; width: 300px; border: 1px solid black; }


Ответ 2



Второй вариант движения машины Чтобы развернуть машину для движения вдоль трассы и для уменьшения её размеров применена команда трансформации: transform:rotate(75deg) scale(0.75); В svg для корректного вычисления центра вращения потребовались бы некоторые усилия. В css это реализуется проще: transform-box: fill-box; - контейнер по габаритным размерам объекта И вычисляется центр вращения transform-origin:50% 50%;


пятница, 14 февраля 2020 г.

Как сделать такой эффект как на скриншоте с эффектом смещения?

#css #clip_path #svg_animation


Хотелось бы реализовать такой эффект как на скрине :



Разумеется хотя бы с 90% поддержкой но как можно проще. 

Как это можно реализовать ?
    


Ответы

Ответ 1



Удалось реализовать только средствами clip-path на css. @import "https://fonts.googleapis.com/css?family=Orbitron"; html, body { background-color: #000; text-align: center; padding: 10%; } .content { color: #62C85B; font-family: 'Orbitron', sans-serif; font-size: 100px; font-weight: bold; color: #61F5A1; position: relative; } @keyframes glitch-anim-1 { 0% { clip: rect(60px, 1084px, 10px, 0); } 5.8823529412% { clip: rect(104px, 1084px, 63px, 0); } 11.7647058824% { clip: rect(67px, 1084px, 72px, 0); } 17.6470588235% { clip: rect(61px, 1084px, 101px, 0); } 23.5294117647% { clip: rect(5px, 1084px, 5px, 0); } 29.4117647059% { clip: rect(105px, 1084px, 85px, 0); } 35.2941176471% { clip: rect(40px, 1084px, 45px, 0); } 41.1764705882% { clip: rect(9px, 1084px, 81px, 0); } 47.0588235294% { clip: rect(62px, 1084px, 76px, 0); } 52.9411764706% { clip: rect(72px, 1084px, 104px, 0); } 58.8235294118% { clip: rect(99px, 1084px, 4px, 0); } 64.7058823529% { clip: rect(43px, 1084px, 88px, 0); } 70.5882352941% { clip: rect(78px, 1084px, 7px, 0); } 76.4705882353% { clip: rect(12px, 1084px, 20px, 0); } 82.3529411765% { clip: rect(112px, 1084px, 40px, 0); } 88.2352941176% { clip: rect(106px, 1084px, 113px, 0); } 94.1176470588% { clip: rect(69px, 1084px, 69px, 0); } 100% { clip: rect(23px, 1084px, 68px, 0); } } @keyframes glitch-anim-2 { 0% { clip: rect(114px, 1084px, 104px, 0); } 5.8823529412% { clip: rect(91px, 1084px, 83px, 0); } 11.7647058824% { clip: rect(64px, 1084px, 106px, 0); } 17.6470588235% { clip: rect(115px, 1084px, 109px, 0); } 23.5294117647% { clip: rect(66px, 1084px, 25px, 0); } 29.4117647059% { clip: rect(59px, 1084px, 57px, 0); } 35.2941176471% { clip: rect(115px, 1084px, 102px, 0); } 41.1764705882% { clip: rect(94px, 1084px, 51px, 0); } 47.0588235294% { clip: rect(17px, 1084px, 30px, 0); } 52.9411764706% { clip: rect(111px, 1084px, 66px, 0); } 58.8235294118% { clip: rect(58px, 1084px, 113px, 0); } 64.7058823529% { clip: rect(69px, 1084px, 1px, 0); } 70.5882352941% { clip: rect(108px, 1084px, 13px, 0); } 76.4705882353% { clip: rect(32px, 1084px, 18px, 0); } 82.3529411765% { clip: rect(33px, 1084px, 36px, 0); } 88.2352941176% { clip: rect(92px, 1084px, 49px, 0); } 94.1176470588% { clip: rect(3px, 1084px, 49px, 0); } 100% { clip: rect(35px, 1084px, 86px, 0); } } .content:before, .content:after { content: attr(data-text); position: absolute; top: 0; left: 0; width: 100%; background: black; clip: rect(0, 0, 0, 0); } .content:after { left: 2px; text-shadow: -1px 0 red; animation: glitch-anim-1 2s infinite linear alternate-reverse; } .content:before { left: -2px; text-shadow: 2px 0 blue; animation: glitch-anim-2 3s infinite linear alternate-reverse; }
lensky
пример смотреть на весь экран

Ответ 2



Не хотел я jQuery применять но не нашёл другого выхода ... реализация второго скрина $("header").append("
"); //fill div with clone of real header $("h1.glitched").clone().appendTo(".glitch-window"); * { -webkit-box-sizing: border-box; box-sizing: border-box; } body { font-family: 'Raleway', sans-serif; background: #F9F8F8; } header.header { position: absolute; top: 50%; left: 0; width: 100%; -webkit-transform: translateY(-50%); transform: translateY(-50%); } header.header h1 { font-size: 8rem; color: #222222; text-align: center; margin-top: 0; text-transform: uppercase; font-weight: 900; } .glitch-window { position: absolute; top: 0; left: -2px; width: 100%; color: #222222; text-shadow: 2px 0 #F9F8F8, -1px 0 yellow, -2px 0 green; overflow: hidden; animation: crt-me 2500ms infinite linear alternate-reverse; } @-webkit-keyframes crt-me { 0% { clip: rect(31px, 9999px, 94px, 0); } 10% { clip: rect(112px, 9999px, 76px, 0); } 20% { clip: rect(85px, 9999px, 77px, 0); } 30% { clip: rect(27px, 9999px, 97px, 0); } 40% { clip: rect(64px, 9999px, 98px, 0); } 50% { clip: rect(61px, 9999px, 85px, 0); } 60% { clip: rect(99px, 9999px, 114px, 0); } 70% { clip: rect(34px, 9999px, 115px, 0); } 80% { clip: rect(98px, 9999px, 129px, 0); } 90% { clip: rect(43px, 9999px, 96px, 0); } 100% { clip: rect(82px, 9999px, 64px, 0); } } @keyframes crt-me { 0% { clip: rect(31px, 9999px, 94px, 0); } 10% { clip: rect(112px, 9999px, 76px, 0); } 20% { clip: rect(85px, 9999px, 77px, 0); } 30% { clip: rect(27px, 9999px, 97px, 0); } 40% { clip: rect(64px, 9999px, 98px, 0); } 50% { clip: rect(61px, 9999px, 85px, 0); } 60% { clip: rect(99px, 9999px, 114px, 0); } 70% { clip: rect(34px, 9999px, 115px, 0); } 80% { clip: rect(98px, 9999px, 129px, 0); } 90% { clip: rect(43px, 9999px, 96px, 0); } 100% { clip: rect(82px, 9999px, 64px, 0); } }

lensky



четверг, 13 февраля 2020 г.

Изменение background для SVG c однотоного на изображение

#html #css3 #svg #css_animation #svg_animation


Как изменить фон для SVG? Изначально фон синего цвета спустя несколько секунд меняется
на изображение. 

  




   
      
	    
          
     
    
 
   




    


Ответы

Ответ 1





Ответ 2



Можно под одной фигурой нарисовать другую, верхнюю показать с задержкой, сделать паузу можно за счет последовательности css анимаций, первая пустая, нужна чтобы сработал delay от второй: image { opacity: 0; animation: wait, 1s ease-out 2s op forwards; } @keyframes wait { from { opacity: 0 } to { opacity: 0 } } @keyframes op { from { opacity: 0 } to { opacity: 1 } }

воскресенье, 9 февраля 2020 г.

Canvas / Создание эффекта (маски) миража для изображения

#javascript #svg #canvas #webgl #svg_animation


Подскажите, есть ли легкий способ создать эффекта миража(марева) на технологиях canvas
/ svg для изображения. В приведенном примере используется перемещение текстур, можно
ли проще, к примеру для анимации эффекта огня?  
    


Ответы

Ответ 1



Выбираем картинку с объемными объектами на дальнем плане, чтобы эффект миража лучше проявился. Применение фильтров сильно нагружает видеокарту, поэтому при реальном применении этого эффекта старайтесь уменьшить размеры зоны действия фильтра. Применяем к ней два фильтра feTurbulenceи feDisplacementMap Подробно о фильтрах, на русском, с многочисленными примерами можно почитать здесь За основу создания эффекта миража в фильтре отвечают несколько параметров, но основной параметр это baseFrequency Частота генерации шума, которая представляется в виде двух чисел, определяющих горизонтальное и вертикальное направления. Если задается одно число, то оно по умолчанию принимается для обоих направлений. Вот этот параметр фильтра и будем анимировать с помощью скрипта Остальные параметры фильтра можете регулировать по своему вкусу. scale="6" - увеличивает размер волн seed="53" - отвечает за слоистость структуры frames += 0.3 - увеличение прироста фраймов, увеличивает скорость волновых эффектов var img = document.querySelector("#displacementFilter feTurbulence"); var frames = 0; var rad = Math.PI / 180; function AnimateBaseFrequency() { //baseFrequency="0.01 .1" bfx = 0.01; bfy = 0.1; frames += 0.8 bfx += 0.01 * Math.cos(frames * rad); bfy += 0.01 * Math.sin(frames * rad); bf = bfx.toString() + ' ' + bfy.toString(); img.setAttributeNS(null, 'baseFrequency', bf); window.requestAnimationFrame(AnimateBaseFrequency); } window.requestAnimationFrame(AnimateBaseFrequency); .container { width:50%; height:50%; }
Пламя Чтобы получить тот или иной эффект нужно подобрать несколько однотипных картинок, например горящего огня и после экспериментов с изменением атрибутов фильтров и переменных скрипта пробовать их по очереди, какая картинка будет давать лучший эффект. var img = document.querySelector("#displacementFilter feTurbulence"); var frames = 0; var rad = Math.PI / 180; function AnimateBaseFrequency() { //baseFrequency="0.01 .1" bfx = 0.1; bfy = 0.1; frames += .4 bfx += 0.05 * Math.cos(frames * rad); bfy += 0.1 * Math.sin(frames * rad); bf = bfx.toString() + ' ' + bfy.toString(); img.setAttributeNS(null, 'baseFrequency', bf); window.requestAnimationFrame(AnimateBaseFrequency); } window.requestAnimationFrame(AnimateBaseFrequency); .container { width:50%; height:50%; }
Огонь и вода При обработке изображений необходимо уменьшить их размеры в любом растровом редакторе. Лучше в фотошопе, у которого есть недокументированная возможность уменьшать поэтапно на 10% размеры изображения без заметной потери качества. таким образом можно получить из изображения весом 2.2 Mb картинку весом 100kb В шапке svg файла необходимо выставить размер viewBox с атрибутами равными размеру используемой картинки. Например в этом примере - viewBox="0 0 670 526" var img = document.querySelector("#displacementFilter feTurbulence"); var frames = 0; var rad = Math.PI / 180; function AnimateBaseFrequency() { //baseFrequency="0.01 .1" bfx = 0.1; bfy = 0.1; frames += .31 bfx += 0.1 * Math.cos(frames * rad); bfy += 0.1 * Math.sin(frames * rad); bf = bfx.toString() + ' ' + bfy.toString(); img.setAttributeNS(null, 'baseFrequency', bf); window.requestAnimationFrame(AnimateBaseFrequency); } window.requestAnimationFrame(AnimateBaseFrequency); .container { width:50%; height:50%;


Ответ 2



Вот смастерил WebGL версию такого фильтра, за основу взят код вот из этого поста, там я уже делал фильтр для текстуры. Алгоритм: // запоминаем текущую текстурную координату vec2 p_d = uv; // прибавляем dt (сколько прошло времени с прошлого кадра) p_d.y += t * 0.1; // берем для полученного значения текстурных координат сэмпл 2d шума // (тут могла быть текстура вместо вызова математического метода, и это будет быстрее) vec2 offset = vec2(noise(p_d * 22.)); // плавно уменьшаем это значения до 0 (0 сверху) offset *= uv.y * 0.01; // берем цвет оригинальным координатам + смещение return sample(uv.xy + offset); let t = new Date().getTime(); let url = "https://webgl2fundamentals.org/webgl/resources/images/computer-history-museum/pos-z.jpg"; let filter = webglFilter(url, ` uniform float t; float rand(vec2 n) { return fract(sin(dot(n, vec2(12.9898, 4.1414))) * 43758.5453); } float noise(vec2 p){ vec2 ip = floor(p); vec2 u = fract(p); u = u*u*(3.0-2.0*u); float res = mix( mix(rand(ip),rand(ip+vec2(1.0,0.0)),u.x), mix(rand(ip+vec2(0.0,1.0)),rand(ip+vec2(1.0,1.0)),u.x),u.y); return res*res; } vec4 frag (vec2 uv) { vec2 p_d = uv; p_d.y += t * 0.1; vec2 offset = vec2(noise(p_d*22.)); offset *= uv.y * 0.01; return sample(uv.xy + offset); } `); filter.ready = function() { let c = filter.canvas; document.body.append(c); animate(); } function animate() { filter.uniform('1f', 't', (new Date().getTime() - t)/1000) .apply(); requestAnimationFrame(animate); }

Как добавить многоцветную строку в стиле Google One к круглому изображению?

#css #html5 #svg #css_animation #svg_animation


Я создаю веб-сайт для клуба Google DSC в моем университете, и я хотел бы добавить
границу стиля Google One style border к круговым изображениям портфолио на сайте. 

Мне интересует, как сделать это с помощью CSS, но также подойдут предварительно отрисованные
решения в Photoshop или Illustrator.   

Я попытался изменить код, приведенный в этом ответе, но не смог добиться идеального
эффекта.



.test {
  margin: 25px 0;
  width: 200px;
  height: 200px;
  border-radius: 50%;
  border: 12px solid transparent;
  background-size: 100% 100%, 50% 50%, 50% 50%, 50% 50%, 50% 50%;
  background-repeat: no-repeat;
  background-image: linear-gradient(white, white), 
                    linear-gradient(30deg, #ea4335 36%, #4285f4 30%),
                    linear-gradient(120deg, #4285f4 36%, #34a853 30%),
                    linear-gradient(300deg, #fbbc04 36%, #ea4335 30%),
                    linear-gradient(210deg, #34a853 36%, #fbbc04 30%);
  background-position: center center, left top, right top, left bottom, right bottom;
  background-origin: content-box, border-box, border-box, border-box, border-box;
  background-clip: content-box, border-box, border-box, border-box, border-box;
  transform: rotate(90deg);
}
Как видите, цвета границ выровнены неправильно. Есть ли способ сделать это, используя более простой метод?


Ответы

Ответ 1



Предлагаю решение без особых вычислений: Или так:

Ответ 2



Вариант SVG Для более глубокого изучения и понимания этого ответа можно почитать топик на нашем сайте: Помогите с dasharray и dashoffset Для создания разноцветных секторов окружности используем атрибут stroke-dasharray Расчет длин черточек и пробелов: Для радиуса R=100px длина окружности =2 * 3.1415 * 100 = 628.3 px` Чтобы получить черту равной одной четвертой окружности расcчитаем атрибуты stroke-dasharray: 628.3 / 4 = 157.075 Пробел составит 3 / 4 длины окружности = 471px Итого параметы атрибута будут равны stroke-dasharray="157 471" Но так как длина синего , красного и зеленого секторов немного больше четверти окружности, то добавляем эту разницу. stroke-dasharray="183.255 445.045" stroke-dashoffset="78.54" сдвигает начало сектора на 1/8 длины окружности Пример кода для одного сектора: И таким же способом устанавливаем параметры аттрибута stroke-dasharray для остальных цветных секторов. Добавляем изображение и вырезаем его с помощью маски по размеру окружностей: Решение адаптивно и работает одинаково во всех современных браузерах в включая IE11,Edge SVG+CSS анимация Чтобы оживить приложение, я добавляю опции анимации. #1. Анимация вращения строки вокруг изображения Оберните все круги, которые образуют многоцветную линию, групповым тегом fill ="none" заменяется на fill ="transparent" для срабатывания анимации при наведении на любую часть окружности .student { background: rgb(238,174,202); background: linear-gradient(90deg, rgba(238,174,202,1) 0%, rgba(148,208,233,1) 100%); } .container { display: inline-block; width:25%; } #gr1 { transform-origin:125px 125px; -webkit-transition: -webkit-transform 1s ease-in-out; transition: transform 1s ease-in-out; } #gr1:hover { -webkit-transform: rotate(720deg); transform: rotate(720deg); }
2.# Анимация вращения изображения внутри многоцветной строки Используемые правила CSS: #img { transform-origin:125px 125px; -webkit-transition: -webkit-transform 1s ease-in-out; transition: transform 1s ease-in-out; } #img:hover { -webkit-transform: rotate(360deg); transform: rotate(360deg); } .student { background: rgb(238,174,202); background: linear-gradient(90deg, rgba(238,174,202,1) 0%, rgba(148,208,233,1) 100%); } .container { display: inline-block; width:25%; } #img { transform-origin:125px 125px; -webkit-transition: -webkit-transform 1s ease-in-out; transition: transform 1s ease-in-out; } #img:hover { -webkit-transform: rotate(360deg); transform: rotate(360deg); }


Progress bar circle on js

#javascript #html #css #svg #svg_animation


Написал скрипт, для круглого прогресс бара с помощью SVG, на чистом js.
Но не учел тот факт, что мне нужно еще и текст внутри этого круга сделать. Поискал
в инете, и не нашел.
 А вот сделать с обычными div'ами у меня не получается. Не получается  начинать прогресс
с определенной точки и заканчивать соответственно тоже в определенной точке.

Вот мой код, который с svg: 



function setProgress(percent) {
  const circle = document.getElementById(`circle`);
  const radius = circle.r.baseVal.value;
  const circumference = 2 * Math.PI * radius;

  circle.style.strokeDasharray = `${circumference} ${circumference}`;
  circle.style.strokeDashoffset = circumference;
  const offset = circumference - percent / 10 * circumference;
  circle.style.strokeDashoffset = offset;
}
setProgress(7);
.svg_circle_loader {
  background: none;
  border: none;
  margin: none;
  padding: none;
}

.circle_loader {
  fill: none;
  stroke: #FFB10A;
  stroke-width: 10px;
  transition: all 0.2s linear;
  transform-origin: center;
  transform: rotate(-90deg);
  transition: stroke-dashoffset .5s;
}

      

    



    


Ответы

Ответ 1



Как-то так? const circumference = 2 * Math.PI * circle.r.baseVal.value; circle.style.strokeDasharray = `${circumference} 1000`; function setProgress(percent) { circle.style.strokeDashoffset = circumference * (1 - percent / 100); pct.innerHTML = percent.toFixed(0) + '%'; } requestAnimationFrame(draw) function draw(t) { requestAnimationFrame(draw) setProgress((t/100)%100) } .circle_loader { fill: none; stroke: #FFB10A; stroke-width: 10px; transform-origin: center; transform: rotate(-90deg); } text { dominant-baseline:middle; text-anchor:middle; font-size:30px; font-family:Arial; }

Как залить фоновый цвет в SVG изображении луны в процентах

#javascript #css #html5 #svg #svg_animation


Я хочу, чтобы  цвет фонового изображения SVG заполнялся постепенно, в процентах.

Вот изображение луны svg. Я хочу постепенно, в процентах заполнять её белым цветом.     



 
 
 
  
  
 



    


Ответы

Ответ 1



Как-то так можно посчитать точки пересечения окружностей, для конструирования пути requestAnimationFrame(draw); function draw(t) { requestAnimationFrame(draw); let r = 51; let x = Math.sin(t/2010)*90; let y = Math.sin(t/1731)*40; let a = Math.atan2(y, x); let s = Math.acos(Math.sqrt(x*x + y*y)/2/r); let p0 = [Math.cos(a+s)*r, Math.sin(a+s)*r]; let p1 = [Math.cos(a-s)*r, Math.sin(a-s)*r]; sun.setAttribute('d', ` m${p0} A${r},${r},0,1,1,${p1} A${r},${r},0,0,0,${p0} z `); } body{ overflow: hidden; margin: 0; }

Ответ 2



Я бы сделал это с маской. Так что, я могу сделать эллиптическую тень. Пояснения смотрите в комментариях скрипта // Установить handler на input слайдера var control = document.getElementById("control"); control.addEventListener("input", setMoonPhase); // Инициализируйте SVG из начального значения слайдера setMoonPhase(); function setMoonPhase(evt) { // Преобразовать из процента в значение 0..1 var val = control.value / 100; // Получить элемент эллипса, который представляет фазу луны var phaseEllipse = document.getElementById("phase-ellipse"); // Установите радиус X фазового эллипса (где 100% = 0,5 -> 50% = 0 -> 0% = 0,5) phaseEllipse.rx.baseVal.value = Math.abs(val - 0.5); // Если фаза> 50%, то эллипс должен быть белым. // В противном случае это черный цвет, чтобы сделать дыру в маске, чтобы пропустить черный фон. phaseEllipse.style.fill = (val > 0.5) ? "white" : "black"; }

Источник: @Paul LeBeau

Ответ 3



Я бы сделал это с помощью clip-path. mooning() control.addEventListener("input",()=>{ mooning() }) function map(n, a, b, _a, _b) { let d = b - a; let _d = _b - _a; let u = _d / d; return _a + n * u; } function mooning(){ output.innerHTML = control.value + "%"; let value = map(control.value, 0, 100, -25, 175) moon.setAttributeNS(null, "cx", value) } svg{border:1px solid; width:75vh} #control{width:75vh;}

Источник: @enxaneta

Ответ 4



Анимация окружностей Я бы сделал это с применением анимации чёрной окружности, которая постепенно и открывает и снова закрывает светлую окружность. Источник: @Alexandr_TT

среда, 5 февраля 2020 г.

Как создать svg-градиент с 3 точками в треугольнике, которые смешиваются вместе

#html #css #svg #градиент #svg_animation





  
      
        
        
        
      
  
    





Я хочу создать svg-градиент в круге с 3 цветными зонами, в виде треугольников.   

   


  
      
        
        
        
      
  
    



Я попытался создать линейный градиент с тремя stops, но я не уверен, как расположить
stops там, где они мне нужны (вверху слева направо). 
    


Ответы

Ответ 1



В качестве бонуса добавлены примеры анимации Вращение градиента Добавляется команда анимации группы элементов id="gr1" : circle cx="50" cy="50" r="5" fill="white" stroke="silver"> Полный код: 2. Анимация дорожек Добавляется команда анимации радиуса окружностей

Ответ 2



В примере ниже близко, то, что вы хотите получить. svg { width: 400px; } Поскольку смешивание, которое вы получаете в CSS / SVG, работает исключительно путем отдельного сочетания красного, зеленого и синего каналов цветов RGB, то он не знает, что мы ожидаем увидеть зеленый, когда мы смешиваем синий и желтый. Вместо этого вы получите мутный серый. Таким образом, в приведенном выше примере я «обманул», добавив полоски «правильных» цветов между нашими тремя основными цветами. Например, я положил полоску зеленого цвета между синим и желтым секторами. Если я этого не сделаю, приведенный выше пример будет выглядеть так: svg { width: 400px; }

суббота, 1 февраля 2020 г.

Анимация прогресс-бара

#javascript #css3 #html5 #svg #svg_animation


Я пытаюсь сделать анимацию прогресс-бара
https://codepen.io/mihail-kamahin/pen/YzKZjWd

Я хочу сделать так, чтобы из одной точки круга анимация начиналась сразу с двух сторон,
на картинке я показал схематично, как я хотел это сделать


Но у меня не получается, я пытался ещё один круг создавать, поверх уже созданного,
но получается какая-то каша. Кто уже работал с кругами на svg, возможно, знаете, как
это сделать?



function setProgress(percent, selector__circle) {
	const circle = document.querySelector(`${selector__circle}`);
	const radius = circle.r.baseVal.value;
	const circumference = 2 * Math.PI * radius;

	circle.style.strokeDasharray = `${circumference} ${circumference}`;
	circle.style.strokeDashoffset = circumference;

	const offset = circumference - percent / 100 * circumference;
	circle.style.strokeDashoffset = offset;
}

var number = 125;

setProgress(number, '.progressbar__thumb');

click__me = document.querySelector('.click__me');

click__me.addEventListener('click', function() {
  setProgress(number += 25, '.progressbar__thumb');
});
.progress__container {
	width: 140px;
	height: 140px;
}

.progressbar__track {
	fill: transparent;
	stroke: #3E4153;
	stroke-width: 3px;
}

.progressbar__thumb{
	fill: transparent;
	stroke: yellow;
	stroke-width: 4px;
	transform: rotate(270deg);
	transform-origin: center;
	transition: 0.5s linear;
}

.click__me {
  margin-top: 30px;
  margin-left: 30px;
}


Ответы

Ответ 1



Все можно сделать за счет одного лишь stroke-dasharray, корректно посчитав длины: function setProgress(percent, selector__circle) { const circle = document.querySelector(selector__circle); const total = Math.PI * circle.r.baseVal.value; circle.style.strokeDasharray = `${total*percent} ${total*(1-percent)*2}`; document.querySelector('svg text').innerHTML = (percent*100).toFixed(0) + '%'; } var number = 0; setProgress(number, '.progressbar__thumb'); document.querySelector('.click__me').addEventListener('click', function() { setProgress(number = number+0.1 > 1 ? 0 : number+0.1, '.progressbar__thumb'); }); .progress__container { width: 140px; height: 140px; } .progressbar__track { fill: transparent; stroke: #3E4153; stroke-width: 3px; } .progressbar__thumb { transform: translate(32px,32px) rotate(180deg) translate(-32px,-32px); fill: transparent; stroke: yellow; stroke-width: 4px; transition: 0.2s; } .click__me { margin-top: 10px; margin-left: 35px; }


Ответ 2



Как я понял из рисунка, - анимация прогресс бара должна начинаться из одной точки синхронно двумя линиями и заканчиваться тоже в одной точке. Расчет цифр в атрибуте stroke-dasharray При радиусе окружности r="100" длина окружности равна C= 2 * PI * R = 628,3 Половина окружности равна 314,15 Анимация линии достигается с помощью увеличения черты от нуля до максимума - 628,3 У атрибута stroke-dasharray первый параметр это длина черты, второй параметр это длина пробела, поэтому: Чтобы получить в начале нулевую длину черты записываем: stroke-dasharray="0 314.15 0 314.15" Длина черты 0 длина пробела -314.15 длина черты 0 длина пробела -314.15, в итоге линию не будет видно. Для максимального значения видимости линии нужно убрать пробелы : stroke-dasharray=0 0 628.3 0 Для анимации линии записываем в values эти два значения stroke-dasharray values="0 314.15 0 314.15;0 0 628.3 0" var btn = document.getElementById('btn'); var anim = document.getElementById('an'); btn.onclick = function () { anim.beginElement(); } Ещё пример основанный на этой технике .container { width:50%; height:50%; background:black; }
L C T B R