Блог

css Кастомный input radio
16 марта 2024 г.

Кастомный input radio

html css

HTML - код выглядит следующим образом.

HTML

<div class="radio">
  <label class="control">
    <input type="radio" name="radio" checked="checked">
    <div class="control_indicator"></div>
    Checked
  </label>
  <label class="control">
    <input type="radio" name="radio">
    <div class="control_indicator"></div>
    No checked
  </label>
  <label class="control">
    <input type="radio" name="radio">
    <div class="control_indicator"></div>
    No checked
  </label>
  <label class="control">
    <input type="radio" name="radio" disabled="disabled">
    <div class="control_indicator"></div>
    Disabled
  </label>
</div>

О чем этот код?

radio - общий контейнер для input radio;
label class="control" - контейнер для input и всего содержимого. Важно чтобы тег был <label>, иначе клик не сработает;
input type="radio" - сам input для передачи состояния, но сам по себе он скрыт;
control_indicator - блок для отрисовки input radio и нужных состояний;
Checked - любой текст.

SCSS

$gray: #ccc;

html, body {
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
}

.radio {
  
  .control {
    font: 20px/20px 'Verdana';
    display: flex;
    align-items: center;
    margin-bottom: 20px;
    cursor: pointer;

    input {
      position: absolute;
      z-index: -1;
      opacity: 0;

      &:checked {

        & ~ .control_indicator {
          border-color: $gray;

          &:after {
            display: block;
          }
        }
      }

      &:disabled {

        & ~ .control_indicator {
          background: transparent;
          opacity: .4;
          pointer-events: none;

          &:after {
            background: transparent;
          }
        }
      }
    }

    &_indicator {
      height: 20px;
      width: 20px;
      border-radius: 50%;
      position: relative;
      margin-right: 12px;
      border: 2px solid $gray;

      &:after {
        box-sizing: unset;
        content: '';
        position: absolute;
        display: none;
        left: 4px;
        top: 4px;
        height: 12px;
        width: 12px;
        border-radius: 50%;
        background: $gray;
      }
    }

    &:hover {

      .control_indicator {

        &:after {
          display: block;
        }
      }
    }
  }
}

Демонстрация