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

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

JamieD
источник
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.

Klewis
источник
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>

Вадим Овчинников
источник
10

вы можете использовать взломанный флажок, как описано в трюках css

http://css-tricks.com/the-checkbox-hack/

рабочий пример радиокнопки:

http://codepen.io/Angelata/pen/Eypnq

input[type=radio]:checked ~ .check {}
input[type=radio]:checked ~ .check .inside{}

Работает в IE9 +, Firefox 3.5+, Safari 1.3+, Opera 6+, Chrome что угодно.

Амит Чукроун
источник
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). Используя их сочетание, мы можем создать несколько довольно крутых пользовательских форм. Проверь это

GkDreamz
источник
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

Froschkoenig84
источник
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

Может быть полезно привязать переключатель к стилизованной метке. Более подробная информация в этом ответе .

Snowerest
источник
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;
}
Авинаш Агарвал
источник