您好,登錄后才能下訂單哦!
本篇內容介紹了“css怎么改變單選框的顏色”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
單選框了解一下
由于我們的目標是改變單選框顏色,其他外觀特征和行為與原來的單選框一致,那么我們就必須先了解單選框原來的外觀特征和行為主要有哪些。
1.外觀特征
1.1.常態樣式
margin:3px3px0px5px;
border:none0;
padding:0;
box-sizing:border-box;
display:inline-block;
line-height:normal;
position:static;
注意:外觀上我們必須要保證布局特性和原生的一致,否則采用自定義單選框替換后很大機會會影響整體的布局,最后導致被迫調整其他元素的布局特性來達到整體的協調,從而擴大了修改范圍。
1.2.獲得焦點的樣式
outline-offset:0px;
outline:-webkit-focu-ring-colorauto5px;
注意:這里的獲取焦點的樣式僅通過鍵盤Tab鍵才生效,若通過鼠標點擊雖然單選框已獲得焦點,但上述樣式并不會生效。
1.3.設置為disabled的樣式
color:rgb(84,84,84);
2.行為特征
單選框的行為特征,明顯就是選中與否,及選中狀態的改變事件,因此我們必須保持對外提供change事件。
另外值得注意的是,當通過鍵盤的Tab鍵讓單選框獲得焦點后,再按下Space鍵則會選中該單選框。
有了上述的了解,我們可以開始著手擼代碼了!
少廢話,擼代碼
435275490-5bb54e2fc18b1_articlex.png
上圖中左側就是原生單選框,右側為我們自定義的單選框。從上到下依次為未選中、選中、獲得焦點和disabled狀態的樣式。
CSS部分
label.radio{
/*保證布局特性保持一致*/
margin:3px3px0px5px;
display:inline-block;
box-sizing:border-box;
width:12px;
height:12px;
}
.radio__appearance{
display:block;/*設置為block則不受vertical-align影響,從而不會意外影響到.radio的linebox高度*/
position:relative;
box-shadow:0001pxtomato;/*box-shadow不像border那樣會影響盒子的框高*/
border-radius:50%;
height:90%;
width:90%;
text-align:center;
}
label.radio[type=radio]+.radio__appearance::before{
content:"";
display:block;
border-radius:50%;
width:85%;
height:85%;
position:absolute;
top:50%;
left:50%;
transform:translate(-50%,-50%);
transition:background.3s;
}
label.radio[type=radio]:checked+.radio__appearance::before{
background:tomato;
}
label.radio[type=radio][disabled]+.radio__appearance{
opacity:.5;
}
label.radio:focus{
outline-offset:0px;
outline:#999auto5px;
}
/*通過鼠標單擊獲得焦點時,outline效果不生效*/
label.radio.clicked{
outline:none0;
}
/*自定義單選框的行為主要是基于原生單選框的,因此先將原生單選框隱藏*/
label.radioinput{
display:none;
}
HTML部分
<!--未選中狀態-->
<labelclass="radio"tabindex="0">
<inputtype="radio"name="a">
<iclass="radio__appearance"></i>
</label>
<br>
<!--選中狀態-->
<labelclass="radio"tabindex="0">
<inputtype="radio"name="a"checked>
<iclass="radio__appearance"></i>
</label>
<br>
<!--disabled狀態-->
<labelclass="radio">
<inputtype="radio"name="a"disabled>
<iclass="radio__appearance"></i>
</label>
JavaScript部分
varradios=document.querySelectorAll(".radio")
radios.forEach(radio=>{
//模擬鼠標點擊后:focus樣式無效
radio.addEventListener("mousedown",e=>{
vartar=e.currentTarget
tar.classList.add("clicked")
varfp=setInterval(function(){
if(document.activeElement!=tar){
tar.classList.remove("clicked")
clearInterval(fp)
}
},400)
})
//模擬通過鍵盤獲得焦點后,按`Space`鍵執行選中操作
radio.addEventListener("keydown",e=>{
if(e.keyCode===32){
e.target.click()
}
})
})
這個實現有3個注意點:
1、通過label傳遞鼠標點擊事件到關聯的input[type=radio],因此可以安心隱藏單選框又可以利用單選框自身特性。但由于label控件自身的限制,如默認不是可獲得焦點元素,因此無法傳遞鍵盤按鍵事件到單選框,即使添加tabindex特性也需手寫JS來實現;
2、當tabindex大于等于0時表示該元素可以獲得焦點,為0時表示根據元素所在位置安排獲得焦點的順序,而大于0則表示越小越先獲得焦點;
3、由于單選框的display為inline-block,因此單選框將影響linebox高度。當自定義單選框內元素采用inline-block時,若vertical-align設置稍有不慎就會導致內部元素所在的linebox被撐高,從而導致自定義單選框所在的linebox高度變大。因此這里采用將內部元素的display均設置為block的做法,直接讓vertical-align失效,提高可控性。
通過opacity:0實現
上面我們通過label關聯display:none的input[type=radio]從而利用input[type=radio]簡化自定義單選框的實現,但依然要手寫JS實現按Space鍵選中的行為特征,有沒有另一種方式可以更省事呢?我們只是想讓用戶看不到原生單選框,那么直接設置為opacity:0不就可以了嗎?!
CSS部分
.radio{
/*保證布局特性保持一致*/
margin:3px3px0px5px;
display:inline-block;
box-sizing:border-box;
width:13px;
height:13px;
}
/*自定義單選框的行為主要是基于原生單選框的,因此先將原生單選框透明,且沾滿整個父元素*/
.radioinput{
opacity:0;
position:absolute;
z-index:1;/*必須覆蓋在.radio__appearance上才能響應鼠標事件*/
width:100%;
height:100%;
}
.radio__container-box{
position:relative;
width:100%;
height:100%;
}
.radio__appearance{
display:block;/*設置為block則不受vertical-align影響,從而不會意外影響到.radio的linebox高度*/
position:relative;
box-shadow:0001pxtomato;/*box-shadow不像border那樣會影響盒子的框高*/
border-radius:50%;
height:90%;
width:90%;
text-align:center;
}
.radio[type=radio]+.radio__appearance::before{
content:"";
display:block;
border-radius:50%;
width:85%;
height:85%;
position:absolute;
top:50%;
left:50%;
transform:translate(-50%,-50%);
transition:background.3s;
}
.radio[type=radio]:checked+.radio__appearance::before{
background:tomato;
}
.radio[type=radio][disabled]+.radio__appearance{
opacity:.5;
}
.radio:focus-within.radio__appearance{
outline-offset:0px;
outline:#999auto5px;
}
/*通過鼠標單擊獲得焦點時,outline效果不生效*/
.radio.clicked.radio_appearance{
outline:none0;
}
HTML部分
<!--未選中狀態-->
<spanclass="radio">
<spanclass="radio__container-box">
<inputtype="radio"name="a">
<iclass="radio__appearance"></i>
</span>
</span>
<br>
<!--選中狀態-->
<spanclass="radio">
<spanclass="radio__container-box">
<inputtype="radio"name="a"checked>
<iclass="radio__appearance"></i>
</span>
</span>
<br>
<!--disabled狀態-->
<spanclass="radio">
<spanclass="radio__container-box">
<inputtype="radio"name="a"disabled>
<iclass="radio__appearance"></i>
</span>
</span>
JavaScript部分
varradios=document.querySelectorAll(".radio")
radios.forEach(radio=>{
//模擬鼠標點擊后:focus樣式無效
radio.addEventListener("mousedown",e=>{
vartar=e.currentTarget
tar.classList.add("clicked")
varfp=setInterval(function(){
if(!tar.contains(document.activeElement){
tar.classList.remove("clicked")
clearInterval(fp)
}
},400)
})
})
“css怎么改變單選框的顏色”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。