0

0

HTML5 Placeholder属性的详情介绍

黄舟

黄舟

发布时间:2018-05-30 09:51:30

|

6094人浏览过

|

来源于php中文网

原创

placeholder(占位符) 是 html5 新增的一个 html 属性,用来对可输入字段的期望值提供提示信息,目前已经得到主流浏览器的广泛支持,使用方式非常简单:

该属性适用于 多行文本框和 type 属性值为 text, password, search, tel, url 或者 email 等的

placeholder

自定义样式

如果想改变 placeholder 的默认呈现样式,应该使用 ::placeholder 伪元素选择器,不过当前还没有浏览器支持,因此只能根据不同浏览器的不同实现方式分别定义:

::-webkit-input-placeholder { /* Chrome/Safari/Opera */
  color: green;}::-moz-placeholder { /* Firefox 19+ */
  color: green;}:-ms-input-placeholder { /* IE 10+ 注意这里只有一个冒号 */
  color: green;}

为什么样式要分别定义呢,如果像下面这样组合到一起:

立即学习前端免费学习笔记(深入)”;

::-webkit-input-placeholder,::-moz-placeholder {
  color: green;}

不应该把针对不同浏览器的选择器写在一起,这样写会因为无法识别的选择器而造成这整个规则集被忽略(当然,像类似 IE 7 这种具有超强错误处理能力的浏览器除外,不过这里和 IE 7 没什么关系)。

Firefox 定义方式的改变

如果需要兼容老版本的 Firefox 浏览器,还需要添加下面这种只有一个冒号的样式规则:

:-moz-placeholder { /* Firefox 4 - 18 */
  color: green;}

因为从 Firefox 19 开始一个冒号的伪类定义方式 :-moz-placeholder 被废弃了,切换为两个冒号的伪元素定义方式。与此同时,它还添加了一个默认的 opacity: 0.54 不透明度样式,如果需要,可以覆盖掉该样式,否则文字是半透明的:

::-moz-placeholder {
  color: green;
  opacity: 1;}

伪类和伪元素

伪类和伪元素有什么区别呢?伪类可以理解为给某个元素添加了一个类,比如 :first-child 伪类,选择第一个子元素:

p:first-child {
  font-size: 16px;}

也可以理解为元素当前的状态,同样也可以通过添加一个真正的 class 来实现类似效果:

p.first-child {
  font-size: 16px;}

无论是伪类还是真正的类,样式都是直接添加到

元素上的。

而伪元素可以理解为添加了一个虚拟的元素。比如 p:before 伪元素,可以像下面这个伪代码这样理解:

p:before

paragraph

这里

元素和 p:before 可以理解为是两个不同的元素。如果被绕晕了,没关系,毕竟这不是本文的重点,更多伪元素与伪类的信息可以参考 Pseudo-classes - CSS | MDN 和 Pseudo-elements - CSS | MDN

关于伪类选择器引发的问题

因为 IE 浏览器使用的是伪类 :-ms-input-placeholder 选择器来定义 placeholder 的样式,实际上样式是作用于文本输入框的,如果另外还有针对文本输入框的选择器特殊性更高的样式规则,将会覆盖掉该样式,参考下面代码:

input:-ms-input-placeholder { /* 0, 0, 1, 1 */
  color: green;}#username { /* 0, 1, 0, 0 */
  color: blue;}

注释中的数字用来表示该选择器的特殊性。

上面两个样式规则当中使用 ID 选择器的特殊性更高,所以在 IE 10/11 中测试会看到 placeholder 显示为蓝色,与期望的有点不一样。同样使用伪类选择器的旧版本 Firefox 也会出现这个问题,因此,在书写样式的时候需要特别注意,实在搞不定,别忘了还有 !important 规则可以用。其它使用两个冒号的伪元素选择器的浏览器不会出现这个问题,例如:

input::-webkit-input-placeholder { /* 0, 0, 0, 2 */
  color: green;}#username { /* 0, 1, 0, 0 */
  color: blue;}

上面两个样式规则互相之间不会影响,使用 Chrome 测试 placeholder 的颜色为绿色。

关于选择器的特殊性可以参考拙作CSS选择器特殊性与重要性。

让行为保持一致

虽然样式是可以自定义了,不过在行为上还有些差异,在 Chrome 和 Firefox 中当文本输入框输入内容时 placeholder 才会消失,清除内容时又会显示出来;而在 IE 中则是当文本输入框获取焦点时 placeholder 就消失了,失去焦点同时没有输入内容时才会重新显示。如果希望在 Chrome 和 Firefox 等浏览器中实现获取焦点就消失的效果,可以借助 :focus 伪类选择器来将 placeholder 的文本颜色设置为透明:

:focus::-webkit-input-placeholder {
  color: transparent;}

当文本输入框获取焦点时,placeholder 的颜色被设置为透明,感官上就好像消失一样。

JavaScript

获取或者修改 placeholder 的内容直接获取或者修改对应文本输入框的 placeholder 属性的值就行了:

$('input').attr('placeholder', 'Please enter your name');

So easy,妈妈再也不用担心我写代码了。不过,想要像普通 DOM 元素那样通过 javaScript 获取伪元素对象直接操作估计很难,目前可以使用 window.getComputedStyle() 方法来得到其样式属性,该方法的第二个参数是一个伪元素:

名扬银河企业通用版网站源码2.0.2.2
名扬银河企业通用版网站源码2.0.2.2

【部分功能介绍】1、产品管理发布企业产品信息,管理企业产品,自定义产品封面图,产品详情图、文、视频,产品扩展属性自定义等。2、案例管理系统发布企业成功案例,管理成功案例,自定义案例封面图,案例详情图、文、视频,案例扩展属性自定义等。3、资讯管理系统发布企业资讯、公司动态、行业资讯等,自定义资讯封面图,资讯详情图、文、视频,资讯扩展属性自定义等。4、企业信息系统公司介绍、关于我们、联系我们、企业荣誉

下载
window.getComputedStyle(document.getElementById('username'),
  '::-moz-placeholder').getPropertyValue('color'); // "rgb(0, 255, 0)"

如果要通过 JavaScript 来修改 placeholder 伪元素的样式的话比较好的一种方式是预先定义好几种不同的样式:

.style-1::-moz-placeholder {
  color: green;}.style-2::-moz-placeholder {
  color: red;}

然后通过切换文本输入框的 class 属性来实现修改样式的目的:

$('input').addClass('style-2').removeClass('style-1');

另外也可以通过直接添加样式规则来实现。

Polyfill

对于不支持该属性的浏览器,会简单地忽略掉。原则上,placeholder 仅仅是用来对期望的输入起个提示的作用,对于不支持的浏览器在可用性上不受任何影响。如果需要兼容,那么应该使用特性检测的方式,针对不支持的浏览器使用 Polyfill,对于支持的浏览器来说,原生的当然是最好。

判断浏览器是否支持 元素的 placeholder 属性,可以引入 Modernizr 库来判断:

if (!Modernizr.input.placeholder) {
  // 做点什么事}

也可以自己写判断,简单易行的办法就是生成一个 元素对象,并判断该元素对象是否具有 placeholder 属性:

'placeholder' in document.createElement('input')

同理,对于 元素也是一样:

'placeholder' in document.createElement('textarea')

另外,Opera Mini 明明不支持 placeholder 属性,却装成自己很懂的样子。这时候可以使用客户端检测技术来将之排除掉,Opera Mini 的 window 对象包含一个 operamini 对象:

({}).toString.call(window.operamini) === '[object OperaMini]'

结合起来就是这样:

if (!('placeholder' in document.createElement('input'))  || ({}).toString.call(window.operamini) === '[object OperaMini]') {
  // 做点什么事}

在编写 Polyfill 的时候应该尽量与原生功能保持一致,我这里选择向 IE 的方式看齐,即当文本输入框获取或失去焦点的时候处理 placeholder 是否显示,将文本输入框的 value 值设置为 placeholder 的值来模拟显示 placeholder 的状态。再添加上事件处理程序,当文本输入框获取焦点时如果 value 的值为 placeholder 则清空文本输入框;当文本输入框失去焦点时如果 value 值为空则将 placeholder 的内容赋给它,同时当 placeholder 显示的时候应该给文本输入框添加一个 class="placeholder" 用来设置样式以区别是显示的 placeholder 和还是显示的普通 value:

// 做点什么事$('input[placeholder]').on('focus', function() {
  var $this = $(this);
  if (this.value === $this.attr('placeholder') && $this.hasClass('placeholder')) {
    this.value = '';
    $this.removeClass('placeholder');
  }}).on('blur', function() {
  var $this = $(this);
  if (this.value === '') {
    $this.addClass('placeholder');
    this.value = $this.attr('placeholder');
  }});

这只是一个简单的模拟实现,实际上还有很多需要处理的情况。

处理密码输入框

如果需要处理 placeholder 的是个密码输入框,它的 value 值会显示为圆点之类的字符,呈现几个莫名其妙的圆点来作为 placeholder 提示恐怕不妥,因此需要特殊对待一下,将密码输入框拷贝一份出来然后修改其 type 属性为 'text' 来替代显示 placeholder,并把原本的密码输入框隐藏:

$('input[placeholder]').on('blur', function() {
  var $this = $(this);
  var $replacement;
  if (this.value === '') { // 失去焦点时值为空则显示 placeholder
    if (this.type === 'password') {
      $replacement = $this.clone().attr('type', 'text');
      $replacement.data('placeholder-password', $this);

      // 替代显示的文本输入框获取焦点时将它删掉,并且重新显示原来的密码输入框
      $replacement.on('focus', function() {
        $(this).data('placeholder-password').show().focus();
        $(this).remove();
      });
      $this.after($replacement).hide();
      $this = $replacement;
    }
    $this.addClass('placeholder');
    $this[0].value = $this.attr('placeholder');
  }});

对于 IE 8 来说它不支持修改 input 元素的 type 属性,使用 jQuery 的 .attr() 方法来修改的话只会默默地失败。此时,可以新建一个文本输入框,然后把密码输入框上的属性赋给这个新建的文本输入框:

try {
  $replacement = $this.clone().prop('type', 'text'); // 使用 .prop() 方法在 IE 8 下会报错} catch(e) {
  $replacement = $('').attr({
    'type': 'text',
    'class': this.className // 还可以赋予 id, name 等属性
  });}

需要注意的是 id 和 name 属性不要重复了,可以先用一个变量保存下来,再用 .removeAttr() 方法来删除属性。

处理表单提交

当表单提交的时候应该将那些正在显示 placeholder 的文本输入框过滤掉,毕竟没有必要将那些没有用的数据提交给服务器,在提交时候将那些文本输入框的 value 值设为空,提交之后再恢复成显示 placeholder 的状态:

$(document).on('submit', 'form', function() {
  var $input = $('.placeholder', this);
  $input.each(function() {
    this.value = '';
  });
  setTimeout(function() {
    $input.each(function() {
      this.value = $(this).attr('placeholder');
    });
  }, 10);});

离开页面时

当用户离开页面时也需要清空正在显示 placeholder 的文本输入框,防止浏览器记住文本输入框当前的值,这里可以给 window 对象绑定一个 beforeunload 事件来处理:

$(window).on('beforeunload', function() {
  $('.placeholder').each(function() {
    this.value = '';
  });});

另外还需要考虑的问题:

  • 使用代码给一个文本输入框赋值时,应该同时处理 placeholder 的状态。

  • 使用代码获取一个正在显示 placeholder 的文本输入框的值的时候应该得到的是一个空字符串。

如此多的问题也就是说无论 Polyfill 写到如何极致,都很难与原生的功能相提并论,因此推荐的方式使用特性检测技术仅针对不支持的浏览器做 Polyfill,而 Polyfill 的功能应尽可能地向原生功能看齐。

总结

将所有样式总结起来:

input::-webkit-input-placeholder,
textarea::-webkit-input-placeholder {
  color: #999;}input::-moz-placeholder,
textarea::-moz-placeholder {
  color: #999;
  opacity: 1;}input:-ms-input-placeholder,
textarea:-ms-input-placeholder {
  color: #999;}.placeholder {
  color: #999;}input:focus::-webkit-input-placeholder,
textarea:focus::-webkit-input-placeholder {
  color: transparent;}input:focus::-moz-placeholder,
textarea:focus::-moz-placeholder {
  color: transparent;}

Polyfill 可以直接使用这个 jQuery 插件 mathiasbynens/jquery-placeholder,已经相当完善了。

相关文章

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

536

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

372

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

706

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

470

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

388

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

989

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

652

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

535

2023.09.20

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

10

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 6.5万人学习

HTML+CSS基础与实战
HTML+CSS基础与实战

共132课时 | 9.1万人学习

前端开发(基础+实战项目合集)
前端开发(基础+实战项目合集)

共60课时 | 3.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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