【问题标题】:twitter like button animation using css [duplicate]twitter喜欢使用css的按钮动画[重复]
【发布时间】:2018-12-15 09:13:40
【问题描述】:

我在网络上找到了动画代码,当我单击图像时,它再次播放动画到说明部分。当我单击图像时,我想做它会播放动画并再次停止动画单击它应该重置图像,任何人都给我反馈如何做到这一点..

.like-btn-svg {
  width: 80px;
  height: 100px;
  position: absolute;
  left: 25px;
  bottom: -112px;
  transform: translate(-50%, -50%);
  background: url(https://abs.twimg.com/a/1446542199/img/t1/web_heart_animation.png) no-repeat;
  background-position: 0 0;
  animation: fave-like-btn-svg 1s steps(28);
  cursor: pointer;
}

.like-btn-svg:hover {
  background-position: -2800px 0;
  transition: background 1s steps(28);
}

@keyframes fave-like-btn-svg {
  0% {
    background-position: 2800px 0;
  }
  100% {
    background-position: -2800px 0;
  }
}
<div class="like-btn-svg"></div>

【问题讨论】:

    标签: javascript jquery css html


    【解决方案1】:

    纯 CSS 和 SVG

    svg {
      cursor: pointer;
      overflow: visible;
      width: 60px;
      margin: 20px;
    }
    
    svg #heart {
      transform-origin: center;
      animation: animateHeartOut .3s linear forwards;
    }
    
    svg #main-circ {
      transform-origin: 29.5px 29.5px;
    }
    
    .checkbox {
      display: none;
    }
    
    .checkbox:checked+label svg #heart {
      transform: scale(0.2);
      fill: #E2264D;
      animation: animateHeart .3s linear forwards .25s;
    }
    
    .checkbox:checked+label svg #main-circ {
      transition: all 2s;
      animation: animateCircle .3s linear forwards;
      opacity: 1;
    }
    
    .checkbox:checked+label svg #grp1 {
      opacity: 1;
      transition: .1s all .3s;
    }
    
    .checkbox:checked+label svg #grp1 #oval1 {
      transform: scale(0) translate(0, -30px);
      transform-origin: 0 0 0;
      transition: .5s transform .3s;
    }
    
    .checkbox:checked+label svg #grp1 #oval2 {
      transform: scale(0) translate(10px, -50px);
      transform-origin: 0 0 0;
      transition: 1.5s transform .3s;
    }
    
    .checkbox:checked+label svg #grp2 {
      opacity: 1;
      transition: .1s all .3s;
    }
    
    .checkbox:checked+label svg #grp2 #oval1 {
      transform: scale(0) translate(30px, -15px);
      transform-origin: 0 0 0;
      transition: .5s transform .3s;
    }
    
    .checkbox:checked+label svg #grp2 #oval2 {
      transform: scale(0) translate(60px, -15px);
      transform-origin: 0 0 0;
      transition: 1.5s transform .3s;
    }
    
    .checkbox:checked+label svg #grp3 {
      opacity: 1;
      transition: .1s all .3s;
    }
    
    .checkbox:checked+label svg #grp3 #oval1 {
      transform: scale(0) translate(30px, 0px);
      transform-origin: 0 0 0;
      transition: .5s transform .3s;
    }
    
    .checkbox:checked+label svg #grp3 #oval2 {
      transform: scale(0) translate(60px, 10px);
      transform-origin: 0 0 0;
      transition: 1.5s transform .3s;
    }
    
    .checkbox:checked+label svg #grp4 {
      opacity: 1;
      transition: .1s all .3s;
    }
    
    .checkbox:checked+label svg #grp4 #oval1 {
      transform: scale(0) translate(30px, 15px);
      transform-origin: 0 0 0;
      transition: .5s transform .3s;
    }
    
    .checkbox:checked+label svg #grp4 #oval2 {
      transform: scale(0) translate(40px, 50px);
      transform-origin: 0 0 0;
      transition: 1.5s transform .3s;
    }
    
    .checkbox:checked+label svg #grp5 {
      opacity: 1;
      transition: .1s all .3s;
    }
    
    .checkbox:checked+label svg #grp5 #oval1 {
      transform: scale(0) translate(-10px, 20px);
      transform-origin: 0 0 0;
      transition: .5s transform .3s;
    }
    
    .checkbox:checked+label svg #grp5 #oval2 {
      transform: scale(0) translate(-60px, 30px);
      transform-origin: 0 0 0;
      transition: 1.5s transform .3s;
    }
    
    .checkbox:checked+label svg #grp6 {
      opacity: 1;
      transition: .1s all .3s;
    }
    
    .checkbox:checked+label svg #grp6 #oval1 {
      transform: scale(0) translate(-30px, 0px);
      transform-origin: 0 0 0;
      transition: .5s transform .3s;
    }
    
    .checkbox:checked+label svg #grp6 #oval2 {
      transform: scale(0) translate(-60px, -5px);
      transform-origin: 0 0 0;
      transition: 1.5s transform .3s;
    }
    
    .checkbox:checked+label svg #grp7 {
      opacity: 1;
      transition: .1s all .3s;
    }
    
    .checkbox:checked+label svg #grp7 #oval1 {
      transform: scale(0) translate(-30px, -15px);
      transform-origin: 0 0 0;
      transition: .5s transform .3s;
    }
    
    .checkbox:checked+label svg #grp7 #oval2 {
      transform: scale(0) translate(-55px, -30px);
      transform-origin: 0 0 0;
      transition: 1.5s transform .3s;
    }
    
    .checkbox:checked+label svg #grp2 {
      opacity: 1;
      transition: .1s opacity .3s;
    }
    
    .checkbox:checked+label svg #grp3 {
      opacity: 1;
      transition: .1s opacity .3s;
    }
    
    .checkbox:checked+label svg #grp4 {
      opacity: 1;
      transition: .1s opacity .3s;
    }
    
    .checkbox:checked+label svg #grp5 {
      opacity: 1;
      transition: .1s opacity .3s;
    }
    
    .checkbox:checked+label svg #grp6 {
      opacity: 1;
      transition: .1s opacity .3s;
    }
    
    .checkbox:checked+label svg #grp7 {
      opacity: 1;
      transition: .1s opacity .3s;
    }
    
    @keyframes animateCircle {
      40% {
        transform: scale(10);
        opacity: 1;
        fill: #DD4688;
      }
      55% {
        transform: scale(11);
        opacity: 1;
        fill: #D46ABF;
      }
      65% {
        transform: scale(12);
        opacity: 1;
        fill: #CC8EF5;
      }
      75% {
        transform: scale(13);
        opacity: 1;
        fill: transparent;
        stroke: #CC8EF5;
        stroke-width: .5;
      }
      85% {
        transform: scale(17);
        opacity: 1;
        fill: transparent;
        stroke: #CC8EF5;
        stroke-width: .2;
      }
      95% {
        transform: scale(18);
        opacity: 1;
        fill: transparent;
        stroke: #CC8EF5;
        stroke-width: .1;
      }
      100% {
        transform: scale(19);
        opacity: 1;
        fill: transparent;
        stroke: #CC8EF5;
        stroke-width: 0;
      }
    }
    
    @keyframes animateHeart {
      0% {
        transform: scale(0.2);
      }
      40% {
        transform: scale(1.2);
      }
      100% {
        transform: scale(1);
      }
    }
    
    @keyframes animateHeartOut {
      0% {
        transform: scale(1.4);
      }
      100% {
        transform: scale(1);
      }
    }
    <input type="checkbox" class="checkbox" id="checkbox" />
    <label for="checkbox">
          <svg id="heart-svg" viewBox="467 392 58 57" xmlns="http://www.w3.org/2000/svg">
            <g id="Group" fill="none" fill-rule="evenodd" transform="translate(467 392)">
              <path d="M29.144 20.773c-.063-.13-4.227-8.67-11.44-2.59C7.63 28.795 28.94 43.256 29.143 43.394c.204-.138 21.513-14.6 11.44-25.213-7.214-6.08-11.377 2.46-11.44 2.59z" id="heart" fill="#AAB8C2"/>
              <circle id="main-circ" fill="#E2264D" opacity="0" cx="29.5" cy="29.5" r="1.5"/>
    
              <g id="grp7" opacity="0" transform="translate(7 6)">
                <circle id="oval1" fill="#9CD8C3" cx="2" cy="6" r="2"/>
                <circle id="oval2" fill="#8CE8C3" cx="5" cy="2" r="2"/>
              </g>
    
              <g id="grp6" opacity="0" transform="translate(0 28)">
                <circle id="oval1" fill="#CC8EF5" cx="2" cy="7" r="2"/>
                <circle id="oval2" fill="#91D2FA" cx="3" cy="2" r="2"/>
              </g>
    
              <g id="grp3" opacity="0" transform="translate(52 28)">
                <circle id="oval2" fill="#9CD8C3" cx="2" cy="7" r="2"/>
                <circle id="oval1" fill="#8CE8C3" cx="4" cy="2" r="2"/>
              </g>
    
              <g id="grp2" opacity="0" transform="translate(44 6)">
                <circle id="oval2" fill="#CC8EF5" cx="5" cy="6" r="2"/>
                <circle id="oval1" fill="#CC8EF5" cx="2" cy="2" r="2"/>
              </g>
    
              <g id="grp5" opacity="0" transform="translate(14 50)">
                <circle id="oval1" fill="#91D2FA" cx="6" cy="5" r="2"/>
                <circle id="oval2" fill="#91D2FA" cx="2" cy="2" r="2"/>
              </g>
    
              <g id="grp4" opacity="0" transform="translate(35 50)">
                <circle id="oval1" fill="#F48EA7" cx="6" cy="5" r="2"/>
                <circle id="oval2" fill="#F48EA7" cx="2" cy="2" r="2"/>
              </g>
    
              <g id="grp1" opacity="0" transform="translate(24)">
                <circle id="oval1" fill="#9FC7FA" cx="2.5" cy="3" r="2"/>
                <circle id="oval2" fill="#9FC7FA" cx="7.5" cy="2" r="2"/>
              </g>
            </g>
          </svg>
        </label>
        <input type="checkbox" class="checkbox" id="checkbox_2" />
    <label for="checkbox_2">
          <svg id="heart-svg" viewBox="467 392 58 57" xmlns="http://www.w3.org/2000/svg">
            <g id="Group" fill="none" fill-rule="evenodd" transform="translate(467 392)">
              <path d="M29.144 20.773c-.063-.13-4.227-8.67-11.44-2.59C7.63 28.795 28.94 43.256 29.143 43.394c.204-.138 21.513-14.6 11.44-25.213-7.214-6.08-11.377 2.46-11.44 2.59z" id="heart" fill="#AAB8C2"/>
              <circle id="main-circ" fill="#E2264D" opacity="0" cx="29.5" cy="29.5" r="1.5"/>
    
              <g id="grp7" opacity="0" transform="translate(7 6)">
                <circle id="oval1" fill="#9CD8C3" cx="2" cy="6" r="2"/>
                <circle id="oval2" fill="#8CE8C3" cx="5" cy="2" r="2"/>
              </g>
    
              <g id="grp6" opacity="0" transform="translate(0 28)">
                <circle id="oval1" fill="#CC8EF5" cx="2" cy="7" r="2"/>
                <circle id="oval2" fill="#91D2FA" cx="3" cy="2" r="2"/>
              </g>
    
              <g id="grp3" opacity="0" transform="translate(52 28)">
                <circle id="oval2" fill="#9CD8C3" cx="2" cy="7" r="2"/>
                <circle id="oval1" fill="#8CE8C3" cx="4" cy="2" r="2"/>
              </g>
    
              <g id="grp2" opacity="0" transform="translate(44 6)">
                <circle id="oval2" fill="#CC8EF5" cx="5" cy="6" r="2"/>
                <circle id="oval1" fill="#CC8EF5" cx="2" cy="2" r="2"/>
              </g>
    
              <g id="grp5" opacity="0" transform="translate(14 50)">
                <circle id="oval1" fill="#91D2FA" cx="6" cy="5" r="2"/>
                <circle id="oval2" fill="#91D2FA" cx="2" cy="2" r="2"/>
              </g>
    
              <g id="grp4" opacity="0" transform="translate(35 50)">
                <circle id="oval1" fill="#F48EA7" cx="6" cy="5" r="2"/>
                <circle id="oval2" fill="#F48EA7" cx="2" cy="2" r="2"/>
              </g>
    
              <g id="grp1" opacity="0" transform="translate(24)">
                <circle id="oval1" fill="#9FC7FA" cx="2.5" cy="3" r="2"/>
                <circle id="oval2" fill="#9FC7FA" cx="7.5" cy="2" r="2"/>
              </g>
            </g>
          </svg>
        </label>
        <input type="checkbox" class="checkbox" id="checkbox_3" />
    <label for="checkbox_3">
          <svg id="heart-svg" viewBox="467 392 58 57" xmlns="http://www.w3.org/2000/svg">
            <g id="Group" fill="none" fill-rule="evenodd" transform="translate(467 392)">
              <path d="M29.144 20.773c-.063-.13-4.227-8.67-11.44-2.59C7.63 28.795 28.94 43.256 29.143 43.394c.204-.138 21.513-14.6 11.44-25.213-7.214-6.08-11.377 2.46-11.44 2.59z" id="heart" fill="#AAB8C2"/>
              <circle id="main-circ" fill="#E2264D" opacity="0" cx="29.5" cy="29.5" r="1.5"/>
    
              <g id="grp7" opacity="0" transform="translate(7 6)">
                <circle id="oval1" fill="#9CD8C3" cx="2" cy="6" r="2"/>
                <circle id="oval2" fill="#8CE8C3" cx="5" cy="2" r="2"/>
              </g>
    
              <g id="grp6" opacity="0" transform="translate(0 28)">
                <circle id="oval1" fill="#CC8EF5" cx="2" cy="7" r="2"/>
                <circle id="oval2" fill="#91D2FA" cx="3" cy="2" r="2"/>
              </g>
    
              <g id="grp3" opacity="0" transform="translate(52 28)">
                <circle id="oval2" fill="#9CD8C3" cx="2" cy="7" r="2"/>
                <circle id="oval1" fill="#8CE8C3" cx="4" cy="2" r="2"/>
              </g>
    
              <g id="grp2" opacity="0" transform="translate(44 6)">
                <circle id="oval2" fill="#CC8EF5" cx="5" cy="6" r="2"/>
                <circle id="oval1" fill="#CC8EF5" cx="2" cy="2" r="2"/>
              </g>
    
              <g id="grp5" opacity="0" transform="translate(14 50)">
                <circle id="oval1" fill="#91D2FA" cx="6" cy="5" r="2"/>
                <circle id="oval2" fill="#91D2FA" cx="2" cy="2" r="2"/>
              </g>
    
              <g id="grp4" opacity="0" transform="translate(35 50)">
                <circle id="oval1" fill="#F48EA7" cx="6" cy="5" r="2"/>
                <circle id="oval2" fill="#F48EA7" cx="2" cy="2" r="2"/>
              </g>
    
              <g id="grp1" opacity="0" transform="translate(24)">
                <circle id="oval1" fill="#9FC7FA" cx="2.5" cy="3" r="2"/>
                <circle id="oval2" fill="#9FC7FA" cx="7.5" cy="2" r="2"/>
              </g>
            </g>
          </svg>
        </label>

    【讨论】:

    • 你编码单个帖子意味着工作,但多个帖子意味着第一个图像只有在点击其他图像时才工作也请给我一个解决这个问题的方法
    • 您可以使用类更改 id,我已经更新了您需要使用唯一 'ids' 和 'for' 属性的代码
    • 非常感谢两位,这篇文章对我帮助很大。
    【解决方案2】:

    只有css:

    .like-btn-svg {
      width: 80px;
      height: 100px;
      background: url(https://abs.twimg.com/a/1446542199/img/t1/web_heart_animation.png) no-repeat;
      background-position: 0 0;
      cursor: pointer;
    }
    
    input[type="checkbox"] {
      display:none;
    }
    
    input:checked + .like-btn-svg{
      transition: background 1s steps(28);
      animation: fave-like-btn-svg 1s steps(28);
      background-position: -2800px 0;
    }
    
    @keyframes fave-like-btn-svg {
      0% {
        background-position: 0 0;
      }
      100% {
        background-position: -2800px 0;
      }
    }
    <label><input type="checkbox">
      <div class="like-btn-svg"></div>
    </label>

    【讨论】:

      【解决方案3】:

      您可以使用 jquery(或 javaScript,如果您愿意)来切换动画类。我已经更新了你的代码,请看一下:

      $('.like-btn-svg').on('click', function () {
        $(this).toggleClass('animate');
      });
      .like-btn-svg {
        width: 80px;
        height: 100px;
        position: absolute;
        left: 25px;
        bottom: 0; /* temp value */
        transform: translate(-50%, -50%);
        background: url(https://abs.twimg.com/a/1446542199/img/t1/web_heart_animation.png) no-repeat;
        background-position: 0 0;
        cursor: pointer;
      }
      
      .like-btn-svg.animate {
        transition: background 1s steps(28);
        animation: fave-like-btn-svg 1s steps(28);
        background-position: -2800px 0;
      }
      
      @keyframes fave-like-btn-svg {
        0% {
          background-position: 0 0;
        }
        100% {
          background-position: -2800px 0;
        }
      }
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js"></script>
      <div class="like-btn-svg"></div>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-10
        • 1970-01-01
        • 2014-09-21
        • 2012-09-20
        • 1970-01-01
        • 2016-04-04
        • 2019-07-03
        相关资源
        最近更新 更多