Cách tạo kiểu hộp kiểm bằng CSS


831

Tôi đang cố gắng tạo kiểu cho một hộp kiểm bằng cách sử dụng như sau:

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

Nhưng phong cách không được áp dụng. Hộp kiểm vẫn hiển thị kiểu mặc định của nó. Làm thế nào để tôi cung cấp cho nó phong cách được chỉ định?



1
tôi nghĩ rằng bạn đang tìm kiếm một cái gì đó như thế này: asimishaq.com/myfiles/image-checkbox Xem bài đăng này: stackoverflow.com/questions/16352864/...
Asim-Ishaq


1
các liên kết là trong các bình luận ở trên. anyway: blog.felixhagspiel.de/index.php/posts/custom-inputs
Felix Hagspiel

1
Ồ Nhìn vào tất cả những câu trả lời tôi chỉ cần nói, Tất cả công việc này chỉ để đặt một hộp kiểm theo kiểu trên màn hình
Michael

Câu trả lời:


784

CẬP NHẬT:

Câu trả lời dưới đây tham khảo trạng thái của mọi thứ trước khi có sẵn CSS 3. Trong các trình duyệt hiện đại (bao gồm cả Internet Explorer 9 trở lên), việc tạo các thay thế hộp kiểm với kiểu dáng ưa thích của bạn sẽ dễ dàng hơn mà không cần sử dụng JavaScript.

Dưới đây là một số liên kết hữu ích:

Điều đáng chú ý là vấn đề cơ bản không thay đổi. Bạn vẫn không thể áp dụng trực tiếp các kiểu (viền, v.v.) cho thành phần hộp kiểm và các kiểu đó có ảnh hưởng đến việc hiển thị hộp kiểm HTML. Tuy nhiên, điều đã thay đổi là giờ đây có thể ẩn hộp kiểm thực tế và thay thế nó bằng một yếu tố theo kiểu của riêng bạn, không sử dụng gì ngoài CSS. Đặc biệt, vì CSS hiện có :checkedbộ chọn được hỗ trợ rộng rãi , bạn có thể làm cho sự thay thế của mình phản ánh chính xác trạng thái đã chọn của hộp.


TRẢ LỜI

Đây là một bài viết hữu ích về hộp kiểm kiểu dáng . Về cơ bản, người viết đó nhận thấy rằng nó thay đổi rất nhiều từ trình duyệt này sang trình duyệt khác và nhiều trình duyệt luôn hiển thị hộp kiểm mặc định cho dù bạn có tạo kiểu như thế nào. Vì vậy, thực sự không phải là một cách dễ dàng.

Không khó để tưởng tượng một cách giải quyết trong đó bạn sẽ sử dụng JavaScript để phủ lên một hình ảnh trên hộp kiểm và có các nhấp chuột vào hình ảnh đó khiến hộp kiểm thực sự được chọn. Người dùng không có JavaScript sẽ thấy hộp kiểm mặc định.

Đã chỉnh sửa để thêm: đây là một kịch bản hay thực hiện điều này cho bạn ; nó ẩn phần tử hộp kiểm thực, thay thế nó bằng một nhịp theo kiểu và chuyển hướng các sự kiện nhấp chuột.


34
Câu trả lời này đang già đi! Liên kết chính dẫn đến một trang web so sánh các kiểu IE6 và IE7 ...
Jonatan Littke

7
Điểm công bằng - và điểm cơ bản không thực sự đúng nữa, trong các trình duyệt hiện đại. Tôi đã cập nhật một số liên kết mới hơn, nhưng để lại bản gốc làm tài nguyên cho các trình duyệt cũ hơn.
Jacob Mattison

3
Trình tạo hộp kiểm CSS dễ dàng , thực sự dễ dàng và thân thiện với n00b. Đi kèm với GUI để tạo tùy chỉnh quá! Được đánh giá cao. :)
CZ

Tôi quan tâm đến câu trả lời cũ vì tôi muốn tính năng này tương thích với IE8 + và các trình duyệt khác (chrome, firefox & safari). Tuy nhiên tôi không thể tìm thấy nhiều phản hồi liên quan đến plugin mà bạn đề xuất ryanfait.com/resource/custom-checkboxes-and-radio-buttons
Adrien Be

2
Đây không phải là một câu trả lời rất hữu ích - nó chỉ là một danh sách các bài báo, hầu hết trong số đó đã rất cũ.
Steve Bennett

141

Có một cách để làm điều này bằng cách chỉ sử dụng CSS. Chúng ta có thể (ab) sử dụng labelphần tử và kiểu dáng phần tử đó để thay thế. Thông báo trước là điều này sẽ không hoạt động đối với Internet Explorer 8 và các phiên bản thấp hơn.

.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 điều này sẽ hoạt động cho bất kỳ trình duyệt nào hỗ trợ: lớp giả được kiểm tra, mà IE8 KHÔNG hỗ trợ. Bạn có thể kiểm tra xem điều này có hoạt động với selectivizr.com - có thêm hỗ trợ cho: đã kiểm tra và bạn bè.
Blake Pettersson

Nói cách khác, IE9 và các phiên bản mới hơn hỗ trợ: đã chọn.
Blake Pettersson

1
Có một polyfill cho IE8 trở xuống: github.com/rdebeasi/checked-polyfill
Tim

Nó hoạt động, nhưng lần đầu tiên nó nhấp nháy. Tại sao nó lại xảy ra?
Technophyle

Tôi tin rằng các ẩn inputkhông bao giờ lấy trọng tâm bàn phím, vì vậy những thứ này không thể truy cập bằng bàn phím.
sam

139

Bạn có thể đạt được hiệu ứng hộp kiểm tùy chỉnh khá thú vị bằng cách sử dụng các khả năng mới đi kèm với các lớp :after:beforegiả. Ưu điểm của việc này là: Bạn không cần thêm bất cứ thứ gì vào DOM, chỉ cần hộp kiểm tiêu chuẩn.

Lưu ý điều này sẽ chỉ hoạt động cho các trình duyệt tương thích. Tôi tin rằng điều này có liên quan đến thực tế là một số trình duyệt không cho phép bạn đặt :after:beforetrên các yếu tố đầu vào. Điều không may có nghĩa là hiện tại chỉ có các trình duyệt WebKit được hỗ trợ. Firefox + Internet Explorer vẫn sẽ cho phép các hộp kiểm hoạt động, không bị chặn và điều này hy vọng sẽ thay đổi trong tương lai (mã không sử dụng tiền tố của nhà cung cấp).

Đây chỉ là giải pháp trình duyệt WebKit (trình duyệt Chrome, Safari, Mobile)

Xem ví dụ Fiddle

$(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>

Phần thưởng kiểu Webkit flipswitch fiddle

$(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: Fiddle chỉ hiển thị các hộp kiểm mặc định. Không có gì khác nhau.
robsch

1
@robsch Điều này được chỉ ra rõ ràng trong bài viết gốc. Phiên bản của firefox hoặc OS không liên quan, nó không hoạt động trong firefox. "FF + IE vẫn sẽ cho phép các hộp kiểm hoạt động, chỉ không theo kiểu ..."
Josh Mc

Một cách tiếp cận tốt. Nhưng không phải tất cả các trình duyệt làm điều đó tốt. Chỉ Chrome mới có đầu ra tốt nhất theo như tôi đã kiểm tra.
EA

Rất đẹp. Tuy nhiên ... Đây lại là một cách tiếp cận IE 5.x. Chỉ bộ webkit. Bởi vì nó không luôn tuân theo các quy tắc ... Đó là toàn bộ vấn đề với trình duyệt webkit.
Alex

1
Giải pháp tốt nhất! +1 Nhưng tôi không thấy lý do để viết một ví dụ lớn như vậy. 30 dòng để mô tả ý tưởng sẽ là đủ.
Andrii Bogachenko

136

Trước khi bạn bắt đầu (kể từ tháng 1 năm 2015)

Câu hỏi và câu trả lời ban đầu là ~ 5 tuổi. Như vậy, đây là một chút cập nhật.

Thứ nhất, có một số cách tiếp cận khi nói đến hộp kiểm kiểu dáng. nguyên lý cơ bản là:

  1. Bạn sẽ cần ẩn điều khiển hộp kiểm mặc định được tạo bởi trình duyệt của bạn và không thể bị ghi đè theo bất kỳ cách có ý nghĩa nào khi sử dụng CSS.

  2. Với điều khiển bị ẩn, bạn vẫn cần có khả năng phát hiện và chuyển trạng thái đã kiểm tra

  3. Trạng thái đã chọn của hộp kiểm sẽ cần được phản ánh bằng cách tạo kiểu cho phần tử mới

Giải pháp (về nguyên tắc)

Những điều trên có thể được thực hiện bằng một số phương tiện - và bạn sẽ thường nghe thấy sử dụng các phần tử giả CSS3 là đúng cách. Trên thực tế, không có cách nào đúng hay sai, nó phụ thuộc vào cách tiếp cận phù hợp nhất với bối cảnh bạn sẽ sử dụng. Điều đó nói rằng, tôi có một cách ưa thích.

  1. Bọc hộp kiểm của bạn trong một labelyếu tố. Điều này có nghĩa là ngay cả khi nó bị ẩn, bạn vẫn có thể chuyển trạng thái đã kiểm tra khi nhấp vào bất kỳ vị trí nào trong nhãn.

  2. Ẩn hộp kiểm của bạn

  3. Thêm một yếu tố mới sau hộp kiểm mà bạn sẽ tạo kiểu cho phù hợp. Nó phải xuất hiện sau hộp kiểm để có thể được chọn bằng CSS và được tạo kiểu tùy thuộc vào :checkedtrạng thái. CSS không thể chọn 'ngược'.

Giải pháp (bằng mã)

Sàng lọc (sử dụng biểu tượng)

Nhưng này! Tôi nghe bạn hét lên. Điều gì về nếu tôi muốn hiển thị một đánh dấu nhỏ hoặc chéo trong hộp? Và tôi không muốn sử dụng hình nền!

Chà, đây là lúc các yếu tố giả của CSS3 có thể phát huy tác dụng. Chúng hỗ trợ thuộc contenttính cho phép bạn thêm các biểu tượng Unicode đại diện cho một trong hai trạng thái. Ngoài ra, bạn có thể sử dụng nguồn biểu tượng phông chữ của bên thứ ba như phông chữ tuyệt vời (mặc dù đảm bảo rằng bạn cũng đặt liên quan font-family, ví dụ như FontAwesome)

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
Ngoại trừ: HTML đơn giản hóa, CSS đơn giản hóa, giải thích chi tiết.
SW4

4
@AnthonyHayward - câu trả lời được cập nhật, điều này là do sử dụng màn hình: không có gì không khởi tạo điều khiển theo cách có thể lập bảng, tôi đã thay đổi
SW4

1
Tôi đã vật lộn để tìm một ví dụ trong đó hộp kiểm nằm trong nhãn thay vì trước / sau nó. Đây là một giải pháp tài liệu và giải thích rất tốt. Thật tuyệt vời khi thấy câu trả lời này được cập nhật vào tháng 1 năm 2016.
Clarus Dignus 16/1/2016

1
Vẫn không thể tabbable với display: none.
sam

2
Thay thế visibility: hidden;bằng opacity: 0 !important;nếu bạn vẫn gặp sự cố với tab.
jabacchetta

40

Tôi sẽ làm theo lời khuyên về câu trả lời của SW4 - để ẩn hộp kiểm và che nó bằng một khoảng tùy chỉnh, gợi ý HTML này:

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

Gói trong nhãn gọn gàng cho phép nhấp vào văn bản mà không cần liên kết thuộc tính "for-id". Tuy nhiên,

Đừng che giấu nó bằng cách sử dụng visibility: hiddenhoặcdisplay: none

Nó hoạt động bằng cách nhấp hoặc nhấn, nhưng đó là một cách khập khiễng để sử dụng các hộp kiểm. Một số người vẫn sử dụng hiệu quả hơn nhiều Tabđể di chuyển tiêu điểm, Spacekích hoạt và ẩn với phương thức đó sẽ vô hiệu hóa nó. Nếu biểu mẫu dài, người ta sẽ lưu cổ tay của ai đó để sử dụng tabindexhoặc accesskeythuộc tính. Và nếu bạn quan sát hành vi hộp kiểm hệ thống, có một bóng khá tốt trên di chuột. Các hộp kiểm theo kiểu cũng nên theo hành vi này.

Câu trả lời của cobberboy đề xuất Font Awesome thường tốt hơn bitmap vì phông chữ là các vectơ có thể mở rộng. Làm việc với HTML ở trên, tôi đề xuất các quy tắc CSS này:

  1. Ẩn các hộp kiểm

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

    Tôi chỉ sử dụng tiêu cực z-indexvì ví dụ của tôi sử dụng da hộp kiểm đủ lớn để che nó hoàn toàn. Tôi không khuyên bạn left: -999pxvì nó không thể tái sử dụng trong mọi bố cục. Câu trả lời của Bushan wagh cung cấp một cách chống đạn để che giấu nó và thuyết phục trình duyệt sử dụng tabindex, vì vậy đây là một cách thay thế tốt. Dù sao, cả hai chỉ là một hack. Cách thích hợp ngày hôm nay là appearance: none, xem câu trả lời của Joost :

    input[type="checkbox"] {
      appearance: none;
      -webkit-appearance: none;
      -moz-appearance: none;
    }
  2. Nhãn hộp kiểm kiểu

    input[type="checkbox"] + span {
      font: 16pt sans-serif;
      color: #000;
    }
  3. Thêm hộp kiểm tra da

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

    \00f096là Font Awesome's square-o, phần đệm được điều chỉnh để cung cấp đường viền chấm đều trên tiêu điểm (xem bên dưới).

  4. Thêm hộp kiểm tra da

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

    \00f046là Font Awesome check-square-o, không có cùng chiều rộng square-o, đó là lý do cho kiểu chiều rộng ở trên.

  5. Thêm phác thảo tập trung

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

    Safari không cung cấp tính năng này (xem bình luận của @Jason Sankey), bạn nên sử dụng window.navigatorđể phát hiện trình duyệt và bỏ qua nếu đó là Safari.

  6. Đặt màu xám cho hộp kiểm bị vô hiệu hóa

    input[type="checkbox"]:disabled + span {
      color: #999;
    }
  7. Đặt bóng di chuột trên hộp kiểm không bị vô hiệu hóa

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

Demo Fiddle

Cố gắng di chuột qua các hộp kiểm và sử dụng TabShift+ Tabđể di chuyển và Spacechuyển đổi.


3
Upvote để bao quát vấn đề trọng tâm: các tùy chỉnh như thế này không nên loại bỏ chức năng cơ bản. Lưu ý rằng Safari không tập trung vào bàn phím cho các hộp kiểm (ngay cả những hộp mặc định), điều đó làm tôi bối rối trong giây lát khi thực hiện một giải pháp bao gồm xử lý tiêu điểm.
Jason Sankey

vẻ như các hộp kiểm trong đoạn trích không hoạt động nữa? Trên cửa sổ chrome 10
Félix Gagnon-Grenier

1
Câu trả lời tốt đẹp. Cung cấp cơ sở cho giải pháp của tôi - Tôi đã sử dụng nhãn hiện có sau đầu vào nơi bạn đã sử dụng một khoảng phụ và tôi nhận được hỗ trợ Edge & FF.
Jono

2
Hầu hết các câu trả lời bỏ qua khả năng tiếp cận. Tôi thích rằng câu trả lời này giữ điều đó trong chiến thuật.
tối đa

1
@maxshuty Tôi cũng thích cách tiếp cận của bạn: khi ai đó tạo thư viện, đôi khi, đó chỉ là một lời thú nhận rằng anh ta không thể viết mã đơn giản bằng ngôn ngữ bản địa mà mình chọn. IMHO FontAwgie đã làm hỏng kế hoạch miễn phí của họ bằng cách sử dụng javascript để tải phông chữ, nhưng tôi vẫn thích chúng khi chúng ở dạng nguồn mở và giấy phép miễn phí. Tôi thường kết thúc tập hợp giả mạo phông chữ của các biểu tượng miễn phí tôi cần trong dự án cụ thể (thường là tối đa 5kB). Tôi sẵn sàng trả tiền nếu họ tiết kiệm cho tôi công sức, nhưng không phải là 99 đô la điên rồ mỗi năm như họ đề xuất trong kế hoạch Pro của họ.
Jan Turoň

30

Bạn có thể định kiểu hộp kiểm với một mẹo nhỏ bằng cách sử dụng labelphần tử ví dụ bên dưới:

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

Và một FIDDLE cho mã trên. Lưu ý rằng một số CSS không hoạt động trong các phiên bản cũ hơn của trình duyệt, nhưng tôi chắc chắn có một số ví dụ JavaScript lạ mắt ngoài kia!


28

Giải pháp đơn giản để thực hiện và dễ dàng tùy chỉnh

Sau rất nhiều tìm kiếm và thử nghiệm, tôi đã nhận được giải pháp này rất đơn giản để thực hiện và dễ dàng tùy chỉnh hơn. Trong giải pháp này :

  1. Bạn không cần thư viện và tập tin bên ngoài
  2. Bạn không cần thêm HTML trong trang của mình
  3. Bạn không cần thay đổi tên hộp kiểm và id

Đơn giản đặt CSS trôi chảy ở đầu trang của bạn và tất cả kiểu hộp kiểm sẽ thay đổi như thế này:

Nhập mô tả hình ảnh ở đây

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
Đơn giản hơn là tốt hơn!
Adrian Moisa

Đây là một câu trả lời tuyệt vời, nó chỉ hoạt động mà không cần thêm bất cứ điều gì
HeavyHead

Tốt một và rất đơn giản
khalidh

Giải pháp tốt đẹp. Nhưng tôi không thấy nó hoạt động trên Firefox, IE hoặc Edge (không có hộp kiểm)
Jono

20

Bạn có thể tránh thêm đánh dấu thêm. Điều này hoạt động ở mọi nơi trừ IE cho Máy tính để bàn (nhưng hoạt động trong IE cho Windows Phone và Microsoft Edge) thông qua cài đặt CSS 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
Tôi thích cách tiếp cận này - nó hơi rắc rối vì bạn không bao giờ thực sự sử dụng ngoại hình trong css nhưng nó sạch sẽ hơn nhiều so với một số câu trả lời khác sử dụng trước và sau. Và đối với một cái gì đó như thế này tôi cảm thấy JavaScript là quá mức cần thiết.
Sprose

18

Tôi thích sử dụng phông chữ biểu tượng (như FontAwgie) vì nó dễ dàng sửa đổi màu sắc của chúng bằng CSS và chúng có tỷ lệ thực sự tốt trên các thiết bị có mật độ pixel cao. Vì vậy, đây là một biến thể CSS thuần túy khác, sử dụng các kỹ thuật tương tự như ở trên.

(Dưới đây là hình ảnh tĩnh để bạn có thể hình dung kết quả; xem JSFiddle để biết phiên bản tương tác.)

Ví dụ hộp kiểm

Cũng như các giải pháp khác, nó sử dụng labelphần tử. Một liền kề spangiữ nhân vật hộp kiểm của chúng tôi.

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>

Đây là JSFiddle cho nó.


.... những gì bạn mô tả giống như câu trả lời trước của Bhushan wagh, Jake, Jonathan Hodgson và Blake;)
SW4

7
@ SW4 Tôi đã tham chiếu đến thực tế đó, ngoại trừ câu trả lời này sử dụng phông chữ biểu tượng (điều mà không câu trả lời nào trước đây có). Đoạn đầu tiên làm cho điều đó khá rõ ràng.
cobberboy

Bạn cần thay thế font-family: FontAwesome;bằng font-family: 'Font Awesome\ 5 Free';và cập nhật nội dung unicode nếu bạn muốn làm cho nó hoạt động trong phiên bản mới.
SuN

12

Gần đây tôi tìm thấy một giải pháp khá thú vị cho vấn đề này.

Bạn có thể sử dụng appearance: none;để tắt kiểu mặc định của hộp kiểm và sau đó viết kiểu của riêng bạn trên đó giống như được mô tả ở đây (Ví dụ 4) .

Ví dụ

Thật không may, hỗ trợ trình duyệt là khá xấu cho appearancetùy chọn. Từ thử nghiệm cá nhân của tôi, tôi chỉ có Opera và Chrome hoạt động chính xác. Nhưng đây sẽ là cách để đơn giản hóa khi có hỗ trợ tốt hơn hoặc bạn chỉ muốn sử dụng Chrome / Opera.

"Tôi có thể sử dụng?" liên kết


Quả thực appearancechỉ là những gì chúng ta cần cho việc này; chỉ cần lưu ý rằng "không chuẩn và không theo dõi tiêu chuẩn" .
sam

12

Với CSS thuần túy, không có gì lạ mắt bằng :before:afterkhông có biến đổi, bạn có thể tắt giao diện mặc định và sau đó tạo kiểu cho nó bằng một hình nền nội tuyến như ví dụ sau. Điều này hoạt động trong Chrome, Firefox, Safari và giờ là 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
Đúng! Chỉ có một thứ thực sự đàng hoàng.
odinho - Velmont

10

Giải pháp của tôi

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>


Nếu ai đó có thể tư vấn tại sao văn bản của tôi không được căn chỉnh sau đó, tôi rất muốn biết! Người mới bắt đầu CSS ở đây.
agirault

8

Bạn chỉ có thể sử dụng appearance: nonetrên các trình duyệt hiện đại, do đó không có kiểu dáng mặc định và tất cả các kiểu của bạn được áp dụng đúng cách:

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
Đây là một ví dụ đặc biệt tối giản đã làm việc cho trường hợp của tôi, cảm ơn!
Jason R Stevens CFA

8

Muốn KHÔNG JavaScript, KHÔNG thư viện bên ngoài, Tuân thủ truy cập và cả Hộp kiểm và Nút radio?

Tôi đã cuộn và cuộn và hàng tấn câu trả lời này chỉ đơn giản là ném khả năng tiếp cận ra khỏi cửa và vi phạm WCAG theo nhiều cách. Tôi đã ném vào các nút radio vì hầu hết thời gian bạn đang sử dụng các hộp kiểm tùy chỉnh mà bạn cũng muốn các nút radio tùy chỉnh.

Câu đố :

  • Hộp kiểm - CSS thuần - miễn phí từ thư viện của bên thứ 3
  • Các nút radio - CSS thuần - miễn phí từ các thư viện của bên thứ 3
  • Các hộp kiểm * sử dụng FontAwgie nhưng có thể hoán đổi với Glyphicons, v.v.

Đi dự tiệc muộn nhưng không hiểu sao điều này vẫn còn khó khăn vào năm 2019 2020 nên tôi đã thêm ba giải pháp có thể truy cậpdễ dàng để tham gia.

Đây là tất cả JavaScript miễn phí , thư viện bên ngoài miễn phí *có thể truy cập ...

Nếu bạn muốn plug-n-play với bất kỳ thứ nào trong số này, chỉ cần sao chép biểu định kiểu từ các câu đố, chỉnh sửa mã màu trong CSS để phù hợp với nhu cầu của bạn và theo cách của bạn. Bạn có thể thêm một biểu tượng dấu kiểm Svg tùy chỉnh nếu bạn muốn cho các hộp kiểm. Tôi đã thêm rất nhiều ý kiến ​​cho những người không phải CSS.

Nếu bạn có văn bản dài hoặc một thùng chứa nhỏ và đang gặp phải gói văn bản bên dưới hộp kiểm hoặc đầu vào nút radio thì chỉ cần chuyển đổi sang div như thế này .

Giải thích dài hơn: Tôi cần một giải pháp không vi phạm WCAG, không dựa vào JavaScript hoặc các thư viện bên ngoài và không phá vỡ điều hướng bàn phím như tab hoặc phím cách để chọn, cho phép các sự kiện tập trung, một giải pháp cho phép các hộp kiểm bị vô hiệu hóa đều được kiểm tra và không được kiểm soát, và cuối cùng là một giải pháp mà tôi có thể tùy biến giao diện của hộp kiểm tuy nhiên tôi muốn với nhau background-color's, border-radius, svghình nền vv

Tôi đã sử dụng một số kết hợp của câu trả lời này từ @Jan Turoň để đưa ra giải pháp của riêng tôi mà dường như hoạt động khá tốt. Tôi đã thực hiện một fiddle nút radio sử dụng rất nhiều mã giống nhau từ các hộp kiểm để làm cho công việc này với các nút radio.

Tôi vẫn đang học khả năng truy cập vì vậy nếu tôi bỏ lỡ điều gì đó, vui lòng gửi bình luận và tôi sẽ cố gắng sửa nó ở đây là một ví dụ mã về các hộp kiểm của tôi:

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>


Tôi cũng đã thêm câu trả lời của riêng mình ở đây , hy vọng nó sẽ giúp được ai đó. Tôi sử dụng chủ đề trong tôi. :) Hy vọng ai đó nhìn thấy nó.
Ông Polywhirl

6

Đây là một giải pháp CSS đơn giản mà không cần bất kỳ mã jQuery hoặc JavaScript nào.

Tôi đang sử dụng các biểu tượng FontAwseome nhưng bạn có thể sử dụng bất kỳ hình ảnh nào

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
Không giống như hầu hết các câu trả lời khác, câu trả lời này không yêu cầu tạo thêm labelhoặc spancác yếu tố. Nó chỉ hoạt động!
KurtPreston

Bạn có thể hiển thị một ví dụ hoặc bản demo hoặc ít nhất là phần HTML mà mã CSS này đang hoạt động không? @aWebDeveloper
Sándor Zuboly

@aWebDeveloper thực hiện các chỉnh sửa inane để trả lời câu hỏi hoặc câu hỏi cho trang chủ là trái với quy tắc.
TylerH

@aWebDeveloper Bạn đã chỉnh sửa một câu trả lời cũ cho một câu hỏi không hoạt động, nó đưa nó lên trang nhất và cung cấp một liên kết thẳng đến câu trả lời của bạn. Điều này tốt nếu bạn có thông tin thích hợp để thêm hoặc thay đổi câu trả lời. Tất cả những gì bạn đã làm là nhúng một trong những câu của bạn vào một khối trích dẫn, điều này không hữu ích với bất kỳ ai.
TylerH

nên hoạt động @VadimOvchinnikov ... không có gì ở đây là chrome cụ thể
aWebDeveloper 26/07/17

6

Từ googling của tôi, đây là cách dễ nhất để tạo kiểu hộp kiểm. Chỉ cần thêm :after:checked:afterCSS dựa trên thiết kế của bạn.

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>


Giải pháp rất tuyệt vời cho các trình duyệt hỗ trợ các yếu tố giả. :)
Jean-François Beauchamp

6

Sửa đổi kiểu hộp kiểm với CSS3 đơn giản, không yêu cầu bất kỳ thao tác JS & HTML nào.

.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 Chúng tôi có một giải pháp yêu cầu tuân theo một số cấu trúc html .. stackoverflow.com/questions/23305780/
Kẻ

4

Một mẫu đơn giản và nhẹ là tốt:

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
Giả cho inputs chỉ được hỗ trợ trong Chrome, mã của bạn không hoạt động giống nhau trong mọi trình duyệt.
Vadim Ovchinnikov

4

Tôi nghĩ rằng cách dễ nhất để làm điều đó là bằng cách tạo kiểu a labelvà làm cho checkboxvô hình.

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 */
}

Các checkbox, mặc dù nó được ẩn, vẫn có thể truy cập, và giá trị của nó sẽ được gửi khi một mẫu được gửi. Đối với các trình duyệt cũ bạn có thể phải thay đổi lớp của labelđể checked sử dụng JavaScript bởi vì tôi không nghĩ rằng phiên bản cũ của trình duyệt Internet Explorer hiểu ::checkedtrên checkbox.


4
Sự khác biệt giữa câu trả lời của bạn và của tôi là chính xác là gì?
Blake Pettersson

@BlakePettersson của bạn là chính xác, :: đã kiểm tra là sai (tôi thậm chí đã thử chỉ trong trường hợp nó cũng được cho phép);)
đặc biệt là

7
Đây là một câu trả lời xấu. (a) ::checkedlà sai, nó nên được :checked. (b) checkboxlà sai, nên là[type=checkbox]
Chris Morgan

4

Rất tiếc! Tất cả các cách giải quyết này đã đưa tôi đến kết luận rằng loại hộp kiểm HTML rất tệ nếu bạn muốn tạo kiểu cho nó.

Như một lời cảnh báo trước, đây không phải là một triển khai CSS. Tôi chỉ nghĩ rằng tôi sẽ chia sẻ cách giải quyết mà tôi đã nghĩ ra trong trường hợp bất kỳ ai khác có thể thấy nó hữu ích.


Tôi đã sử dụng canvasphần tử HTML5 .

Mặt trái của điều này là bạn không phải sử dụng hình ảnh bên ngoài và có thể tiết kiệm một số băng thông.

Nhược điểm là nếu một trình duyệt vì một lý do nào đó không thể hiển thị chính xác, thì sẽ không có dự phòng. Mặc dù điều này vẫn còn là một vấn đề trong năm 2017 đang gây tranh cãi.

Cập nhật

Tôi thấy mã cũ khá xấu, vì vậy tôi quyết định viết lại.

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

Đây là một bản demo hoạt động .

Phiên bản mới sử dụng nguyên mẫu và kế thừa vi sai để tạo ra một hệ thống hiệu quả để tạo các hộp kiểm. Để tạo một hộp kiểm:

var my_checkbox = Checkbox.create();

Điều này sẽ ngay lập tức thêm hộp kiểm vào DOM và kết nối các sự kiện. Để truy vấn xem hộp kiểm có được chọn hay không:

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

Cũng cần lưu ý là tôi đã thoát khỏi vòng lặp.

Cập nhật 2

Một cái gì đó tôi đã bỏ qua để đề cập đến trong bản cập nhật mới nhất là việc sử dụng canvas có nhiều lợi thế hơn là chỉ tạo một hộp kiểm trông giống như bạn muốn nó nhìn. Bạn cũng có thể tạo các hộp kiểm đa trạng thái , nếu bạn muốn.

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

Tôi đã sửa đổi một chút cái Checkboxđược sử dụng trong đoạn trích cuối để nó chung chung hơn, giúp nó có thể "mở rộng" nó bằng một hộp kiểm có 3 trạng thái. Đây là bản demo . Như bạn có thể thấy, nó đã có nhiều chức năng hơn hộp kiểm tích hợp.

Một cái gì đó để xem xét khi bạn chọn giữa JavaScript và CSS.

Mã cũ, thiết kế kém

Trình diễn làm việc

Đầu tiên, thiết lập một khung vẽ

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'));

Tiếp theo, nghĩ ra một cách để có bản cập nhật canvas.

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

Phần cuối cùng là làm cho nó tương tác. May mắn thay, nó khá đơn giản:

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

Đây là nơi bạn có thể gặp sự cố trong IE, do mô hình xử lý sự kiện kỳ ​​lạ của họ trong JavaScript.


Tôi hi vọng điêu nay se giup được ai đo; nó chắc chắn phù hợp với nhu cầu của tôi


Lưu ý rằng việc triển khai Canvas, dưới dạng mô phỏng các hộp kiểm, cho phép nhiều chức năng hơn các hộp kiểm tích hợp. Ví dụ: các công cụ ưa thích như hộp kiểm "đa trạng thái" (ví dụ unchecked (e.g. unchecked -> checked -> "kinda" checked -> unchecked: các trạng thái có thể đại diện cho "rõ ràng sai", "rõ ràng đúng", "sử dụng mặc định", ví dụ). Tôi đang xem xét thêm một ví dụ cho câu trả lời.
Braden hay nhất

Ý tưởng khủng khiếp theo ý kiến ​​của tôi.

@Neil vui lòng giải thích
Braden hay nhất

Tại sao phải phát minh lại bánh xe?

@Neil tại sao không phát minh lại bánh xe? NIH không phải lúc nào cũng là một điều xấu, đặc biệt là khi nó mang lại những lợi thế mà nếu không thì không thể hoặc phức tạp một cách ngu ngốc để thực hiện với công nghệ hiện có. Vì vậy, đó là một câu hỏi về việc bạn có sẵn sàng đối phó với các hộp kiểm tích hợp hay không. Và nếu tôi muốn chủ đề chúng hòa trộn với ngôn ngữ hình ảnh của trang web hoặc ứng dụng của tôi, tôi muốn toàn quyền kiểm soát. Vì vậy, cho đến khi ai đó tạo ra một thư viện UI độc lập, nhẹ và dễ sử dụng, cá nhân tôi thích bánh xe của mình được phát minh ở đây. Một số người khác có thể không, nhưng điều đó không làm mất hiệu lực câu trả lời của tôi.
Braden hay nhất

3

Đây là cách đơn giản nhất và bạn có thể chọn hộp kiểm nào để tạo kiểu này.

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

Không yêu cầu JavaScript hoặc jQuery .

Thay đổi kiểu hộp kiểm của bạn một cách đơn giản.

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>

Đây là liên kết JsFiddle


Hộp kiểm không hiển thị, vì nó phụ thuộc vào các liên kết bên ngoài đến các tệp hình ảnh imgh.us/uncheck.pngimgh.us/check_2.png không còn khả dụng trực tuyến.
jkdev

2

Đây là phiên bản chỉ có CSS ​​/ HTML, không cần jQuery hay JavaScript, HTML đơn giản và sạch sẽ và CSS thực sự đơn giản và ngắn.

Đây là JSFiddle

http://jsfiddle.net/v71kn3pr/

Đây là 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>

Đây là 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;
}

Điều này có thể được điều chỉnh để có thể có radio hoặc hộp kiểm riêng lẻ, các hộp kiểm tra và nhóm các nút radio.

Html / css này, sẽ cho phép bạn cũng bắt được nhấp vào nhãn, vì vậy hộp kiểm sẽ được kiểm tra và bỏ chọn ngay cả khi bạn chỉ nhấp vào nhãn.

Loại hộp kiểm / nút radio này hoạt động hoàn hảo với mọi hình thức, không có vấn đề gì cả. Đã được thử nghiệm bằng 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);
}

Một lời giải thích sẽ theo thứ tự.
Peter Mortensen

1

Không, bạn vẫn không thể tự tạo kiểu cho hộp kiểm, nhưng tôi (cuối cùng) đã tìm ra cách tạo ảo giác trong khi vẫn giữ chức năng nhấp vào hộp kiểm. Điều đó có nghĩa là bạn có thể chuyển đổi nó ngay cả khi con trỏ không hoàn toàn yên tĩnh mà không mạo hiểm chọn văn bản hoặc kích hoạt kéo và thả!

Giải pháp này có lẽ cũng phù hợp với các nút radio.

Các hoạt động sau đây trong Internet Explorer 9, Firefox 30.0 và Chrome 40.0.2214.91 và chỉ là một ví dụ cơ bản. Bạn vẫn có thể sử dụng nó kết hợp với hình nền và các yếu tố giả.

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

Vì các trình duyệt như Edge và Firefox không hỗ trợ: trước: sau trên các thẻ nhập hộp kiểm, nên đây là một giải pháp thay thế hoàn toàn với HTML và CSS. Tất nhiên bạn nên chỉnh sửa CSS theo yêu cầu của bạn.

Tạo HTML cho hộp kiểm như thế này:

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

Áp dụng kiểu này cho hộp kiểm để thay đổi nhãn màu

<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

Có vẻ như bạn có thể thay đổi màu của hộp kiểm tra theo thang độ xám chỉ bằng cách sử dụng CSS.

Sau đây chuyển đổi các hộp kiểm từ đen sang xám (đó là về những gì tôi muốn):

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

Điều này làm cho ánh sáng biên giới quá. Ngoài ra, bạn không thể thực sự nhìn thấy kiểm tra nếu bạn kiểm tra nó.
Rachel S

1

Triển khai SCSS / SASS

Một cách tiếp cận hiện đại hơn

Đối với những người sử dụng SCSS (hoặc dễ dàng chuyển đổi sang SASS), những điều sau đây sẽ hữu ích. Hiệu quả, tạo một yếu tố bên cạnh hộp kiểm, đó là yếu tố mà bạn sẽ tạo kiểu. Khi hộp kiểm được nhấp, CSS sẽ điều chỉnh lại phần tử chị em (theo kiểu mới, được kiểm tra của bạn). Mã dưới đây:

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

Cảnh báo : điều sau đây là đúng tại thời điểm viết, nhưng trong khi đó mọi thứ đã tiến triển.

Các trình duyệt hiện đại của AFAIK hiển thị các hộp kiểm bằng cách sử dụng điều khiển HĐH gốc, vì vậy không có cách nào để tạo kiểu cho chúng.


30
Nó có thể đúng trong 10, nhưng không phải bây giờ, bạn nên xóa câu trả lời này.
Michał K

3
Nó vẫn đúng - tất cả các trình duyệt hiện đại hiển thị các hộp kiểm sử dụng kiểm soát hệ điều hành gốc. Chỉ là có một số kỹ thuật mới tuyệt vời để khắc phục hạn chế này.
Gal

Vâng, tôi đã đề cập đến phần "không có cách nào để tạo kiểu cho chúng" ^^
Joril
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.