当前位置: 首页 > 面试题库 >

如果选择器不再匹配,如何将CSS3动画运行到最后?

咸玄天
2023-03-14
问题内容

我一直认为CSS3动画(与CSS3 Transitions不同) 一旦启动,就总是完成工作 ,无论选择器是否与激活它们的元素都不匹配。

我今天意识到自己可能是错的。

在以下示例中,动画由:focus:active类触发。专注于第一个文本字段:

  • 如果tab缓慢按下按钮,您将看到动画正确开始和结束;
  • 如果tab快速按下按钮,您将看到一个新元素获得焦点后,旧元素的动画立即结束并消失。

    @-webkit-keyframes pressed {

    0%, 100% { transform : scale(1); }
    
         50% { transform : scale(2); }
    

    }

    @keyframes pressed {

    0%, 100% { transform : scale(1); }
    
         50% { transform : scale(2); }
    

    }

    a:focus, a:active {

    -webkit-animation : pressed 2s;
    
            animation : pressed 2s;
    

    }

    a, input {

          border : 1px solid silver;
    
         padding : 5px;
    
          height : 40px;
    
     line-height : 28px;
    
          margin : 0px;
    
         display : inline-block;
    
           width : 33.3%;
    
      box-sizing : border-box;
    
      background : white;
    

    vertical-align : middle;

    }

    a {

           color : dodgerBlue;
    

    text-decoration : none;}

    input {

           color : red;
    

    }

    Lorem


问题答案:

如评论中所讨论的,即使在最初应用该动画的选择器规则不再适用之后,目前也没有办法强制动画完成一个完整的周期。

实现此目的的唯一方法是使用脚本。以下是使用JavaScript的示例代码段。这样做是animation在元素获得焦点时向该元素添加一个类(已设置属性),然后仅在动画结束时将其删除。

注意:
我已在代码段中使用了webkitAnimationEnd事件,因此在其他浏览器中将无法使用。该代码还需要进行更精细的调整,因为它当前仅在动画结束时删除该类。因此,如果您在一个周期完成之前退出并进入,则不会发生任何事情。

window.onload = function() {

  var anchors = document.querySelectorAll('a');

  for (var i = 0; i < anchors.length; i++) {

    anchors[i].addEventListener('focus', function() {

      addanim(this);

    });

    anchors[i].addEventListener('webkitAnimationEnd', function() {

      endanim(this);

    });

  }



  function addanim(el) {

    el.classList.add('focus');

  }



  function endanim(el) {

    el.classList.remove('focus');

  }

}


@keyframes pressed {

  0%, 100% {

    transform: scale(1);

  }

  50% {

    transform: scale(2);

  }

}

.focus {

  animation: pressed 2s;

}

a,

input {

  border: 1px solid silver;

  padding: 5px;

  height: 40px;

  line-height: 28px;

  margin: 0px;

  display: inline-block;

  width: 33.3%;

  box-sizing: border-box;

  background: white;

}

a {

  color: dodgerBlue;

  text-decoration: none;

}

input {

  color: red;

}


<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>



<input type="text" id="foo" value="Start here, then press tab" />

<a href="#">Lorem</a>

<a href="#">Ipsum</a>

<a href="#">dolor</a>

<a href="#">sit</a>

<a href="#">amet</a>

<a href="#">consectetur</a>

<a href="#">adipiscing</a>

<a href="#">elit</a>

animationcancel注释中提到的事件(由BoltClock提出)对于我们的案例可能更有用,但它只是遇到动画异常结束时触发的事件。我们仍然必须编写自己的代码,以使其继续到周期结束。



 类似资料:
  • 问题内容: 给定 当我不知道n是什么时,如何选择最后一个’service-n’行?我尝试添加,但是没有用。 我有: 但它选择第一行,而我要最后一行。 我无法使用,因为实际上’service-n’行的数量是动态的,并且变化很大。 问题答案: 答案正是我把[last()]放在哪里,我把它放在错误的地方 它在这里: 不在这里:

  • 如果条目的时间戳与今天的日期匹配,我想从SQLite表中选择所有条目。 我查询SQLite数据库如下: 这是我最近的行为,但我不希望在过去24小时内选择所有条目。我只想选择今天的日期是否与时间戳匹配。 如何仅选择表中时间戳与今天日期匹配的行。 数据库中的日期格式为:2014-07-05 12:59:35。

  • null 我正在编写一个数据库客户端库,示例使用了一个假设的、不存在的数据库服务器。因此,示例在运行时总是失败,但重要的是示例在语法上是有效的。因此我有上述要求。 如果没有办法做我想做的事情,那么如何选择不让运行特定的文档测试呢?例如,编译并运行一些文档测试,但完全忽略其他一些测试吗?

  • 问题内容: 我有一个看起来像这样的报告: 这是通过SQL完成的(特别是T-SQL版本的Server 2005): 我希望该报告仅显示每个工作流程的最早日期: 有任何想法吗?我不知道这一点。我尝试使用嵌套的选择返回最早的托盘日期,然后在WHERE子句中进行设置。如果只有一家公司,这将非常有用: 但是,如果该表中有不止一家公司,那么这显然将行不通。任何帮助表示赞赏! 问题答案: 只需使用

  • #animated_div{ width:76px; height:47px; background:#92B901; color:#ffffff; position:relative; font-weight:bold; font-size:20px; padding:10px; animation:animated_div 5s 1;

  • 我在一个微服务体系结构中工作,其工作原理如下 我有两个服务Web应用程序(REST服务),在eureka服务器中正确注册自己,然后我有一个客户端应用程序,获取eureka注册表,并使用ribbon作为客户端负载均衡器,确定哪个服务应用程序去(目前,一个简单的正在使用圆形罗宾)。 我的问题是,当我停止其中一个服务应用程序(它们目前在docker容器中运行)时,eureka不会将它们从注册表中删除(似