Firefox Android 中带有“white-space:pre-wrap”的“input”高度大于 Android 中的 Chrome

Posted

技术标签:

【中文标题】Firefox Android 中带有“white-space:pre-wrap”的“input”高度大于 Android 中的 Chrome【英文标题】:Height of "input" with "white-space:pre-wrap" in Firefox Android is bigger than Chrome in Android 【发布时间】:2021-01-27 13:58:45 【问题描述】:

请看一下这个错误的以下简化版本:

.wrap 
  white-space: pre-wrap;
<div>
<input type="date" class="wrap">
</div>

如果您在 Firefox android(最新版本)中打开此代码,您会看到高度比 Chrome 中的要大。

问题是因为“空白:预包装”。我不知道为什么它会导致高度更大。有人可以向我解释它以及可能的解决方案或替代方案。顺便说一句,我不想​​为我的输入设置一个固定的高度。

【问题讨论】:

删除white-space: pre-wrap; 或删除padding: 0; 另外不同的浏览器有不同的风格。例如,&lt;input type="color"&gt; 在 Firefox 和 Chrome 中是不同的。 我需要预包装功能,我不想删除它。请给我一个替代解决方案 尝试使用box-sizing: border-box; padding: 0 !important; 不,它不起作用。还是很大! 【参考方案1】:

您似乎在 Firefox 中发现了一个有趣的错误。

A.首先是建议的(!)解决方案

简单地说:不要使用whitespace: pre-wrap&lt;input type="date"&gt;&lt;input type="time"&gt;。你仍然不需要这个......显然浏览器开发人员不希望任何人这样做,因此开发人员尚未发现这种行为。

真的很难想象属性whitespace: pre-wrap 需要用于该元素的任何原因或场景。日期不会自己流到下一行。

B.背景(您要求的原因)

date-/time-picker 这样的包含功能的元素有额外的隐藏内部元素。对于&lt;input type="date",通常看不到的结构如下:

<div id="input-box-wrapper" class="datetime-input-box-wrapper">
    <span id="edit-wrapper" class="datetime-input-edit-wrapper"></span>
    <button id="reset-button" class="datetime-reset-button"></button>
</div>

// you can see this normally hidden structure in Firefox using the developer tools
// when 'white-space: pre-wrap' is set to the element ...

该元素的 CSS 放置在您通常无法通过 css/js 访问/覆盖的浏览器集成样式中。尤其是在 Firefox 中这是不可能的,因为开发人员根本没有打算删除 Firefox 中的日期/时间行为的方法。

如果您不想在 Firefox 中使用浏览器集成机制,请使用文本字段并添加日期选择器扩展,即通过 jQuery。 (对你来说也可以是一个解决方法!?)

这里的更多信息是集成隐藏元素的浏览器集成 CSS:

// file: datetimebox.css
// you may have a look on them using Firefox dev tools as well

/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

@namespace url("http://www.w3.org/1999/xhtml");
@namespace svg url("http://www.w3.org/2000/svg");

.datetimebox 
  display: flex;
  /* TODO: Enable selection once bug 1455893 is fixed */
  user-select: none;


.datetime-input-box-wrapper 
  display: inline-flex;
  flex: 1;
  background-color: inherit;
  min-width: 0;
  justify-content: space-between;
  align-items: center;


.datetime-input-edit-wrapper 
  overflow: hidden;
  white-space: nowrap;
  flex-grow: 1;


.datetime-edit-field 
  display: inline;
  text-align: center;
  padding: 1px 3px;
  border: 0;
  margin: 0;
  ime-mode: disabled;
  outline: none;


.datetime-edit-field:not([disabled="true"]):focus 
  background-color: Highlight;
  color: HighlightText;
  outline: none;


.datetime-edit-field[disabled="true"],
.datetime-edit-field[readonly="true"] 
  user-select: none;


.datetime-reset-button 
  color: inherit;
  fill: currentColor;
  opacity: .5;
  background-color: transparent;
  border: none;
  flex: none;
  padding-inline: 2px;


svg|svg.datetime-reset-button-svg 
  pointer-events: none;


集合在一起:

真正的问题是集成元素.datetime-reset-button。自己证明:使用white-space: pre-wrapinput 让“增长”将按钮包装元素重置为给定的高度。如果您现在将浏览器集成样式中的 display: none(在 Firefox 直接中)添加到该元素,则 input 的行为将被删除,input 的大小将恢复为正常状态。

所以,-white-space: pre-wrap 更改了字段的行为并保留了空白序列的位置(更多详细信息:https://developer.mozilla.org/en-US/docs/Web/CSS/white-space)。正常行为是,来自 reset-button-container 的父元素的属性 display: inline-flex 让容器内联流动并流动到下一行。如果您设置white-space: wrap,您可以在输入字段下方的下一行中看到该按钮。 (看到这似乎也是一个错误。)但是对于pre-wrap,流程不再可能,并且在字段中按下按钮......让它增长得更高。

【讨论】:

【参考方案2】:

当您使用white-space: pre-wrap 时,Safari 会保留空白序列。

最简单的解决方案是:

.wrap 
  white-space: none;
  white-space: -moz-none;

我建议你检查CSS-Tricks。

【讨论】:

谢谢,我知道问题是预包装问题,但我不想删除它,因为我需要它。目前,我对 Firefox 有疑问。我没有用 Safari 测试它 Arnon,这不能回答 OP 的问题。他们正在寻找一种方法来保留空白,但不会产生奇怪的影响。【参考方案3】:
<div> <--linebreak
>whitespace<.innerHTML <-- linebreak
</div>

这些换行符和空白确实会使您的元素伸展,因为您已使用 white-space: pre; 将它们保存在 .innerHTML 中

<div>.innerHTML</div>
-or-
elem.innerHTML = elem.innerHTML.trim()

修复了带有 标记的元素的问题>

然而,

<input type="date" id="wrap" value='2021-12-06'>

没有 .innerHTML 也没有结束标记。它的值没有空格。

元素显示的内容,不反映在inspector中,被max-height: 20px规则裁剪

我一直在寻找一种方法来访问此标签的显示内容,但找不到。我建议不要使用默认输入标签,而是使用 js 解决方案。众所周知,默认输入字段难以跨设备预测和样式化。

【讨论】:

以上是关于Firefox Android 中带有“white-space:pre-wrap”的“input”高度大于 Android 中的 Chrome的主要内容,如果未能解决你的问题,请参考以下文章

Firefox中带有缩放变换的CSS过渡效果后的图像移动/跳跃

外部样式表中带有 fill:url(#id) 样式的 Firefox SVG,内联样式很好

SceneKit 中带有反射的透明玻璃

Bootstrap:容器中带有列的全宽网格

Internet Explorer 中带有 innerHTML 的 JavaScript iframe 设置

android中每行中带有添加和删除按钮的ListView