可信赖的div的占位符

Bag*_*ell 57 html javascript css jquery

我有以下内容:FIDDLE

占位符工作正常,花花公子,直到你键入一些东西,ctrl+ A,和delete.如果这样做,占位符将消失,并且不会再次显示.

怎么了?我怎样才能拥有一个可满足的div的占位符?

HTML:

<div class="test" placeholder="Type something..." contenteditable="true"></div>
Run Code Online (Sandbox Code Playgroud)


CSS:

.test {
    width: 500px;
    height: 70px;
    background: #f5f5f5;
    border: 1px solid #ddd;
    padding: 5px;
}

.test[placeholder]:empty:before {
    content: attr(placeholder);
    color: #555; 
}
Run Code Online (Sandbox Code Playgroud)


谢谢.

Ete*_*al1 60

在搜索同样的问题时,我想出了一个简单的混合css-JavaScript解决方案,我想分享:

CSS:

[placeholder]:empty::before {
    content: attr(placeholder);
    color: #555; 
}

[placeholder]:empty:focus::before {
    content: "";
}
Run Code Online (Sandbox Code Playgroud)

JavaScript的:

jQuery(function($){
    $("[contenteditable]").focusout(function(){
        var element = $(this);        
        if (!element.text().trim().length) {
            element.empty();
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

更新了小提琴

  • 请添加 `cursor: text;` 否则显示占位符时光标将是箭头 (3认同)
  • 对于你想要的行为,只需从css中删除`[placeholder]:empty:focus:before`元素. (2认同)

小智 26

我创建了一个现场演示:“内容可编辑 div 的占位符”,由 HTML 和 CSS 编写。
另外,Codepen:https
: //codepen.io/fritx/pen/NZpbqW参考:https : //github.com/fritx/vue-at/issues/39#issuecomment-504412421

.editor {
  border: solid 1px gray;
  width: 300px;
  height: 100px;
  padding: 6px;
  overflow: scroll;
}
[contenteditable][placeholder]:empty:before {
  content: attr(placeholder);
  position: absolute;
  color: gray;
  background-color: transparent;
}
Run Code Online (Sandbox Code Playgroud)
<textarea class="editor"
  placeholder="Textarea placeholder..."
></textarea>
<br/>
<br/>
<div class="editor"
  contenteditable
  placeholder="Div placeholder..."
  oninput="if(this.innerHTML.trim()==='<br>')this.innerHTML=''"
></div>
Run Code Online (Sandbox Code Playgroud)


Ege*_*urk 16

我从:https : //codepen.io/flesler/pen/AEIFc得到了这个解决方案

基本上把这个css代码:

[contenteditable=true]:empty:before{
  content: attr(placeholder);
  pointer-events: none;
  display: block; /* For Firefox */
}
Run Code Online (Sandbox Code Playgroud)

并在您的 contenteditable div 中设置占位符属性。

  • 很好的答案,但并不完美。必须有 javascript 来清除为 contenteditable div 中的新行创建的中断标签和 div 标签。为了证明这一点,请在可编辑的 div 中输入一些内容,然后单击 Enter 创建新行。然后按 Control+A 选择所有文本并用退格键删除。结果??不再有占位符 (3认同)
  • 这很漂亮 (2认同)
  • 这非常酷,适合很多用例,谢谢! (2认同)
  • 这太完美了为什么不更高! (2认同)

小智 13

来自Placeholder in contenteditable - 焦点事件问题

[contentEditable=true]:empty:not(:focus):before{
  content:attr(data-ph);
  color:grey;
  font-style:italic;
}
Run Code Online (Sandbox Code Playgroud)


Bog*_*tan 6

感觉就像在重复自己,但为什么不检查contenteditable元素突变呢?试图将所有内容与正在更改内容的事件绑定在一起是一件很痛苦的事情。如果您需要添加按钮(例如粘贴)或动态更改内容(javascript)怎么办?我的方法是使用MutationObservers。演示小提琴

HTML:

<div class="test" id="test" placeholder="Type something..." contenteditable="true"></div>
Run Code Online (Sandbox Code Playgroud)

CSS:

.test {
    width: 500px;
    height: 70px;
    background: #f5f5f5;
    border: 1px solid #ddd;
    padding: 5px;
}

.test[placeholder]:empty:before {
    content: attr(placeholder);
    color: #555; 
}
Run Code Online (Sandbox Code Playgroud)

JavaScript:

var target = document.querySelector('#test');
var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
      if (target.textContent == '') {
          target.innerHTML = '';
      }
  });    
});
var config = { attributes: true, childList: true, characterData: true };
observer.observe(target, config);
Run Code Online (Sandbox Code Playgroud)


小智 5

我明白你的意思了。在您的小提琴中,我输入了几个字符并使用“ctrl-a”和“delete”将其删除,然后占位符重新出现。

但是,似乎当您在 contenteditabele div 中点击“输入”时,它会创建一个包含换行符的子 div,<div><br></div>从而导致 :empty 伪类出现问题,该伪类仅针对没有子元素的元素。**

在 chrome 开发人员工具或您使用的任何工具中查看它。

来自 developer.mozilla.org

:empty 伪类代表任何根本没有子元素的元素。只考虑元素节点和文本(包括空格)。注释或处理指令不会影响元素是否被视为空。

Ctrl-a 将删除文本,但保留子 div。也许可以通过添加一些 javascript 来解决这个问题。


com*_*erc 5

一些修复:

1)$element.text().trim().length-解决了<div><br/></div>和的问题&nbsp;

2)data-placeholderattr代替placeholder-这是正确的方法

3)通用选择器$("[contenteditable]")-这是正确的方法

4)display: inline-block;-修复了Chrome和Firefox

JavaScript:

jQuery(function($){
    $("[contenteditable]").blur(function(){
        var $element = $(this);
        if ($element.html().length && !$element.text().trim().length) {
            $element.empty();
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

HTML:

<div data-placeholder="Type something..." contenteditable="true"></div>
Run Code Online (Sandbox Code Playgroud)

CSS:

[contenteditable]:empty:before {
    content: attr(data-placeholder);
    color: grey;
    display: inline-block;
}
Run Code Online (Sandbox Code Playgroud)