怎么解决div[contenteditable]设置padding却没有效果?

下面这段代码在ubuntu/chrome53下面测试的时候会出现padding-left设置无效的情况,也就是鼠标没有距离div的左边border有5px的现象。 但是一旦开始输入文字,这个padding却又开始生效了。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <style>
    div {
        width:600px;
        border: 1px solid red;
        padding-left: 5px;
        line-height: 200%;
    }
        
    div:empty:before {
        content: attr(placeholder);
        display: block;
        color: #999;
    }
  </style>
</head>
<body>
  <div contenteditable="true" placeholder="输入用户名"></div>
</body>
</html>

请问应该怎么解决这个问题。ps: 知乎的评论框现在都是采用的div而不是testarea实现的,在我的浏览器里面却没有出现这种问题。但是它的实现代码我没有看懂。


补充

输入文字前。
图片描述

一旦输入文字后,又变成正常的了。
图片描述

阅读 5.8k
4 个回答

before这个伪元素不要用display: block;默认的inline就行了。

左和上的对齐要靠padding来实现,设置一个min-height来保证最低高度,行高是每一行的高度。

我这边没有带桌面版本的ubuntu,打死不能复现啊。。。

如果默认before一直为Inline都还是出现这个问题,再试试重置盒模型

*, *:before {
    box-sizing: border-box;
}

clipboard.png
这里不就是padding-left为5么

知乎貌似就是用css实现的,只不过是通过js移除class去掉:before

楼主你要不换个思路,我也不知道你那ubuntu/chrome53到底是个什么(chrome版本?),你试试这样子:

<div style="padding:0 5px">
<div placeholder="写下你的评论…" data-input-box="true" aria-label="写下你的评论…" contenteditable="true" data-reactid=".0.7.1"></div>
</div>

我的意思是你不要纠结它的版本问题,你把那个padding——left效果加到data-input-box的父元素上,然后他的首行和光标都在默认位置(看上去光标和输入文字有了缩进效果,其实是外层父元素的padding效果)。不知道你明白我的意思没有?我没有试验,楼主你可以试试看看能行不能

用 你的代码 经过测试 , 造成光标 不在指定的位置 , 原因是 :你的 div:empty:before 这个伪元素造成的, 我也同时看了知乎的评论的代码。 他的获得光标的时候,清空这个伪元素 就不会造成这个问题,我然后将你的 伪元素 去除后, 也就不会再有光标不到位的现象

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏