在以前遇到使用 < input >的 radio 或是 checkbox 都是使用遊覽器原生的樣式,

這次剛好遇到設計搞是有做過更動的樣式,在沒經驗的情況下找到了方法,

當然也要記錄一下了🗒️。

圖一:

Test1.png

圖一是這次拿到需要完成的樣式,

首先是先將 HTML 準備好,

<div class="customOptions">
  測試樣式
  <label class="testOptoins" for="radio1">
    <input type="radio" name="test" id="radio1"/>
    選項1
    <span></span>
  </label>
  <label class="testOptoins" for="radio2">
    <input type="radio" name="test" id="radio2"/>
    選項2
    <span></span>
  </label>
</div>

再來就要來寫 CSS 了,因為我們不需要原本遊覽器的 input 樣式,

所以我會先將原本的隱藏起來,再利用 <span> 設計樣式來取代原本的,

.testOptoins + .testOptoins {
  margin-left: 4%;
}
.testOptoins input[type="radio"] {
  display: none;
}
.testOptoins span {
  height: 16px;
  width: 16px;
  border-radius: 50%;
  border: #979797 1px solid;
  display: block;
  position: absolute;
  left: 0px;
  top: 14px;
}
.testOptoins span::after {
  content: "";
  height: 10px;
  width: 10px;
  background: var(--gradient);
  display: block;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%) scale(1);
  border-radius: 50%;
}

先在 <span> 上設計出 radio 的外框,再來就要利用偽元素畫出裡面的圓圈,

*提醒: after 或 before 偽元素裡面一定要有 content 這個屬性,不然他不會顯示。

都畫好後應該就能夠看到像圖二這樣的外觀。

圖二:

cb418c8b1ebff1e9116127945b82e734.png

最後就要運用到 CSS3 一個新的偽元素 :checked 來完成這個自訂義的樣式。

.testOptoins + .testOptoins {
  margin-left: 4%;
}
.testOptoins input[type="radio"] {
  display: none;
}
.testOptoins span {
  height: 16px;
  width: 16px;
  border-radius: 50%;
  border: #979797 1px solid;
  display: block;
  position: absolute;
  left: 0px;
  top: 14px;
}
.testOptoins span::after {
  content: "";
  height: 10px;
  width: 10px;
  background: var(--gradient);
  display: block;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%) scale(0);
  border-radius: 50%;
	transition: 200ms ease-in-out 0s;
}
.testOptoins input[type="radio"]:checked ~ span:after {
  transform: translate(-50%, -50%) scale(1);
}

先讓 :after樣式在 radio 尚未選取前 scale 變成 0