涟漪效应 - 边界半径问题

Posted

技术标签:

【中文标题】涟漪效应 - 边界半径问题【英文标题】:Ripple effect - border radius issue 【发布时间】:2017-07-25 04:11:20 【问题描述】:

我制作了以下动画:

Fiddle

如果你有大视网膜显示器(在小型 mac 视网膜上它也有问题) - 看到它看起来不错,但如果你把它带到非视网膜显示器上,它看起来有点模糊和 rectangle-d 而不是圆角。

如果您没有视网膜显示器(或 Mac 笔记本电脑) - 您可以使用 devtools 并将动画减慢到 10%,然后查看它在减慢时是否正常运行,但速度正常它看起来不同。

更新问题似乎主要在 Chrome 中,FF 运行良好。

简洁的 CSS:

.container 
  width: 700px;
  height: 128px;
  border-top-left-radius: 4px;
  border-top-right-radius: 4px;
  cursor: pointer;

  .ripple-container 
    width: 100%;
    height: 100%;
    background-color: #F5B30C;
    position: relative;
    overflow: hidden;
  

  .ripple 
    position: absolute;
    background-color: blue;
    top: 0;
    right: 0;
    height: 3px;
    width: 3px;
    border-radius: 50%;
    transition: transform 1s;

    &.rippler-active 
      transition: transform 0.5s;
      transform: scale(500);
    
  

【问题讨论】:

我遇到了类似的问题,chrome 似乎以一种奇怪的方式“优化”了边缘。它似乎在转换时无法足够快地调整边界半径,因此它模糊了它。我相信有一些技巧或解决方法,但我建议使用 SVG。 顺便说一句,应该有背景颜色的不是您的波纹容器,而是它的父级,... 突然“波纹” R :D - 是的,Chrome 有时是一个讨厌的浏览器。 .. 是的,我主要从我的项目中复制粘贴,其中有一些更复杂的逻辑,这说明了重点,所以我保留了它。 Rippler 听起来不错,不是吗:) 是的 :D 喜欢 Ripley :) 来自 A L I E N,看看这个:***.com/a/37500979/383904 有意思,我试试看能不能集成,谢谢! 【参考方案1】:

而不是从 1 扩展到 500(这会产生各种地下邪恶的错误)... 从 0 缩放到(比如说)3,但不是将初始大小设置为 0(或 3px),而是需要设置为像 1400px 这样的大尺寸。

1400 像素 * 3 比例的波纹 = 意味着它可以扩展到 4200 像素,我认为这对于任何目的来说都绰绰有余:

var el = document.querySelector('.container');
var ripple = document.querySelector('.ripple');

el.addEventListener('click', function() 
  ripple.classList.toggle("ripple-active")
);
.container 
  height: 128px;
  border-top-left-radius: 4px;
  border-top-right-radius: 4px;
  cursor: pointer;


.ripple-container 
  width: 100%;
  height: 100%;
  background-color: #F5B30C;
  position: relative;
  overflow: hidden;


.ripple 
  position: absolute;
  background-color: #3f3fd8;
  top: 0;
  right: 0;
  height: 1400px;
  width: 1400px;
  /* Notice the size!! */
  margin: -700px -700px auto auto;
  /* and set here the desired offset */
  border-radius: 50%;
  transition: transform 2s;
  transform: scale(0);


.ripple.ripple-active 
  transition: transform 2s;
  transform: scale(3);            /* 1400 * 3 !!! yey */
<div class="container">
  <div class="ripple-container">
    <div class="ripple"></div>
  </div>
</div>

【讨论】:

另一个想法是使波纹为容器宽度的 150% - 并使其为正方形(高度=宽度)。但是你很可能必须解决非水平元素(高度>宽度)的问题 - 并且逻辑上在移动设备上......

以上是关于涟漪效应 - 边界半径问题的主要内容,如果未能解决你的问题,请参考以下文章

android中的恒定涟漪效应

Android L 的涟漪效应 - 按钮的触摸反馈 - 使用 XML

recyclerview 中的触摸没有涟漪效应

获得点击按钮的正确位置(涟漪效应)

Angular 材质:从代码中控制涟漪效应

如何从 MaterialCardView 中移除涟漪效应?