CSS 翻译动画副作用

CSS translate animation side effects

我正在尝试将我的对话置于屏幕中间。 我不知道对话的高度或宽度(以后 JS 可能会添加新元素)。对话的大小必须取决于它的内容。

我使用了转换:translate(-50%, -50%);与顶部:50%;剩下:50%;它完成了它的工作,但在某些对话高度上也有副作用,在不同的浏览器上显示不同:

请帮我消除这个副作用。

可以在下面的示例中看到这种副作用。通过将对话元素的高度向上或向下更改 1px,效果消失。

JSfiddle Demo

.radio label {
  padding: 4px 11px;
  border: 1px solid #000;
}
.radio label.checked {
  background-color: #0275b8;
}
select {
  border: 1px solid #000;
  margin-bottom:20px;
}
.dialogue {
  padding: 10px;
  border: 1px solid #000;
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
<div class="dialogue" style="height:71px;">
  <select>
    <option>Option 1</option>
  </select>
  <div class="radio">
    <label class="checked">Option 1</label><label>Option 2</label>
  </div>
</div>

添加前缀是否有效?

.dialogue {
  padding: 10px;
  border: 1px solid #000;
  position: fixed;
  top: 50%;
  left: 50%;
  -webkit-transform: translate(-50%, -50%);
  -ms-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
}

这似乎是对话的浮动宽度和高度四舍五入的问题。在奇数高度数字上不需要四舍五入 - 一切都很好。在偶数高度上结果高度是 x.5px,这似乎在不同的浏览器中处理不同。

为了解决这个问题,决定使用 MutationObserver 功能定位与 JS 的对话。 在加载时,只要 MutationObserver 在 HTML 中发现变化,JS 就会调用以下函数:

jQuery('.dialogue').css({
    'left': Math.round((jQuery(window).width() - jQuery('.dialogue').width()) / 2) + 'px',
    'top': Math.round((jQuery(window).height() - jQuery('.dialogue').height()) / 2) + 'px'
});