【问题标题】:Safari hides element when applying translate3d transition inside another transitionSafari 在另一个过渡中应用 translate3d 过渡时隐藏元素
【发布时间】:2022-01-25 18:31:28
【问题描述】:

我注意到,在最新的 Safari 11.1(在 Chrome 和 Firefox 中运行良好)中,当将具有 translate3d 过渡的元素应用到另一个也包含 translate3d 过渡的元素中时,它会在屏幕上消失。

复制在这里: https://jsfiddle.net/chq2qfm8/66/

视频:

【问题讨论】:

  • 你试过backface-visibility: hidden; transform-style: flat;
  • 是的,我试过了:jsfiddle.net/chq2qfm8/74 也不工作。
  • 尝试添加 translateZ 并将其设置为 0,这应该有望修复故障,否则将错误报告给 Apple,以便在下一次更新中修复它
  • @TheCrazyProfessor translateZ 是在使用translate3d 时自动添加的,对吗​​?只有在使用 translateX 或 translateY 时才需要,这不是我的情况。

标签: javascript css safari webkit css-transitions


【解决方案1】:

看起来 Safari 是新的 IE,但你可以使用 translateY,它也是“3d”:

更新作为 PO“可能也有 X 运动”我也添加了 X 组件。

init();

function init() {
  bindEvents();
}

function bindEvents() {
  document.querySelector('.scrollUp').addEventListener('click', scrollUp, false);
  document.querySelector('.scrollDown').addEventListener('click', scrollDown, false);

}

function scrollDown() {
  document.querySelector('.panels')
  .style.transform = 'translateX(100px) translateY(-' + window.innerHeight + 'px)';

  document.querySelector('.panel1 .panel-bg')
  .style.transform = 'translateX(100px) translateY(-20px)';


  document.querySelector('.panel2 .panel-bg')
  .style.transform = 'translateX(-100px) translateY(-20px)';
}

function scrollUp() {
  document.querySelector('.panels')
  .style.transform = 'translateX(0) translateY(0)';

  document.querySelector('.panel1 .panel-bg')
  .style.transform = 'translateX(-100px) translateY(-20px)';

  document.querySelector('.panel2 .panel-bg')
  .style.transform = 'translateX(100px) translateY(-20px)';

}
html,
body {
  overflow: hidden;
  height: 100%;
  padding: 0;
  margin: 0;
  color: red;
  font-weight: bold;
}

.panels {
  position: relative;
  width: 100%;
  height: 100%;
  transition: all 1000ms ease;
}

.panel,
.panel-bg {
  width: 100%;
  height: 100%;
}

.panel-bg {
  background-image: url(https://www.w3schools.com/howto/img_fjords.jpg);
  background-size: cover;
  transition: transform 700ms ease;
}

.panel2 .panel-bg {
  background-image: url('https://camo.mybb.com/e01de90be6012adc1b1701dba899491a9348ae79/687474703a2f2f7777772e6a71756572797363726970742e6e65742f696d616765732f53696d706c6573742d526573706f6e736976652d6a51756572792d496d6167652d4c69676874626f782d506c7567696e2d73696d706c652d6c69676874626f782e6a7067');
}

.panel {
  overflow: hidden;
}

.panel-bg {
  top: 0;
  left: 0;
  width: 100%;
}

.actions {
  position: fixed;
  z-index: 777;
  left: 20px;
  top: 20px;
}

.acions button {
  display: inline-block;
}
<div class="actions">
  <button class="scrollDown">
        Scroll down
    </button>
  <button class="scrollUp">
        Scroll up
    </button>
</div>

<div class="panels">
  <div class="panel panel1">
    <div class="panel-bg">
      TEST <br>TESTTEST <br>TESTTEST <br>TESTTEST <br>TESTTEST <br>TEST<br>TESTTEST <br>TESTTEST <br>TESTTEST <br>TESTTEST <br>TEST</div>
  </div>
  <div class="panel panel2">
    <div class="panel-bg">
      TEST <br>TESTTEST <br>TESTTEST <br>TESTTEST <br>TESTTEST <br>TEST<br>TESTTEST <br>TESTTEST <br>TESTTEST <br>TESTTEST <br>TEST
    </div>
  </div>
</div>

【讨论】:

  • 我想继续使用translate3d,因为我可能也有 X 运动。它在其他浏览器中运行良好。
  • 但是感谢您的回答,它似乎适用于一个肮脏的解决方案!
  • @Alvaro,感谢您的评论!它不是“肮脏”的解决方案,因为它基于您的示例并操纵了您在问题中显示的 translate 属性的相同 Y 组件。我已经更新了我的答案。
  • 听起来是迄今为止最好的答案。我将不得不修改代码以适应它 translateX 和 translateY 而不是 translate3d,但我想这是最好的选择。只是想知道为什么 translate3d 不起作用,除了 translateY 和 translateX 之外,它不应该与将 translateZ(0) 应用于元素相同吗?
  • @Alvaro,如果您也添加translateZ(0),它将正常工作。我认为 Safari 中的 translate3d 实现很差。希望他们有一天能修好。
【解决方案2】:

“看来强制硬件加速可以解决问题”

Source

【讨论】:

  • 这也不适用于 Safari 桌面。所以可能不是同一个问题?
【解决方案3】:

hiii 我有一个经过测试的解决方案

使用 ......输入占位符=“您的文本”已禁用............

然后使用 placeHolder(在占位符上分配您的文本) 然后用css消除输入的所有背景和阴影, 确保你禁用输入按钮然后 设置占位符文本的样式,就像它是普通文本一样 使用以下语法来定位它

::placeholder{font.size:30px;颜色:红色;)等...

或者,如果您只想在页面中定位该输入,请使用

input::placeholder{ font-size:"", etc.....)

好的,现在你的问题已经解决了,文本可以在 safari 上使用 translate3d 轻松清晰地呈现 然而,safari 默认提供 0.4 到 0.5 的占位符文本不透明度 所以它会是透明的 你怎么解决的.... 是的,有一种方法只需创建两个具有相同占位符标题的相同输入元素的副本;然后给它
位置:绝对; transform:translate(50%,-50%) 或任何您想要的位置,只是将它们全部 3 放在彼此之上以增加 safari 的不透明度,这是我尝试了这么多方法之后的一种方法,并且我失败了......这就像魔术一样

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 2015-09-16
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多