绘制元素边框(动画)

时间:2016-11-03 23:13:53

标签: javascript jquery html css css3

我试图找出一种让按钮为其边框设置动画的方法,就好像有人正在绘制它一样。

最近我得到的是这个片段,虽然它对边界半径设置不起作用。 (看角落)

https://codepen.io/anon/pen/MbWagQ

<button class="draw">draw</button>

//Colors
$cyan: #60daaa;
$red: #f45e61;

// Basic styles
button {
  background: none;
  border: 0;
  box-sizing: border-box;
  color: $red;
  font-size: inherit;
  font-weight: 700;
  padding: 1em 2em;
  text-align: center;
  margin: 20px;

  // Required, since we're setting absolute on pseudo-elements
  position: relative;
  vertical-align: middle;

  &::before,
  &::after {
    box-sizing: border-box;
    content: '';
    position: absolute;
    width: 100%;
    height: 100%;
  }
}

.draw {
    transition: color 0.25s;
    border-radius: 7px;

  &::before,
  &::after {
    border-radius: 7px;
    border: 3px solid transparent; // Set border to invisible, so we don't see a 4px border on a 0x0 element before the transition starts
    width: 0;
    height: 0;
  }

  // This covers the top & right borders (expands right, then down)
  &::before {
    top: 0;
    left: 0;
  }

  // And this the bottom & left borders (expands left, then up)
  &::after {
    bottom: 0;
    right: 0;
  }

  &:hover {
    color: $cyan;
  }

  // Hover styles
  &:hover::before,
  &:hover::after {
    width: 100%;
    height: 100%;
  }

  &:hover::before {
    border-top-color: $cyan; // Make borders visible
    border-right-color: $cyan;
    transition:
      width 0.25s ease-out, // Width expands first
      height 0.25s ease-out 0.25s; // And then height
  }

  &:hover::after {
    border-bottom-color: $cyan; // Make borders visible
    border-left-color: $cyan;
    transition:
      border-color 0s ease-out 0.5s, // Wait for ::before to finish before showing border
      width 0.25s ease-out 0.5s, // And then exanding width
      height 0.25s ease-out 0.75s; // And finally height
  }
}

我试图避免使用svg文件,最好是我希望在纯html&amp; css但javascript没问题。

1 个答案:

答案 0 :(得分:5)

所以,您的draw::before/draw::after元素在转换开始时的高度为0px。这意味着边界半径将非常偏斜。

&#13;
&#13;
button {
  background: none;
  border: 0;
  box-sizing: border-box;
  color: #f45e61;
  font-size: inherit;
  font-weight: 700;
  padding: 200px;
  text-align: center;
  margin: 20px;
  position: relative;
  vertical-align: middle;
}
button::before,
button::after {
  box-sizing: border-box;
  content: '';
  position: absolute;
  width: 100%;
  height: 100%;
}
.draw {
  -webkit-transition: color 0.25s;
  transition: color 0.25s;
  border-radius: 70px;
}
.draw::before,
.draw::after {
  border-radius: 70px;
  border: 30px solid transparent;
  width: 0;
  height: 0;
}
.draw::before {
  top: 0;
  left: 0;
}
.draw::after {
  bottom: 0;
  right: 0;
}
.draw:hover {
  color: #60daaa;
}
.draw:hover::before,
.draw:hover::after {
  width: 100%;
  height: 100%;
}
.draw:hover::before {
  border-top-color: #60daaa;
  border-right-color: #60daaa;
  -webkit-transition: width 1.25s ease-out, height 1.25s ease-out 1.25s;
  transition: width 1.25s ease-out, height 1.25s ease-out 1.25s;
}
.draw:hover::after {
  border-bottom-color: #60daaa;
  border-left-color: #60daaa;
  -webkit-transition: border-color 0s ease-out 2.5s, width 1.25s ease-out 2.5s, height 1.25s ease-out 3.75s;
  transition: border-color 0s ease-out 2.5s, width 1.25s ease-out 2.5s, height 1.25s ease-out 3.75s;
}
&#13;
<h1>CSS Border Transitions</h1>
<button class="draw">draw</button>
&#13;
&#13;
&#13;

放大/减慢动画后,您可以看到问题所在。我还建议在右/左边框上设置一个过渡,直到高度过渡,以避免“绘图点”。是一个奇怪的形状。

这是我所说的边缘半径倾斜的另一个例子:

Skewed

http://codepen.io/anon/pen/mOdOyQ