Posso alterar o tamanho da caixa de seleção usando CSS?


459

É possível definir o tamanho de uma caixa de seleção usando CSS ou HTML nos navegadores?

widthe sizetrabalhe no IE6 +, mas não no Firefox, onde a caixa de seleção fica 16x16, mesmo que eu defina um tamanho menor.


3
Isso é difícil de executar em vários navegadores. Roger Johansson investigou isso bastante extensivamente.
Cristian Libardo

Lendo todos os comentários - existe uma maneira muito simples de fazer isso sem envolver CSS: <input type = "checkbox" name = "checkboxName" value = "on" style = "width: 110%; height: 110%">
Williamz902


@ Williamz902 a style=tag é CSS ...
Tiebe Groosman

Respostas:


434

É um pouco feio (devido à expansão), mas funciona na maioria dos navegadores mais recentes:

input[type=checkbox]
{
  /* Double-sized Checkboxes */
  -ms-transform: scale(2); /* IE */
  -moz-transform: scale(2); /* FF */
  -webkit-transform: scale(2); /* Safari and Chrome */
  -o-transform: scale(2); /* Opera */
  transform: scale(2);
  padding: 10px;
}

/* Might want to wrap a span around your checkbox text */
.checkboxtext
{
  /* Checkbox text */
  font-size: 110%;
  display: inline;
}
<input  type="checkbox" name="optiona" id="opta" checked />
<span class="checkboxtext">
  Option A
</span>
<input type="checkbox" name="optionb" id="optb" />
<span class="checkboxtext">
  Option B
</span>
<input type="checkbox" name="optionc" id="optc" />
<span class="checkboxtext">
  Option C
</span>


3
esta parece ser a resposta correta, pois a que está marcada como resposta não oferece soluções em muitos casos (nenhuma solução para o firefox no xp? nenhum chrome?), está desatualizada e contém apenas um link e um comentário de pouco valor.
Nurettin

4
@jdw +1 para esta resposta e até eu tive a necessidade de fazer isso e sua resposta foi útil. Mas, de alguma forma, acho que a caixa de seleção 'redimensionada' aparece um pouco distorcida. Não sei se isso é uma coisa do FF ou do meu sistema operacional (Ubuntu 12.04). Obrigado mesmo assim :)
itsols

1
a scale () precisa de 2 parâmetros para chrome, FF e IE, eu acho. Portanto, se você mudar todas as escalas para a escala (2,2), ele deverá funcionar em todos os navegadores.
Onur Topal

10
adicione transform: scale(2);também, para garantir mais por qualquer navegador
Adriano Resende

8
a escala parece horrível, na escala 2 você já vê os pixels individuais. Eu nunca escolheria esta solução para belas caixas de seleção de css grandes.
precisa saber é o seguinte

369

Solução de trabalho para todos os navegadores modernos.

input[type=checkbox] {
    transform: scale(1.5);
}
<label><input type="checkbox"> Test</label>


Compatibilidade:

  • IE: 10+
  • FF: 16+
  • Chrome: mais de 36
  • Safari: 9+
  • Opera: 23+
  • iOS Safari: 9.2 ou superior
  • Chrome para Android: mais de 51

Aparência:

  • Caixas de seleção em escala no Chrome, Win 10 Chrome 58 (maio de 2017), Windows 10

Isso cobre navegadores mais antigos como o 8?
Huangism

1
@ Huangismo Não, o código acima não terá nenhum efeito no IE 8, que não suporta a transformpropriedade. O IE 9 suporta os -ms-transformquais você pode usar, no entanto, alguns dizem que é bastante pixelizado; portanto, é melhor deixar o IE 9 com o padrão.
Simon East

A abordagem acima não é ruim, porque há um limite de escala, pois faz com que a caixa de seleção seja pixelizada.
rishiAgar

9
Extremamente pixelizada no Chrome 64 com o macOS 10.13.3 :( timo-ernst.net/misc/zeug/cb-pixel.jpg
Timo

Ainda pixelizado no Chrome 76.
Labrador

68

Uma solução fácil é usar a propriedade zoom:

input[type="checkbox"] {
    zoom: 1.5;
}
<input type="checkbox" />


8
Não tenho certeza de que funciona em todos os navegadores, mas parece mais bonito na tela do que a solução de transformação de escala.
Gwened

2
No Chrome 64 com MacOS 10.13.3 isso parece maneira menos pixelizada do que usar transformar + escala
Timo


É meio interessante que a Mozilla o desanime, enquanto o Firefox é quase o único navegador que não suporta: caniuse.com/#feat=css-zoom
ndreisg

47

Versão 2020 - usando pseudoelementos, o tamanho depende do tamanho da fonte.

A caixa de seleção / rádio padrão é renderizada fora da tela, mas o CSS cria elementos virtuais muito semelhantes aos elementos padrão. Suporta todos os navegadores, sem desfoque. Tamanho depende do tamanho da fonte. Ações de teclado (espaço, guias) também são suportadas.

https://jsfiddle.net/ohf7nmzy/2/

body{
	padding:0 20px;
}
.big{
	font-size: 50px;
}

/* CSS below will force radio/checkbox size be same as font size */
label{
	position: relative;
	line-height: 1.4;
}
/* radio */
input[type=radio]{
	width: 1em;
	font-size: inherit;
	margin: 0;
	transform: translateX(-9999px);
}
input[type=radio] + label:before{
	position: absolute;
	content: '';
	left: -1.3em;
	top: 0;
	width: 1em;
	height: 1em;
	margin: 0;
	border:none;
	border-radius: 50%;
	background-color: #bbbbbb;
}
input[type=radio] + label:after{
	position: absolute;
	content: '';
	left: -1.3em;
	top: 0;
	width: 1em;
	height: 1em;
	margin: 0;
	border: none;
	background-color: white;
	border-radius: 50%;
	transform: scale(0.8);
}
/*checked*/
input[type=radio]:checked + label:before{
	position:absolute;
	content:'';
	left: -1.3em;
	top: 0;
	width: 1em;
	height: 1em;
	margin: 0;
	border: none;
	background-color: #3b88fd;
}
input[type=radio]:checked + label:after{
	position: absolute;
	content: '';
	left: -1.3em;
	top: 0;
	width: 1em;
	height: 1em;
	margin: 0;
	border: none;
	background-color: white;
	border-radius: 50%;
	transform: scale(0.3);
}
/*focused*/
input[type=radio]:focus + label:before{
	border: 0.2em solid #8eb9fb;
	margin-top: -0.2em;
	margin-left: -0.2em;
	box-shadow: 0 0 0.3em #3b88fd;
}


/*checkbox/*/
input[type=checkbox]{
	width: 1em;
	font-size: inherit;
	margin: 0;
	transform: translateX(-9999px);
}
input[type=checkbox] + label:before{
	position: absolute;
	content: '';
	left: -1.3em;
	top: 0;
	width: 1em;
	height: 1em;
	margin: 0;
	border:none;
	border-radius: 10%;
	background-color: #bbbbbb;
}
input[type=checkbox] + label:after{
	position: absolute;
	content: '';
	left: -1.3em;
	top: 0;
	width: 1em;
	height: 1em;
	margin: 0;
	border: none;
	background-color: white;
	border-radius: 10%;
	transform: scale(0.8);
}
/*checked*/
input[type=checkbox]:checked + label:before{
	position:absolute;
	content:'';
	left: -1.3em;
	top: 0;
	width: 1em;
	height: 1em;
	margin: 0;
	border: none;
	background-color: #3b88fd;
}
input[type=checkbox]:checked + label:after{
	position: absolute;
	content: "\2713";
	left: -1.3em;
	top: 0;
	width: 1em;
	height: 1em;
	margin: 0;
	border: none;
	background-color: #3b88fd;
	border-radius: 10%;
	color: white;
	text-align: center;
	line-height: 1;
}
/*focused*/
input[type=checkbox]:focus + label:before{
	border: 0.1em solid #8eb9fb;
	margin-top: -0.1em;
	margin-left: -0.1em;
	box-shadow: 0 0 0.2em #3b88fd;
}
<input type="checkbox" name="checkbox_1" id="ee" checked /> 
<label for="ee">Checkbox small</label>

<br />

<input type="checkbox" name="checkbox_2" id="ff" /> 
<label for="ff">Checkbox small</label>

<hr />

<div class="big">
	<input type="checkbox" name="checkbox_3" id="gg" checked /> 
	<label for="gg">Checkbox big</label>

	<br />

	<input type="checkbox" name="checkbox_4" id="hh" /> 
	<label for="hh">Checkbox big</label>
</div>


<hr />


<input type="radio" name="radio_1" id="aa" value="1" checked /> 
<label for="aa">Radio small</label>

<br />

<input type="radio" name="radio_1" id="bb" value="2" /> 
<label for="bb">Radio small</label>

<hr />

<div class="big">
	<input type="radio" name="radio_2" id="cc" value="1" checked /> 
	<label for="cc">Radio big</label>

	<br />

	<input type="radio" name="radio_2" id="dd" value="2" /> 
	<label for="dd">Radio big</label>
</div>

Versão 2017 - usando zoom ou escala

O navegador usará o zoomrecurso não padrão se for suportado (boa qualidade) ou padrão transform: scale(embaçado).

O dimensionamento funciona em todos os navegadores, mas fica embaçado no Firefox e Safari .

https://jsfiddle.net/ksvx2txb/11/

@supports (zoom:2) {
	input[type="radio"],  input[type=checkbox]{
	zoom: 2;
	}
}
@supports not (zoom:2) {
	input[type="radio"],  input[type=checkbox]{
		transform: scale(2);
		margin: 15px;
	}
}
label{
  /* fix vertical align issues */
	display: inline-block;
	vertical-align: top;
	margin-top: 10px;
}
<input type="radio" name="aa" value="1" id="aa" checked /> 
<label for="aa">Radio 1</label>
<br />
<input type="radio" name="aa" value="2" id="bb" /> 
<label for="bb">Radio 2</label>

<br /><br />

<input  type="checkbox" name="optiona" id="cc" checked /> 
<label for="cc">Checkbox 1</label>
<br />
<input  type="checkbox" name="optiona" id="dd" /> 
<label for="dd">Checkbox 1</label>


O zoom parece funcionar bem no FQ. Talvez esteja atento a versões mais antigas do Gecko?
Neil Chowdhury

27

Acabei de sair com isso:

input[type="checkbox"] {display:none;}
input[type="checkbox"] + label:before {content:"☐";}
input:checked + label:before {content:"☑";}
label:hover {color:blue;}
<input id="check" type="checkbox" /><label for="check">Checkbox</label>

Obviamente, graças a isso, você pode alterar o valor de acordo contentcom as suas necessidades e usar uma imagem, se desejar ou usar outra fonte ...

O principal interesse aqui é que:

  1. O tamanho da caixa de seleção permanece proporcional ao tamanho do texto

  2. Você pode controlar o aspecto, a cor, o tamanho da caixa de seleção

  3. Não é necessário HTML extra!

  4. São necessárias apenas 3 linhas de CSS (a última é apenas para lhe dar ideias)

Editar : como indicado no comentário, a caixa de seleção não será acessível pela navegação por teclas. Você provavelmente deve adicionar tabindex=0como uma propriedade ao seu rótulo para torná-lo focável.


2
Infelizmente, definir display:nonea entrada impedirá que ela seja selecionada com a tabchave, então não acho que seja uma boa ideia.
Harfangk

2
Boa observação. Você pode adicionar tabindex = 0 na entrada para corrigir isso.
Sharcoux 14/01/19

26

Visualização:
http://jsfiddle.net/h4qka9td/

*,*:after,*:before {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  padding: 0;
  margin: 0;
}

.switch {
  margin: 50px auto;
  position: relative;
}

.switch label {
  width: 100%;
  height: 100%;
  position: relative;
  display: block;
}

.switch input {
  top: 0; 
  right: 0; 
  bottom: 0; 
  left: 0;
  opacity: 0;
  z-index: 100;
  position: absolute;
  width: 100%;
  height: 100%;
  cursor: pointer;
}

/* DEMO 3 */

.switch.demo3 {
  width: 180px;
  height: 50px;
}

.switch.demo3 label {
  display: block;
  width: 100%;
  height: 100%;
  background: #a5a39d;
  border-radius: 40px;
  box-shadow:
      inset 0 3px 8px 1px rgba(0,0,0,0.2),
      0 1px 0 rgba(255,255,255,0.5);
}

.switch.demo3 label:after {
  content: "";
  position: absolute;
  z-index: -1;
  top: -8px; right: -8px; bottom: -8px; left: -8px;
  border-radius: inherit;
  background: #ababab;
  background: -moz-linear-gradient(#f2f2f2, #ababab);
  background: -ms-linear-gradient(#f2f2f2, #ababab);
  background: -o-linear-gradient(#f2f2f2, #ababab);
  background: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#ababab));
  background: -webkit-linear-gradient(#f2f2f2, #ababab);
  background: linear-gradient(#f2f2f2, #ababab);
  box-shadow: 0 0 10px rgba(0,0,0,0.3),
        0 1px 1px rgba(0,0,0,0.25);
}

.switch.demo3 label:before {
  content: "";
  position: absolute;
  z-index: -1;
  top: -18px; right: -18px; bottom: -18px; left: -18px;
  border-radius: inherit;
  background: #eee;
  background: -moz-linear-gradient(#e5e7e6, #eee);
  background: -ms-linear-gradient(#e5e7e6, #eee);
  background: -o-linear-gradient(#e5e7e6, #eee);
  background: -webkit-gradient(linear, 0 0, 0 100%, from(#e5e7e6), to(#eee));
  background: -webkit-linear-gradient(#e5e7e6, #eee);
  background: linear-gradient(#e5e7e6, #eee);
  box-shadow:
      0 1px 0 rgba(255,255,255,0.5);
  -webkit-filter: blur(1px);
  -moz-filter: blur(1px);
  -ms-filter: blur(1px);
  -o-filter: blur(1px);
  filter: blur(1px);
}

.switch.demo3 label i {
  display: block;
  height: 100%;
  width: 60%;
  border-radius: inherit;
  background: silver;
  position: absolute;
  z-index: 2;
  right: 40%;
  top: 0;
  background: #b2ac9e;
  background: -moz-linear-gradient(#f7f2f6, #b2ac9e);
  background: -ms-linear-gradient(#f7f2f6, #b2ac9e);
  background: -o-linear-gradient(#f7f2f6, #b2ac9e);
  background: -webkit-gradient(linear, 0 0, 0 100%, from(#f7f2f6), to(#b2ac9e));
  background: -webkit-linear-gradient(#f7f2f6, #b2ac9e);
  background: linear-gradient(#f7f2f6, #b2ac9e);
  box-shadow:
      inset 0 1px 0 white,
      0 0 8px rgba(0,0,0,0.3),
      0 5px 5px rgba(0,0,0,0.2);
}

.switch.demo3 label i:after {
  content: "";
  position: absolute;
  left: 15%;
  top: 25%;
  width: 70%;
  height: 50%;
  background: #d2cbc3;
  background: -moz-linear-gradient(#cbc7bc, #d2cbc3);
  background: -ms-linear-gradient(#cbc7bc, #d2cbc3);
  background: -o-linear-gradient(#cbc7bc, #d2cbc3);
  background: -webkit-gradient(linear, 0 0, 0 100%, from(#cbc7bc), to(#d2cbc3));
  background: -webkit-linear-gradient(#cbc7bc, #d2cbc3);
  background: linear-gradient(#cbc7bc, #d2cbc3);
  border-radius: inherit;
}

.switch.demo3 label i:before {
  content: "off";
  text-transform: uppercase;
  font-style: normal;
  font-weight: bold;
  color: rgba(0,0,0,0.4);
  text-shadow: 0 1px 0 #bcb8ae, 0 -1px 0 #97958e;
  font-family: Helvetica, Arial, sans-serif;
  font-size: 24px;
  position: absolute;
  top: 50%;
  margin-top: -12px;
  right: -50%;
}

.switch.demo3 input:checked ~ label {
  background: #9abb82;
}

.switch.demo3 input:checked ~ label i {
  right: -1%;
}

.switch.demo3 input:checked ~ label i:before {
  content: "on";
  right: 115%;
  color: #82a06a;
  text-shadow: 
    0 1px 0 #afcb9b,
    0 -1px 0 #6b8659;
}
<div class="switch demo3">
  <input type="checkbox">
  <label><i></i>
  </label>
</div>

<div class="switch demo3">
  <input type="checkbox" checked>
  <label><i></i>
  </label>
</div>


@robertjd concordou, estava confuso sobre por que isso seria necessário para um simples transformar
Neil Chowdhury

@robertjd Essas nem são caixas de seleção; eles são alternadores.
TylerH

14

A aparência das caixas de seleção parece estar corrigida por padrão. Mas, como apontado por Worthy7, isso pode ser corrigido usando a propriedade CSSappearance . Isso deixará as caixas de seleção completamente vazias, para que você possa definir sua própria aparência. O que é interessante sobre isso: você pode usar seu código HTML existente. Desvantagem: É uma tecnologia experimental . Edge e IE não usam o estilo personalizado.

Aqui estão os estilos CSS necessários:

input[type=checkbox] {
    width: 14mm;
    -webkit-appearance: none;
    -moz-appearance: none;
    height: 14mm;
    border: 0.1mm solid black;
}

input[type=checkbox]:checked {
    background-color: lightblue;
}

input[type=checkbox]:checked:after {
    margin-left: 4.3mm;
    margin-top: -0.4mm;
    width: 3mm;
    height: 10mm;
    border: solid white;
    border-width: 0 2mm 2mm 0;
    -webkit-transform: rotate(45deg);
    -moz-transform: rotate(45deg);
    -ms-transform: rotate(45deg);
    transform: rotate(45deg);
    content: "";
    display: inline-block;
}
<label><input type="checkbox"> Test</label>

Imagens:

Cromada: insira a descrição da imagem aqui

Raposa de fogo: insira a descrição da imagem aqui

Beira: insira a descrição da imagem aqui

IE: insira a descrição da imagem aqui


8

Eu estava procurando fazer uma caixa de seleção um pouco maior e procurei o código-fonte do 37Signals Basecamp para encontrar a seguinte solução-

Você pode alterar o tamanho da fonte para tornar a caixa de seleção um pouco maior:

font-size: x-large;

Em seguida, você pode alinhar a caixa de seleção corretamente, executando:

vertical-align: top;
margin-top: 3px; /* change to center it */

3
font-size não parece afetar o tamanho da caixa de seleção real em tudo
Michael

Não funcionou para mim
Amirhossein Tarmast 30/12/19

6

Você pode aumentar as caixas de seleção no Safari - que geralmente é resistente às abordagens usuais - com este atributo: -webkit-transform: scale(1.3, 1.3);

Fonte


6

Eu acho que a solução mais simples é mudar o estilo da caixa de seleção, como sugerem alguns usuários. O CSS abaixo está funcionando para mim, requer apenas algumas linhas de CSS e responde à pergunta do OP:

input[type=checkbox] {
    -webkit-appearance: none;
    -moz-appearance: none;
    vertical-align: middle;
    width: 14px; 
    height: 14px;
    font-size: 14px;
    background-color: #eee;
}

input[type=checkbox]:checked:after {
    position: relative;
    bottom: 3px;
    left: 1px;
    color: blue;
    content: "\2713"; /* check mark */
}

Conforme mencionado nesta postagem, a propriedade zoom parece não funcionar no Firefox e as transformações podem causar efeitos indesejados.

Testado no Chrome e Firefox, deve funcionar para todos os navegadores modernos. Basta alterar as propriedades (cores, tamanho, fundo, esquerda, etc.) de acordo com suas necessidades. Espero que ajude!


5

Meu entendimento é que isso não é nada fácil de executar em vários navegadores. Em vez de tentar manipular o controle da caixa de seleção, você sempre pode criar sua própria implementação usando imagens, javascript e campos de entrada ocultos. Estou assumindo que isso é semelhante ao que são boas formas (da resposta de Staicu lonut acima), mas não seria particularmente difícil de implementar. Acredito que o jQuery também tenha um plug-in para permitir esse comportamento personalizado (procurará o link e publicará aqui, se possível).


3

Achei esta biblioteca somente CSS muito útil: https://lokesh-coder.github.io/pretty-checkbox/

Ou você pode criar o seu próprio com esse mesmo conceito básico, semelhante ao que o @Sharcoux postou. É basicamente:

  • Ocultar a caixa de seleção normal (opacidade 0 e colocada onde ela iria)
  • Adicionar uma caixa de seleção falsa baseada em css
  • Use input:checked~div labelpara o estilo verificado
  • verifique se você <label>clicável usandofor=yourinputID

.pretty {
  position: relative;
  margin: 1em;
}
.pretty input {
  position: absolute;
  left: 0;
  top: 0;
  min-width: 1em;
  width: 100%;
  height: 100%;
  z-index: 2;
  opacity: 0;
  margin: 0;
  padding: 0;
  cursor: pointer;
}
.pretty-inner {
  box-sizing: border-box;
  position: relative;
}
.pretty-inner label {
  position: initial;
  display: inline-block;
  font-weight: 400;
  margin: 0;
  text-indent: 1.5em;
  min-width: calc(1em + 2px);
}
.pretty-inner label:after,
.pretty-inner label:before {
  content: '';
  width: calc(1em + 2px);
  height: calc(1em + 2px);
  display: block;
  box-sizing: border-box;
  border-radius: 0;
  border: 1px solid transparent;
  z-index: 0;
  position: absolute;
  left: 0;
  top: 0;
  background-color: transparent;
}
.pretty-inner label:before {
  border-color: #bdc3c7;
}
.pretty input:checked~.pretty-inner label:after {
  background-color: #00bb82;
  width: calc(1em - 6px);
  height: calc(1em - 6px);
  top: 4px;
  left: 4px;
}


/* Add checkmark character style */
.pretty input:checked~.pretty-inner.checkmark:after {
  content: '\2713';
  color: #fff;
  position: absolute;
  font-size: 0.65em;
  left: 6px;
  top: 3px;
}



body {
  font-size: 20px;
  font-family: sans-serif;
}
<div class="pretty">
	<input type="checkbox" id="demo" name="demo">
	<div class="pretty-inner"><label for="demo">I agree.</label></div>
</div>

<div class="pretty">
	<input type="checkbox" id="demo" name="demo">
	<div class="pretty-inner checkmark"><label for="demo">Please check the box.</label></div>
</div>


3

O problema é que o Firefox não escuta largura e altura. Desative isso e você estará pronto.

input[type=checkbox] {
    width: 25px;
    height: 25px;
    -moz-appearance: none;
}
<label><input type="checkbox"> Test</label>


3

As outras respostas mostraram uma caixa de seleção pixelizada, enquanto eu queria algo bonito. O resultado fica assim: pré-visualização da caixa de seleção

Embora esta versão seja mais complicada, acho que vale a pena tentar.

.checkbox-list__item {
  position: relative;
  padding: 10px 0;
  display: block;
  cursor: pointer;
  margin: 0 0 0 34px;
  border-bottom: 1px solid #b4bcc2;
}
.checkbox-list__item:last-of-type {
  border-bottom: 0;
}

.checkbox-list__check {
  width: 18px;
  height: 18px;
  border: 3px solid #b4bcc2;
  position: absolute;
  left: -34px;
  top: 50%;
  margin-top: -12px;
  transition: border .3s ease;
  border-radius: 5px;
}
.checkbox-list__check:before {
  position: absolute;
  display: block;
  width: 18px;
  height: 22px;
  top: -2px;
  left: 0px;
  padding-left: 2px;
  background-color: transparent;
  transition: background-color .3s ease;
  content: '\2713';
  font-family: initial;
  font-size: 19px;
  color: white;
}

input[type="checkbox"]:checked ~ .checkbox-list__check {
  border-color: #5bc0de;
}
input[type="checkbox"]:checked ~ .checkbox-list__check:before {
  background-color: #5bc0de;
}
<label class="checkbox-list__item">
  <input class="checkbox_buttons" type="checkbox" checked="checked" style="display: none;">
  <div class="checkbox-list__check"></div>
</label>

JSFiddle: https://jsfiddle.net/asbd4hpr/


0

você pode alterar a altura e a largura no código abaixo

.checkmark {
    position: absolute;
    top: 0;
    left: 0;
    height: 20px;
    width: 20px;
    border-radius:5px;
    border:1px solid #ff7e02;
}
<div class="check">

     <label class="container1">Architecture/Landscape
										  

    <input type="checkbox" checked="checked">
										  

    <span class="checkmark"></span>
								 

	</label>
</div>

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.