CSS и вёрстка

Как изменить radio CSS

Как изменить radio CSS 📅 ⏱ 22:11 ⏳ 2 мин 💬 0

Как изменить radio css: простыми словами, по шагам и с примерами. Разбираем, как это работает на практике, типичные ошибки и лучшие решения. Раскрываем тему: ['

Как изменить radio CSS

Коротко: изменить внешний вид радиокнопки (input type="radio") напрямую почти нельзя — браузер рисует её сам. Рабочий приём: скрыть нативный input (appearance: none или opacity: 0) и нарисовать свой вид через label или псевдоэлемент ::before. Важно сохранить доступность: связь label + input и фокус с клавиатуры.

Кому и зачемСтандартные радиокнопки выбиваются из дизайна, особенно в опросах, квизах и формах выбора тарифа. Их оформляют под бренд: цвет, размер, «кружок внутри кружка». Ниже — как сделать это правильно.

Почему нельзя стилизовать напрямую

Свойство Результат
background часто игнорируется
border работает нестабильно
width/height ограниченно
appearance: none убирает системный вид — база для своей стилизации

Вкладки: способы оформления




CSS
.radio {
  appearance: none;
  width: 20px; height: 20px;
  border: 2px solid #ccc;
  border-radius: 50%;
  display: inline-grid;
  place-content: center;
}
.radio:checked { border-color: #003F8F; }
.radio:checked::before {
  content: "";
  width: 10px; height: 10px;
  border-radius: 50%;
  background: #003F8F;
}

Самый чистый способ: input остаётся настоящим (доступность сохраняется), а вид рисуют border и псевдоэлемент.

CSS
.opt { display: flex; align-items: center; gap: 8px; cursor: pointer; }
.opt input { accent-color: #003F8F; }

Самый быстрый путь: свойство accent-color перекрашивает стандартную радиокнопку в цвет бренда. Ничего скрывать не нужно — минимум кода.

CSS
.opt input { position: absolute; opacity: 0; }
.opt span::before {
  content: "";
  display: inline-block;
  width: 18px; height: 18px;
  border: 2px solid #bbb;
  border-radius: 50%;
  margin-right: 8px;
  vertical-align: -4px;
}
.opt input:checked + span::before {
  background: radial-gradient(#003F8F 45%, #fff 46%);
  border-color: #003F8F;
}

Нативный input скрыт, но остаётся в разметке: клик по label его переключает. Вид рисует ::before у соседнего элемента.

CSS
.tariff input { position: absolute; opacity: 0; }
.tariff span { display: block; border: 2px solid #eee; border-radius: 12px; padding: 16px; }
.tariff input:checked + span { border-color: #003F8F; box-shadow: 0 0 0 3px rgba(0,63,143,.12); }

Так делают выбор тарифа «карточками»: выбранный вариант подсвечивается рамкой. Радиокнопка при этом скрыта — клик по всей карточке.

Не используйте display: noneЕсли скрыть input через display: none, он пропадёт из навигации с клавиатуры. Скрывайте через opacity: 0 и абсолютное позиционирование — тогда стрелки и Tab работают.

Правильная разметка

CODE
<label class="opt">
  <input type="radio" name="plan" value="base">
  <span>Базовый</span>
</label>

Важно: label оборачивает input — тогда клик по тексту тоже выбирает вариант. У группы радиокнопок одинаковое name, тогда выбор будет взаимоисключающим.

Частые ошибки: причина → решение

Симптом Причина Решение
Клик по тексту не работает нет связи label и input обернуть или использовать for
Не выбирается с клавиатуры input скрыт через display: none скрывать через opacity: 0
Стиль не применяется правила на ::before у input рисовать у соседнего элемента
Можно выбрать несколько разные name дать одинаковое name

Проверьте себя

Чек-лист




Как правильно скрыть нативный input, сохранив доступность?




Что самое быстрое для перекраски радиокнопки?




Вопросы и ответы

Одинаковое name объединяет их в группу: выбрать можно только один вариант. Разные name — независимые переключатели.

Radio — выбор одного из нескольких. Checkbox — независимые галочки, можно отметить несколько. Оформляют их схожими приёмами.

Да, при своей стилизации уберите border-radius: 50%. Но учтите: пользователи привыкли к круглой форме, это снижает узнаваемость.

Через input:focus-visible + span задайте обводку или тень. Это важно для навигации с клавиатуры.

Итоги

  • Нативный radio стилизуется плохо; база — appearance: none.
  • Быстрый путь — accent-color, гибкий — свой вид через ::before.
  • Скрывайте input через opacity: 0, а не display: none.
  • Связь label + input обязательна для клика и доступности.
Поделиться: ВКонтакте Telegram WhatsApp Одноклассники Viber Мой Мир

Комментарии

Пока комментариев нет — будьте первым, кто поделится мнением.

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Получите консультацию нашего маркетолога

Изучит ваш проект, подберет подходящие услуги и тарифы

Получите бесплатный аудит

Наш специалист сделает базовый аудит вашего проекта и предложит персональные предложения.

Закажите услугу Каталог морепродуктов

Наш специалист свяжется с вами в ближайшее время и уточнит детали

Закажите адаптивный сайт

Наш специалист поможет составить Вам техническое задание на разработку сайта

Закажите сайт

Наш специалист поможет составить Вам техническое задание на разработку сайта

Закажите сайт лендинг

Наш специалист поможет составить Вам техническое задание на разработку сайта

Закажите сайт каталог

Наш специалист поможет составить Вам техническое задание на разработку сайта

Закажите интернет-магазин

Наш специалист поможет составить Вам техническое задание на разработку сайта

Закажите веб-приложение

Наш специалист поможет составить Вам техническое задание на разработку сайта

Закажите тариф Аутсорс

Стоимость от 150 000 ₽

Закажите тариф Магазин

Стоимость 90 000 ₽

Закажите тариф Классический

Стоимость 60 000 ₽

Закажите тариф Эконом

Стоимость 40 000 ₽

Закажите SEO продвижение

Наш специалист свяжется с вами, проведет анализ, предложит стоимость