Chodzi mi o to, że sam przycisk opcji składa się z okrągłego kształtu i kropki pośrodku (gdy przycisk jest wybrany). To, co chcę zmienić, to kolor obu. Czy można to zrobić za pomocą CSS?
Chodzi mi o to, że sam przycisk opcji składa się z okrągłego kształtu i kropki pośrodku (gdy przycisk jest wybrany). To, co chcę zmienić, to kolor obu. Czy można to zrobić za pomocą CSS?
Odpowiedzi:
Przycisk opcji to natywny element, specyficzny dla każdego systemu operacyjnego / przeglądarki. Nie ma możliwości zmiany koloru / stylu, chyba że chcesz zaimplementować niestandardowe obrazy lub użyć niestandardowej biblioteki JavaScript, która zawiera obrazy (np. To - link w pamięci podręcznej )
Szybkim rozwiązaniem byłoby nałożenie stylu wprowadzania przycisków radiowych za pomocą :after, jednak prawdopodobnie lepszą praktyką jest utworzenie własnego niestandardowego zestawu narzędzi.
input[type='radio']:after {
width: 15px;
height: 15px;
border-radius: 15px;
top: -2px;
left: -1px;
position: relative;
background-color: #d1d3d1;
content: '';
display: inline-block;
visibility: visible;
border: 2px solid white;
}
input[type='radio']:checked:after {
width: 15px;
height: 15px;
border-radius: 15px;
top: -2px;
left: -1px;
position: relative;
background-color: #ffa500;
content: '';
display: inline-block;
visibility: visible;
border: 2px solid white;
}
<input type='radio' name="gender"/>
<input type='radio' name="gender"/>
Jak wspomniał Fred, nie ma sposobu na natywne stylizowanie przycisków radiowych pod względem koloru, rozmiaru itp. Ale możesz użyć pseudoelementów CSS, aby ustawić oszusta dla dowolnego przycisku opcji i nadać mu styl. Dotykając tego, co powiedział JamieD, w jaki sposób możemy użyć: after Pseudo element, możesz użyć obu: before i: after, aby uzyskać pożądany wygląd.
Korzyści z tego podejścia:
Objaśnienie krótkiego demo poniżej:
HTML
<div class="radio-item">
<input type="radio" id="ritema" name="ritem" value="ropt1">
<label for="ritema">Option 1</label>
</div>
<div class="radio-item">
<input type="radio" id="ritemb" name="ritem" value="ropt2">
<label for="ritemb">Option 2</label>
</div>
CSS
.radio-item {
display: inline-block;
position: relative;
padding: 0 6px;
margin: 10px 0 0;
}
.radio-item input[type='radio'] {
display: none;
}
.radio-item label {
color: #666;
font-weight: normal;
}
.radio-item label:before {
content: " ";
display: inline-block;
position: relative;
top: 5px;
margin: 0 5px 0 0;
width: 20px;
height: 20px;
border-radius: 11px;
border: 2px solid #004c97;
background-color: transparent;
}
.radio-item input[type=radio]:checked + label:after {
border-radius: 11px;
width: 12px;
height: 12px;
position: absolute;
top: 9px;
left: 10px;
content: " ";
display: block;
background: #004c97;
}
Krótkie demo , aby zobaczyć go w akcji
Podsumowując, nie jest wymagany JavaScript, obrazy ani baterie. Czysty CSS.
Tylko jeśli celujesz w przeglądarki oparte na webkitach (Chrome i Safari, być może tworzysz aplikację Chrome WebApp, kto wie ...), możesz użyć:
input[type='radio'] {
-webkit-appearance: none;
}
Następnie nadaj mu styl, jakby był prostym elementem HTML, na przykład stosując obraz tła.
Posługiwać się input[type='radio']:active gdy wybrane jest wejście, aby zapewnić alternatywną grafikę
Aktualizacja : od 2018 r. Można dodać następujące elementy, aby obsługiwać wielu dostawców przeglądarek:
input[type="radio"] {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}
:active, należy użyć :checkeddo rozróżnienia stylów między „wybranymi” przyciskami radiowymi.
Możesz uzyskać spersonalizowane przyciski opcji na dwa czyste sposoby CSS
Poprzez usunięcie standardowego wyglądu za pomocą CSS appearancei zastosowanie wyglądu niestandardowego. Niestety to nie działa w IE na komputer (ale działa w IE na Windows Phone). Próbny:
input[type="radio"] {
/* remove standard background appearance */
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
/* create custom radiobutton appearance */
display: inline-block;
width: 25px;
height: 25px;
padding: 6px;
/* background-color only for content */
background-clip: content-box;
border: 2px solid #bbbbbb;
background-color: #e7e6e7;
border-radius: 50%;
}
/* appearance for checked radiobutton */
input[type="radio"]:checked {
background-color: #93e026;
}
/* optional styles, I'm using this for centering radiobuttons */
.flex {
display: flex;
align-items: center;
}
<div class="flex">
<input type="radio" name="radio" id="radio1" />
<label for="radio1">RadioButton1</label>
</div>
<div class="flex">
<input type="radio" name="radio" id="radio2" />
<label for="radio2">RadioButton2</label>
</div>
<div class="flex">
<input type="radio" name="radio" id="radio3" />
<label for="radio3">RadioButton3</label>
</div>
Poprzez ukrycie radiobutton i ustawienie niestandardowego wyglądu radiobutton na labelpseudoselektor. Nawiasem mówiąc, nie ma tu potrzeby pozycjonowania absolutnego (widzę pozycjonowanie absolutne w większości dem). Próbny:
*,
*:before,
*:after {
box-sizing: border-box;
}
input[type="radio"] {
display: none;
}
input[type="radio"]+label:before {
content: "";
/* create custom radiobutton appearance */
display: inline-block;
width: 25px;
height: 25px;
padding: 6px;
margin-right: 3px;
/* background-color only for content */
background-clip: content-box;
border: 2px solid #bbbbbb;
background-color: #e7e6e7;
border-radius: 50%;
}
/* appearance for checked radiobutton */
input[type="radio"]:checked + label:before {
background-color: #93e026;
}
/* optional styles, I'm using this for centering radiobuttons */
label {
display: flex;
align-items: center;
}
<input type="radio" name="radio" id="radio1" />
<label for="radio1">RadioButton1</label>
<input type="radio" name="radio" id="radio2" />
<label for="radio2">RadioButton2</label>
<input type="radio" name="radio" id="radio3" />
<label for="radio3">RadioButton3</label>
możesz użyć hackowania pola wyboru, jak wyjaśniono w sztuczkach CSS
http://css-tricks.com/the-checkbox-hack/
działający przykład przycisku radiowego:
http://codepen.io/Angelata/pen/Eypnq
input[type=radio]:checked ~ .check {}
input[type=radio]:checked ~ .check .inside{}
Działa w IE9 +, Firefox 3.5+, Safari 1.3+, Opera 6+, Chrome cokolwiek.
prosty przykład niestandardowego przycisku opcji dla różnych przeglądarek
.checkbox input{
display: none;
}
.checkbox input:checked + label{
color: #16B67F;
}
.checkbox input:checked + label i{
background-image: url('http://kuzroman.com/images/jswiddler/radio-button.svg');
}
.checkbox label i{
width: 15px;
height: 15px;
display: inline-block;
background: #fff url('http://kuzroman.com/images/jswiddler/circle.svg') no-repeat 50%;
background-size: 12px;
position: relative;
top: 1px;
left: -2px;
}
<div class="checkbox">
<input type="radio" name="sort" value="popularity" id="sort1">
<label for="sort1">
<i></i>
<span>first</span>
</label>
<input type="radio" name="sort" value="price" id="sort2">
<label for="sort2">
<i></i>
<span>second</span>
</label>
</div>
Cóż, aby stworzyć dodatkowe elementy, możemy użyć: after,: before (więc nie musimy tak bardzo zmieniać HTML). Następnie dla przycisków radiowych i pól wyboru możemy użyć: zaznaczone. Jest jeszcze kilka innych pseudo elementów, których możemy użyć (np. Hover). Używając ich mieszanki, możemy stworzyć całkiem fajne niestandardowe formularze. Sprawdź to
Zbudowałem kolejny fork przykładowego kodu @ klewis , aby zademonstrować pewne granie z czystym CSS i gradientami, używając: before /: after pseudoelementy i ukrytego przycisku radiowego.
HTML:
sample radio buttons:
<div style="background:lightgrey;">
<span class="radio-item">
<input type="radio" id="ritema" name="ritem" class="true" value="ropt1" checked="checked">
<label for="ritema">True</label>
</span>
<span class="radio-item">
<input type="radio" id="ritemb" name="ritem" class="false" value="ropt2">
<label for="ritemb">False</label>
</span>
</div>
:
CSS:
.radio-item input[type='radio'] {
visibility: hidden;
width: 20px;
height: 20px;
margin: 0 5px 0 5px;
padding: 0;
}
.radio-item input[type=radio]:before {
position: relative;
margin: 4px -25px -4px 0;
display: inline-block;
visibility: visible;
width: 20px;
height: 20px;
border-radius: 10px;
border: 2px inset rgba(150,150,150,0.75);
background: radial-gradient(ellipse at top left, rgb(255,255,255) 0%, rgb(250,250,250) 5%, rgb(230,230,230) 95%, rgb(225,225,225) 100%);
content: "";
}
.radio-item input[type=radio]:checked:after {
position: relative;
top: 0;
left: 9px;
display: inline-block;
visibility: visible;
border-radius: 6px;
width: 12px;
height: 12px;
background: radial-gradient(ellipse at top left, rgb(245,255,200) 0%, rgb(225,250,100) 5%, rgb(75,175,0) 95%, rgb(25,100,0) 100%);
content: "";
}
.radio-item input[type=radio].true:checked:after {
background: radial-gradient(ellipse at top left, rgb(245,255,200) 0%, rgb(225,250,100) 5%, rgb(75,175,0) 95%, rgb(25,100,0) 100%);
}
.radio-item input[type=radio].false:checked:after {
background: radial-gradient(ellipse at top left, rgb(255,225,200) 0%, rgb(250,200,150) 5%, rgb(200,25,0) 95%, rgb(100,25,0) 100%);
}
.radio-item label {
display: inline-block;
height: 25px;
line-height: 25px;
margin: 0;
padding: 0;
}
podgląd: https://www.codeply.com/p/y47T4ylfib
Spróbuj tego CSS z przejściem:
$DarkBrown: #292321;
$Orange: #CC3300;
div {
margin:0 0 0.75em 0;
}
input[type="radio"] {
display:none;
}
input[type="radio"] + label {
color: $DarkBrown;
font-family:Arial, sans-serif;
font-size:14px;
}
input[type="radio"] + label span {
display:inline-block;
width:19px;
height:19px;
margin:-1px 4px 0 0;
vertical-align:middle;
cursor:pointer;
-moz-border-radius: 50%;
border-radius: 50%;
}
input[type="radio"] + label span {
background-color:$DarkBrown;
}
input[type="radio"]:checked + label span{
background-color:$Orange;
}
input[type="radio"] + label span,
input[type="radio"]:checked + label span {
-webkit-transition:background-color 0.4s linear;
-o-transition:background-color 0.4s linear;
-moz-transition:background-color 0.4s linear;
transition:background-color 0.4s linear;
}
HTML:
<div>
<input type="radio" id="radio01" name="radio" />
<label for="radio01"><span></span>Radio Button 1</label>
</div>
<div>
<input type="radio" id="radio02" name="radio" />
<label for="radio02"><span></span>Radio Button 2</label>
</div>
Jak powiedzieli inni, nie ma sposobu, aby to osiągnąć we wszystkich przeglądarkach, więc najlepszym sposobem na zrobienie tego w różnych przeglądarkach jest dyskretne używanie javascript. Zasadniczo musisz zamienić swój radiobutton w linki (w pełni konfigurowalne przez CSS). każde kliknięcie odsyłacza będzie powiązane z odpowiednim radioboxem, przełączając jego stan i wszystkie inne.
Pomocne może być powiązanie przycisku radiowego z etykietą ze stylem. Dalsze szczegóły w tej odpowiedzi .
Możesz osadzić element span w wejściu radiowym, a następnie wybrać wybrany kolor, który ma być renderowany, gdy wejście radiowe jest zaznaczone. Sprawdź poniższy przykład pochodzący z w3schools.
<!DOCTYPE html>
<html>
<style>
/* The container */
.container {
display: block;
position: relative;
padding-left: 35px;
margin-bottom: 12px;
cursor: pointer;
font-size: 22px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
/* Hide the browser's default radio button */
.container input {
position: absolute;
opacity: 0;
cursor: pointer;
}
/* Create a custom radio button */
.checkmark {
position: absolute;
top: 0;
left: 0;
height: 25px;
width: 25px;
background-color: #eee;
border-radius: 50%;
}
/* On mouse-over, add a grey background color */
.container:hover input ~ .checkmark {
background-color: #ccc;
}
/* When the radio button is checked, add a blue background */
.container input:checked ~ .checkmark {
background-color: #00a80e;
}
/* Create the indicator (the dot/circle - hidden when not checked) */
.checkmark:after {
content: "";
position: absolute;
display: none;
}
/* Show the indicator (dot/circle) when checked */
.container input:checked ~ .checkmark:after {
display: block;
}
/* Style the indicator (dot/circle) */
.container .checkmark:after {
top: 9px;
left: 9px;
width: 8px;
height: 8px;
border-radius: 50%;
background: white;
}
</style>
<body>
<h1>Custom Radio Buttons</h1>
<label class="container">One
<input type="radio" checked="checked" name="radio">
<span class="checkmark"></span>
</label>
<label class="container">Two
<input type="radio" name="radio">
<span class="checkmark"></span>
</label>
<label class="container">Three
<input type="radio" name="radio">
<span class="checkmark"></span>
</label>
<label class="container">Four
<input type="radio" name="radio">
<span class="checkmark"></span>
</label>
</body>
Zmiana koloru tła w tym segmencie kodu poniżej załatwia sprawę.
/* When the radio button is checked, add a blue background */
.container input:checked ~ .checkmark {
background-color: #00a80e;
}
Prostą poprawką byłoby użycie następującej właściwości CSS.
input[type=radio]:checked{
background: \*colour*\;
border-radius: 15px;
border: 4px solid #dfdfdf;
}