Como altero a cor dos botões de opção?

104

Quer dizer, um botão de opção em si consiste em uma forma redonda e um ponto no centro (quando o botão é selecionado). O que eu quero mudar é a cor de ambos. Isso pode ser feito usando CSS?

gato e rato
fonte

Respostas:

67

Um botão de opção é um elemento nativo específico para cada sistema operacional / navegador. Não há como alterar sua cor / estilo, a menos que você queira implementar imagens personalizadas ou usar uma biblioteca Javascript personalizada que inclui imagens (por exemplo, isto - link em cache )

Fred
fonte
Eu acredito que sim. Nenhum navegador que eu conheça apresenta uma maneira de configurar a aparência dos botões de opção, você terá que usar uma biblioteca JS para fazer isso.
Fred
Ou use css, mas você precisa da imagem como você disse. Isso é um pouco estranho
AturSams
1
Post 8/1/2014: Este método irá agora desativar e remover o campo de entrada dos dados do formulário enviado. É em resposta ao abuso de empresas que colocaram caixas de seleção fora da vista, que declararam que seus usuários concordaram com a permissão e os regulamentos que os visitantes não puderam avaliar antes de prosseguir. Se o botão literal não for exibido na tela, ele é considerado 'desativado'
ppostma1
2
Leia minha resposta abaixo para uma solução moderna usando CSS.
klewis
'este' link está em 404 no momento. Se voltar, avise-nos!
markreyes
103

Uma solução rápida seria sobrepor o estilo de entrada do botão de opção usando :after, no entanto, é provavelmente uma prática melhor criar seu próprio kit de ferramentas personalizado.

    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
fonte
2
Isto funcionou bem para mim. Ótima solução quando você não deseja adicionar nenhum elemento extra ou usar imagens.
Swen
2
Em geral, os navegadores aceitam o estilo ": após" apenas para elementos de contêiner - conforme definido no W3C. A entrada não é um contêiner e, portanto, geralmente não oferece suporte após estilização. w3.org/TR/CSS2/generate.html#before-after-content
Ina
Basta inserir um carimbo de data / hora para reforçar as observações anteriores - ele ainda funciona apenas no Chrome (60.0.3112.90). Eu tentei no Microsoft Edge (38.14393.1066.0) e Firefox (54.0.1, 32 bits), mas sem dados.
markreyes
1
Atualização de @markreyes: funciona no Chrome (64 bits 73.0.3683.75), funciona um pouco no Safari (12.0.3) e não funciona no Firefox (64 bits 65.0.1) em 15 de março de 2019.
jarhill0
37

Como Fred mencionou, não há como definir o estilo nativo dos botões de opção em relação à cor, tamanho etc. Mas você pode usar Pseudoelementos CSS para configurar um impostor de qualquer botão de opção e estilizá-lo. Tocando no que JamieD disse, em como podemos usar o elemento: after Pseudo, você pode usar ambos: before e: after para obter uma aparência desejável.

Benefícios desta abordagem:

  • Defina o estilo de seu botão de opção e também inclua um rótulo para o conteúdo.
  • Altere a cor da borda externa e / ou o círculo marcado para qualquer cor de sua preferência.
  • Dê a ele uma aparência transparente com modificações na propriedade de cor de fundo e / ou uso opcional da propriedade opacity.
  • Dimensione o tamanho do seu botão de opção.
  • Adicione várias propriedades de sombra projetada, como a inserção de sombra projetada CSS quando necessário.
  • Combine este truque simples de CSS / HTML em vários sistemas Grid, como o Bootstrap 3.3.6, para que corresponda visualmente ao restante dos componentes do Bootstrap.

Explicação da breve demonstração abaixo:

  • Configure um bloco em linha relativo para cada botão de opção
  • Oculte o sentido do botão de opção nativo - não há como estilizá-lo diretamente.
  • Estilize e alinhe o rótulo
  • Reconstruir o conteúdo CSS no: before Pseudo-elemento para fazer 2 coisas - estilizar a borda externa do botão de opção e definir o elemento para aparecer primeiro (à esquerda do conteúdo do rótulo). Você pode aprender as etapas básicas sobre Pseudo-elementos aqui - http://www.w3schools.com/css/css_pseudo_elements.asp
  • Se o botão de opção estiver marcado, solicite um rótulo para exibir o conteúdo CSS (o ponto estilizado no botão de opção) posteriormente.

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

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

Uma breve demonstração para vê-lo em ação

Em conclusão, nenhum JavaScript, imagens ou baterias necessárias. CSS puro.

Klewis
fonte
1
Essa técnica funcionou para mim no Chrome (60.0.3112.90). Eu tentei no Microsoft Edge (38.14393.1066.0) e no Firefox (54.0.1, 32 bits) também.
markreyes de
1
Funciona para mim no Safari 11.1 (mais recente).
staxim de
33

Somente se você estiver almejando navegadores baseados em webkit (Chrome e Safari, talvez você esteja desenvolvendo um Chrome WebApp, quem sabe ...), você pode usar o seguinte:

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

E, em seguida, estilize-o como se fosse um elemento HTML simples, por exemplo, aplicando uma imagem de fundo.

Use input[type='radio']:activepara quando a entrada for selecionada, para fornecer os gráficos alternativos

Atualização : a partir de 2018, você pode adicionar o seguinte para oferecer suporte a vários fornecedores de navegadores:

input[type="radio"] {
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
}
Omiod
fonte
1
a aparência é rotulada como uma tecnologia experimental: developer.mozilla.org/en-US/docs/Web/CSS/appearance
HBCondo
1
Funcionou como um encanto!
Supercool.
Em vez de usar :active, você deve usar :checkedpara diferenciar o estilo entre os botões de opção 'selecionados'.
Daan
15

Você pode obter botões de opção personalizados de duas maneiras CSS puras

  1. Removendo a aparência padrão usando CSS appearancee aplicando a aparência personalizada. Infelizmente, isso não funciona no IE para Desktop (mas funciona no IE para Windows Phone). Demo:

    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. Através da ocultação do botão de opção e da configuração da aparência do botão de opção personalizado para labelo pseudo-seletor de. A propósito, não há necessidade de posicionamento absoluto aqui (vejo posicionamento absoluto na maioria das demos). Demo:

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

Vadim Ovchinnikov
fonte
10

você pode usar o hack da caixa de seleção conforme explicado em truques de CSS

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

exemplo funcional do botão de rádio:

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

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

Funciona no IE9 +, Firefox 3.5+, Safari 1.3+, Opera 6+, Chrome qualquer.

Amit Choukroun
fonte
5

exemplo de botão de rádio personalizado simples em qualquer navegador para você

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

Kuzroman
fonte
Isso não está funcionando para bootstrap, por favor, atualize com bootstrap
Krishna Jonnalagadda
4

Bem, para criar elementos extras, podemos usar: after,: before (então não precisamos mudar muito o HTML). Então, para botões de opção e caixas de seleção, podemos usar: verificado. Existem alguns outros pseudo-elementos que também podemos usar (como: hover). Usando uma mistura desses, podemos criar alguns formulários personalizados muito legais. verifique isso

GkDreamz
fonte
2

Experimente este css com transição:

insira a descrição da imagem aqui

Demo

$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>
Ahmad Aghazadeh
fonte
2

Eu construí outra bifurcação do exemplo de código de @klewis para demonstrar alguns jogos com css puro e gradientes usando: before /: after pseudoelementos e um botão de entrada de rádio oculto.

insira a descrição da imagem aqui

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

visualização: https://www.codeply.com/p/y47T4ylfib

Froschkoenig84
fonte
1

Isso não é possível por CSS nativo. Você terá que usar imagens de fundo e alguns truques de javascript.

Joni
fonte
1

Como já foi dito, não há como fazer isso em todos os navegadores, então a melhor maneira de fazer isso no crossbrowser é usando javascript discretamente. Basicamente, você tem que transformar seu botão de rádio em links (totalmente personalizáveis ​​via CSS). cada clique no link será vinculado à caixa de rádio relacionada, alternando seu estado e todos os outros.


fonte
0

Pode ser útil vincular o botão de opção a uma etiqueta estilizada. Mais detalhes nesta resposta .

mais snower
fonte
0

Uma maneira inteligente de fazer isso seria criar um div separado com uma altura e largura de -por exemplo- 50px e um raio de 50px sobre seus botões de opção ...

Zeusox
fonte
0

Você pode incorporar um elemento span na entrada de rádio e então selecionar uma cor de sua escolha para ser renderizada quando uma entrada de rádio for marcada. Confira o exemplo abaixo fornecido por 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>

Alterar a cor de fundo neste segmento de código abaixo resolve.

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

Originado de como criar um botão de opção personalizado

Raymond Wachaga
fonte
-1

Uma solução simples seria usar a seguinte propriedade CSS.

input[type=radio]:checked{
    background: \*colour*\;
    border-radius: 15px;
    border: 4px solid #dfdfdf;
}
Avinash Agarwal
fonte