javascript - 怎么解决div[contenteditable]设置padding却没有效果?
天蓬老师
天蓬老师 2017-04-11 09:48:33
[JavaScript讨论组]

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

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

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


补充

输入文字前。

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

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(4)
黄舟

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

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

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

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

*, *:before {
    box-sizing: border-box;
}
怪我咯


这里不就是padding-left为5么

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

怪我咯

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

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

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

怪我咯

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号