【问题标题】:Input placeholder using CSS only仅使用 CSS 输入占位符
【发布时间】:2013-08-22 04:07:55
【问题描述】:

我知道这里有很多关于此查询的问题,但没有一个为我提供解决方案。

HTML

<input id="tb1" type="text" class="note" />

<br>

<p class="note1"> This is not done.</p>

CSS

p.note1:before{
    content: "Note:";
}

tb1.note:before{
    content: "Enter your number";
}

我正在尝试使用上述代码和在网上找到的变体,但似乎没有一个适用于输入标签。它适用于 p 标签。

编辑:我无法将 value 属性添加到输入标签并管理 css 以获得所需的结果。这是系统的限制。

EDIT2:忘掉我的css,有没有什么方法可以在不使用占位符属性的情况下使用占位符文本,而只需使用input type="text"的纯css@

【问题讨论】:

  • 使用placeholder="text here"有什么问题
  • 由于系统限制无法添加...
  • 是什么限制了您使用纯 HTML?
  • :before 仅适用于可以有子节点的元素,输入也没有结束标签
  • html 是从现有框架控件呈现的,我没有控制权来询问/更改它。

标签: html css pseudo-element css-content


【解决方案1】:

这个简单的事实是行不通的:

<input id="tb1" type="text" class="note"></input>

无效。 &lt;input /&gt; 元素不是容器。正如规范所指出的,结束标签是被禁止的(并且基本上被浏览器忽略):http://www.w3.org/TR/html401/interact/forms.html#h-17.4

【讨论】:

  • 我得到了这部分,然后如何仅使用 css 在我的输入字段上呈现占位符文本。
【解决方案2】:

编辑:

初学者试试这个:(注意:你需要一些js来检测输入中是否输入了文本)

除此之外 - 我认为没有使用占位符属性的输入元素上的占位符文本的 css 解决方案。

FIDDLE

标记

<div class="container">
<input />
<div class="fakePlaceholder">Some placeholder text</div>
</div>

css

.container
{
    position: relative;
}
input
{
    background: transparent;
}
input:focus + .fakePlaceholder
{
    display: none;
}
.fakePlaceholder
{
    color:gray;
    position:absolute;
    top: 3px;
    left: 5px;
    z-index: -1;
}

您不能在 input 标签上使用伪元素 - 或任何其他非容器元素

来自Pseudo-Elements tag info:

您不能将它们(伪元素)与替换元素一起使用(请参阅 下面)没有实际内容。这是因为生成的 内容位于元素内。
...

替换元素

外观和/或尺寸由某些因素决定的任何元素 外部资源被认为是被替换的元素。一些 伪元素不能应用于替换元素,因为它们 没有“内容”或被某些东西(例如用户 界面控制)。替换的元素包括图像 (&lt;img&gt;)、内联 框架(&lt;iframe&gt;),换行符(&lt;br&gt;),水平线(&lt;hr&gt;), 插件 (&lt;object&gt;)、表单元素 (&lt;button&gt;、&lt;textarea&gt;、&lt;input&gt; 和 &lt;select&gt;)、视频 (&lt;video&gt;)、音频 (&lt;audio&gt;) 和画布 (&lt;canvas&gt;)。任何其他元素都被认为是不可替换的 元素。

【讨论】:

    【解决方案3】:

    :before 创建一个伪元素,它是匹配元素的第一个子元素。

    所选元素必须是容器标签。像&lt;input&gt; 这样的空标签没有任何子元素。

    如果您不能手动编辑 HTML 代码,您仍然可以使用 JavaScript:

    document.getElementById("tb1").setAttribute("placeholder", "Enter your number");
    

    更新

    如果您只想通过使用 CSS 来实现这一点,您需要有一个容器元素来包装您的 &lt;input&gt;(或在它之后)。

    但是它不能像placeholder 那样正常工作。您将无法通过 CSS 检查 &lt;input&gt; 的值。如果你在&lt;input&gt;里面写了一些东西,在blur事件之后,生成的占位符会再次显示在&lt;input&gt;上面。

    HTML:

    <label>
        <input id="tb1" type="text" class="note">
    </label>
    

    CSS:

    label {
      position: relative;
    }
    
    label:after {
      content: 'Enter your number';
      position: absolute;
      left: 5px;
      top: 0;
      color: #bbb;
    }
    
    #tb1 {
      position: relative;
    }
    
    #tb1:focus {
      z-index: 10;
    }
    

    JSBin Demo

    【讨论】:

    • 感谢您的回复,但需要仅使用 css 来完成...有没有办法利用 css 来解决这个问题。
    • @Akki619 这取决于你的 HTML 标记,你应该有一个像 &lt;label&gt; 这样的容器元素。检查我的更新。
    • 我喜欢它,但是,当 tb1 失去焦点时,即使您在其中输入了一些文本,占位符也会返回。
    • 当我无法直接编辑 HTML 时,Javascript 确实是我发现的最可靠(尽管很老套)的方法。
    【解决方案4】:

    我找到了这种方法,但不是所有浏览器都支持:

    #tb1.note:empty:before{
        content: "Enter your number";
    }
    

    注意:你忘了放置一个id选择器#tb1.note

    see this link

    【讨论】:

      【解决方案5】:

      另一种可以实现的方法,并且还没有真正看到任何其他人将其作为选项,而是使用锚点作为输入和标签周围的容器,并通过一些颜色技巧处理标签的移除, #hashtag 和 css a:visited。 (底部的jsfiddle)

      您的 HTML 将如下所示:

      <a id="Trickory" href="#OnlyHappensOnce">
          <input type="text" value="" id="email1" class="inputfield_ui" />
          <label>Email address 1</label>
      </a>
      

      还有你的 CSS,像这样:

      html, body {margin:0px}
      a#Trickory {color: #CCC;} /* Actual Label Color */
      a#Trickory:visited {color: #FFF;} /* Fake "Turn Off" Label */
      
      a#Trickory:visited input {border-color: rgb(238, 238, 238);} /* Make Sure We Dont Mess With The Border Of Our Input */
      
      a#Trickory input:focus + label {display: none;} /* "Turn Off" Label On Focus */
      
      a#Trickory input {
          width:95%;
          z-index:3;
          position:relative;
          background-color:transparent;
      }
      a#Trickory label {
          position:absolute;
          display:block;
          top:3px;
          left:4px;
          z-index:1;
      }
      

      你可以在 jsfiddle 看到这个工作,注意这个解决方案只允许用户选择一次字段,然后它会永久删除标签。也许不是您想要的解决方案,但绝对是我没有看到其他人提到的可用解决方案。如果您想进行多次试验,只需将您的#hashtag 更改为新的“未访问”标签即可。

      http://jsfiddle.net/childerskc/M6R7K/

      【讨论】:

        【解决方案6】:

        如果您无法操作 html 并使用placeholder=""。使用 javascript 来操作占位符。无论如何,每种 css 方法都是 hack-isch。 例如。使用 jQuery: $('#myFieldId').attr('placeholder', 'Search for Stuff');

        【讨论】:

          猜你喜欢
          • 2013-01-03
          • 2012-07-07
          • 2018-04-12
          • 2020-05-12
          • 2011-02-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多