English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Di recente ho visto un ottimo effetto di clic su un pulsante, che produce un effetto di onde ondulate quando viene cliccato, molto divertente, quindi l'ho implementato in modo semplice (non ho considerato la compatibilità con i browser di versione bassa)
Guardiamo prima l'effetto, come nell'immagine seguente (il software di registrazione del gif è un po' scadente, sembra un po' lento...)
Questo effetto può essere realizzato sia tramite l'incorporamento di canves all'interno degli elementi, sia tramite CSS3.
Implementazione di Canves
Ho copiato un pezzo di codice di implementazione di canves da Internet, ho rimosso alcune definizioni di stile ripetute e fornito commenti in js, il codice è il seguente
codice HTML
<a class="btn color-1 material-design" data-color="#2f5398">Premi su di me!</a>
codice CSS
* {}} box-sizing: border-box; outline: none; } body { font-family: 'Open Sans'; font-size: 100%; font-weight: 300; line-height: 1.5em; text-align: center; } .btn { border: none; display: inline-block; color: white; overflow: hidden; margin: 1rem; padding: 0; width: 150px; height: 40px; text-align: center; line-height: 40px; border-radius: 5px; } .btn.color-1 { background-color: #426fc5; } .btn-border.color-1 { background-color: transparent; border: 2px solid #426fc5; color: #426fc5; } .material-design { position: relative; } .material-design canvas { opacity: 0.25; position: absolute; top: 0; left: 0; } .container { align-content: center; align-items: flex-start; display: flex; flex-direction: row; flex-wrap: wrap; justify-content: center; margin: 0 auto; max-width: 46rem; }
codice JavaScript
var canvas = {}; centerX = 0; centerY = 0; color = ''; containers = document.getElementsByClassName('material-design'); context = {}; element = {}; radius = 0; // In base a callback genera l'animazione requestAnimationFrame requestAnimFrame = function () { return ( window.requestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) { window.setTimeout(callback, 1000 / 60); } ); } (), // Crea un canves per ogni elemento specificato init = function () { containers = Array.prototype.slice.call(containers); for (var i = 0; i < containers.length; i += 1) { canvas = document.createElement('canvas'); canvas.addEventListener('click', press, false); containers[i].appendChild(canvas); canvas.style.width ='100%'; canvas.style.height='100%'; canvas.width = canvas.offsetWidth; canvas.height = canvas.offsetHeight; } }, // Fai clic e ottieni i dati necessari, come le coordinate del clic, la dimensione dell'elemento, il colore press = function (event) { color = event.toElement.parentElement.dataset.color; element = event.toElement; context = element.getContext('2d'); radius = 0; centerX = event.offsetX; centerY = event.offsetY; context.clearRect(0, 0, element.width, element.height); draw(); }, // Disegna un cerchio e esegui l'animazione draw = function () { context.beginPath(); context.arc(centerX, centerY, radius, 0, 2 * Math.PI, false); context.fillStyle = color; context.fill(); radius += 2; // Attraverso il giudizio che il raggio è minore della larghezza dell'elemento, disegna il cerchio di radius += 2 continuamente if (radius < element.width) { requestAnimFrame(draw); } }; init();
Implementazione CSS3
Poi inizia il codice fatto a mano... Penso che CSS3 sia più comodo, forse perché sono abituato a scrivere CSS...
codice HTML
<a class="waves ts-btn">Premi me!</a>
codice CSS
.waves{ position:relative; cursor:pointer; display:inline-block; overflow:hidden; text-align: center; -webkit-tap-highlight-color:transparent; z-index:1; } .waves .waves-animation{ position:absolute; border-radius:50%; width:25px; height:25px; opacity:0; background:rgba(255,255,255,0.3); transition:all 0.7s ease-out; transition-property:transform, opacity, -webkit-transform; -webkit-transform:scale(0); transform:scale(0); pointer-events:none } .ts-btn{ width: 200px; height: 56px; line-height: 56px; background: #f57035; color: #fff; border-radius: 5px; }
codice JavaScript
document.addEventListener('DOMContentLoaded',function(){ var duration = 750; // Composizione della stringa di stile var forStyle = function(position){ var cssStr = ''; for( var key in position){ if(position.hasOwnProperty(key)) cssStr += key+':'+position[key]+';'; }; return cssStr; } // Ottieni la posizione del clic del mouse var forRect = function(target){ var position = { alto:0, sinistra:0 }, ele = document.documentElement; 'undefined' != typeof target.getBoundingClientRect && (position = target.getBoundingClientRect()); return { alto: position.top + window.pageYOffset - ele.clientTop, sinistra: position.left + window.pageXOffset - ele.clientLeft } } var show = function(event){ var pDiv = event.target, cDiv = document.createElement('div'); pDiv.appendChild(cDiv); var rectObj = forRect(pDiv), _height = event.pageY - rectObj.top, _left = event.pageX - rectObj.left, _scale = 'scala(' + pDiv.clientWidth / 100 * 10 + ')'; var position = { alto: _height+'px', sinistra: _left+'px' }; cDiv.className = cDiv.className + " waves-animation", cDiv.setAttribute("style", forStyle(position)), position["-webkit-transform"] = _scale, position["-moz-transform"] = _scale, position["-ms-transform"] = _scale, position["-o-transform"] = _scale, position.transform = _scale, position.opacity = "1", position["-webkit-transition-duration"] = duration + "ms", position["-moz-transition-duration"] = duration + "ms", position["-o-transition-duration"] = duration + "ms", position["transition-duration"] = duration + "ms", position["-webkit-transition-timing-function"] = "cubic-bezier(0.250, 0.460, 0.450, 0.940)", position["-moz-transition-timing-function"] = "cubic-bezier(0.250, 0.460, 0.450, 0.940)", position["-o-transition-timing-function"] = "cubic-bezier(0.250, 0.460, 0.450, 0.940)", position["transition-timing-function"] = "cubic-bezier(0.250, 0.460, 0.450, 0.940)", cDiv.setAttribute("style", forStyle(position)); var finishStyle = { opacità: 0, "-webkit-transition-duration": duration + "ms", // tempo di transizione "-moz-transition-duration": duration + "ms", "-o-transition-duration": duration + "ms" "transition-duration": duration + "ms", "-webkit-transform" : _scale, "-moz-transform" : _scale, "-ms-transform" : _scale, "-o-transform" : _scale, top: _height + "px", left: _left + "px", }; setTimeout(function(){ cDiv.setAttribute("style", forStyle(finishStyle)); setTimeout(function(){ pDiv.removeChild(cDiv); },duration); },100) } document.querySelector('.waves').addEventListener('click',function(e){ show(e); },!1); },!1);
Bene, è tutto, a proposito, felice的中秋节~
Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il copyright spetta ai rispettivi autori, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene i diritti di proprietà, non è stato editato manualmente e non assume alcuna responsabilità legale. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare, fornendo prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente il contenuto sospetto di violazione del copyright.