HTML/CSS:文本居中,但光标在开始输入前保持左对齐

前端开发 2026-07-08

我正在做的一个项目,涉及可编辑框中的文本字段。框中有占位文本,直到用户点击进入框后,占位文本才会消失,用户就可以输入文本。我已经尽量删减到只保留最小必要的部分来展示问题。我整理出了如下的HTML文档:

.editable-box {
  background: cyan;
  height: 100px;

  /* Center alignment properties */
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
}

/* CSS Placeholder using data attribute */
.editable-box:empty::before {
  content: "Sample Text";
}
<div class="editable-box" contenteditable="true"></div>

我观察到的现象是,单击框时会出现一个正常的闪烁文本输入光标,但光标却出现在框的最左边缘。一旦我输入一个字符,字符就会移动到框的正中,文本光标跳到该字符之后。下面是一张截图,在点击框后尚未输入前,请注意左边缘的黑色竖线(我的闪烁光标):

在此输入图片描述

我期望的行为是,当我点击框时,光标应位于框的正中心(文本将要出现的位置)。

为什么我的光标会左对齐而不是居中?是否可以通过修改CSS使光标居中对齐,或是有其他实现这个框的方法?

我的浏览器是Linux Mint 22上的Firefox 151。

解决方案

这是一个 Bug 1625298 Opened 6 years »caret positioned on the left when focus is set on a contenteditable node with text-align set to center«,遗憾的是,没有优雅的变通办法。

因此,要在Firefox中让初始光标位置居中,唯一的方法是在焦点进入之前确保存在一些真实的内容(而非伪内容),请参见测试:

mark {
 display: block;
 padding: 1lh 2ch;
 text-align: center;
 &:empty:not(:focus)::before {
  content: '"Placeholder"';
 }
}
Truly empty:
<mark contenteditable></mark>
Some text content (space + white-space:pre):
<mark contenteditable style="white-space:pre;"> </mark>
Initial BR:
<mark contenteditable><br></mark>

因此,如果你确实需要正确的光标放置,就需要进行类似ufraan在这里建议的那样对内容进行一些摆弄。

或者可以考虑把 <br> 放在那里,因为它也是当用户清空 contenteditable 元素中的所有内容时真正的“默认”内容。当然,这会破坏伪占位符的 :empty 的斜线效果,但也许值得尝试?


温馨提示:通常更建议直接使用真实的 label 元素,而不是为了这个目的滥用 placeholder 属性(真实的或模拟的)。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章