【问题标题】:CSS transform scalex line unconsistant heightCSS变换scalex线高度不一致
【发布时间】:2020-04-10 00:43:32
【问题描述】:

我在链接上有一个悬停动画。在文本下方绘制一条线。它的高度为 2px。问题是它从一个高度开始并以另一个高度继续。

  • 为什么要这样做?它不需要计算任何东西,因为 2px 是一个固定的数字。
  • 我怎样才能绕过它?

动画 GIF 是在 Chrome 中拍摄的。

:root {
  --cp-500: #c53e3a;
  --cp-700: #8d1d2d;
  --cp-800: #721228;
}

.action a {
  background: linear-gradient(45deg, var(--cp-500), var(--cp-800));
  color: #fff;
  border-radius: 100vh;
  padding: .5rem 2rem;
  display: inline-block;
  border: 1px solid var(--cp-700);
  transition: box-shadow 150ms ease-in;
  box-shadow: 0 1.25rem 1rem -1rem var(--cp-800);
  z-index: 1;
  text-decoration: none;
  position: relative;
 }

.action a:hover {
  box-shadow: 0 1rem 1rem -1rem var(--cp-800);
  background: var(--cp-700);
}

.action a:before {
  content: '';
  position: absolute;
  bottom: .5rem;
  left: 2rem;
  width: calc(100% - 4rem);
  height: 2px;
  background: var(--cp-500);
  transform: scaleX(0);
  transform-origin: top right;
  transition: transform 1000ms ease-in;
  z-index: -1;
}

.action a:hover:before {
  transform-origin: top left;
  transform: scaleX(1);
}
<div class="action">
   <a href="#">Test</a>
 </div>

【问题讨论】:

  • 它在我的电脑上运行良好。 =)
  • 版本 79.0.3945.88 (Official Build) (64-bit) 并且工作正常。
  • 也可以,Win10 上为 79.0.3945.88。字体似乎改变了想法?
  • 似乎工作正常。请分享您的 chrome 版本和系统信息。
  • 我在 Windows 上使用 Chrome 版本 79.0.3945.88 - 64 位。

标签: css css-transitions scale css-transforms


【解决方案1】:

我还能够重现您的问题。正如上面提到的 AlexioVay,您还应该添加一个 scaleY。但这还不够,您应该将 scaleY 设置为与 scaleX 几乎相同。现在这条线从开始到结束的高度相同。见此代码:https://jsfiddle.net/q236tmuk/30/

我在您的 css 中添加了以下更改:

.action a:hover:before {
  transform-origin: top left;
  transform: scaleX(1) scaleY(0.99);
}

以下场景也可以正常工作:

.action a:hover:before {
  transform-origin: top left;
  transform: scaleX(1) scaleY(1.01);
}

悬停时,行高从开始到结束都是相同的。不要对 scaleX 和 scaleY 使用相同的值,因为这样高度会在变换事件之后发生变化。是浏览器问题。唯一的解决方案是对 scaleY 使用一个小的不同值。

【讨论】:

  • 当@AlexioVay 接近解决方案时,我觉得仍然缺少一些东西。我觉得这个答案好一点。如果我做对了,为了避免浏览器错误,我们需要将 scaleX 和 scaleY 设置为几乎相同的值,但绝不完全相同。也就是强制浏览器在整个过渡过程中保持正确的值。
  • 是的,你是对的,对于许多 css 设置,Chrome 和 Mozilla 都会出现这种问题。
【解决方案2】:

您提到当您的浏览器大小为125% 时会发生此行为。我也可以重现这种行为并进行了很多测试,包括heightmax-height 等属性,它们没有任何影响。

似乎scaleX 是主要问题,因为您使用了更大的浏览器尺寸,所以这种行为仅在此特定浏览器尺寸(或大于 125% 的浏览器尺寸)中可见。所以它也可能在 100% 时表现得像这样,但由于 2px 太小而无法用人眼看到它是我的猜测。

因此,我还在.action a:hover:before 上将scaleY(1.2) 添加到transform:,以防止这种紧张行为。

:root {
  --cp-500: #c53e3a;
  --cp-700: #8d1d2d;
  --cp-800: #721228;
}

.action a {
  background: linear-gradient(45deg, var(--cp-500), var(--cp-800));
  color: #fff;
  border-radius: 100vh;
  padding: .5rem 2rem;
  display: inline-block;
  border: 1px solid var(--cp-700);
  transition: box-shadow 150ms ease-in;
  box-shadow: 0 1.25rem 1rem -1rem var(--cp-800);
  z-index: 1;
  text-decoration: none;
  position: relative;
 }

.action a:hover {
  box-shadow: 0 1rem 1rem -1rem var(--cp-800);
  background: var(--cp-700);
}

.action a:before {
  content: '';
  position: absolute;
  bottom: .5rem;
  left: 2rem;
  width: calc(100% - 4rem);
  height: 2px;
  background: var(--cp-500);
  transform: scaleX(0);
  transform-origin: top right;
  transition: transform 1000ms ease-in;
  z-index: -1;
}

.action a:hover:before {
  transform-origin: top left;
  transform: scaleX(1) scaleY(1.2);
}
<div class="action">
   <a href="#">Test</a>
 </div>

【讨论】:

  • 不错! 1.2 是一个出乎意料的数字,还是对为什么使用该数字有合理的解释?我想知道在其他决议中会发生什么。会断吗?我也测试了 100%,它似乎适用于 100% 和 125%。
  • 我测试了12之间的一些数字,当行高为2px时,1.2提供了最好的结果。由于scale 缩放元素不依赖于像素,我认为这也适用于其他高度大小。注意:您也可以写transform: scale(1, 1.2) 来稍微缩短这个解决方案。
  • 更新:像素越高,过渡越明显。如果我将height 设置为20px 并保持scaleY(1.2),您会清楚地看到它不是一条直线。请参阅以下代码笔并尝试更改 scaleY 值:codepen.io/alexiovay/pen/rNaYVym 这意味着您必须每次都根据 height 对其进行测试才能确定。如果我能帮助你,我会很高兴的! @JensTörnell
猜你喜欢
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多