Respostas:
Se algo acontecer em qualquer navegador, eu ficaria surpreso. Esse é um desses elementos de formulário pendentes que os navegadores tendem a não deixar você estilizar tanto, e que as pessoas geralmente tentam substituir por javascript para que possam estilizar / codificar algo para parecer e agir como uma caixa de seleção.
Eu sugiro usar "estrutura de tópicos" em vez de "borda". Por exemplo: outline: 1px solid #1e5180
.
!important
ao seu css ao usar o contorno. Eu estava testando isso no Firefox 12.0 e, sem! Importante, o esquema desapareceria enquanto eu estivesse clicando na caixa de seleção.
Você deveria usar
-moz-appearance:none;
-webkit-appearance:none;
-o-appearance:none;
Então você se livra da imagem / estilo padrão da caixa de seleção e pode estilizá-la. De qualquer forma, uma fronteira ainda estará lá no Firefox
Você pode usar sombras de caixa para falsificar uma borda:
-webkit-box-shadow: 0px 0px 0px 1px rgba(255,0,0,1);
-moz-box-shadow: 0px 0px 0px 1px rgba(255,0,0,1);
box-shadow: 0px 0px 0px 1px rgba(255,0,0,1);
Aqui está uma solução CSS simples (sem imagens) para vários navegadores, baseada nas caixas de seleção e botões de opção personalizados da Martin com o CSS3 LINK: http://martinivanov.net/2012/12/21/imageless-custom-checkboxes-and-radio-buttons -with-css3-revisited /
Aqui está um jsFiddle: http://jsfiddle.net/DJRavine/od26wL6n/
Eu testei isso nos seguintes navegadores:
label,
input[type="radio"] + span,
input[type="radio"] + span::before,
label,
input[type="checkbox"] + span,
input[type="checkbox"] + span::before
{
display: inline-block;
vertical-align: middle;
}
label *,
label *
{
cursor: pointer;
}
input[type="radio"],
input[type="checkbox"]
{
opacity: 0;
position: absolute;
}
input[type="radio"] + span,
input[type="checkbox"] + span
{
font: normal 11px/14px Arial, Sans-serif;
color: #333;
}
label:hover span::before,
label:hover span::before
{
-moz-box-shadow: 0 0 2px #ccc;
-webkit-box-shadow: 0 0 2px #ccc;
box-shadow: 0 0 2px #ccc;
}
label:hover span,
label:hover span
{
color: #000;
}
input[type="radio"] + span::before,
input[type="checkbox"] + span::before
{
content: "";
width: 12px;
height: 12px;
margin: 0 4px 0 0;
border: solid 1px #a8a8a8;
line-height: 14px;
text-align: center;
-moz-border-radius: 100%;
-webkit-border-radius: 100%;
border-radius: 100%;
background: #f6f6f6;
background: -moz-radial-gradient(#f6f6f6, #dfdfdf);
background: -webkit-radial-gradient(#f6f6f6, #dfdfdf);
background: -ms-radial-gradient(#f6f6f6, #dfdfdf);
background: -o-radial-gradient(#f6f6f6, #dfdfdf);
background: radial-gradient(#f6f6f6, #dfdfdf);
}
input[type="radio"]:checked + span::before,
input[type="checkbox"]:checked + span::before
{
color: #666;
}
input[type="radio"]:disabled + span,
input[type="checkbox"]:disabled + span
{
cursor: default;
-moz-opacity: .4;
-webkit-opacity: .4;
opacity: .4;
}
input[type="checkbox"] + span::before
{
-moz-border-radius: 2px;
-webkit-border-radius: 2px;
border-radius: 2px;
}
input[type="radio"]:checked + span::before
{
content: "\2022";
font-size: 30px;
margin-top: -1px;
}
input[type="checkbox"]:checked + span::before
{
content: "\2714";
font-size: 12px;
}
input[class="blue"] + span::before
{
border: solid 1px blue;
background: #B2DBFF;
background: -moz-radial-gradient(#B2DBFF, #dfdfdf);
background: -webkit-radial-gradient(#B2DBFF, #dfdfdf);
background: -ms-radial-gradient(#B2DBFF, #dfdfdf);
background: -o-radial-gradient(#B2DBFF, #dfdfdf);
background: radial-gradient(#B2DBFF, #dfdfdf);
}
input[class="blue"]:checked + span::before
{
color: darkblue;
}
input[class="red"] + span::before
{
border: solid 1px red;
background: #FF9593;
background: -moz-radial-gradient(#FF9593, #dfdfdf);
background: -webkit-radial-gradient(#FF9593, #dfdfdf);
background: -ms-radial-gradient(#FF9593, #dfdfdf);
background: -o-radial-gradient(#FF9593, #dfdfdf);
background: radial-gradient(#FF9593, #dfdfdf);
}
input[class="red"]:checked + span::before
{
color: darkred;
}
<label><input type="radio" checked="checked" name="radios-01" /><span>checked radio button</span></label>
<label><input type="radio" name="radios-01" /><span>unchecked radio button</span></label>
<label><input type="radio" name="radios-01" disabled="disabled" /><span>disabled radio button</span></label>
<br/>
<label><input type="radio" checked="checked" name="radios-02" class="blue" /><span>checked radio button</span></label>
<label><input type="radio" name="radios-02" class="blue" /><span>unchecked radio button</span></label>
<label><input type="radio" name="radios-02" disabled="disabled" class="blue" /><span>disabled radio button</span></label>
<br/>
<label><input type="radio" checked="checked" name="radios-03" class="red" /><span>checked radio button</span></label>
<label><input type="radio" name="radios-03" class="red" /><span>unchecked radio button</span></label>
<label><input type="radio" name="radios-03" disabled="disabled" class="red" /><span>disabled radio button</span></label>
<br/>
<label><input type="checkbox" checked="checked" name="checkbox-01" /><span>selected checkbox</span></label>
<label><input type="checkbox" name="checkbox-02" /><span>unselected checkbox</span></label>
<label><input type="checkbox" name="checkbox-03" disabled="disabled" /><span>disabled checkbox</span></label>
<br/>
<label><input type="checkbox" checked="checked" name="checkbox-01" class="blue" /><span>selected checkbox</span></label>
<label><input type="checkbox" name="checkbox-02" class="blue" /><span>unselected checkbox</span></label>
<label><input type="checkbox" name="checkbox-03" disabled="disabled" class="blue" /><span>disabled checkbox</span></label>
<br/>
<label><input type="checkbox" checked="checked" name="checkbox-01" class="red" /><span>selected checkbox</span></label>
<label><input type="checkbox" name="checkbox-02" class="red" /><span>unselected checkbox</span></label>
<label><input type="checkbox" name="checkbox-03" disabled="disabled" class="red" /><span>disabled checkbox</span></label>
Estou desatualizado, eu sei .. Mas uma solução alternativa seria colocar sua caixa de seleção dentro de uma etiqueta de rótulo e, em seguida, estilizar o rótulo com uma borda:
<label class='hasborder'><input type='checkbox' /></label>
estilize o rótulo:
.hasborder { border:1px solid #F00; }
label { position: relative; overflow: hidden; width: 16px; height: 16px; border: 1px solid #0f0; }
e depois label > input[type=checkbox] { position: absolute; left: -999px; }
Isso permitirá que você costume estilo seu próprio caixa e a caixa original ainda vai ficar marcada / desmarcada mas o usuário não vai vê-lo. Eles verão apenas sua caixa de seleção personalizada.
:hover
e :checked
estilizar outros estados da sua caixa de seleção personalizada.
Aqui está minha versão que usa FontAwesome para ticker de caixa de seleção, acho que FontAwesome é usado por quase todo mundo, por isso é seguro supor que você também o tenha. Não testado no IE / Edge e acho que ninguém se importa.
input[type=checkbox] {
-moz-appearance:none;
-webkit-appearance:none;
-o-appearance:none;
outline: none;
content: none;
}
input[type=checkbox]:before {
font-family: "FontAwesome";
content: "\f00c";
font-size: 15px;
color: transparent !important;
background: #fef2e0;
display: block;
width: 15px;
height: 15px;
border: 1px solid black;
margin-right: 7px;
}
input[type=checkbox]:checked:before {
color: black !important;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css" rel="stylesheet"/>
<input type="checkbox">
Para Firefox , Chrome e Safari , nada acontece.
Para o IE a borda é aplicada fora da caixa de seleção (não como parte da caixa de seleção) e o efeito de sombreamento "sofisticado" na caixa de seleção desaparece (exibido como uma caixa de seleção à moda antiga).
Para o Opera, o estilo da borda está realmente aplicando a borda no elemento da caixa de seleção.
O Opera também lida com outros estilos na caixa de seleção melhor do que em outros navegadores: a cor é aplicada como a cor do carrapato, a cor de fundo é aplicada como a cor de fundo dentro da caixa de seleção (o IE aplica o fundo como se a caixa de seleção estivesse dentro de um<div>
com fundo)) .
A solução mais fácil é embrulhar a caixa de seleção <div>
como sugerem outros.
Se você deseja controlar completamente a aparência, precisará seguir a abordagem avançada de imagem / javascript, também utilizada por outras pessoas.
Caixas de seleção de estilo (e muitos outros elementos de entrada para essa matéria) não são realmente possíveis com CSS puro, se você quiser alterar drasticamente a aparência visual.
Sua melhor aposta é implementar algo como jqTransform , que na verdade substitui as entradas por imagens e aplica o comportamento javascript para simular uma caixa de seleção (ou outro elemento)
Não, você ainda não pode estilizar a caixa de seleção em si, mas (finalmente) descobri como estilizar uma ilusão, mantendo a funcionalidade de clicar em uma caixa de seleção. Isso significa que você pode alterná-lo, mesmo que o cursor não esteja perfeitamente imóvel, sem correr o risco de selecionar o texto ou acionar o recurso de arrastar e soltar!
O exemplo está usando um "botão" de extensão, além de algum texto em um rótulo, mas fornece a idéia de como você pode tornar a caixa de seleção invisível e desenhar qualquer coisa por trás dela.
Essa solução provavelmente também se encaixa em botões de opção.
O seguinte funciona no IE9, FF30.0 e Chrome 40.0.2214.91 e é apenas um exemplo básico. Você ainda pode usá-lo em combinação com imagens de fundo e pseudoelementos.
http://jsfiddle.net/o0xo13yL/1/
label {
display: inline-block;
position: relative; /* needed for checkbox absolute positioning */
background-color: #eee;
padding: .5rem;
border: 1px solid #000;
border-radius: .375rem;
font-family: "Courier New";
font-size: 1rem;
line-height: 1rem;
}
label > input[type="checkbox"] {
display: block;
position: absolute; /* remove it from the flow */
width: 100%;
height: 100%;
margin: -.5rem; /* negative the padding of label to cover the "button" */
cursor: pointer;
opacity: 0; /* make it transparent */
z-index: 666; /* place it on top of everything else */
}
label > input[type="checkbox"] + span {
display: inline-block;
width: 1rem;
height: 1rem;
border: 1px solid #000;
margin-right: .5rem;
}
label > input[type="checkbox"]:checked + span {
background-color: #666;
}
<label>
<input type="checkbox" />
<span> </span>Label text
</label>
Aqui está uma maneira simples (usar antes ou depois dos pseudo elementos / classes):
input[type=checkbox] {
position: relative;
}
input[type=checkbox]:after {
position: absolute;
top: 0;
left: 0;
/* Above three lines allow the checkbox:after position at checkbox's position */
content: '';
width: 32px;
height: 32px;
z-index: 1; /* This allows the after overlap the checkbox */
/* Anything you want */
}
<!DOCTYPE html>
<html>
<head>
<style>
.abc123
{
-webkit-appearance:none;
width: 14px;
height: 14px;
display: inline-block;
background: #FFFFFF;
border: 1px solid rgba(220,220,225,1);
}
.abc123:after {
content: "";
display: inline-block;
position: relative;
top: -3px;
left: 4px;
width: 3px;
height: 5px;
border-bottom: 1px solid #fff;
border-right: 1px solid #fff;
-webkit-transform: rotate(45deg);
}
input[type=checkbox]:checked {
background: #327DFF;
outline: none;
border: 1px solid rgba(50,125,255,1);
}
input:focus,input:active {
outline: none;
}
input:hover {
border: 1px solid rgba(50,125,255,1);
}
</style>
</head>
<body>
<input class="abc123" type="checkbox"></input>
</body>
</html>
coloque-o em uma div e adicione borda à div