Material Design 下自定义 CheckBox 样式的实现方式

阅读时长 8 分钟读完

在 Material Design 中,CheckBox 是一个非常常见的控件,用于用户选择。然而,由于 Material Design 中的设计风格非常统一,很多开发者可能会感觉 CheckBox 的样式略显单调。那么,如何给 CheckBox 自定义样式呢?本文将为大家介绍一种实现方式,帮助你打造更加美观的 CheckBox 控件。

实现思路

在 Material Design 中,CheckBox 通常由两个元素组成:checkbox 本身和一个文本标签。对于 checkbox 的样式,大家可能已经熟知,它包括默认状态(unchecked)、选中状态(checked)、半选中状态(indeterminate)三种状态。

那么,要实现自定义样式,我们需要做的就是针对这三种状态,使用 CSS 修改 checkbox 的默认样式。在实现之前,我们可以先了解一下 HTML 中 checkbox 的基本结构。

可以看到,整个 checkbox 控件包括一个 label 标签,其中有一个 input 元素和一个 span 元素,文本标签直接包含在 label 中。而文字标签不需要处理,我们主要关注的就是 input 和 span 元素的样式。接下来,我们将分别介绍三种状态下的样式实现方式。

默认状态

对于默认状态的 checkbox,我们只需要去掉默认的样式,并添加自定义的样式即可。

-- -------------------- ---- -------
-------------------- -
  --------- ---------
  -------- --
  ------- --------
-

---------- -
  --------- ---------
  ---- --
  ----- --
  ------- -----
  ------ -----
  ----------------- -----
  ------- --- ----- -----
-

------------------- -
  -------- -------------
  --------- ---------
  ------------- -----
  -------------- -----
  ------- --------
  ---------- -----
-

------------------- ------------- - ---------------- -
  -------- ------
-

------------------- ---------------- -
  -------- ---
  --------- ---------
  -------- -----
-

------------------- ------------- - ---------- -
  ----------------- --------
  ------- -----
-
展开代码

可以看到,我们使用了绝对定位的方式,将 checkbox 隐藏掉并放在了左上角。然后,我们将 span 元素的宽高设为 20px,设置背景色和边框,来模拟 checkbox,最后通过伪类实现选中状态下的勾。

选中状态

对于选中状态的 checkbox,我们只需要修改其样式即可。

这里,我们只需要将背景色和边框去掉,并设置一个深蓝色的背景即可。当 checkbox 被选中时,它的背景色将变为该深蓝色。

半选中状态

对于半选中状态的 checkbox,我们可以通过设置一张图片来模拟出半选中的效果。

这里,我们通过指定查找 input 元素 class 名为 indeterminate 的元素(这个类名非常特殊,是 checkbox 本身带有的),然后将背景图片指向一张 SVG 文件,来实现半选中状态下的样式。

这里使用的 SVG 图片比较简单,只需要绘制一个矩形即可,颜色设置为灰色。如果想要更加复杂的图案,可以使用在线 SVG 编辑器来自动生成。比如 https://svg-edit.github.io/svgedit/

应用实例

在实践中,我们可以通过这种方式来实现自定义的样式。下面给出一个完整的例子:

-- -------------------- ---- -------
--------- -----
------
  ------
    ------------- -------- ------------
    -------
      -------------------- -
        --------- ---------
        -------- --
        ------- --------
      -

      ---------- -
        --------- ---------
        ---- --
        ----- --
        ------- -----
        ------ -----
        ----------------- -----
        ------- --- ----- -----
      -

      ------------------- -
        -------- -------------
        --------- ---------
        ------------- -----
        -------------- -----
        ------- --------
        ---------- -----
      -

      ------------------- ------------- - ---------------- -
        -------- ---
        --------- ---------
        ---- ----
        ----- ----
        ---------- --------------- ------
        ------ ----
        ------- -----
        ------- ----- ------
        ------------- - --- --- --
        ---------- --------------
        -------- ------
      -

      ------------------- ------------------- - ---------- -
        ------- -----
        ---------------- ---- -----
        -------------------- -------
        ----------------- ------------------------------ ---------- - -- --- -------------------------------------------- ---------------- ---------------------------------------
      -

      ------------------- ------------- - ---------- -
        ----------------- --------
        ------- -----
      -
    --------
  -------
  ------
    ------ ---------------------------
      ------ ----------------
      ----- -------------------------
      -------- -
    --------
    ----
    ------ ---------------------------
      ------ --------------- --------
      ----- -------------------------
      -------- -
    --------
    ----
    ------ ---------------------------
      ------ --------------- ----------------------
      ----- -------------------------
      -------- -
    --------
  -------
-------
展开代码

可以看到,我们通过 CSS 实现了三种状态下 checkbox 的自定义样式。当然,这只是一种方法,你也可以选择其它的实现方式,比如使用 SVG 图片来模拟 checkbox,或者使用 JavaScript 语言来动态生成 checkbox 的 HTML 和样式。总之,无论哪种方法,都需要注意可维护性和可复用性,以及与 Material Design 中的设计风格相适应。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67cde571e46428fe9e7a7752

纠错
反馈

纠错反馈