CSS를 사용하여 확인란의 스타일을 지정하는 방법


831

다음을 사용하여 확인란의 스타일을 지정하려고합니다.

<input type="checkbox" style="border:2px dotted #00f;display:block;background:#ff0000;" />

그러나 스타일은 적용되지 않습니다. 확인란은 여전히 ​​기본 스타일을 표시합니다. 지정된 스타일을 어떻게 지정합니까?



1
나는 당신이 다음과 같은 것을 찾고 있다고 생각합니다 : asimishaq.com/myfiles/image-checkbox 이 게시물보기 : stackoverflow.com/questions/16352864/…
asim-ishaq


1
링크는 위의 주석에 있습니다. 어쨌든 : blog.felixhagspiel.de/index.php/posts/custom-inputs
펠릭스 Hagspiel

1
와. 방금 말해야 할 모든 답변을 보면서이 모든 작업은 스타일 체크 박스를 화면에 표시하는 것입니다.
Michael

답변:


784

최신 정보:

아래 답변은 CSS 3이 널리 보급되기 전의 상태를 나타냅니다. 최신 브라우저 (Internet Explorer 9 이상 포함)에서는 JavaScript를 사용하지 않고 원하는 스타일로 확인란을 대체하는 것이 더 간단합니다.

유용한 링크는 다음과 같습니다.

근본적인 문제가 바뀌지 않았다는 점은 주목할 가치가 있습니다. 여전히 확인란 요소에 스타일 (테두리 등)을 직접 적용 할 수 없으며 해당 스타일이 HTML 확인란의 표시에 영향을 미칩니다. 그러나 변경된 것은 이제 CSS 이외의 다른 것을 사용하여 실제 확인란을 숨기고 자신의 스타일 요소로 바꿀 수 있다는 것입니다. 특히, CSS는 이제 광범위하게 지원되는 :checked선택기 가 있으므로 대체 된 항목의 확인란 상태를 올바르게 반영하도록 할 수 있습니다.


주문 답변

다음 은 스타일 체크 박스에 대한 유용한 기사 입니다. 기본적으로 해당 작성자는 브라우저마다 브라우저마다 매우 다양하며 스타일을 지정하는 방식에 관계없이 많은 브라우저에서 항상 기본 확인란을 표시합니다. 정말 쉬운 방법은 없습니다.

JavaScript를 사용하여 확인란의 이미지를 오버레이하고 해당 이미지를 클릭하면 실제 확인란이 선택되는 해결 방법을 상상하기 어렵지 않습니다. JavaScript가없는 사용자에게는 기본 확인란이 표시됩니다.

추가하기 위해 편집 : 여기 당신을 위해 좋은 스크립트가 있습니다 ; 실제 확인란 요소를 숨기고 스타일 범위로 바꾸고 클릭 이벤트를 리디렉션합니다.


34
이 답변은 오래되었습니다! IE6와 IE7 스타일을 비교하는 사이트 ...에 대한 기본 링크 리드
요나탄 Littke

7
요점-현대 브라우저에서 기본 요점은 더 이상 사실이 아닙니다. 최신 링크로 업데이트했지만 이전 브라우저의 원본으로 원본을 남겼습니다.
Jacob Mattison

3
Easy CSS Checkbox Generator 는 정말 쉽고 n00b 친화적이었습니다. 맞춤형 제작을위한 GUI도 함께 제공됩니다! 잘 부탁드립니다. :)
CᴴᴀZ

이 기능이 IE8 + 및 다른 브라우저 (chrome, firefox 및 safari)와 호환되기를 원하기 때문에 이전 답변에 관심이 있습니다. 그러나 ryanfait.com/resources/custom-checkboxes-and-radio-buttons
Adrien Be

2
이것은 매우 유용한 답변이 아닙니다. 기사의 목록 일뿐입니다.
Steve Bennett

141

CSS 만 사용하여이를 수행 할 수있는 방법이 있습니다. label요소를 사용하고 대신 해당 요소의 스타일을 지정할 수 있습니다 . 주의 사항은 Internet Explorer 8 이하 버전에서는 작동하지 않는다는 것입니다.

.myCheckbox input {
  position: relative;
  z-index: -9999;
}

.myCheckbox span {
  width: 20px;
  height: 20px;
  display: block;
  background: url("link_to_image");
}

.myCheckbox input:checked + span {
  background: url("link_to_another_image");
}
<label for="test">Label for my styled "checkbox"</label>
<label class="myCheckbox">
  <input type="checkbox" name="test" />
  <span></span>
</label>


@GandalfStormCrow : IE8이 지원하지 않는 : checked pseudo-class를 지원하는 모든 브라우저에서 작동합니다. : checked 및 friends에 대한 지원을 추가하는 selectivizr.com에서 작동하는지 확인할 수 있습니다 .
Blake Pettersson

즉, IE9 이상 버전은 : checked를 지원합니다.
Blake Pettersson

1
IE8 이하의 폴리 필이
Tim

작동하지만 처음 깜박입니다. 왜 그런 일이?
technophyle

숨겨진 input키보드는 키보드 포커스를 사용하지 않으므로 키보드로는 도달 할 수 없습니다.
sam

139

:after:before의사 클래스 와 함께 제공되는 새로운 기능을 사용하면 멋진 사용자 정의 확인란 효과를 얻을 수 있습니다 . 이것의 장점은 다음과 같습니다. DOM에 더 많은 것을 추가 할 필요없이 표준 확인란 만 추가하면됩니다.

이것은 호환되는 브라우저에서만 작동합니다. 나는 이것이 일부 브라우저가 입력 요소 를 설정 :after하고 설정할 수 없다는 사실과 관련이 있다고 생각합니다 :before. 불행히도 현재 WebKit 브라우저 만 지원됩니다. Firefox + Internet Explorer는 여전히 확인란의 기능을 그대로 유지하고 스타일을 변경하지 않을 것이며 앞으로 코드가 벤더 접두사를 사용하지 않기 때문에 바뀔 것입니다.

이것은 WebKit 브라우저 솔루션 전용입니다 (Chrome, Safari, 모바일 브라우저)

바이올린 예를 참조하십시오.

$(function() {
  $('input').change(function() {
    $('div').html(Math.random());
  });
});
/* Main Classes */
.myinput[type="checkbox"]:before {
  position: relative;
  display: block;
  width: 11px;
  height: 11px;
  border: 1px solid #808080;
  content: "";
  background: #FFF;
}

.myinput[type="checkbox"]:after {
  position: relative;
  display: block;
  left: 2px;
  top: -11px;
  width: 7px;
  height: 7px;
  border-width: 1px;
  border-style: solid;
  border-color: #B3B3B3 #dcddde #dcddde #B3B3B3;
  content: "";
  background-image: linear-gradient(135deg, #B1B6BE 0%, #FFF 100%);
  background-repeat: no-repeat;
  background-position: center;
}

.myinput[type="checkbox"]:checked:after {
  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAQAAABuW59YAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAB2SURBVHjaAGkAlv8A3QDyAP0A/QD+Dam3W+kCAAD8APYAAgTVZaZCGwwA5wr0AvcA+Dh+7UX/x24AqK3Wg/8nt6w4/5q71wAAVP9g/7rTXf9n/+9N+AAAtpJa/zf/S//DhP8H/wAA4gzWj2P4lsf0JP0A/wADAHB0Ngka6UmKAAAAAElFTkSuQmCC'), linear-gradient(135deg, #B1B6BE 0%, #FFF 100%);
}

.myinput[type="checkbox"]:disabled:after {
  -webkit-filter: opacity(0.4);
}

.myinput[type="checkbox"]:not(:disabled):checked:hover:after {
  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAQAAABuW59YAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAB2SURBVHjaAGkAlv8A3QDyAP0A/QD+Dam3W+kCAAD8APYAAgTVZaZCGwwA5wr0AvcA+Dh+7UX/x24AqK3Wg/8nt6w4/5q71wAAVP9g/7rTXf9n/+9N+AAAtpJa/zf/S//DhP8H/wAA4gzWj2P4lsf0JP0A/wADAHB0Ngka6UmKAAAAAElFTkSuQmCC'), linear-gradient(135deg, #8BB0C2 0%, #FFF 100%);
}

.myinput[type="checkbox"]:not(:disabled):hover:after {
  background-image: linear-gradient(135deg, #8BB0C2 0%, #FFF 100%);
  border-color: #85A9BB #92C2DA #92C2DA #85A9BB;
}

.myinput[type="checkbox"]:not(:disabled):hover:before {
  border-color: #3D7591;
}

/* Large checkboxes */
.myinput.large {
  height: 22px;
  width: 22px;
}

.myinput.large[type="checkbox"]:before {
  width: 20px;
  height: 20px;
}

.myinput.large[type="checkbox"]:after {
  top: -20px;
  width: 16px;
  height: 16px;
}

/* Custom checkbox */
.myinput.large.custom[type="checkbox"]:checked:after {
  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGHRFWHRBdXRob3IAbWluZWNyYWZ0aW5mby5jb23fZidLAAAAk0lEQVQ4y2P4//8/AyUYwcAD+OzN/oMwshjRBoA0Gr8+DcbIhhBlAEyz+qZZ/7WPryHNAGTNMOxpJvo/w0/uP0kGgGwGaZbrKgfTGnLc/0nyAgiDbEY2BCRGdCDCnA2yGeYVog0Aae5MV4c7Gzk6CRqAbDM2w/EaQEgzXgPQnU2SAcTYjNMAYm3GaQCxNuM0gFwMAPUKd8XyBVDcAAAAAElFTkSuQmCC'), linear-gradient(135deg, #B1B6BE 0%, #FFF 100%);
}

.myinput.large.custom[type="checkbox"]:not(:disabled):checked:hover:after {
  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGHRFWHRBdXRob3IAbWluZWNyYWZ0aW5mby5jb23fZidLAAAAk0lEQVQ4y2P4//8/AyUYwcAD+OzN/oMwshjRBoA0Gr8+DcbIhhBlAEyz+qZZ/7WPryHNAGTNMOxpJvo/w0/uP0kGgGwGaZbrKgfTGnLc/0nyAgiDbEY2BCRGdCDCnA2yGeYVog0Aae5MV4c7Gzk6CRqAbDM2w/EaQEgzXgPQnU2SAcTYjNMAYm3GaQCxNuM0gFwMAPUKd8XyBVDcAAAAAElFTkSuQmCC'), linear-gradient(135deg, #8BB0C2 0%, #FFF 100%);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<table style="width:100%">
  <tr>
    <td>Normal:</td>
    <td><input type="checkbox" /></td>
    <td><input type="checkbox" checked="checked" /></td>
    <td><input type="checkbox" disabled="disabled" /></td>
    <td><input type="checkbox" disabled="disabled" checked="checked" /></td>
  </tr>
  <tr>
    <td>Small:</td>
    <td><input type="checkbox" class="myinput" /></td>
    <td><input type="checkbox" checked="checked" class="myinput" /></td>
    <td><input type="checkbox" disabled="disabled" class="myinput" /></td>
    <td><input type="checkbox" disabled="disabled" checked="checked" class="myinput" /></td>
  </tr>
  <tr>
    <td>Large:</td>
    <td><input type="checkbox" class="myinput large" /></td>
    <td><input type="checkbox" checked="checked" class="myinput large" /></td>
    <td><input type="checkbox" disabled="disabled" class="myinput large" /></td>
    <td><input type="checkbox" disabled="disabled" checked="checked" class="myinput large" /></td>
  </tr>
  <tr>
    <td>Custom icon:</td>
    <td><input type="checkbox" class="myinput large custom" /></td>
    <td><input type="checkbox" checked="checked" class="myinput large custom" /></td>
    <td><input type="checkbox" disabled="disabled" class="myinput large custom" /></td>
    <td><input type="checkbox" disabled="disabled" checked="checked" class="myinput large custom" /></td>
  </tr>
</table>

보너스 웹킷 스타일 플립 스위치 바이올린

$(function() {
  var f = function() {
    $(this).next().text($(this).is(':checked') ? ':checked' : ':not(:checked)');
  };
  $('input').change(f).trigger('change');
});
body {
  font-family: arial;
}

.flipswitch {
  position: relative;
  background: white;
  width: 120px;
  height: 40px;
  -webkit-appearance: initial;
  border-radius: 3px;
  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
  outline: none;
  font-size: 14px;
  font-family: Trebuchet, Arial, sans-serif;
  font-weight: bold;
  cursor: pointer;
  border: 1px solid #ddd;
}

.flipswitch:after {
  position: absolute;
  top: 5%;
  display: block;
  line-height: 32px;
  width: 45%;
  height: 90%;
  background: #fff;
  box-sizing: border-box;
  text-align: center;
  transition: all 0.3s ease-in 0s;
  color: black;
  border: #888 1px solid;
  border-radius: 3px;
}

.flipswitch:after {
  left: 2%;
  content: "OFF";
}

.flipswitch:checked:after {
  left: 53%;
  content: "ON";
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>

<h2>Webkit friendly mobile-style checkbox/flipswitch</h2>
<input type="checkbox" class="flipswitch" /> &nbsp;
<span></span>
<br>
<input type="checkbox" checked="checked" class="flipswitch" /> &nbsp;
<span></span>


9
Firefox 33.1 / Linux : 바이올린에는 기본 확인란 만 표시됩니다. 아무것도 다르게 보입니다.
robsch

1
@robsch 이것은 원래 게시물에서 분명히 지적됩니다. 파이어 폭스 또는 OS의 버전은 관련이 없으며 파이어 폭스에서는 작동하지 않습니다. "FF + IE는 여전히 체크 박스가 작동하지 않고 스타일 만 지정됩니다 ..."
Josh Mc

좋은 접근법. 그러나 모든 브라우저가 잘하는 것은 아닙니다. 내가 조사한 한 Chrome 만 최상의 출력을 제공합니다.
EA

아주 좋아요 그러나 ... 다시 한 번 IE 5.x 방식입니다. 웹킷 만. 항상 규칙을 준수하지는 않기 때문에 ... 이것이 웹킷 브라우저의 모든 문제입니다.
Alex

1
최고의 솔루션! +1 그러나 그런 큰 예를 작성해야 할 이유는 없습니다. 아이디어를 설명하는 30 줄이면 충분합니다.
Andrii Bogachenko

136

시작하기 전에 (2015 년 1 월 기준)

원래 질문과 답변은 이제 ~ 5 세입니다. 따라서 이것은 약간의 업데이트입니다.

첫째, 스타일 체크 박스와 관련하여 여러 가지 접근 방식이 있습니다. 기본 교리는 다음과 같습니다.

  1. 브라우저에서 스타일이 지정된 기본 확인란 컨트롤을 숨겨야하며 CSS를 사용하여 의미있는 방식으로 재정의 할 수 없습니다.

  2. 컨트롤을 숨겨도 여전히 체크 상태를 감지하고 토글 할 수 있어야합니다.

  3. 체크 박스의 체크 상태는 새로운 요소를 스타일링하여 반영해야합니다

해결책 (원칙)

위의 방법은 여러 가지 방법으로 달성 할 수 있으며 CSS3 의사 요소를 사용하는 것이 올바른 방법 인 경우가 종종 있습니다. 실제로, 옳고 그른 방법은 없으며, 그것이 당신이 그것을 사용할 상황에 가장 적합한 접근법에 달려 있습니다.

  1. 확인란을 label요소로 감싸십시오 . 이것은 숨겨져 있어도 레이블 내의 아무 곳이나 클릭해도 체크 상태를 전환 할 수 있음을 의미합니다.

  2. 확인란 숨기기

  3. 새로운 요소를 추가 한 후 그에 따라 스타일을합니다 확인란을 선택합니다. CSS를 사용하여 선택하고 :checked상태에 따라 스타일을 지정할 수 있도록 확인란 뒤에 표시되어야합니다 . CSS는 '뒤로'를 선택할 수 없습니다.

솔루션 (코드)

세분화 (아이콘 사용)

그러나 이봐! 나는 당신이 소리를 듣는다. 상자에 작은 진드기 나 십자 표시를하려면 어떻게해야합니까? 그리고 배경 이미지를 사용하고 싶지 않습니다!

CSS3의 유사 요소가 작용할 수있는 곳입니다. 이들은 상태를 나타내는 유니 코드 아이콘content 을 주입 할 수 있는 속성을 지원합니다 . 다른 방법으로, 같은 타사 글꼴 아이콘 소스를 사용할 수있는 글꼴 최고 (메이크업은 당신이 또한 관련 설정하지만 예에를 )font-familyFontAwesome

label input {
  display: none; /* Hide the default checkbox */
}

/* Style the artificial checkbox */
label span {
  height: 10px;
  width: 10px;
  border: 1px solid grey;
  display: inline-block;
  position: relative;
}

/* Style its checked state...with a ticked icon */
[type=checkbox]:checked + span:before {
  content: '\2714';
  position: absolute;
  top: -5px;
  left: 0;
}
<label>
  <input type='checkbox'>
  <span></span>
  Checkbox label text
</label>


14
단, HTML 단순화, CSS 단순화, 자세한 설명.
SW4

4
@AnthonyHayward-답변을 업데이트했습니다. 이것은 display : none을 사용하여 발생했습니다. 탭 가능한 방식으로 컨트롤을 인스턴스화하지 않습니다. 변경되었습니다
SW4

1
확인란이 레이블 앞 / 뒤가 아니라 레이블 안에있는 예를 찾기 위해 고심하고있었습니다. 이것은 매우 잘 문서화되고 설명 된 솔루션입니다. 월 2016 년 업데이트이 답변을보고 좋은 것
Clarus Dignus

1
로 탭할 수 없습니다 display: none.
sam

2
교체 visibility: hidden;opacity: 0 !important;여전히 탭 이동에 문제가있는 경우.
jabacchetta

40

SW4의 답변에 대한 조언을 따르겠습니다 . 확인란을 숨기고 맞춤 범위로 표시하여 다음 HTML을 제안하십시오.

<label>
  <input type="checkbox">
  <span>send newsletter</span>
</label>

랩인 레이블을 사용하면 "for-id"속성 링크없이 텍스트를 깔끔하게 클릭 할 수 있습니다. 하나,

사용하여 숨기지 마십시오 visibility: hidden또는display: none

클릭하거나 두드려서 작동하지만 확인란을 사용하는 절름발이입니다. 일부 사람들은 여전히 Tab초점을 이동 Space하고 활성화하고 해당 방법으로 숨기면 훨씬 더 효과적 입니다. 양식이 길면 다른 사람의 손목을 사용 tabindex하거나 accesskey속성으로 저장 합니다. 그리고 시스템 체크 박스 동작을 관찰하면 호버에 알맞은 그림자가 있습니다. 스타일이 올바른 확인란은이 동작을 따라야합니다.

cobberboy의 답변 은 글꼴이 확장 가능한 벡터이기 때문에 일반적으로 비트 맵보다 나은 Font Awesome 을 권장 합니다. 위의 HTML을 사용하여 다음 CSS 규칙을 제안합니다.

  1. 확인란 숨기기

    input[type="checkbox"] {
      position: absolute;
      opacity: 0;
      z-index: -1;
    }

    z-index내 예제에서는 충분히 큰 확인란 스킨을 사용하여 완전히 덮을 수 있으므로 음수 를 사용합니다. left: -999px모든 레이아웃에서 재사용 할 수 없기 때문에 권장하지 않습니다 . Bushan wagh의 답변 은 방탄 방법을 제공하여 브라우저를 숨기고 브라우저가 tabindex를 사용하도록 유도하므로 좋은 대안입니다. 어쨌든, 둘 다 단지 해킹입니다. 오늘 올바른 방법 appearance: noneJoost의 답변을 참조하십시오 .

    input[type="checkbox"] {
      appearance: none;
      -webkit-appearance: none;
      -moz-appearance: none;
    }
  2. 스타일 체크 박스 라벨

    input[type="checkbox"] + span {
      font: 16pt sans-serif;
      color: #000;
    }
  3. 확인란 스킨 추가

    input[type="checkbox"] + span:before {
      font: 16pt FontAwesome;
      content: '\00f096';
      display: inline-block;
      width: 16pt;
      padding: 2px 0 0 3px;
      margin-right: 0.5em;
    }

    \00f096Font Awesome 's square-o이며, 패딩은 초점에 점선 윤곽선을 제공하도록 조정됩니다 (아래 참조).

  4. 체크 박스 체크 스킨 추가

    input[type="checkbox"]:checked + span:before {
      content: '\00f046';
    }

    \00f046Font Awesome 's check-square-o와 (와) 같은 너비가 아니므로 square-o위의 너비 스타일의 이유입니다.

  5. 초점 개요 추가

    input[type="checkbox"]:focus + span:before {
      outline: 1px dotted #aaa;
    }

    Safari는이 기능을 제공하지 않으므로 (@Jason Sankey의 설명 참조) window.navigator브라우저 인 경우 브라우저를 감지하여 Safari 인 경우 건너 뛰어야합니다.

  6. 비활성화 확인란의 회색 설정

    input[type="checkbox"]:disabled + span {
      color: #999;
    }
  7. 비활성화되지 않은 확인란에 호버 그림자 설정

    input[type="checkbox"]:not(:disabled) + span:hover:before {
      text-shadow: 0 1px 2px #77F;
    }

데모 피들

확인란 위로 마우스를 가져 Tab가고 Shift+ Tab를 사용 하여 이동하고 Space전환합니다.


3
초점 문제를 다루기위한 공감 : 이와 같은 사용자 지정으로 기본 기능이 제거되어서는 안됩니다. Safari는 포커스를 포함하는 솔루션을 구현할 때 키보드 포커스를 체크 박스 (기본 키조차도)에 제공하지 않지만 잠시 혼란 스럽습니다.
Jason Sankey

그것은 보인다 스 니펫의 체크 박스가 더 이상 작동하지 않습니다? 크롬 창 10
Félix Gagnon-Grenier

1
좋은 대답입니다. 내 솔루션의 기초를 제공했습니다. 추가 스팬을 사용한 입력 후에 기존 레이블을 사용했으며 Edge & FF 지원을 받았습니다.
Jono

2
이러한 답변의 대부분은 접근성을 무시합니다. 나는이 대답이 그것을 그대로 유지하는 것을 좋아합니다.
maxshuty

1
@maxshuty 나도 당신의 접근 방식을 좋아합니다. 누군가가 라이브러리를 만들 때, 종종 자신이 선택한 모국어로 간단하게 코드를 작성할 수없는 것은 단지 고백 일뿐입니다. IMHO FontAwesome은 자바 스크립트를 사용하여 글꼴을로드하는 무료 계획을 세웠지 만 오픈 소스 및 무료 라이센스를 유지하면서 여전히 좋아합니다. 나는 보통 특정 프로젝트에 필요한 무료 아이콘의 글꼴 위조 서브셋을 만듭니다 (보통 최대 5kB). 그들이 저의 노력을 아끼면 기꺼이 지불 할 것이지만, 그들이 Pro 계획에서 제안 할 때 연간 미친 99 $는 아닙니다.
Jan Turoň

30

label예제가 아래에 있는 요소를 사용하여 약간의 속임수로 확인란의 스타일을 지정할 수 있습니다 .

.checkbox > input[type=checkbox] {
  visibility: hidden;
}

.checkbox {
  position: relative;
  display: block;
  width: 80px;
  height: 26px;
  margin: 0 auto;
  background: #FFF;
  border: 1px solid #2E2E2E;
  border-radius: 2px;
  -webkit-border-radius: 2px;
  -moz-border-radius: 2px;
}

.checkbox:after {
  position: absolute;
  display: inline;
  right: 10px;
  content: 'no';
  color: #E53935;
  font: 12px/26px Arial, sans-serif;
  font-weight: bold;
  text-transform: capitalize;
  z-index: 0;
}

.checkbox:before {
  position: absolute;
  display: inline;
  left: 10px;
  content: 'yes';
  color: #43A047;
  font: 12px/26px Arial, sans-serif;
  font-weight: bold;
  text-transform: capitalize;
  z-index: 0;
}

.checkbox label {
  position: absolute;
  display: block;
  top: 3px;
  left: 3px;
  width: 34px;
  height: 20px;
  background: #2E2E2E;
  cursor: pointer;
  transition: all 0.5s linear;
  -webkit-transition: all 0.5s linear;
  -moz-transition: all 0.5s linear;
  border-radius: 2px;
  -webkit-border-radius: 2px;
  -moz-border-radius: 2px;
  z-index: 1;
}

.checkbox input[type=checkbox]:checked + label {
  left: 43px;
}
<div class="checkbox">
  <input id="checkbox1" type="checkbox" value="1" />
  <label for="checkbox1"></label>
</div>

그리고 위 코드에 대한 FIDDLE . 일부 CSS는 이전 버전의 브라우저에서는 작동하지 않지만 멋진 JavaScript 예제가 있습니다.


28

구현이 간단하고 쉽게 사용자 지정할 수있는 솔루션

많은 검색과 테스트를 거친 후에 구현하기 쉽고 사용자 정의하기 쉬운이 솔루션을 얻었습니다. 이 솔루션에서 :

  1. 외부 라이브러리와 파일이 필요하지 않습니다
  2. 페이지에 HTML을 추가 할 필요가 없습니다.
  3. 확인란 이름과 ID를 변경할 필요가 없습니다

흐르는 CSS를 페이지 상단에 놓으면 모든 확인란 스타일이 다음과 같이 변경됩니다.

여기에 이미지 설명을 입력하십시오

input[type=checkbox] {
  transform: scale(1.5);
}

input[type=checkbox] {
  width: 30px;
  height: 30px;
  margin-right: 8px;
  cursor: pointer;
  font-size: 17px;
  visibility: hidden;
}

input[type=checkbox]:after {
  content: " ";
  background-color: #fff;
  display: inline-block;
  margin-left: 10px;
  padding-bottom: 5px;
  color: #00BFF0;
  width: 22px;
  height: 25px;
  visibility: visible;
  border: 1px solid #00BFF0;
  padding-left: 3px;
  border-radius: 5px;
}

input[type=checkbox]:checked:after {
  content: "\2714";
  padding: -5px;
  font-weight: bold;
}

1
간단할수록 좋습니다!
Adrian Moisa 2012 년

이것은 훌륭한 해답입니다. 추가 사항 없이도 작동합니다
HeavyHead

좋은 하나와 매우 간단
khalidh

좋은 해결책. 그러나 Firefox, IE 또는 Edge에서 작동하는 것을 보지 못합니다 (확인란 없음)
Jono

20

추가 마크 업을 추가하지 않아도됩니다. 이것은 CSS 설정을 통해 데스크탑 용 IE를 제외하고 모든 곳에서 작동하지만 Windows Phone 및 Microsoft Edge 용 IE에서는 작동합니다 appearance.

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

  /* Styling checkbox */
  width: 16px;
  height: 16px;
  background-color: red;
}

input[type="checkbox"]:checked {
  background-color: green;
}
<input type="checkbox" />


3
나는이 접근법을 좋아한다. 실제로 CSS에서 모양을 사용해서는 안되기 때문에 약간 해킹이지만 이전과 이후에 사용하는 다른 답변보다 훨씬 깨끗합니다. 그리고 이와 같은 것에 대해서는 JavaScript가 완전히 과도하다고 생각합니다.
Sprose

18

CSS를 사용하여 색상을 쉽게 수정할 수 있기 때문에 아이콘 글꼴 (예 : FontAwesome)을 사용하는 것이 좋으며 픽셀 밀도가 높은 장치에서 실제로 잘 확장됩니다. 위의 것과 유사한 기술을 사용하는 또 다른 순수한 CSS 변형이 있습니다.

(아래는 정적 이미지이므로 결과를 시각화 할 수 있습니다 . 대화식 버전 은 JSFiddle 을 참조하십시오 .)

확인란 예

다른 솔루션과 마찬가지로 label요소를 사용합니다 . 옆에 span체크 박스 문자가 있습니다.

span.bigcheck-target {
  font-family: FontAwesome; /* Use an icon font for the checkbox */
}

input[type='checkbox'].bigcheck {
  position: relative;
  left: -999em; /* Hide the real checkbox */
}

input[type='checkbox'].bigcheck + span.bigcheck-target:after {
  content: "\f096"; /* In fontawesome, is an open square (fa-square-o) */
}

input[type='checkbox'].bigcheck:checked + span.bigcheck-target:after {
  content: "\f046"; /* fontawesome checked box (fa-check-square-o) */
}

/* ==== Optional - colors and padding to make it look nice === */
body {
  background-color: #2C3E50;
  color: #D35400;
  font-family: sans-serif;
  font-weight: 500;
  font-size: 4em; /* Set this to whatever size you want */
}

span.bigcheck {
  display: block;
  padding: 0.5em;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" />

<span class="bigcheck">
  <label class="bigcheck">
    Cheese
    <input type="checkbox" class="bigcheck" name="cheese" value="yes" />
    <span class="bigcheck-target"></span>
  </label>
</span>

여기 JSFiddle 이 있습니다.


.... 당신이 설명한 것은 Bhushan wagh, Jake, Jonathan Hodgson 및 Blake의 이전 답변과 동일합니다.)
SW4

7
@ SW4 나는이 답변이 아이콘 글꼴을 사용한다는 것을 제외하고는 그 사실을 언급했습니다 (이전 답변은 없었습니다). 첫 번째 단락은 그 점을 분명하게 보여줍니다.
cobberboy

당신은 교체해야합니다 font-family: FontAwesome;으로 font-family: 'Font Awesome\ 5 Free';당신이 새 버전에서 작동하게하려면, 업데이트 유니 코드 내용.
SuN

12

최근에 문제에 대한 흥미로운 해결책을 찾았습니다.

당신이 사용할 수 appearance: none;있는 체크 박스의 기본 스타일을 해제 한 다음 설명을 좋아 위에 직접 작성하는 여기 (예 4) .

바이올린 예

불행히도 브라우저 지원은 appearance옵션에 매우 좋지 않습니다 . 내 개인 테스트에서 Opera와 Chrome 만 올바르게 작동했습니다. 그러나 이것은 더 나은 지원이 오거나 Chrome / Opera 만 사용하려고 할 때 간단하게 유지하는 방법입니다.

"사용해도 되나요?" 링크


실제로 appearance우리에게 필요한 것입니다. "비표준이고 표준 트랙에 있지 않다"는 것을 명심하십시오 .
sam

12

순수 CSS, 아무것도 공상으로 :before하고 :after, 아니 변환, 다음 예와 같이 인라인 배경 이미지로 기본 모양 다음 스타일을 해제 할 수 있습니다. Chrome, Firefox, Safari 및 이제 Edge (Chromium Edge)에서 작동합니다.

INPUT[type=checkbox]:focus
{
    outline: 1px solid rgba(0, 0, 0, 0.2);
}

INPUT[type=checkbox]
{
    background-color: #DDD;
    border-radius: 2px;
    appearance: none;
    -webkit-appearance: none;
    -moz-appearance: none;
    width: 17px;
    height: 17px;
    cursor: pointer;
    position: relative;
    top: 5px;
}

INPUT[type=checkbox]:checked
{
    background-color: #409fd6;
    background: #409fd6 url("data:image/gif;base64,R0lGODlhCwAKAIABAP////3cnSH5BAEKAAEALAAAAAALAAoAAAIUjH+AC73WHIsw0UCjglraO20PNhYAOw==") 3px 3px no-repeat;
}
<form>
  <label><input type="checkbox">I Agree To Terms &amp; Conditions</label>
</form>


1
예! 실제로 괜찮은 것만.
odinho-Velmont

10

내 솔루션

input[type="checkbox"] {
  cursor: pointer;
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  outline: 0;
  background: lightgray;
  height: 16px;
  width: 16px;
  border: 1px solid white;
}

input[type="checkbox"]:checked {
  background: #2aa1c0;
}

input[type="checkbox"]:hover {
  filter: brightness(90%);
}

input[type="checkbox"]:disabled {
  background: #e6e6e6;
  opacity: 0.6;
  pointer-events: none;
}

input[type="checkbox"]:after {
  content: '';
  position: relative;
  left: 40%;
  top: 20%;
  width: 15%;
  height: 40%;
  border: solid #fff;
  border-width: 0 2px 2px 0;
  transform: rotate(45deg);
  display: none;
}

input[type="checkbox"]:checked:after {
  display: block;
}

input[type="checkbox"]:disabled:after {
  border-color: #7b7b7b;
}
<input type="checkbox"><br>
<input type="checkbox" checked><br>
<input type="checkbox" disabled><br>
<input type="checkbox" disabled checked><br>


누군가 내 텍스트가 정렬되지 않은 이유를 조언 할 수 있다면 알고 싶습니다. CSS 초보자는 여기에 있습니다.
agirault

8

appearance: none기본 브라우저가없고 모든 스타일이 올바르게 적용되도록 최신 브라우저에서 간단히 사용할 수 있습니다 .

input[type=checkbox] {
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  display: inline-block;
  width: 2em;
  height: 2em;
  border: 1px solid gray;
  outline: none;
  vertical-align: middle;
}

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

1
이것은 내 경우에 효과가있는 특히 미니멀 한 모범입니다. 감사합니다!
Jason R Stevens CFA

8

JavaScript, 외부 라이브러리, 접근성 준수 및 확인란과 라디오 버튼이 필요하십니까?

나는 스크롤 스크롤 된 이 답변은 단순히 문 밖으로 접근성을 던져 WCAG을 위반하는 하나 이상의 방법으로. 사용자 정의 체크 박스를 사용할 때 대부분 사용자 정의 라디오 버튼을 원하기 때문에 라디오 버튼을 던졌습니다.

피들 :

  • 확인란 -순수 CSS-타사 라이브러리에서 무료
  • 라디오 버튼 -순수 CSS-타사 라이브러리에서 무료
  • FontAwesome을 사용하지만 Glyphicon 등으로 쉽게 바꿀 수있는 확인란 *

늦게 파티에 어떻게 든이 여전히 어려운 2019 I는 나의 세 가지 솔루션을 추가 한 그래서 2020 접근 하고 쉽게 에서 드롭을.

이것들은 모두 JavaScript 무료 , 외부 라이브러리 무료 *액세스 가능합니다 ...

이 중 하나를 사용하여 플러그 앤 플레이하려면 바이올린에서 스타일 시트를 복사하고 CSS에서 색상 코드를 편집하여 필요에 맞게 편집하십시오. 확인란을 원하는 경우 사용자 지정 svg 확인 표시 아이콘을 추가 할 수 있습니다. 나는 CSS가 아닌 사람들을 위해 많은 의견을 추가했습니다.

긴 텍스트 또는 작은 컨테이너가 있고 확인란 또는 라디오 버튼 입력 아래에 텍스트 줄 바꿈이 발생하면 다음 과 같이 div로 변환 하십시오 .

더 긴 설명 : WCAG를 위반하지 않고 JavaScript 또는 외부 라이브러리에 의존하지 않고 탭 또는 스페이스 바와 같은 키보드 탐색을 선택하지 않아 초점 이벤트를 허용하는 포커스 이벤트를 허용하는 확인란이 비활성화 된 솔루션이 필요했습니다. 모두 확인하고 선택 해제되고 마지막으로 내가 다른와 함께하고자 그러나 내가 체크 박스의 모양을 사용자 정의 할 수있는 솔루션 background-color의, border-radius, svg배경 등

@ Jan Turoň 의이 답변 을 조합 하여 꽤 잘 작동하는 것처럼 보이는 자체 솔루션을 만들었습니다. 라디오 버튼으로도 작동하도록 확인란에서 동일한 코드를 많이 사용하는 라디오 버튼 바이올린을 수행했습니다.

나는 여전히 접근성을 배우고있어서 뭔가를 놓친 경우 의견을 적어주십시오. 내 확인란의 코드 예는 여기에서 수정하려고합니다.

input[type="checkbox"] {
  position: absolute;
  opacity: 0;
  z-index: -1;
}

/* Text color for the label */
input[type="checkbox"]+span {
  cursor: pointer;
  font: 16px sans-serif;
  color: black;
}

/* Checkbox un-checked style */
input[type="checkbox"]+span:before {
  content: '';
  border: 1px solid grey;
  border-radius: 3px;
  display: inline-block;
  width: 16px;
  height: 16px;
  margin-right: 0.5em;
  margin-top: 0.5em;
  vertical-align: -2px;
}

/* Checked checkbox style (in this case the background is red) */
input[type="checkbox"]:checked+span:before {
  /* NOTE: Replace the url with a path to an SVG of a checkmark to get a checkmark icon */
  background-image: url('https://cdnjs.cloudflare.com/ajax/libs/ionicons/4.5.6/collection/build/ionicons/svg/ios-checkmark.svg');
  background-repeat: no-repeat;
  background-position: center;
  /* The size of the checkmark icon, you may/may not need this */
  background-size: 25px;
  border-radius: 2px;
  background-color: #e7ffba;
  color: white;
}

/* Adding a dotted border around the active tabbed-into checkbox */
input[type="checkbox"]:focus+span:before,
input[type="checkbox"]:not(:disabled)+span:hover:before {
  /* Visible in the full-color space */
  box-shadow: 0px 0px 0px 2px rgba(0, 150, 255, 1);

  /* Visible in Windows high-contrast themes
     box-shadow will be hidden in these modes and
     transparency will not be hidden in high-contrast
     thus box-shadow will not show but the outline will
     providing accessibility */
  outline-color: transparent; /*switch to transparent*/
  outline-width: 2px;
  outline-style: dotted;
  }


/* Disabled checkbox styles */
input[type="checkbox"]:disabled+span {
  cursor: default;
  color: black;
  opacity: 0.5;
}

/* Styles specific to this fiddle that you do not need */
body {
  padding: 1em;
}
h1 {
  font-size: 18px;
}
<h1>
  NOTE: Replace the url for the background-image in CSS with a path to an SVG in your solution or CDN. This one was found from a quick google search for a checkmark icon cdn
</h1>

<label>
  <input type="checkbox">
  <span>Try using tab and space</span>
</label>

<br>

<label>
  <input type="checkbox" checked disabled>
  <span>Disabled Checked Checkbox</span>
</label>

<br>

<label>
  <input type="checkbox" disabled>
  <span>Disabled Checkbox</span>
</label>
<br>

<label>
  <input type="checkbox">
  <span>Normal Checkbox</span>
</label>

<br>

<label>
  <input type="checkbox">
  <span>Another Normal Checkbox</span>
</label>


나는 여기에도 내 자신의 대답을 추가 했다 . 나는 테마를 활용했다. :) 잘만되면 누군가 그것을 본다.
Mr. Polywhirl

6

다음은 jQuery 또는 JavaScript 코드가없는 간단한 CSS 솔루션입니다.

FontAwseome 아이콘을 사용하고 있지만 모든 이미지를 사용할 수 있습니다

input[type=checkbox] {
  display: inline-block;
  font-family: FontAwesome;
  font-style: normal;
  font-weight: normal;
  line-height: 1;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  visibility: hidden;
  font-size: 14px;
}

input[type=checkbox]:before {
  content: @fa-var-square-o;
  visibility: visible;
  /*font-size: 12px;*/
}

input[type=checkbox]:checked:before {
  content: @fa-var-check-square-o;
}

1
대부분의 다른 답변과 달리이 답변은 추가 label또는 span요소를 만들 필요가 없습니다 . 그냥 작동합니다!
KurtPreston

이 CSS 코드가 작동하는 예제 나 데모 또는 적어도 HTML 부분을 보여줄 수 있습니까? @aWebDeveloper
Sándor Zuboly

@aWebDeveloper는 홈페이지에 대한 답변이나 질문에 부딪 치도록 편집을 수정하는 것은 규칙에 위배됩니다.
TylerH

@aWebDeveloper 비활성 질문에 대한 이전 답변을 편집했습니다.이 질문은 첫 페이지로 올라가고 답변으로 바로 연결되는 링크를 제공합니다. 답변을 추가하거나 변경할 관련 정보가있는 경우에 좋습니다. 따옴표 블록에 문장 중 하나를 삽입하면 모든 사람에게 유용하지 않습니다.
TylerH

@VadimOvchinnikov 작동합니다 ... 여기에 아무것도 크롬 특정는 없다
aWebDeveloper

6

내 인터넷 검색에서 확인란 스타일을 만드는 가장 쉬운 방법입니다. 그냥 추가 :after:checked:afterCSS 당신의 디자인을 기반으로.

body{
  background: #DDD;
}
span{
  margin-left: 30px;
}
input[type=checkbox] {
    cursor: pointer;
    font-size: 17px;
    visibility: hidden;
    position: absolute;
    top: 0;
    left: 0;
    transform: scale(1.5);
}

input[type=checkbox]:after {
    content: " ";
    background-color: #fff;
    display: inline-block;
    color: #00BFF0;
    width: 14px;
    height: 19px;
    visibility: visible;
    border: 1px solid #FFF;
    padding: 0 3px;
    margin: 2px 0;
    border-radius: 8px;
    box-shadow: 0 0 15px 0 rgba(0,0,0,0.08), 0 0 2px 0 rgba(0,0,0,0.16);
}

input[type=checkbox]:checked:after {
    content: "\2714";
    display: unset;
    font-weight: bold;
}
<input type="checkbox"> <span>Select Text</span>


의사 요소를 지원하는 브라우저를위한 매우 멋진 솔루션입니다. :)
Jean-François Beauchamp

6

일반 CSS3로 확인란 스타일을 수정하십시오. JS 및 HTML 조작이 필요하지 않습니다.

.form input[type="checkbox"]:before {
  display: inline-block;
  font: normal normal normal 14px/1 FontAwesome;
  font-size: inherit;
  text-rendering: auto;
  -webkit-font-smoothing: antialiased;
  content: "\f096";
  opacity: 1 !important;
  margin-top: -25px;
  appearance: none;
  background: #fff;
}

.form input[type="checkbox"]:checked:before {
  content: "\f046";
}

.form input[type="checkbox"] {
  font-size: 22px;
  appearance: none;
  -webkit-appearance: none;
  -moz-appearance: none;
}
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" />

<form class="form">
  <input type="checkbox" />
</form>


@VadimOvchinnikov 우리는 약간의 HTML 구조 .. 다음에 필요 하나 개의 솔루션이 stackoverflow.com/questions/23305780/...
BEJGAM 시바 프라 사드

4

간단하고 가벼운 템플릿 :

input[type=checkbox] {
  cursor: pointer;
}

input[type=checkbox]:checked:before {
  content: "\2713";
  background: #fffed5;
  text-shadow: 1px 1px 1px rgba(0, 0, 0, .2);
  font-size: 20px;
  text-align: center;
  line-height: 8px;
  display: inline-block;
  width: 13px;
  height: 15px;
  color: #00904f;
  border: 1px solid #cdcdcd;
  border-radius: 4px;
  margin: -3px -3px;
  text-indent: 1px;
}

input[type=checkbox]:before {
  content: "\202A";
  background: #ffffff;
  text-shadow: 1px 1px 1px rgba(0, 0, 0, .2);
  font-size: 20px;
  text-align: center;
  line-height: 8px;
  display: inline-block;
  width: 13px;
  height: 15px;
  color: #00904f;
  border: 1px solid #cdcdcd;
  border-radius: 4px;
  margin: -3px -3px;
  text-indent: 1px;
}
<input type="checkbox" checked="checked">checked1<br>
<input type="checkbox">unchecked2<br>
<input type="checkbox" checked="checked" id="id1">
<label for="id1">checked2+label</label><br>
<label for="id2">unchecked2+label+rtl</label>
<input type="checkbox" id="id2">
<br>

https://jsfiddle.net/rvgccn5b/


1
의 의사 요소 input는 Chrome에서만 지원되며 모든 브라우저에서 코드가 동일하게 작동하지는 않습니다.
Vadim Ovchinnikov

4

가장 쉬운 방법은 스타일을 지정 label하고 checkbox보이지 않게 만드는 것입니다.

HTML

<input type="checkbox" id="first" />
<label for="first">&nbsp;</label>

CSS

checkbox {
  display: none;
}

checkbox + label {
  /* Style for checkbox normal */
  width: 16px;
  height: 16px;
}

checkbox::checked + label,
label.checked {
  /* Style for checkbox checked */
}

은 ( checkbox는) 숨겨져 있어도 액세스 할 수 있으며 양식을 제출하면 값이 전송됩니다. 오래된 브라우저의 당신은의 클래스를 변경해야 할 수도 있습니다 label내가 인터넷 익스플로러의 이전 버전을 이해 생각하지 않기 때문에 자바 스크립트를 사용하여 확인하기 위해 ::checkedcheckbox.


4
당신의 대답과 나의 차이점은 정확히 무엇입니까?
Blake Pettersson

당신이 올바른지 @BlakePettersson :: 검사는 (심지어 그냥도 사용할 수있어 경우에 시도) 단지 잘못된 것입니다)
ESP

7
이것은 나쁜 대답입니다. (a) ::checked잘못되었습니다 :checked. (b) checkbox잘못 되었음 — [type=checkbox]
Chris Morgan

4

이케! 이 모든 해결 방법으로 인해 HTML 확인란의 스타일을 지정하려는 경우 짜증납니다.

미리, 이것은 CSS 구현이 아닙니다. 다른 사람이 유용하다고 생각하는 경우에 대비하여 해결 방법을 공유하겠다고 생각했습니다.


HTML5 canvas요소를 사용했습니다 .

이것의 단점은 외부 이미지를 사용할 필요가 없으며 대역폭을 절약 할 수 있다는 것입니다.

단점은 어떤 이유로 브라우저가 올바르게 렌더링 할 수 없다면 대체가 없다는 것입니다. 이것이 2017 년에도 여전히 문제가되는지 여부는 논쟁의 여지가 있습니다.

최신 정보

이전 코드가 매우 추악하다는 것을 알았으므로 다시 작성하기로 결정했습니다.

Object.prototype.create = function(args){
    var retobj = Object.create(this);

    retobj.constructor(args || null);

    return retobj;
}

var Checkbox = Object.seal({
    width: 0,
    height: 0,
    state: 0,
    document: null,
    parent: null,
    canvas: null,
    ctx: null,

    /*
     * args:
     * name      default             desc.
     *
     * width     15                  width
     * height    15                  height
     * document  window.document     explicit document reference
     * target    this.document.body  target element to insert checkbox into
     */
    constructor: function(args){
        if(args === null)
            args = {};

        this.width = args.width || 15;
        this.height = args.height || 15;
        this.document = args.document || window.document;
        this.parent = args.target || this.document.body;
        this.canvas = this.document.createElement("canvas");
        this.ctx = this.canvas.getContext('2d');

        this.canvas.width = this.width;
        this.canvas.height = this.height;
        this.canvas.addEventListener("click", this.ev_click(this), false);
        this.parent.appendChild(this.canvas);
        this.draw();
    },

    ev_click: function(self){
        return function(unused){
            self.state = !self.state;
            self.draw();
        }
    },

    draw_rect: function(color, offset){
        this.ctx.fillStyle = color;
        this.ctx.fillRect(offset, offset,
                this.width - offset * 2, this.height - offset * 2);
    },

    draw: function(){
        this.draw_rect("#CCCCCC", 0);
        this.draw_rect("#FFFFFF", 1);

        if(this.is_checked())
            this.draw_rect("#000000", 2);
    },

    is_checked: function(){
        return !!this.state;
    }
});

작동하는 데모 는 다음과 같습니다 .

새 버전은 프로토 타입과 차등 상속을 사용하여 확인란을 만들기위한 효율적인 시스템을 만듭니다. 확인란을 만들려면

var my_checkbox = Checkbox.create();

그러면 즉시 확인란을 DOM에 추가하고 이벤트를 연결합니다. 확인란이 선택되어 있는지 확인하려면 :

my_checkbox.is_checked(); // True if checked, else false

또한 루프를 제거했습니다.

업데이트 2

마지막 업데이트에서 언급하지 않은 것은 캔버스를 사용하면 원하는 것처럼 보이는 확인란을 만드는 것보다 더 많은 이점이 있다는 것입니다. 원하는 경우 다중 상태 확인란을 만들 수도 있습니다 .

Object.prototype.create = function(args){
    var retobj = Object.create(this);

    retobj.constructor(args || null);

    return retobj;
}

Object.prototype.extend = function(newobj){
    var oldobj = Object.create(this);

    for(prop in newobj)
        oldobj[prop] = newobj[prop];

    return Object.seal(oldobj);
}

var Checkbox = Object.seal({
    width: 0,
    height: 0,
    state: 0,
    document: null,
    parent: null,
    canvas: null,
    ctx: null,

    /*
     * args:
     * name      default             desc.
     *
     * width     15                  width
     * height    15                  height
     * document  window.document     explicit document reference
     * target    this.document.body  target element to insert checkbox into
     */
    constructor: function(args){
        if(args === null)
            args = {};

        this.width = args.width || 15;
        this.height = args.height || 15;
        this.document = args.document || window.document;
        this.parent = args.target || this.document.body;
        this.canvas = this.document.createElement("canvas");
        this.ctx = this.canvas.getContext('2d');

        this.canvas.width = this.width;
        this.canvas.height = this.height;
        this.canvas.addEventListener("click", this.ev_click(this), false);
        this.parent.appendChild(this.canvas);
        this.draw();
    },

    ev_click: function(self){
        return function(unused){
            self.state = !self.state;
            self.draw();
        }
    },

    draw_rect: function(color, offsetx, offsety){
        this.ctx.fillStyle = color;
        this.ctx.fillRect(offsetx, offsety,
                this.width - offsetx * 2, this.height - offsety * 2);
    },

    draw: function(){
        this.draw_rect("#CCCCCC", 0, 0);
        this.draw_rect("#FFFFFF", 1, 1);
        this.draw_state();
    },

    draw_state: function(){
        if(this.is_checked())
            this.draw_rect("#000000", 2, 2);
    },

    is_checked: function(){
        return this.state == 1;
    }
});

var Checkbox3 = Checkbox.extend({
    ev_click: function(self){
        return function(unused){
            self.state = (self.state + 1) % 3;
            self.draw();
        }
    },

    draw_state: function(){
        if(this.is_checked())
            this.draw_rect("#000000", 2, 2);

        if(this.is_partial())
            this.draw_rect("#000000", 2, (this.height - 2) / 2);
    },

    is_partial: function(){
        return this.state == 2;
    }
});

Checkbox마지막 스 니펫에서 사용 된 부분을 좀 더 일반적으로 수정하여 3 가지 상태의 확인란으로 "확장"할 수있었습니다. 여기 데모가 있습니다. 보시다시피 이미 내장 확인란보다 더 많은 기능이 있습니다.

JavaScript와 CSS 중에서 선택할 때 고려해야 할 사항.

오래되고 잘못 설계된 코드

실무 데모

먼저 캔버스를 설정하십시오

var canvas = document.createElement('canvas'),
    ctx = canvas.getContext('2d'),
    checked = 0; // The state of the checkbox
canvas.width = canvas.height = 15; // Set the width and height of the canvas
document.body.appendChild(canvas);
document.body.appendChild(document.createTextNode(' Togglable Option'));

다음으로 캔버스 자체를 업데이트하는 방법을 고안하십시오.

(function loop(){
  // Draws a border
  ctx.fillStyle = '#ccc';
  ctx.fillRect(0,0,15,15);
  ctx.fillStyle = '#fff';
  ctx.fillRect(1, 1, 13, 13);
  // Fills in canvas if checked
  if(checked){
    ctx.fillStyle = '#000';
    ctx.fillRect(2, 2, 11, 11);
  }
  setTimeout(loop, 1000/10); // Refresh 10 times per second
})();

마지막 부분은 대화식으로 만드는 것입니다. 다행히도 매우 간단합니다.

canvas.onclick = function(){
  checked = !checked;
}

JavaScript에서 이상한 이벤트 처리 모델로 인해 IE에서 문제가 발생할 수 있습니다.


나는 이것이 누군가를 돕기를 바랍니다. 그것은 내 요구에 꼭 맞았습니다.


확인란의 에뮬레이션으로 Canvas 구현은 내장 확인란보다 더 많은 기능을 허용합니다. 예를 들어, "다중 상태"확인란과 같은 멋진 기능 (예 : unchecked (e.g. unchecked -> checked -> "kinda" checked -> unchecked상태는 "명시 적 거짓", "명시 적 참", "기본값 사용"등을 나타낼 수 있음) 답변에 예를 추가하는 것을 고려하고 있습니다.
Braden Best

제 생각에는 끔찍한 생각입니다.

@ 닐 제발 정교하게
브 래든 베스트

왜 바퀴를 재발 명합니까?

@Neil 왜 바퀴를 재발견 하지 않습니까? NIH가 특히 나쁜 것은 아닙니다. 특히 기존 기술로 구현하기가 불가능하거나 어리석게 복잡한 이점을 제공 할 때 특히 그렇습니다. 따라서 기본 제공 확인란을 처리 할 의향이 있는지에 대한 질문입니다. 그리고 내 웹 사이트 또는 앱의 시각적 언어와 혼합되도록 테마를 만들고 싶다면 모든 권한을 원합니다. 그래서 누군가 가볍고 사용하기 쉬운 독립형 UI 라이브러리를 만들 때까지 개인적으로 바퀴를 여기에서 발명하는 것을 선호합니다. 다른 사람은 아니지만 내 대답을 무효화하지는 않습니다.
Braden Best

3

가장 간단한 방법이며이 스타일을 지정할 확인란을 선택할 수 있습니다.

CSS :

.check-box input {
  display: none;
}

.check-box span:before {
  content: ' ';
  width: 20px;
  height: 20px;
  display: inline-block;
  background: url("unchecked.png");
}

.check-box input:checked + span:before {
  background: url("checked.png");
}

HTML :

<label class="check-box">
  <input type="checkbox">
  <span>Check box Text</span>
</label>

3

JavaScript 또는 jQuery가 필요하지 않습니다 .

확인란 스타일을 간단하게 변경하십시오.

input[type="checkbox"] {
  display: none;
  border: none !important;
  box-shadow: none !important;
}

input[type="checkbox"] + label span {
  background: url(http://imgh.us/uncheck.png);
  width: 49px;
  height: 49px;
  display: inline-block;
  vertical-align: middle;
}

input[type="checkbox"]:checked + label span {
  background: url(http://imgh.us/check_2.png);
  width: 49px;
  height: 49px;
  vertical-align: middle;
}
<input type="checkbox" id="option" />
<label for="option"> <span></span> Click me </label>

여기에 JsFiddle 링크가 있습니다


이 확인란은 더 이상 온라인에서 사용할 수없는 이미지 파일 imgh.us/uncheck.pngimgh.us/check_2.png 에 대한 외부 링크를 사용하기 때문에 표시 되지 않습니다.
jkdev

2

다음은 CSS / HTML 전용 버전이며, jQuery 나 JavaScript가 전혀 필요하지 않습니다. 단순하고 깔끔한 HTML과 매우 간단하고 짧은 CSS입니다.

여기 JSFiddle이 있습니다

http://jsfiddle.net/v71kn3pr/

HTML은 다음과 같습니다.

<div id="myContainer">
    <input type="checkbox" name="myCheckbox" id="myCheckbox_01_item" value="red" />
    <label for="myCheckbox_01_item" class="box"></label>
    <label for="myCheckbox_01_item" class="text">I accept the Terms of Use.</label>
</div>

여기 CSS가 있습니다

#myContainer {
    outline: black dashed 1px;
    width: 200px;
}
#myContainer input[type="checkbox"][name="myCheckbox"] {
    display: none;
}
#myContainer input[type="checkbox"][name="myCheckbox"]:not(:checked) + label.box {
    display: inline-block;
    width: 25px;
    height: 25px;
    border: black solid 1px;
    background: #FFF ;
    margin: 5px 5px;
}
#myContainer input[type="checkbox"][name="myCheckbox"]:checked + label.box {
    display: inline-block;
    width: 25px;
    height: 25px;
    border: black solid 1px;
    background: #F00;
    margin: 5px 5px;
}
#myContainer input[type="checkbox"][name="myCheckbox"] + label + label.text {
    font: normal 12px arial;
    display: inline-block;
    line-height: 27px;
    vertical-align: top;
    margin: 5px 0px;
}

개별 라디오 또는 확인란, 확인란 그룹 및 라디오 버튼 그룹을 갖도록 조정할 수 있습니다.

이 html / css를 사용하면 레이블을 클릭하여 캡처 할 수 있으므로 레이블 만 클릭해도 확인란이 선택 및 선택 해제됩니다.

이 유형의 확인란 / 라디오 버튼은 문제없이 모든 형태와 완벽하게 작동합니다. PHP, ASP.NET (.aspx), JavaServer FacesColdFusion을 사용하여 테스트되었습니다 .


2
**Custom checkbox with css**  (WebKit browser solution only Chrome, Safari, Mobile browsers)

    <input type="checkbox" id="cardAccptance" name="cardAccptance" value="Yes">
    <label for="cardAccptance" class="bold"> Save Card for Future Use</label>

    /* The checkbox-cu */

    .checkbox-cu {
        display: block;
        position: relative;
        padding-left: 35px;
        margin-bottom: 0;
        cursor: pointer;
        font-size: 16px;
        -webkit-user-select: none;
        -moz-user-select: none;
        -ms-user-select: none;
        user-select: none;
    }


    /* Hide the browser's default checkbox-cu */

    .checkbox-cu input {
        position: absolute;
        opacity: 0;
        cursor: pointer;
        height: 0;
        width: 0;
    }


    /* Create a custom checkbox-cu */

    .checkmark {
        position: absolute;
        top: 4px;
        left: 0;
        height: 20px;
        width: 20px;
        background-color: #eee;
        border: 1px solid #999;
        border-radius: 0;
        box-shadow: none;
    }


    /* On mouse-over, add a grey background color */

    .checkbox-cu:hover input~.checkmark {
        background-color: #ccc;
    }


    /* When the checkbox-cu is checked, add a blue background */

    .checkbox-cu input:checked~.checkmark {
        background-color: transparent;
    }


    /* Create the checkmark/indicator (hidden when not checked) */

    .checkmark:after {
        content: "";
        position: absolute;
        display: none;
    }


    /* Show the checkmark when checked */

    .checkbox-cu input:checked~.checkmark:after {
        display: block;
    }


    /* Style the checkmark/indicator */

    .checkbox-cu .checkmark::after {
        left: 7px;
        top: 3px;
        width: 6px;
        height: 9px;
        border: solid #28a745;
        border-width: 0 2px 2px 0;
        -webkit-transform: rotate(45deg);
        -ms-transform: rotate(45deg);
        transform: rotate(45deg);
        z-index: 100;
    }

1
input[type=checkbox].css-checkbox {
    position: absolute;
    overflow: hidden;
    clip: rect(0 0 0 0);
    height: 1px;
    width: 1px;
    margin: -1px;
    padding: 0;
    border: 0;
}

input[type=checkbox].css-checkbox + label.css-label {
    padding-left: 20px;
    height: 15px;
    display: inline-block;
    line-height: 15px;
    background-repeat: no-repeat;
    background-position: 0 0;
    font-size: 15px;
    vertical-align: middle;
    cursor: pointer;
}

input[type=checkbox].css-checkbox:checked + label.css-label {
    background-position: 0 -15px;
}

.css-label{
    background-image:url(http://csscheckbox.com/checkboxes/dark-check-green.png);
}

순서대로 설명하겠습니다.
Peter Mortensen

1

아니요, 여전히 확인란 자체의 스타일을 지정할 수는 없지만 확인란 을 클릭하는 기능유지하면서 환상의 스타일을 지정하는 방법을 알아 냈습니다 . 텍스트를 선택하거나 드래그 앤 드롭을 트리거하지 않고 커서가 여전히 완벽하지 않은 경우에도 전환 할 수 있습니다!

이 솔루션은 아마도 라디오 버튼에도 적합합니다.

다음은 Internet Explorer 9, Firefox 30.0 및 Chrome 40.0.2214.91에서 작동하며 기본 예제 일뿐입니다. 여전히 배경 이미지 및 유사 요소와 함께 사용할 수 있습니다.

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>&nbsp;</span>Label text
</label>

1

Edge 및 Firefox와 같은 브라우저는 확인란 입력 태그에서 : before : after를 지원하지 않으므로 HTML 및 CSS를 사용하는 대안이 있습니다. 물론 요구 사항에 따라 CSS를 편집해야합니다.

확인란의 HTML을 다음과 같이 만드십시오.

<div class='custom-checkbox'>
    <input type='checkbox' />
    <label>
        <span></span>
        Checkbox label
    </label>
</div>

확인란에이 스타일을 적용하여 색상 레이블을 변경하십시오.

<style>
    .custom-checkbox {
        position: relative;
    }
    .custom-checkbox input{
        position: absolute;
        left: 0;
        top: 0;
        height:15px;
        width: 50px;    /* Expand the checkbox so that it covers */
        z-index : 1;    /* the label and span, increase z-index to bring it over */
        opacity: 0;     /* the label and set opacity to 0 to hide it. */
    }
    .custom-checkbox input+label {
        position: relative;
        left: 0;
        top: 0;
        padding-left: 25px;
        color: black;
    }
    .custom-checkbox input+label span {
        position: absolute;  /* a small box to display as checkbox */
        left: 0;
        top: 0;
        height: 15px;
        width: 15px;
        border-radius: 2px;
        border: 1px solid black;
        background-color: white;
    }
    .custom-checkbox input:checked+label { /* change label color when checked */
        color: orange;
    }
    .custom-checkbox input:checked+label span{ /* change span box color when checked */
        background-color: orange;
        border: 1px solid orange;
    }
</style>

1

CSS 만 사용하여 확인란의 색상을 회색조로 변경할 수 있습니다.

다음은 확인란을 검은 색에서 회색으로 변환합니다 (원하는 것).

input[type="checkbox"] {
    opacity: .5;
}

이것은 테두리를 밝게 만듭니다. 또한 확인하면 수표를 실제로 볼 수 없습니다.
Rachel S

1

SCSS / SASS 구현

보다 현대적인 접근 방식

SCSS를 사용하거나 SASS로 쉽게 변환하는 사용자에게는 다음이 도움이 될 것입니다. 효과적으로, 체크 박스 옆에 요소를 만들면 스타일을 지정할 것입니다. 확인란을 클릭하면 CSS가 자매 요소의 스타일을 새롭고 체크 된 스타일로 다시 스타일링합니다. 코드는 다음과 같습니다.

label.checkbox {
  input[type="checkbox"] {
    visibility: hidden;
    display: block;
    height: 0;
    width: 0;
    position: absolute;
    overflow: hidden;

    &:checked + span {
      background: $accent;
    }
  }

  span {
    cursor: pointer;
    height: 15px;
    width: 15px;
    border: 1px solid $accent;
    border-radius: 2px;
    display: inline-block;
    transition: all 0.2s $interpol;
  }
}
<label class="checkbox">
    <input type="checkbox" />
    <span></span>
    Label text
</label>


0

경고 : 글을 쓰는 시점에는 다음과 같은 사실이 있었지만 그 동안 상황은 발전했습니다.

AFAIK 최신 브라우저는 기본 OS 컨트롤을 사용하여 확인란을 표시하므로 스타일을 지정할 방법이 없습니다.


30
'10 년에 맞았지만 지금은 그렇지 않습니다.이 답변을 삭제해야합니다.
Michał K

3
여전히 그렇습니다-모든 최신 브라우저는 기본 OS 제어를 사용하여 확인란을 표시합니다. 이 제한을 해결하기위한 몇 가지 멋진 새로운 기술이 있습니다.
Gal

예, "스타일을
지정할
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.