在正文的榜首句加入“我正在参加「码上挑战赛」详情请看:码上挑战赛来了!”

前言

这篇文章咱们用CSS结合原生JS去写一个硬币跳动的作用分析需求用到CSS、JS特点和对应的功用

咱们能够经过码上掘进的功用看到对应的代码完成和实时作用

API

首要讲解CSS+JS,点击按钮完成跳跃的逻辑,这边咱们需求先对一些重要的CSS特点有一些基本的了解,我列出了对应的特点和参数的文档地址

transform

CSStransform特点答应你旋转,缩放,歪斜或平移给定元素。这是经过修正 CSS 视觉格式化模型的坐标空间来完成的。

transition

**transition**CSS特点是transition-propertytransition-durationtransition-timing-functiontransition-delay的一个简写特点。

@keyframes

关键@keyframesat-rule规矩经过在动画序列中界说关键帧(或 waypoints)的款式来操控 CSS 动画序列中的中心步骤。和转化 transition比较,关键帧 keyframes 能够操控动画序列的中心步骤。

逻辑

按钮动画作用

点击按钮,按钮在很短时间内顺时针旋转了一些视点,是经过这两个css,在按钮被点击的时候顺时针旋转4度,过度动画是transition操控的,transform代表着旋转,缩放,歪斜或平移给定元素, 在50ms内,采取ease-in-out的过度策略,具体参照文档解说

.tip-button {
  transition: transform 50ms ease-in-out;
}
.tip-button:active {
 transform: rotate(4deg);
}

这样就完成了榜首个最简单的动画作用,咱们还有一个按钮点击完消失的动画作用,咱们在点击tip-button的时候,咱们在对应的dom节点加了一个选择器clicked,这边css使用了animation+@keyframes完成更详尽的动画操控,分别操控在0%,66%,100%旋转的视点,采用ease-in-out的形式,

加了clicked之后影响对应的选择器如下列的css

.tip-button.clicked {
  animation: 150ms ease-in-out 1 shake;
  pointer-events: none;
}
.tip-button.clicked .tip-button__text {
  opacity: 0;
  transition: opacity 100ms linear 200ms; // 透明度由100变成0, 100ms的时间,形式linear,延时200ms
}
.tip-button.clicked::before {
  height: 0.5rem; //高度缩小
  width: 60%; //宽度缩小
}
.tip-button.clicked .coin {
  transition: margin-bottom 1s linear 200ms;
  margin-bottom: 0;
}
@keyframes shake {
  0% {
    transform: rotate(4deg);
  }
  66% {
    transform: rotate(-4deg);
  }
  100% {
    transform: rotate();
  }
}
button.classList.add("clicked");

flipCoinLoop这个函数便是用来处理硬币翻转的款式改变,每一次的改动的数据都不相同,

.coin {
  --front-y-multiplier: 0;
  --back-y-multiplier: 0;
  --coin-y-multiplier: 0;
  --coin-x-multiplier: 0;
  --coin-scale-multiplier: 0;
  --coin-rotation-multiplier: 0;
  --shine-opacity-multiplier: 0.4;
  --shine-bg-multiplier: 50%;
  bottom: calc(var(--coin-y-multiplier) * 1rem - 3.5rem);
  height: 3.5rem;
  margin-bottom: 3.05rem;
  position: absolute;
  right: calc(var(--coin-x-multiplier) * 34% + 16%);
  transform: translateX(50%) scale(calc(0.4 + var(--coin-scale-multiplier))) rotate(calc(var(--coin-rotation-multiplier) * -1deg));
  transition: opacity 100ms linear 200ms;
  width: 3.5rem;
  z-index: 3;
}

能够看到前面几个是自界说的css特点,能够用到其他款式里边,完成动态款式的改动,咱们在每次循环的时候经过改动这些css特点,直到最后循环完毕改动class

            button.classList.add("coin-landed");
            coin.style.setProperty("opacity", 0);
            setTimeout(() => {
              button.classList.remove(
                "clicked",
                "shrink-landing",
                "coin-landed"
              );
              setTimeout(() => {
                resetCoin();
              }, 300);
            }, 1000);

css改变的首要难点就在动态改变的css特点,让coin的动画看起来流畅