Material Ripple

需要注意的是,如果不使用Javascript,将没法获取到准确的鼠标位置,只能让Ripple从中间散开。

这边的思路是利用伪元素+CSS Clipping的实现,用::before元素加上一般的主元素的宽高进行定位,然后在元素的基础上浮层。

注意的是显示的Animation中,100%处应该试Display恢复为None,避免干扰正常交互。

另外一个思路是父元素overflow为hidden,ripple元素作为父元素的最后子元素,使用JS控制position和元素层级。这种实现比较方便,而且兼容性比伪元素好一些。

给出一个CSS的思路,非常清奇:

原理是Hover的时候让背景变为一个中间为空心、旁边为稍淡颜色的的背景。

这里注意的是用了圆心渐变的形式,让中心变得很大,算是radial-gradient的妙用。


/* Ripple effect */
.ripple {
  background-position: center;
  transition: background 0.8s;
}
.ripple:hover {
  background: #47a7f5 radial-gradient(circle, transparent 1%, #47a7f5 1%) center/15000%; /* what the fuck */
}
.ripple:active {
  background-color: #6eb9f7;
  background-size: 100%;
  transition: background 0s; /* 0s transition??????? */
}
/* Button style */
button {
  border: none;
  border-radius: 2px;
  padding: 12px 18px;
  font-size: 16px;
  text-transform: uppercase;
  cursor: pointer;
  color: white;
  background-color: #2196f3;
  box-shadow: 0 0 4px #999;
  outline: none;
}