悬停时的CSS波纹效果?
Posted
技术标签:
【中文标题】悬停时的CSS波纹效果?【英文标题】:CSS ripple effect on Hover? 【发布时间】:2018-06-23 12:40:15 【问题描述】:我有一个按钮,我想要一个稍微透明的覆盖层,以便在悬停时“滑过”按钮。
有一种叫做“涟漪效应”的东西,您通常可以通过单击按钮来实现。
喜欢这里:https://codepen.io/tomma5o/pen/zwyKya
HTML:
<div class="container">
<a data-animation="ripple">Click Me</a>
</div>
CSS:
:root
/* if u want to change the color of
* the ripple change this value
*/
--color-ripple: rgba(255,255,255,0.8);
body
background: #36353c;
.container
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
height: 50px;
width: 200px;
margin: auto;
*[data-animation="ripple"]
position: relative; /*Position relative is required*/
height: 100%;
width: 100%;
display: block;
outline: none;:root
/* if u want to change the color of
* the ripple change this value
*/
--color-ripple: rgba(255, 255, 255, 0.8);
body
background: #36353c;
.container
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
height: 50px;
width: 200px;
margin: auto;
*[data-animation="ripple"]
position: relative; /*Position relative is required*/
height: 100%;
width: 100%;
display: block;
outline: none;
padding: 20px;
color: #fff;
text-transform: uppercase;
background: linear-gradient(135deg, #e570e7 0%, #79f1fc 100%);
box-sizing: border-box;
text-align: center;
line-height: 14px;
font-family: roboto, helvetica;
font-weight: 200;
letter-spacing: 1px;
text-decoration: none;
box-shadow: 0 5px 3px rgba(0, 0, 0, 0.3);
cursor: pointer;
/*border-radius: 50px;*/
-webkit-tap-highlight-color: transparent;
*[data-animation="ripple"]:focus
outline: none;
*[data-animation="ripple"]::selection
background: transparent;
pointer-events: none;
padding: 20px;
color: #fff;
text-transform: uppercase;
background: linear-gradient(135deg, #e570e7 0%,#79f1fc 100%);
box-sizing: border-box;
text-align: center;
line-height: 14px;
font-family: roboto, helvetica;
font-weight: 200;
letter-spacing: 1px;
text-decoration: none;
box-shadow: 0 5px 3px rgba(0, 0, 0, 0.3);
cursor: pointer;
/*border-radius: 50px;*/
-webkit-tap-highlight-color: transparent;
*[data-animation="ripple"]:focus
outline: none;
*[data-animation="ripple"]::selection
background: transparent;
pointer-events: none;
JS:
const isMobile = window.navigator.userAgent.match(/Mobile/) && window.navigator.userAgent.match(/Mobile/)[0] === "Mobile";
const event = isMobile ? "touchstart" : "click";
const button = document.querySelectorAll('*[data-animation="ripple"]'),
container = document.querySelector(".container");
for (var i = 0; i < button.length; i++)
const currentBtn = button[i];
currentBtn.addEventListener(event, function(e)
e.preventDefault();
const button = e.target,
rect = button.getBoundingClientRect(),
originalBtn = this,
btnHeight = rect.height,
btnWidth = rect.width;
let posMouseX = 0,
posMouseY = 0;
if (isMobile)
posMouseX = e.changedTouches[0].pageX - rect.left;
posMouseY = e.changedTouches[0].pageY - rect.top;
else
posMouseX = e.x - rect.left;
posMouseY = e.y - rect.top;
const baseCSS = `position: absolute;
width: $btnWidth * 2px;
height: $btnWidth * 2px;
transition: all linear 700ms;
transition-timing-function:cubic-bezier(0.250, 0.460, 0.450, 0.940);
border-radius: 50%;
background: var(--color-ripple);
top:$posMouseY - btnWidthpx;
left:$posMouseX - btnWidthpx;
pointer-events: none;
transform:scale(0)`
var rippleEffect = document.createElement("span");
rippleEffect.style.cssText = baseCSS;
//prepare the dom
currentBtn.style.overflow = "hidden";
this.appendChild(rippleEffect);
//start animation
setTimeout( function()
rippleEffect.style.cssText = baseCSS + `transform:scale(1); opacity: 0;`;
, 5);
setTimeout( function()
rippleEffect.remove();
//window.location.href = currentBtn.href;
,700);
)
是否有可能实现类似的东西而无需单击按钮而只需将鼠标悬停在它上面?
【问题讨论】:
hmm 你想让波纹的原点在鼠标进入的任何地方吗?还是一个固定的、居中的原点? 我编辑了答案以获得更接近原始效果的效果。请检查这是否适合您;) 【参考方案1】:替换 JS 的第 2 行:
const event = isMobile ? "touchstart" : "click";
与:
const event = isMobile ? "touchstart" : "mouseover";
这样就可以了。
希望有帮助!
【讨论】:
【参考方案2】:如果您希望波纹原点固定(例如从中间)而不是从鼠标进入的任何地方,答案要简单得多并且不需要 javascript:只需堆叠一个半透明的圆形伪元素并为比例设置动画悬停时。
body
background: #36353c;
.container
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
height: 50px;
width: 200px;
margin: auto;
.ripple
position: relative; /*Position relative is required*/
height: 100%;
width: 100%;
display: block;
outline: none;
padding: 20px;
color: #fff;
text-transform: uppercase;
background: linear-gradient(135deg, #e570e7 0%,#79f1fc 100%);
box-sizing: border-box;
text-align: center;
line-height: 14px;
font-family: roboto, helvetica;
font-weight: 200;
letter-spacing: 1px;
text-decoration: none;
box-shadow: 0 5px 3px rgba(0, 0, 0, 0.3);
cursor: pointer;
overflow:hidden;
.ripple:hover:before
animation: ripple 1s ease;
.ripple:before
content:"";
position:absolute; top:0; left:0;
width:100%; height:100%;
background-color:rgba(255, 255, 255, 0.7);
border-radius:50%;
transform:scale(0);
@keyframes ripple
fromtransform:scale(0); opacity:1;
totransform:scale(3);opacity:0;
<div class="container">
<a class="ripple">Hover Me</a>
</div>
【讨论】:
这可能是最好的事情,但它看起来有点奇怪,与点击时发生的情况完全不同。 @Radical_Activity 你去吧,我刚刚编辑了小提琴以获得更接近原始的东西。以上是关于悬停时的CSS波纹效果?的主要内容,如果未能解决你的问题,请参考以下文章