技術(shù)頻道導(dǎo)航
HTML/CSS
.NET技術(shù)
IIS技術(shù)
PHP技術(shù)
Js/JQuery
Photoshop
Fireworks
服務(wù)器技術(shù)
操作系統(tǒng)
網(wǎng)站運(yùn)營

贊助商

分類目錄

贊助商

最新文章

搜索

純CSS:兩個非常漂亮的checkbox和radio按鈕樣式

作者:admin    時間:2022-12-6 20:52:28    瀏覽:

前面介紹過兩例純CSS樣式:單選radio/復(fù)選checkbox按鈕,以及使用SVG實現(xiàn)的漂亮的復(fù)選框(checkbox)樣式,今天,再給大家介紹兩個非常漂亮的checkboxradio按鈕樣式。

 兩個非常漂亮的checkbox和radio按鈕樣式

demodownload

現(xiàn)在完全可以構(gòu)建自定義復(fù)選框checkbox和單選radio按鈕,同時保持語義和可訪問性。我們甚至不需要一行 JavaScript 或額外的 HTML 元素!實際上現(xiàn)在比過去更容易了。讓我們來看看。

完整HTML

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">

<style>
@supports (-webkit-appearance: none) or (-moz-appearance: none) {
  input[type=checkbox],
input[type=radio] {
    --active: #275EFE;
    --active-inner: #fff;
    --focus: 2px rgba(39, 94, 254, .3);
    --border: #BBC1E1;
    --border-hover: #275EFE;
    --background: #fff;
    --disabled: #F6F8FF;
    --disabled-inner: #E1E6F9;
    -webkit-appearance: none;
    -moz-appearance: none;
    height: 21px;
    outline: none;
    display: inline-block;
    vertical-align: top;
    position: relative;
    margin: 0;
    cursor: pointer;
    border: 1px solid var(--bc, var(--border));
    background: var(--b, var(--background));
    transition: background 0.3s, border-color 0.3s, box-shadow 0.2s;
  }
  input[type=checkbox]:after,
input[type=radio]:after {
    content: "";
    display: block;
    left: 0;
    top: 0;
    position: absolute;
    transition: transform var(--d-t, 0.3s) var(--d-t-e, ease), opacity var(--d-o, 0.2s);
  }
  input[type=checkbox]:checked,
input[type=radio]:checked {
    --b: var(--active);
    --bc: var(--active);
    --d-o: .3s;
    --d-t: .6s;
    --d-t-e: cubic-bezier(.2, .85, .32, 1.2);
  }
  input[type=checkbox]:disabled,
input[type=radio]:disabled {
    --b: var(--disabled);
    cursor: not-allowed;
    opacity: 0.9;
  }
  input[type=checkbox]:disabled:checked,
input[type=radio]:disabled:checked {
    --b: var(--disabled-inner);
    --bc: var(--border);
  }
  input[type=checkbox]:disabled + label,
input[type=radio]:disabled + label {
    cursor: not-allowed;
  }
  input[type=checkbox]:hover:not(:checked):not(:disabled),
input[type=radio]:hover:not(:checked):not(:disabled) {
    --bc: var(--border-hover);
  }
  input[type=checkbox]:focus,
input[type=radio]:focus {
    box-shadow: 0 0 0 var(--focus);
  }
  input[type=checkbox],
input[type=radio] {
    width: 21px;
  }
  input[type=checkbox]:after,
input[type=radio]:after {
    opacity: var(--o, 0);
  }
  input[type=checkbox]:checked,
input[type=radio]:checked {
    --o: 1;
  }
  input[type=checkbox] + label,
input[type=radio] + label {
    font-size: 14px;
    line-height: 21px;
    display: inline-block;
    vertical-align: top;
    cursor: pointer;
    margin-left: 4px;
  }

  input[type=checkbox] {
    border-radius: 7px;
  }
  input[type=checkbox]:after {
    width: 5px;
    height: 9px;
    border: 2px solid var(--active-inner);
    border-top: 0;
    border-left: 0;
    left: 7px;
    top: 4px;
    transform: rotate(var(--r, 20deg));
  }
  input[type=checkbox]:checked {
    --r: 43deg;
  }

  input[type=radio] {
    border-radius: 50%;
  }
  input[type=radio]:after {
    width: 19px;
    height: 19px;
    border-radius: 50%;
    background: var(--active-inner);
    opacity: 0;
    transform: scale(var(--s, 0.7));
  }
  input[type=radio]:checked {
    --s: .5;
  }
}
ul {
  margin: 12px;
  padding: 0;
  list-style: none;
  width: 100%;
  max-width: 320px;
}
ul li {
  margin: 16px 0;
  position: relative;
}

html {
  box-sizing: border-box;
}

* {
  box-sizing: inherit;
}
*:before, *:after {
  box-sizing: inherit;
}

body {
  min-height: 100vh;
  font-family: "Inter", Arial, sans-serif;
  color: #8A91B4;
  display: flex;
  justify-content: center;
  align-items: center;
  background: #F6F8FF;
}
@media (max-width: 800px) {
  body {
    flex-direction: column;
  }
}
</style>


</head>

<body>
  <ul>
  <li>
    <input id="c1" type="checkbox">
    <label for="c1">Checkbox</label>
  </li>
  <li>
    <input id="c2" type="checkbox" checked>
    <label for="c2">Checkbox</label>
  </li>
  <li>
    <input id="r1" type="radio" name="radio" value="1">
    <label for="r1">Radio</label>
  </li>
  <li>
    <input id="r2" type="radio" name="radio" value="2" checked>
    <label for="r2">Radio</label>
  </li>
</ul>

<ul>
  <li>
    <input id="c1d" type="checkbox" disabled>
    <label for="c1d">Checkbox</label>
  </li>
  <li>
    <input id="c2d" type="checkbox" checked disabled>
    <label for="c2d">Checkbox</label>
  </li>
  <li>
    <input id="r1d" type="radio" name="radiod" value="1" disabled>
    <label for="r1d">Radio</label>
  </li>
  <li>
    <input id="r2d" type="radio" name="radiod" value="2" checked disabled>
    <label for="r2d">Radio</label>
  </li>
</ul>

</body>

</html>

下面我們看看這個HTML代碼的實現(xiàn)方法。

1、HTML設(shè)計

我們可以只用這個 HTML 來設(shè)計我們的輸入,沒有什么特別的。

<!-- Checkbox -->
<input type="checkbox">

<!-- Radio -->
<input type="radio">

HTML 部分就這些了,當(dāng)然還是推薦有 nameid 屬性,加上一個匹配的<label>元素:

<!-- Checkbox -->
<input type="checkbox" name="c1" id="c1">
<label for="c1">Checkbox</label>

<!-- Radio -->
<input type="radio" name="r1" id="r1">
<label for="r1">Radio</label>

2、CSS樣式

首先,我們檢查appearance: none;的支持,包括它的前綴組成。appearance屬性是關(guān)鍵,因為它旨在從元素中刪除瀏覽器的默認(rèn)樣式。如果不支持該屬性,則不會應(yīng)用這些樣式,并且會顯示默認(rèn)輸入樣式。這是漸進(jìn)增強(qiáng)的一個很好的例子。

@supports(-webkit-appearance: none) or (-moz-appearance: none) {
  input[type='checkbox'],
  input[type='radio'] {
    -webkit-appearance: none;
    -moz-appearance: none;
  }
}

就目前而言,支持的瀏覽器如下(數(shù)字表示支持瀏覽器該版本及更高版本):

 

3、元素交互狀態(tài)設(shè)計

在設(shè)計元素時,我們會考慮這些交互狀態(tài):

  • :checked
  • :hover
  • :focus
  • :disabled

例如,以下是我們?nèi)绾卧O(shè)置checkboxradio的樣式和:checked狀態(tài): 

input[type=checkbox],
input[type=radio] {
    --active: #275EFE;
    --active-inner: #fff;
    --focus: 2px rgba(39, 94, 254, .3);
    --border: #BBC1E1;
    --border-hover: #275EFE;
    --background: #fff;
    --disabled: #F6F8FF;
    --disabled-inner: #E1E6F9;
    -webkit-appearance: none;
    -moz-appearance: none;
    height: 21px;
    outline: none;
    display: inline-block;
    vertical-align: top;
    position: relative;
    margin: 0;
    cursor: pointer;
    border: 1px solid var(--bc, var(--border));
    background: var(--b, var(--background));
    transition: background 0.3s, border-color 0.3s, box-shadow 0.2s;
  }
  input[type=checkbox]:after,
input[type=radio]:after {
    content: "";
    display: block;
    left: 0;
    top: 0;
    position: absolute;
    transition: transform var(--d-t, 0.3s) var(--d-t-e, ease), opacity var(--d-o, 0.2s);
  }
  input[type=checkbox]:checked,
input[type=radio]:checked {
    --b: var(--active);
    --bc: var(--active);
    --d-o: .3s;
    --d-t: .6s;
    --d-t-e: cubic-bezier(.2, .85, .32, 1.2);
  }

<input>容器一樣使用元素。input內(nèi)部的旋鈕是使用::after偽元素創(chuàng)建的,不再需要額外的標(biāo)記!

4、自定義CSS屬性

示例中,添加了一些 CSS 自定義屬性,這是管理樣式表中可重用值的好方法:

@supports(-webkit-appearance: none) or (-moz-appearance: none) {
  input[type='checkbox'],
  input[type='radio'] {
    --active: #275EFE;
    --active-inner: #fff;
    --focus: 2px rgba(39, 94, 254, .25);
    --border: #BBC1E1;
    --border-hover: #275EFE;
    --background: #fff;
    --disabled: #F6F8FF;
    --disabled-inner: #E1E6F9;
  }
}

自定義屬性可以很好地根據(jù)元素的狀態(tài)更新值!這里不打算做詳細(xì)介紹,下面是一個示例,我們可以為不同的狀態(tài)使用自定義屬性。

/* 默認(rèn) */
input[type='checkbox'],
input[type='radio'] {
  --active: #275EFE;
  --border: #BBC1E1;
  border: 1px solid var(--bc, var(--border));
}

/* 覆蓋默認(rèn) */
input[type='checkbox']:checked,
input[type='radio']:checked {
  --b: var(--active);
  --bc: var(--active);
}
  
/* 如果未選中或未禁用,則在懸停時應(yīng)用另一種邊框顏色 */
input[type='checkbox']:not(:checked):not(:disabled):hover,
input[type='radio']:not(:checked):not(:disabled):hover {
  --bc: var(--border-hover);
}

5、可訪問性設(shè)計

對于可訪問性,我們應(yīng)該添加自定義焦點樣式。刪除默認(rèn)輪廓,因為它不能像我們正在設(shè)計的其他東西一樣圓潤。但是 border-radiusbox-shadow 可以形成一種圓形的樣式,就像輪廓一樣。

input[type='checkbox'],
input[type='radio'] {
  --focus: 2px rgba(39, 94, 254, .25);
  outline: none;
  transition: box-shadow .2s;
}

input[type='checkbox']:focus,
input[type='radio']:focus {
  box-shadow: 0 0 0 var(--focus);
}

也可以對直接跟在<input>后面的的<label>元素進(jìn)行對齊并設(shè)置它的樣式:

<input type="checkbox" name="c1" id="c1">
<label for="c1">Checkbox</label>
input[type='checkbox'] + label,
input[type='radio'] + label {
  display: inline-block;
  vertical-align: top;
  /* 附加樣式 */
}

input[type='checkbox']:disabled + label,
input[type='radio']:disabled + label {
    cursor: not-allowed;
}

6、總結(jié)

由于直接在表單輸入上的偽元素,它需要更少的標(biāo)記。由于自定義屬性,它需要更少花哨的樣式切換。希望你也學(xué)會創(chuàng)建自定義表單樣式。

相關(guān)文章

標(biāo)簽: css  checkbox  radio  
x
  • 站長推薦
/* 左側(cè)顯示文章內(nèi)容目錄 */