【问题标题】:How do I "reverse" a CSS transition when the element is clicked on a second time?当第二次单击元素时,如何“反转” CSS 过渡?
【发布时间】:2020-09-12 07:47:39
【问题描述】:

我有一个用于切换开关的简单 CSS 转换/转换。当我单击它时,它会切换 .slider-click 类。当我再次单击它时,我想执行第二个“反转”效果的转换。但是,显然它只是删除了类。请运行我的代码 sn-p 以了解我的意思。我如何实现这一目标?谢谢。

      const slider = document.querySelector('.slider')
      const circle = document.querySelector('.slider-circle')
      
      slider.addEventListener('click', (e)=>{
        circle.classList.toggle('slider-click');
      })
.slider {
    background-color: hsl(237, 63%, 64%);
    border-radius: 75px;
    width: 34vw;
    height: 21vw;
    display: flex;
    justify-content: flex-start;
    align-content: flex-start;
}
.slider:hover {
    opacity: 50%;
    cursor: pointer;
}
.slider-circle {
    height: 17.36vw;
    width: 17.36vw;
    border-radius: 50%;
    background-color: #ffffff;
    margin: 5%
}

.slider-click {
    transform: translateX(13vw);
    transition: .2s;
}

/* Something like this when clicked again */
.slider-return {
    transform: translateX(-13vw);
    transition: .2s;
}
          <div class="slider-content">
            <div class="slider">
                <div class="slider-circle"></div>
            </div>
          </div>

【问题讨论】:

    标签: javascript html css animation css-transitions


    【解决方案1】:

    在默认元素内设置transition: .2s;,而不是在它接收到active类之后。

    // slider? It's more kindof a checkbox
    const checkbox = document.querySelectorAll('.checkbox'); // use all! It's a class after all
    const checboxToggle = (ev) => ev.currentTarget.classList.toggle('is-active');
    checkbox.forEach(el => el.addEventListener('click', checboxToggle));
    .checkbox {
      background-color: hsl(237, 63%, 64%);
      border-radius: 21vw;
      width: 34vw;
      height: 21vw;
      display: flex;
      justify-content: flex-start;
      align-content: flex-start;
      cursor: pointer;
    }
    
    .checkbox:before {
      content: "";
      height: 17.36vw;
      width: 17.36vw;
      border-radius: 50%;
      background-color: #ffffff;
      margin: 5%;
      transition: .2s; /* USE IT HERE! */
    }
    
    .checkbox.is-active:before {
      transform: translateX(13vw);
    }
    &lt;div class="checkbox"&gt;&lt;/div&gt;

    另外:

    • 使用正确的措辞。没有什么可以滑动。它更像是一个复选框。
    • 使用querySelectorAll,因为您使用类!和.forEach() 所有检索到的元素。
    • 您不需要任何内部元素。使用:before:after 伪类
    • 将所需的类直接添加到主.checkbox 元素中。

    【讨论】:

      【解决方案2】:

      我想这就是你想要的,你只需在圆圈中添加一个单击的类,它将设置 css translateX(13vw) 并在再次单击时将其重置为零。

      const slider = document.querySelector('.slider')
      const circle = document.querySelector('.slider-circle')
      
      slider.addEventListener('click', (e)=>{
        circle.classList.toggle('clicked');
      })
      .slider {
          background-color: hsl(237, 63%, 64%);
          border-radius: 75px;
          width: 34vw;
          height: 21vw;
          display: flex;
          justify-content: flex-start;
          align-content: flex-start;
      }
      .slider:hover {
          opacity: 50%;
          cursor: pointer;
      }
      .slider-circle {
          height: 17.36vw;
          width: 17.36vw;
          border-radius: 50%;
          background-color: #ffffff;
          margin: 5%;
          transition: all .2s ease-out;
          transform: translateX(0);
      }
      
      .clicked {
          transform: translateX(13vw);
      }
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
      <div class="slider-content">
        <div class="slider">
            <div class="slider-circle"></div>
        </div>
      </div>

      【讨论】:

        【解决方案3】:

              const slider = document.querySelector('.slider')
              const circle = document.querySelector('.slider-circle')
              let toggled = false
              slider.addEventListener('click', (e)=>{
                if(toggled) {
                  circle.classList.remove('slider-click');
                  circle.classList.add('slider-return');
                  toggled = false;
                } else {
                  circle.classList.remove('slider-return');
                  circle.classList.add('slider-click');
                  toggled = true;
                }
              })
        .slider {
            background-color: hsl(237, 63%, 64%);
            border-radius: 75px;
            width: 34vw;
            height: 21vw;
            display: flex;
            justify-content: flex-start;
            align-content: flex-start;
        }
        .slider:hover {
            opacity: 50%;
            cursor: pointer;
        }
        .slider-circle {
            height: 17.36vw;
            width: 17.36vw;
            border-radius: 50%;
            background-color: #ffffff;
            margin: 5%
        }
        
        .slider-click {
            transform: translateX(13vw);
            transition: .2s;
        }
        
        /* Something like this when clicked again */
        .slider-return {
            transform: initial;
            transition: .2s;
        }
                  <div class="slider-content">
                    <div class="slider">
                        <div class="slider-circle"></div>
                    </div>
                  </div>

        【讨论】:

        • 这样一个糟糕的解决方案,不必要地使用两个类。
        • @RokoC.Buljan - 我直接回答了发帖者的问题:他们“不必要地使用了两个类”,所以我给出了使“两个不必要的类”起作用的解决方案。我很高兴能够找到 CSS 问题的解决方案!那种短暂的快乐已经消失了,但我想我已经取而代之的是你刚刚放弃的知识。所以...谢谢?
        【解决方案4】:

        首先使用复选框并使用:before:after 伪类。

        无需使用 Javascript。

        有关如何执行此操作的更多信息,请参阅w3schools

        【讨论】:

        • w3schools 至今仍是最糟糕的学习资源。此外,仅链接的答案不是本网站的预期格式。
        猜你喜欢
        • 1970-01-01
        • 2019-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多