Как изменить цвет переключателей?


110

Я имею в виду, что сам переключатель состоит из круглой формы и точки в центре (когда кнопка выбрана). Я хочу изменить цвет обоих. Можно ли это сделать с помощью CSS?

Ответы:


71

Радиокнопка - это собственный элемент, специфичный для каждой ОС / браузера. Невозможно изменить его цвет / стиль, если вы не хотите реализовать пользовательские изображения или использовать пользовательскую библиотеку Javascript, которая включает изображения (например, эта - кешированная ссылка )


Я так считаю. Ни один из известных мне браузеров не предоставляет способ настройки внешнего вида переключателей, для этого вам придется использовать библиотеку JS.
— Фред

Или используйте css, но вам нужно изображение, как вы сказали. Это немного странно
— AturSams 06

1
Сообщение 1/8/2014: этот метод теперь отключит и удалит поле ввода из отправленных данных формы. Это в ответ на злоупотребления со стороны компаний, которые разместили флажки вне поля зрения, заявив, что их пользователи согласны с разрешениями и правилами, которые посетители не могли оценить, прежде чем продолжить. Если буквенная кнопка не отображается на экране, она считается «отключенной»
— ppostma1

2
Прочтите мой ответ ниже, чтобы узнать о современном решении с использованием CSS.
— klewis

Ссылка "эта" в настоящее время находится в состоянии 404. Если он когда-нибудь вернется, дайте нам знать!
— markreyes

104

Быстрое исправление - наложение стиля ввода с помощью переключателя :after, однако, вероятно, лучше создать свой собственный набор инструментов.

    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"/>


2
У меня это сработало. Отличное решение, если вы не хотите добавлять лишние элементы или использовать изображения.
— Swen

2
Как правило, браузеры принимают стиль ": after" только для элементов контейнера - как определено в W3C. Входные данные не являются контейнером и, следовательно, обычно не поддерживаются после стилизации. w3.org/TR/CSS2/generate.html#before-after-content
— Ина,

Просто вставьте метку времени, чтобы применить предыдущие наблюдения - она ​​все еще работает только в Chrome (60.0.3112.90). Я пробовал его на Microsoft Edge (38.14393.1066.0) и Firefox (54.0.1, 32-разрядная версия), но без кубиков.
— markreyes

1
Обновление из @markreyes: работает в Chrome (64-разрядная версия 73.0.3683.75), частично работает в Safari (12.0.3) и не работает в Firefox (64-разрядная версия 65.0.1) 15 марта 2019 г.
— jarhill0

38

Как упоминал Фред, нет возможности настроить переключатели по умолчанию в отношении цвета, размера и т. Д. Но вы можете использовать псевдоэлементы CSS, чтобы настроить самозванец для любого заданного переключателя и стилизовать его. Касаясь того, что сказал JamieD, о том, как мы можем использовать псевдоэлемент: after, вы можете использовать как: before, так и: after для достижения желаемого вида.

Преимущества такого подхода:

  • Создайте стиль радиокнопки, а также добавьте метку для содержимого.
  • Измените цвет внешнего обода и / или отмеченный кружок на любой цвет, который вам нравится.
  • Придайте ему прозрачный вид, изменив свойство цвета фона и / или опционально используя свойство непрозрачности.
  • Измените размер переключателя.
  • При необходимости добавьте различные свойства тени, например вставку тени CSS.
  • Смешайте этот простой трюк CSS / HTML с различными сетками, такими как Bootstrap 3.3.6, чтобы он визуально соответствовал остальным вашим компонентам Bootstrap.

Пояснение к короткой демонстрации ниже:

  • Установите относительный встроенный блок для каждого переключателя
  • Скрыть родное ощущение переключателя, нет возможности напрямую его стилизовать.
  • Стиль и выравнивание метки
  • Перестройка содержимого CSS на псевдоэлементе: before для выполнения двух действий - стилизации внешнего края переключателя и установки элемента, который будет отображаться первым (слева от содержимого метки). Вы можете узнать основные шаги по псевдоэлементам здесь - http://www.w3schools.com/css/css_pseudo_elements.asp
  • Если этот переключатель установлен, после этого запросите метку для отображения содержимого CSS (стилизованная точка в переключателе).

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;
}

Короткий демо чтобы увидеть это в действии

В заключение, никаких JavaScript, изображений или батарей не требуется. Чистый CSS.


1
Этот метод работал у меня в Chrome (60.0.3112.90). Я пробовал его в Microsoft Edge (38.14393.1066.0) и Firefox (54.0.1, 32-разрядная версия).
— markreyes

1
У меня работает в Safari 11.1 (последняя версия).
— staxim

34

Только если вы ориентируетесь на браузеры на основе webkit (Chrome и Safari, возможно, вы разрабатываете Chrome WebApp, кто знает ...), вы можете использовать следующее:

input[type='radio'] {
   -webkit-appearance: none;
}

А затем стилизуйте его, как если бы это был простой элемент HTML, например, применив фоновое изображение.

Использовать input[type='radio']:active когда выбран вход, чтобы предоставить альтернативную графику

Обновление : с 2018 года вы можете добавить следующее для поддержки нескольких поставщиков браузеров:

input[type="radio"] {
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
}

1
внешний вид обозначен как экспериментальная технология: developer.mozilla.org/en-US/docs/Web/CSS/appearance
— HBCondo

1
Работал как шарм!
— Супер круто.

Вместо использования :activeвы должны использовать, :checkedчтобы различать стили между «выбранными» переключателями.
— Даан

17

Вы можете настроить переключатели двумя способами на чистом CSS.

  1. Путем удаления стандартного внешнего вида с помощью CSS appearanceи применения настраиваемого внешнего вида. К сожалению, это не работает в IE для рабочего стола (но работает в IE для Windows Phone). Демо:

    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>

  2. С помощью скрытия радиокнопки и установки пользовательского внешнего вида радиокнопки на labelпсевдоселектор. Кстати, здесь нет необходимости в абсолютном позиционировании (я вижу абсолютное позиционирование в большинстве демонстраций). Демо:

    *,
    *: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>



5

простой пример настраиваемой кнопки переключения браузера для вас

.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>

https://jsfiddle.net/kuzroman/ae1b34ay/


Это не работает для начальной загрузки,
— пожалуйста,

4

Что ж, для создания дополнительных элементов мы можем использовать: after,: before (так что нам не нужно так сильно менять HTML). Затем для переключателей и флажков мы можем использовать: checked. Мы также можем использовать несколько других псевдоэлементов (например: hover). Используя их сочетание, мы можем создать несколько довольно крутых пользовательских форм. Проверь это


3

Я создал еще один форк образца кода @ klewis , чтобы продемонстрировать некоторую игру с чистым CSS и градиентами, используя псевдоэлементы : before /: after и скрытую кнопку радио ввода.

введите описание изображения здесь

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;
}

предварительный просмотр: https://www.codeply.com/p/y47T4ylfib


2

Попробуйте этот css с переходом:

введите описание изображения здесь

Демо

$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>

1

Это невозможно с помощью собственного CSS. Вам придется использовать фоновые изображения и некоторые трюки с javascript.


1

Как уже говорилось, невозможно добиться этого во всех браузерах, поэтому лучший способ сделать это в кроссбраузере - ненавязчиво использовать javascript. По сути, вам нужно превратить радиокнопку в ссылки (полностью настраиваемые с помощью CSS). каждый щелчок по ссылке будет привязан к соответствующему радиобоксу, переключая его состояние и все остальные.



0

Умный способ сделать это - создать отдельный div с высотой и шириной, например, 50 пикселей, а затем с радиусом 50 пикселей разместить его над вашими переключателями ...


0

Вы можете встроить элемент span в радио-вход, а затем выбрать цвет по вашему выбору, который будет отображаться, когда радио-вход отмечен. Взгляните на приведенный ниже пример, полученный от 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>

Изменение цвета фона в этом фрагменте кода ниже помогает.

/* When the radio button is checked, add a blue background */
.container input:checked ~ .checkmark {
  background-color: #00a80e;
}

Источник из того, как создать настраиваемый переключатель


-1

Простое исправление - использовать следующее свойство CSS.

input[type=radio]:checked{
    background: \*colour*\;
    border-radius: 15px;
    border: 4px solid #dfdfdf;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.