Как стилизовать radio button?
Всем привет, делаю кастомные radio button и хочу реализовать две функции, но не знаю как: 1. При выборе какой-то radio-button внутри нее должен появляться кружок синего цвета и 2. Если добавляется класс InputForm invalid, то все radio-buttons должны залиться красным цветом (обводка остаться прежней). Пробовал вот так:
.gender-select input[type="radio"]:not(:checked) {
background-color: red;
}
и так:
.InputForm.invalid .gender-select label input[type="radio"] {
border-color: red;
}
результата ноль. Помогите пожалуйста.
<form onSubmit={handleStep2Submit} className={`InputForm ${selectedGender ? '' : 'invalid'}`}>
<div className="gender-select">
<label htmlFor="male">
<input
type="radio"
id="male"
name="gender"
value="male"
checked={selectedGender === "male"}
onChange={handleGenderChange}
required
/>
Мужской
</label>
<label htmlFor="female">
<input
type="radio"
id="female"
name="gender"
value="female"
checked={selectedGender === "female"}
onChange={handleGenderChange}
required
/>
Женский
</label>
<label htmlFor="other">
<input
type="radio"
id="other"
name="gender"
value="other"
checked={selectedGender === "other"}
onChange={handleGenderChange}
required
/>
Другой
</label>
</div>
</form>
<button className="RegisterButton" type="submit">
Далее
</button>
</form>
)}
CSS:
.gender-select input[type="radio"] {
display: none;
}
.gender-select label {
position: relative;
padding-left: 15px;
cursor: pointer;
}
.gender-select label::before {
content: '';
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
width: 8px;
height: 8px;
border: 2px solid #cddef3;
border-radius: 50%;
}
Ответы (2 шт):
Автор решения: Den aka Ben
→ Ссылка
Для кастомизации формы можно воспользоваться Bootstrap
На главной странице Bootstrap описаны способы кастомизации форм, благодаря которым можно подобрать необходимый вариант отображения.
Автор решения: Meth0d
→ Ссылка
три способа, которыми я обычно пользуюсь
*, *::before, *::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
padding: 40px;
}
.label {
display: flex;
align-items: center;
font-size: 16px;
line-height: 1.15;
}
.label:not(:last-child) {
margin-bottom: 24px;
}
.radio1 {
width: 20px;
height: 20px;
margin-right: 10px;
border-radius: 50%;
border: 1px solid #333;
appearance: none;
-moz-appearance: none;
-webkit-appearance: none;
}
.radio1:checked {
background-color: blue;
border: blue;
}
.radio2,
.radio3 {
position: absolute;
opacity: 0;
visibility: hidden;
width: 1px;
height: 1px;
}
.radio2 + span {
width: 20px;
height: 20px;
margin-right: 10px;
border-radius: 50%;
border: 1px solid #333;
}
.radio2:checked + span {
background-color: blue;
border: blue;
}
.radio3 + label {
padding-left: 30px;
position: relative;
}
.radio3 + label::before {
position: absolute;
content: '';
left: 0;
top: 50%;
transform: translateY(-50%);
width: 20px;
height: 20px;
margin-right: 10px;
border-radius: 50%;
border: 1px solid #333;
}
.radio3:checked + label::before {
background-color: blue;
border: blue;
}
<label class="label label1">
<input type="radio" name="radio" class="radio1">
<span>Первый вариант</span>
</label>
<label class="label label2">
<input type="radio" name="radio" class="radio2">
<span></span>
<span>Второй вариант</span>
</label>
<input type="radio" name="radio" id="radio" class="radio3">
<label for="radio" class="label label3">
<span>Третий вариант</span>
</label>