第一种:纯css实现:
.ripple { position: relative; overflow: hidden; } .ripple:after { content: ""; display: block; position: absolute; width: 100%; height: 100%; top: 0; left: 0; pointer-events: none; background-image: radial-gradient(circle, #666 10%, transparent 10.01%); background-repeat: no-repeat; background-position: 50%; transform: scale(10, 10); opacity: 0; transition: transform .3s, opacity .5s; } .ripple:active:after { transform: scale(0, 0); opacity:.3; transition: 0s; }
给需要的标签添加class为ripple搞定 ,但是你会发现效果不佳 每次都从中间往外的位置扩张的效果 ,能不能冲鼠标点击的地方往外呢,就要集合js实现,(第二种实现);
第二种方法:css + js 实现:(Material-UI效果)
css部分:
.ripple{ background: #1ABC9C; width:100%; height:100px; color: #fff; position:relative; cursor:pointer; display:inline-block; overflow:hidden; text-align: center; -webkit-tap-highlight-color:transparent; z-index:1; } .ripple .ripple-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 }
js:部分:
<script> // 点击涟漪效果 document.addEventListener('DOMContentLoaded',function(){ let duration = 750; // 样式string拼凑 let forStyle = function(position){ let cssStr = '' for( let key in position){ // if(position.hasOwnProperty(key)){ cssStr += key+':'+position[key]+';' // } } return cssStr; } // 获取鼠标点击位置 let forRect = function(target){ let position = { top:0, left:0 } let ele = document.documentElement typeof target.getBoundingClientRect != 'undefined' && (position = target.getBoundingClientRect()) return { top: position.top + window.pageYOffset - ele.clientTop, left: position.left + window.pageXOffset - ele.clientLeft } } let show = function(event){ let pDiv = event.target let cDiv = document.createElement('div'); pDiv.appendChild(cDiv) let rectObj = forRect(pDiv) let height = event.pageY - rectObj.top let left = event.pageX - rectObj.left let scale = 'scale(' + pDiv.clientWidth / 100 * 10 + ')' let position = { top: height+'px', left: left+'px' } cDiv.className = cDiv.className + " ripple-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)) let finishStyle = { opacity: 0, "-webkit-transition-duration": duration + "ms", "-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(() => { cDiv.setAttribute("style", forStyle(finishStyle)) setTimeout(() => pDiv.removeChild(cDiv),duration) },100) } for (let i = 0; i < document.querySelectorAll('.ripple').length; i++) { document.querySelectorAll('.ripple')[i].addEventListener('click',function(e){ show(e) }) } // addEventListener('click',function(e){ // let target = e.target.classList // if (target && target.length) { // for (let i = 0; i < target.length; i++) { // (target[i] === 'ripple') && show(e) // } // } // }) }) </script>
然后在所需要点击效果的标签上加上class="ripple"就可以了
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步