【问题标题】:Disable single CSS transition not working in Firefox禁用单个 CSS 过渡在 Firefox 中不起作用
【发布时间】:2018-08-14 01:17:46
【问题描述】:

是否可以为all 添加一个过渡,但也只禁用一个?例如:

textarea {
  width: 400px;
  height: 60px;
  min-height: 60px;
  resize: vertical;
  color: #ccc;
  border: 1px solid #ccc;
  transition: all 0.3s, height 0s;
}

textarea:focus {
  color: #333;
  border: 3px solid #f00;
  padding: 10px;
}
<textarea>text</textarea>

您会看到(至少在 firefox 中)在调整框的大小时,它会滞后。在 Chrome 和 IE 中没有问题,工作正常。

同时使用1ms 之类的时间来禁用也不起作用:

textarea {
  width: 400px;
  height: 60px;
  min-height: 60px;
  resize: vertical;
  transition: all 0.5s, height 1ms;
}
<textarea placeholder="test"></textarea>

【问题讨论】:

  • 那么可能是 Firefox 错误?
  • 正在转换哪些属性?
  • 我不明白你的问题?是all 除了height?!在这种情况下,我不想添加每个属性。这将是一个解决方案,我知道。但我希望有一种方法可以做到这一点。 ;) @BrettDeWoody
  • 将您不想过渡的属性的过渡持续时间更改为1ms

标签: html css


【解决方案1】:

似乎是 Firefox 的一个错误,我看不到任何可靠的纯 CSS 解决方案。所以这里有一个JS解决方案。

我们将在focus 上添加一个事件侦听器,它会在延迟后删除transition,然后在blur 上重新添加过渡。

const fixFirefoxResizeTransition = el => {
  const elTransition = el.style.transition;
  const elTransitionDuration = parseFloat(getComputedStyle(el)['transitionDuration']) * 1000;
  
  el.addEventListener("focus", () => {
    setTimeout(() => {
      el.style.transition = "none"
    }, elTransitionDuration);
  });

  el.addEventListener("blur", () => {
    el.style.transition = elTransition;
  });
}

fixFirefoxResizeTransition(document.querySelector("textarea"));
textarea {
  width: 100%;
  height: 60px;
  min-height: 60px;
  resize: vertical;
  box-sizing: border-box;
  color: #ccc;
  border: 1px solid #ccc;
  transition: all 0.3s, height 1ms;
}

textarea:focus {
  color: #333;
  border: 3px solid #f00;
  padding: 10px;
}
<textarea>text</textarea>

【讨论】:

  • 但这在没有焦点的情况下调整框的大小时不起作用。 ;) 我认为您可能是对的,这是一个错误,我也没有解决方案。认为我必须将所有转换拆分为单个参数。还是谢谢...
  • 嗯,没错。在这种情况下,有必要检测对调整大小的点击,而不是对文本区域的点击。
  • 我研究了几个选项,但除了检测元素右下角的点击外,没有办法知道元素正在调整大小和焦点。
【解决方案2】:

transition: none 的使用似乎有效。

  • 例如,我创建了一个带有过渡和一个没有。

    textarea {
      width: 400px;
      height: 60px;
      min-height: 60px;
      resize: vertical;
      transition: all 0.5s, height 1ms;
    }
    
    textarea.notransition{
        -moz-transition: none;
        -webkit-transition: none;
        -o-transition: color 0 ease-in;
        transition: none;
    }
<textarea class="notransition">without transition</textarea> <textarea>with transition</textarea>

您有以下 CSS。
- 如果你想要一个没有过渡的文本区域,我向 textarea 添加了一个类/如果你愿意,你也可以为其他东西创建一个新类。

希望这个例子对你有用。

【讨论】:

  • 感谢您的回答,但请再次阅读问题。这不是我想要的。
  • @eisbehr 对不起,我不明白你的问题,你能具体说明一下吗?
  • 我不希望所有的过渡都被删除,所有条目只有一个。所以第二类不是一个选择。请参阅我的第一个示例。
【解决方案3】:

您想只在 Firefox 浏览器中禁用过渡吗?

你试过用-moz-document url-prefix吗?

@-moz-document url-prefix() { 
  textarea{
     transition:none !important;
  }
}

或者你可以设置:

  textarea{
  width: 400px;
  height: 60px;
  min-height: 60px;
  resize: vertical;
  color: #ccc;
  border: 1px solid #ccc;
  transition: all 0.3s, height 0s;
-moz-transition-property: none;
}

【讨论】:

  • 否,适用于所有浏览器。 Firefox 是唯一一个不工作的。
  • 我的代码是为 Firefox 禁用 CSS 过渡,标题错误?
  • 问题中已经说了。但我更新了标题以更清晰。
  • 对于“所有”你是指浏览器吗?查看第二个示例,适用于所有浏览器并仅在 firefox 中阻止转换
  • 不,我的意思是transition: all
猜你喜欢
  • 2014-05-29
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 2012-01-24
  • 2014-07-12
相关资源
最近更新 更多