从0到1:HTML5+CSS3修炼之道
上QQ阅读APP看书,第一时间看更新

第3章 新增属性

3.1 公共属性

HTML5新增了很多公共属性。所谓的公共属性,指的是可以应用于大多数元素的属性,而并不只限于某一个元素。其中,HTML5新增的常见公共属性有4个。

▶ hidden

▶ draggable

▶ contenteditable

▶ data-*

除了以上这些,HTML5还新增了另外3个公共属性:contextmenu、dropzone、spellcheck。不过由于这3个属性兼容性非常差,在实际开发中也极少用得上,我们可以直接忽略。

3.1.1 hidden属性

在HTML5中,我们可以使用hidden属性来显示或隐藏某一个元素。

语法

<element hidden="hidden"></element>

说明

hidden只有一个属性值:hidden。当然,你也可以简写为:<element hidden></element>。其中,element是一个元素。

举例

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title></title>
</head>
<body>
  <div hidden>海贼王</div>
  <div>火影忍者</div>
</body>
</html>

浏览器预览效果如图3-1所示。

图3-1 hidden属性

3.1.2 draggable属性

在HTML5中,我们可以使用draggable属性来定义某一个元素是否可以被拖动。

语法

<element draggable="true或false" ></element>

说明

draggable有两个属性值:true和false。默认值为false。当取值为true时,表示元素可以被拖动;当取值为false时,表示元素不可以被拖动。

举例

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title></title>
  <style type="text/css">
    p
    {
      display: inline-block;
      padding: 10px;
      border:1px dashed gray;
      background-color:#F1F1F1;
    }
  </style>
</head>
<body>
  <p draggable="true">这是一段可以被拖动的文字</p>
</body>
</html>

浏览器预览效果如图3-2所示。

图3-2 draggable属性

分析

当我们使用鼠标左键长按时,会发现p元素可以被拖动。有些小伙伴就会问了:“为什么我松开鼠标左键后,元素位置却没有改变呢?”

其实draggable="true"只能定义元素可以被拖动这一个行为,拖动后并不会改变元素的位置。如果想要改变元素的位置,需要结合“第4章 元素拖放”中介绍的技巧来实现,这个我们在后面会详细介绍。

3.1.3 contenteditable属性

在HTML5中,我们可以使用contenteditable属性来定义某个元素的内容是否可以被编辑。

语法

<element contenteditable="true或false" ></element>

说明

contenteditable有两个属性值:true和false。默认值为false。当取值为true时,元素内容可以被编辑;当取值为false时,元素内容不能被编辑。

举例

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title></title>
  <style type="text/css">
    p{
      display: inline-block;
      padding: 10px;
      border:1px dashed gray;
      background-color:#F1F1F1;
    }
  </style>
</head>
<body>
  <p contenteditable="true">这是一段可以被编辑的文字</p>
</body>
</html>

浏览器预览效果如图3-3所示。

图3-3 contenteditable属性

分析

当我们点击p元素后,发现里面的文字可以被编辑了。

3.1.4 data-*属性

在HTML5中,我们可以使用data-*属性来为元素实现自定义属性。

语法

<element data-*="属性值" ></element>

说明

“data-”只是一个前缀,后面接一个小写的字符串,例如data-color、data-article-title等。

举例

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title></title>
  <script>
    window.onload = function(){
      var oP = document.getElementsByTagName("p")[0];
      oP.style.color=oP.dataset.color;
    }
  </script>
</head>
<body>
  <p data-color="red">你的努力程度之低,根本轮不到拼天赋。</p>
</body>
</html>

浏览器预览效果如图3-4所示。

图3-4 data-*属性

分析

我们可以使用DOM操作中的obj.dataset.xxx来获取data-*属性的值。其中,obj是一个DOM对象,xxx是data-的后缀字符。可能有些小伙伴对具体操作还不是很清楚,我们再多举一个例子。

举例

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title></title>
  <script>
    window.onload = function(){
      var oLi = document.getElementsByTagName("li");
      for(var i=0; i<oLi.length; i++){
        console.log(oLi[i].innerText + ":" +oLi[i].dataset.fruitPrice +"/斤");
      }
    }
  </script>
</head>
<body>
  <ul>
    <li data-fruit-price="¥6.5">苹果</li>
    <li data-fruit-price="¥12.5">香蕉</li>
    <li data-fruit-price="¥3.5">西瓜</li>
  </ul>
</body>
</html>

浏览器预览效果如图3-5所示。

图3-5 data-*属性

分析

在使用JavaScript获取data-*属性的值时,要注意书写格式。

▶ 如果是data-xxx格式,则应该写成obj.dataset.xxx。例如data-color应该写成obj.dataset.color,而data-content应该写成obj.dataset.content。

▶ 如果是data-xxx-yyy格式,则应该写成obj.dataset.xxxYyy。例如data-fruit-price应该写成obj.dataset.fruitPrice,而data-animal-type应该写成obj.dataset.animalType。

那么使用data-*来自定义一个属性究竟有什么用呢?事实上,自定义属性在JavaScript动画以及实际开发中用得是非常多的,暂时不用纠结太多,这个是后面高级部分的知识。

3.2 input元素的新增属性

为了提高开发效率,以及达到更好的用户体验,HTML5为input元素新增了大量的属性。其中,在实际开发中用得最多的有以下5个。

▶ autocomplete

▶ autofocus

▶ placeholder

▶ required

▶ pattern

注意,上面这些新增属性只是针对input元素,并非所有元素都有。除了上面列出的,我们在其他地方可能会看到formaction、formmethod、formtarget等。不过这些属性在实际开发中极少会用到,感兴趣的小伙伴可以自己去搜索了解一下。

3.2.1 autocomplete属性

在HTML5中,我们可以使用autocomplete属性来实现文本框的自动提示功能。

语法

<input type="text" autocomplete="on或off" />

说明

autocomplete属性有两个属性值:on和off。on表示开启,off表示关闭。

autocomplete属性一般都是结合datalist元素来实现自动提示功能。

autocomplete属性适用于所有文本框型的input元素,包括text、password、email、url、tel等。

举例

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title></title>
</head>
<body>
  <form method="post">
    <input type="text" autocomplete="on" list="tips" />
    <datalist id="tips">
      <option value="HTML"></option>
      <option value="CSS"></option>
      <option value="JavaScript"></option>
      <option value="Vue.js"></option>
      <option value="React.js"></option>
      <option value="Angular.js"></option>
    </datalist>
  </form>
</body>
</html>

浏览器预览效果如图3-6所示。

图3-6 默认效果

分析

从外观上来看,这个文本框跟普通文本框没有任何区别。当我们输入内容时,文本框会自动匹配datalist元素中的选项并且弹出匹配列表,效果如图3-7所示。

图3-7 输入内容时效果

3.2.2 autofocus属性

默认情况下,文本框是不会自动获取焦点的,必须点击文本框才会获取。我们经常可以看到很多页面一打开时,文本框就已经自动获取到了焦点,例如百度首页。在HTML5之前,都是使用JavaScript的focus()方法来实现的,这种方式相对来说比较麻烦。

在HTML5中,我们可以使用autofocus属性来实现文本框自动获取焦点。

语法

<input type="text" autofocus="autofocus" />

说明

autofocus只有一个属性值:autofocus。当然,你也可以直接简写为:<input type="text"autofocus />。

autofocus属性也适用于所有文本框型的input元素,包括text、password、email、url、tel等。

举例

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title></title>
</head>
<body>
  <form method="post">
    <input type="text" autofocus />
  </form>
</body>
</html>

浏览器预览效果如图3-8所示。

图3-8 autofocus属性

分析

小伙伴们把autofocus属性删除,然后刷新一下页面,对比一下前后效果的区别,就知道它的作用是什么了。

3.2.3 placeholder属性

在HTML5中,我们可以使用placeholder属性为文本框添加提示内容。

语法

<input type="text" placeholder="提示内容" />

说明

placeholder属性适用于所有文本框型的input元素,包括text、password、email、url、tel等。

举例

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title></title>
</head>
<body>
  <form method="post">
    <input type="text" placeholder="请输入账号" /><br/>
    <input type="text" placeholder="请输入密码" />
  </form>
</body>
</html>

浏览器预览效果如图3-9所示。

图3-9 placeholder属性

3.2.4 required属性

在HTML5中,我们可以使用required属性来定义文本框输入内容不能为空。如果文本框为空,则不允许提交。

语法

<input type="text" required="required" />

说明

required只有一个属性值:required。当然,你也可以简写为:<input type="text" required />。

required属性适用于所有文本框型的input元素,包括text、password、email、url、tel等。

举例

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title></title>
</head>
<body>
  <form method="post">
    <input type="text" required /><br/>
    <input type="submit" value="提交" />
  </form>
</body>
</html>

浏览器预览效果如图3-10所示。

图3-10 默认效果

分析

如果文本框为空,点击【提交】按钮后,会弹出提示框,效果如图3-11所示。

图3-11 提交时效果

3.2.5 pattern属性

在HTML5中,我们可以使用pattern属性来为文本框添加验证功能。

语法

<input type="text" pattern="正则表达式" />

说明

pattern属性取值是一个正则表达式。正则表达式内容比较多,不了解的小伙伴可以参考绿叶学习网开源的正则表达式教程,这里就不再详细展开介绍了。

此外,email、url、tel这3个类型的input元素,本质上都内置了pattern属性,因此它们会自动进行相关匹配验证。

举例

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title></title>
</head>
<body>
  <form method="post">
    <input type="text" pattern="^[a-zA-Z]\w{4,9}$" /><br/>
    <input type="submit" value="提交"/>
  </form>
</body>
</html>

浏览器预览效果如图3-12所示。

图3-12 默认效果

分析

pattern="^[a-zA-Z]\w{4,9}$"表示文本框的内容必须符合“以字母开头,包含字母、数字或下划线,并且长度在5~10之间”的规则。如果不符合条件,则会弹出提示框,如图3-13所示。

图3-13 提交时效果

3.3 form元素的新增属性

在HTML5中,form元素的新增属性中比较重要的只有一个,那就是:novalidate。从“2.2表单元素”这一节我们可以知道,email、tel、url等类型的input元素中内置的验证机制默认会自动执行。但是在某些情况下,我们需要使用JavaScript来创建更为复杂且健全的验证,这时就要覆盖原有的验证机制了。现在问题来了,怎么覆盖呢?

在HTML5中,我们可以使用novalidate属性来禁用form元素的所有文本框内置的验证功能。

语法

<form novalidate="novalidate">
  ……
</form>

说明

novalidate只有一个属性值:novalidate。当然,你也可以直接简写为:<form novalidate></form>。

举例

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title></title>
</head>
<body>
  <form method="post" novalidate>
    <p><label>电子邮箱:<input type="email" /></label></p>
    <p><label>手机号码:<input type="tel" /></label></p>
    <input type="submit" value="提交" />
  </form>
</body>
</html>

浏览器预览效果如图3-14所示。

图3-14 novalidate属性

分析

在上面这个例子中,我们为form元素添加了novalidate属性,因此当点击按钮提交表单时,form元素内的文本框就不会采用浏览器内置的验证机制,然后我们就可以使用JavaScript来创建新的验证规则,请看下面的例子。

举例

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title></title>
  <style>
    p{margin:0;padding:0;margin-top:8px;margin-bottom: 8px;}
  </style>
  <script>
    window.onload=function(){
      var oBtn = document.getElementById("btn");
      var oEmail = document.getElementsByTagName("input")[0];
      var oTel = document.getElementsByTagName("input")[1];
      var errorEmail = document.getElementById("errorEmail");
      var errorTel = document.getElementById("errorTel");
      var oForm = document.getElementsByTagName("form")[0];
      //正则表达式
      var regEmail = /^\w+@[a-zA-Z0-9]{2,10}(?:\.[a-z]{2,4}){1,3}$/;
      var regTel = /^1([358][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}$/;
      //点击按钮后进行验证
      oBtn.onclick = function(){
        if(!regEmail.test(oEmail.value)){
          errorEmail.innerHTML = "请输入正确的邮箱地址";
        }else{
          errorEmail.innerHTML="";
        }
        if(!regTel.test(oTel.value)){
          errorTel.innerHTML = "请输入正确的手机号码";
        }else{
          errorTel.innerHTML="";
        }
        //如果验证都通过,则提交表单
        if(regEmail.test(oEmail.value)&& regTel.test(oTel.value)){
          oForm.onsubmit();
        }
      };
    }
  </script>
</head>
<body>
  <form method="post" novalidate>
    <p><label>电子邮箱:<input type="email" /></label><span id="errorEmail"></span></p>
    <p><label>手机号码:<input type="tel" /></label><span id="errorTel"></span></p>
    <input id="btn" type="button" value="提交" />
  </form>
</body>
</html>

浏览器预览效果如图3-15所示。

图3-15 自定义验证功能

分析

在这个例子中,我们使用novalidate属性来禁用所有文本框内置的验证功能,这样我们就可以使用JavaScript来定义自己的一套验证方法,而不会跟内置的验证功能冲突。

3.4 本章练习

单选题

1.在HTML5中,我们可以使用( )属性来为文本框添加正则验证。

A.required

B.pattern

C.validate

D.novalidate

2.在HTML5中,我们可以使用( )属性来实现文本框自动获取焦点。

A.autofocus

B.autocomplete

C.placeholder

D.required

3.下面有关HTML5新增公共属性的说法中,正确的是( )。

A.<div hidden></div>可以等价于<div style="visibility:hidden"></div>

B.定义了draggable="true"的元素在拖动后,位置也会改变

C.使用JavaScript来获取data-bg-color属性值时,应该写成obj.dataset.bgColor

D.我们可以使用editable属性来定义一个元素的内容是否可以被编辑

4.下面有关input元素新增属性的说法中,正确的是( )。

A.autocomplete属性只适用于<input type="text" />

B.我们可以使用autocomplete="true"来实现文本框的自动提示功能

C.<input type="text" autofocus="autofocus" />等价于<input type="text" autofocus />

D.required属性可以配合正则表达式来为文本框添加验证功能

编程题

请为单行文本框定义一个验证功能,要求只能匹配11位数字,其他字符都不匹配。