我不明白为啥 CSS 转换在 keydown 上不起作用 [重复]

Posted

技术标签:

【中文标题】我不明白为啥 CSS 转换在 keydown 上不起作用 [重复]【英文标题】:I can't understand why CSS Transition is not working on keydown [duplicate]我不明白为什么 CSS 转换在 keydown 上不起作用 [重复] 【发布时间】:2020-07-02 14:24:24 【问题描述】:

我正在尝试制作左右移动方块的动画。但我不明白为什么它不起作用。例如,它适用于点击事件。这是我的codepen。 谢谢

const box = document.getElementsByClassName('box')[0];

document.addEventListener('keydown', function(
  keyCode,
  which
) 
  const keycode = keyCode ? keyCode : which;
  switch (keycode) 
    case (39):
      box.classList.add('move-right');
      box.classList.remove('move-left');
      break;
    case (37):
      box.classList.add('move-left');
      box.classList.remove('move-right');
      break;
  
);
.box 
  background-color: gray;
  height: 100px;
  width: 100px;
  transition: margin-left 0.5s cubic-bezier(0, .7, 0, 1);
  transition: margin-top 0.5s cubic-bezier(0, .7, 0, 1);


.move-right 
  margin-left: 400px;


.move-left 
  margin-left: 0px;
<div class="box"></div>

【问题讨论】:

使用transition: margin 0.5s ...; 它适用于margin-left,我只是想为margin 使用,而不是添加所有边距属性。 【参考方案1】:

transition 应该添加一次,这里是一个有效的 sn-p:

const box = document.getElementsByClassName('box')[0];

document.addEventListener('keydown', function(keyCode, which) 
  const keycode = keyCode ? keyCode : which;
  switch(keycode) 
    case(39):
      box.classList.add('move-right');
      box.classList.remove('move-left');
      break;
    case(37):
      box.classList.add('move-left');
      box.classList.remove('move-right');
      break;
  
);
.box 
  background-color: gray;
  height: 100px;
  width: 100px;
  transition: margin 0.5s cubic-bezier(0, .7, 0, 1);


.move-right 
  margin-left: 400px;


.move-left 
  margin-left: 0px;
<div class="box"></div>

【讨论】:

【参考方案2】:

您的 cssCSS 中有两个 transition 实例

.box 
  ...
  transition: margin-left 0.5s cubic-bezier(0, .7, 0, 1);
  transition: margin-top 0.5s cubic-bezier(0, .7, 0, 1);


如果你想在左边距和顶部边距之间特别有不同的过渡,你可以将它们组合起来。

.box 
  ...
  transition: margin-left 0.5s cubic-bezier(0, .7, 0, 1), margin-top 0.5s cubic-bezier(0, .7, 0, 1);

【讨论】:

【参考方案3】:

如果你看看你写的css

.box 
  background-color: gray;
  height: 100px;
  width: 100px;
  transition: margin-left 0.5s cubic-bezier(0, .7, 0, 1);
  transition: margin-top 0.5s cubic-bezier(0, .7, 0, 1);

你有 2 个转换属性,转换属性被下一个覆盖,它转换 margin-top 属性。

当样式被计算出来时,这就是 css 规则的样子。

.box 
  background-color: gray;
  height: 100px;
  width: 100px;
  transition: margin-top 0.5s cubic-bezier(0, .7, 0, 1);

由于您有相同类型的键,所以最后一条规则获胜,在 margin-top 的转换中,margin-left 的转换丢失。

因此,要么删除第二个转换规则,要么将其编写为单个规则,将用逗号分隔属性。

【讨论】:

以上是关于我不明白为啥 CSS 转换在 keydown 上不起作用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 CSS 转换在锚点内的 SVG 上不起作用

keyup、keydown 和 keypress 事件在移动设备上不起作用

为啥 npm install 在 git bash 上不起作用

为啥 LESS css 在 localhost 上不起作用

为啥 tailwind css 在 iPhone ios 设备上不起作用?

当行内的单元格具有类名时,为啥 CSS 悬停在表格行上不起作用?