您的位置:

inputtype=checkbox的详解

inputtype=checkbox是HTML中常用的表单元素之一,它可以让用户从多个选项中选择一个或多个进行提交。在本文中我们将从多个方面来详解inputtype=checkbox。

一、基础用法

inputtype=checkbox最基础的用法是让用户从多个选项中选择一个或多个进行提交。我们可以通过给每一个input元素设置不同的value来让用户选择不同的选项,当用户提交表单时,我们可以通过表单数据来获取用户的选择结果。

<form action="submit.php">
  <input type="checkbox" name="option_1" value="1">Option 1<br>
  <input type="checkbox" name="option_2" value="2">Option 2<br>
  <input type="checkbox" name="option_3" value="3">Option 3<br>
  <input type="submit" value="Submit">
</form>

上面的代码中,我们定义了三个input元素,每个元素的type均为checkbox,name分别为option_1、option_2、option_3,value分别为1、2、3。当用户选择其中的若干个选项,并提交表单时,表单数据将包含选中的选项的name和value信息,比如option_1=1&option_3=3表示用户选择了第一个和第三个选项。

二、多选框的样式修改

默认情况下,inputtype=checkbox呈现出来是一个方框,用户可以点击选中或取消选中,但是这种样式可能并不适合所有的场景。我们可以通过CSS来修改多选框的样式。

首先我们可以使用伪元素:before和:after来模拟多选框的勾选状态。

input[type=checkbox] {
  display: none;
}
input[type=checkbox]+label:before {
  content: "&";
  display: inline-block;
  margin-right: 5px;
  background-color: #fff;
  border: 1px solid #999;
  width: 20px;
  height: 20px;
  text-align: center;
}
input[type=checkbox]:checked+label:before {
  content: "√";
  background-color: #00a651;
  color: #fff;
  border-color: #00a651;
}

上面的代码中,我们将多选框设为display: none;,然后通过相邻选择器+(加号)将多选框和label关联在一起,当选中多选框时,勾选状态的:before元素将显示,未选中时则隐藏。这样就达到了修改多选框样式的目的。

三、全选和反选功能

在某些场景下,我们需要给用户提供全选和反选的功能,这时我们需要使用JavaScript来实现这两个功能。

<form>
    <input type="checkbox" name="option_1" value="1" class="select-all">全选<br>
    <input type="checkbox" name="option_2" value="2">Option 2<br>
    <input type="checkbox" name="option_3" value="3">Option 3<br>
    <input type="submit" value="Submit">
</form>

<script>
document.querySelector('.select-all').addEventListener('click', function() {
  var checkboxes = document.querySelectorAll('input[type=checkbox]:not(.select-all)');
  for (var i = 0; i < checkboxes.length; i++) {
    checkboxes[i].checked = this.checked;
  }
});

document.addEventListener('change', function(event) {
  if (!event.target.matches('.select-all')) {
    var checkboxes = document.querySelectorAll('input[type=checkbox]:not(.select-all)');
    var allChecked = true;
    for (var i = 0; i < checkboxes.length; i++) {
      if (!checkboxes[i].checked) {
        allChecked = false;
        break;
      }
    }
    document.querySelector('.select-all').checked = allChecked;
  }
});
</script>

上面的代码中,我们在第一个多选框上添加了一个class=select-all,表示这是全选按钮。然后我们监听全选按钮的click事件,在点击时遍历所有的多选框,并设置它们的checked属性。当用户勾选或取消勾选一个选项时,我们还要遍历所有多选框,并判断是否所有的多选框都被勾选,然后设置全选框的勾选状态。

四、在表格中使用checkbox

在表格中使用inputtype=checkbox是很常见的场景,但是在表格中使用checkbox也有一些需要注意的地方。

首先,每个checkbox应该使用不同的name,并在后台处理时分别处理。其次,应该保证表格选中状态的一致性,即全选状态下,每一个checkbox都应该被勾选。

<table>
  <thead>
    <tr>
      <th><input type="checkbox" name="select-all" id="select-all"></th>
      <th>Name</th>
      <th>Age</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><input type="checkbox" name="selected_item[]"></td>
      <td>Alice</td>
      <td>28</td>
    </tr>
    <tr>
      <td><input type="checkbox" name="selected_item[]"></td>
      <td>Bob</td>
      <td>32</td>
    </tr>
  </tbody>
</table>

<script>
document.querySelector('#select-all').addEventListener('change', function() {
  var checkboxes = document.querySelectorAll('input[name="selected_item[]"]');
  for (var i = 0; i < checkboxes.length; i++) {
    checkboxes[i].checked = this.checked;
  }
});
document.addEventListener('change', function(event) {
  if (event.target.matches('input[name="selected_item[]"]')) {
    var checkboxes = document.querySelectorAll('input[name="selected_item[]"]');
    var allChecked = true;
    for (var i = 0; i < checkboxes.length; i++) {
      if (!checkboxes[i].checked) {
        allChecked = false;
        break;
      }
    }
    document.querySelector('#select-all').checked = allChecked;
  }
});
</script>

上面的代码中,我们将每个checkbox的name均设置为selected_item[],注意后面的[],这样做可以让浏览器将多个选中的值组成一个数组传递到后台。

同时,我们为全选框和每个checkbox通过不同的name来区分,具体来说,全选框使用name=select-all,而每个checkbox则使用name=selected_item[]。当用户点击全选框时,我们遍历所有的选项并设置它们的checked属性。当用户选择或取消每一项时,我们遍历所有的选项并判断是否所有的选项都被选择,然后设置全选框的checked属性。