CSS kullanarak bir onay kutusunu biçimlendirme


831

Aşağıdakileri kullanarak bir onay kutusunu stil etmeye çalışıyorum:

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

Ancak stil uygulanmaz. Onay kutusu hala varsayılan stilini görüntüler. Belirtilen stili nasıl verebilirim?





1
bağlantı yukarıdaki yorumda. neyse: blog.felixhagspiel.de/index.php/posts/custom-inputs
Felix Hagspiel

1
Vay. Tüm bu cevaplara baktığımda şunu söylemeliyim ki: Tüm bu çalışmalar ekrana tarz bir onay kutusu koymak için
Michael

Yanıtlar:


784

GÜNCELLEME:

Aşağıdaki yanıt, CSS 3'ün yaygın kullanılabilirliğinden önceki durumlara atıfta bulunur. Modern tarayıcılarda (Internet Explorer 9 ve üstü dahil), JavaScript kullanmadan tercih ettiğiniz stille onay kutusu değiştirmeleri oluşturmak daha kolaydır.

İşte bazı yararlı bağlantılar:

Temel sorunun değişmediğini belirtmek gerekir. Yine de stilleri (kenarlıklar vb.) Doğrudan onay kutusu öğesine uygulayamazsınız ve bu stillerin HTML onay kutusunun görüntülenmesini etkilemesini sağlayabilirsiniz. Bununla birlikte, artık değişen, gerçek onay kutusunu gizlemek ve CSS'den başka bir şey kullanmadan kendi stilize bir öğesiyle değiştirmek mümkün. Özellikle, CSS artık yaygın olarak desteklenen bir :checkedseçiciye sahip olduğundan , değiştirme işleminizin kutunun işaretli durumunu doğru bir şekilde yansıtmasını sağlayabilirsiniz.


ESKİ CEVAP

İşte onay kutularını şekillendirme hakkında yararlı bir makale . Temel olarak, bu yazar tarayıcıdan tarayıcıya büyük ölçüde değiştiğini ve birçok tarayıcıyı nasıl stillendirirseniz seçin her zaman varsayılan onay kutusunu görüntülediğini buldu. Yani gerçekten kolay bir yol yok.

Onay kutusundaki bir görüntüyü bindirmek için JavaScript'i kullanabileceğiniz ve bu resme tıklamanın gerçek onay kutusunun işaretlenmesine neden olacağı bir geçici çözüm hayal etmek zor değildir. JavaScript içermeyen kullanıcılar varsayılan onay kutusunu görür.

Eklemek için düzenlendi: İşte bunu sizin için yapan güzel bir komut dosyası ; gerçek onay kutusu öğesini gizler, stil aralığıyla değiştirir ve tıklama etkinliklerini yeniden yönlendirir.


34
Bu cevap yaşlanıyor! Birincil bağlantı IE6 ve IE7 stillerini karşılaştıran bir siteye götürür ...
Jonatan Littke

7
Adil nokta - ve temel nokta artık modern tarayıcılarda gerçekten doğru değil. Bazı yeni bağlantılarla güncelledim, ancak orijinali eski tarayıcılar için bir kaynak olarak bıraktım.
Jacob Mattison

3
Kolay CSS Checkbox Jeneratör , gerçekten kolay ve n00b dostu oldu. Özelleştirilmiş oluşturma için de GUI ile birlikte gelir! İyi takdir. :)
CᴴᴀZ

Eski yanıtla ilgileniyorum çünkü bu özelliğin IE8 + ve diğer tarayıcılarla (krom, firefox ve safari) uyumlu olmasını istiyorum. Ancak tavsiye ettiğiniz
Adrien Be

2
Bu çok yararlı bir cevap değil - sadece şimdi çok eski olan makalelerin bir listesi.
Steve Bennett

141

Bunu sadece CSS kullanarak yapmanın bir yolu var. Bunun yerine (ab) labelöğeyi kullanabilir ve bu öğeye stil uygulayabiliriz. Uyarı, bunun Internet Explorer 8 ve daha düşük sürümleri için çalışmayacağıdır.

.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'in desteklemediği denetlenen sözde sınıfı destekleyen herhangi bir tarayıcı için çalışır. Bunun çalışıp çalışmadığını kontrol etme ve arkadaşlar için destek ekleyen selectivizr.com ile kontrol edebilirsiniz .
Blake Pettersson

Başka bir deyişle, IE9 ve sonraki sürümleri destekler: işaretli.
Blake Pettersson

1
IE8 ve altı için bir çoklu dolgu var
Tim

Çalışıyor, ama ilk kez titriyor. Neden oluyor?
technophyle

Ben gizli inputklavye asla klavye odak almak inanıyorum , bu yüzden bu klavye tarafından ulaşılamaz.
sam

139

:afterVe :beforesözde sınıflarıyla birlikte gelen yeni yetenekleri kullanarak oldukça havalı bir özel onay kutusu efekti elde edebilirsiniz . Bunun avantajı şudur: DOM'ye daha fazla bir şey eklemenize gerek yoktur, sadece standart onay kutusu.

Bunun yalnızca uyumlu tarayıcılarda çalışacağını unutmayın. Bu bazı tarayıcılar sette sizi izin vermez gerçeği ilişkili olabileceğine inanıyoruz :afterve :beforegiriş elemanlarında. Maalesef şimdilik sadece WebKit tarayıcıları destekleniyor. Firefox + Internet Explorer, onay kutularının hala biçimlendirilmemiş olarak çalışmasına izin verecektir ve bu gelecekte de değişecektir (kod satıcı öneklerini kullanmaz).

Bu yalnızca bir WebKit tarayıcı çözümüdür (Chrome, Safari, Mobil tarayıcılar)

Örnek Fiddle'a bakın

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

Bonus Webkit tarzı flipswitch keman

$(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: Keman sadece varsayılan onay kutularını gösterir. Hiçbir şey farklı görünmüyor.
robsch

1
@robsch Bu, orijinal yayında açıkça belirtilmiştir. Firefox veya OS sürümü önemsizdir, firefox'ta çalışmaz. "FF + IE hala onay kutuları işlevsiz, sadece tarz ..."
Josh Mc

İyi bir yaklaşım. Ancak tüm tarayıcılar bunu iyi yapmaz. İncelediğim kadarıyla yalnızca Chrome en iyi çıktıya sahip.
EA

Çok hoş. Ancak ... Yine bir IE 5.x yaklaşımıdır. Yalnızca webkit. Çünkü her zaman kurallara uymuyor ... Webkit tarayıcıları ile ilgili tüm sorun bu.
Alex

1
En iyi çözüm! +1 Ama böyle büyük bir örnek yazmanın nedenini göremiyorum. Fikri tanımlamak için 30 satır yeterli olacaktır.
Andrii Bogachenko

136

Başlamadan önce (Ocak 2015 itibariyle)

Orijinal soru ve cevap şimdi ~ 5 yaşında. Bu nedenle, bu biraz güncelleme.

İlk olarak, şekillendirme onay kutuları söz konusu olduğunda bir dizi yaklaşım vardır. temel ilke:

  1. Tarayıcınız tarafından stillendirilen ve CSS kullanılarak anlamlı bir şekilde geçersiz kılınamayan varsayılan onay kutusu denetimini gizlemeniz gerekir.

  2. Kontrol gizlendiğinde, kontrol edilen durumunu tespit edip değiştirebilmeniz gerekir.

  3. Onay kutusunun işaretli durumunun yeni bir öğe biçimlendirilerek yansıtılması gerekir

Çözüm (prensipte)

Yukarıdakiler bir dizi yolla gerçekleştirilebilir - ve çoğu zaman CSS3 sözde elemanlarını kullanmanın doğru yol olduğunu duyacaksınız. Aslında, doğru ya da yanlış gerçek bir yol yoktur, bu, onu kullanacağınız bağlam için en uygun yaklaşıma bağlıdır.

  1. Onay kutunuzu bir labelöğeye sarın . Bu, gizlendiğinde bile, etiket içinde herhangi bir yeri tıkladığınızda işaretli durumunu değiştirebileceğiniz anlamına gelir.

  2. Onay kutunuzu gizle

  3. Onay kutusundan sonra buna göre şekillendireceğiniz yeni bir öğe ekleyin . Onay kutusundan sonra görünmelidir, böylece CSS kullanılarak seçilebilir ve :checkedduruma bağlı olarak stillendirilebilir . CSS 'geriye' seçemez.

Çözüm (kodda)

Ayrıntılandırma (simgeleri kullanarak)

Ama hey! Bağırdığını duyuyorum. Kutuda hoş bir küçük kene veya haç göstermek istersem ne olur? Ve arka plan resimleri kullanmak istemiyorum!

CSS3'ün sözde unsurları burada devreye girebilir. Bunlar, her iki durumu temsil eden Unicode simgelerinicontent enjekte etmenizi sağlayan özelliği destekler . Alternatif olarak, örneğin, bir üçüncü taraf yazı simge kaynağı kullanabilen yazı müthiş (marka emin ayrıca ilgili set olsa mesela üzere, )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
Dışında: basitleştirilmiş HTML, basitleştirilmiş CSS, ayrıntılı açıklama.
SW4

4
@AnthonyHayward - güncellenmiş cevap, bunun nedeni ekran kullanmasıydı: kontrolü tabbable bir şekilde somutlaştırmayan hiçbiri, değiştim
SW4

1
Onay kutusunun etiketin içinde / öncesinde değil içinde olduğu bir örnek bulmakta zorlanıyordum. Bu çok iyi belgelenmiş ve açıklanmış bir çözümdür. Bu cevabın Ocak 2016 için güncellendiğini görmek harika olurdu.
Clarus Dignus

1
Hâlâ sekmeli değil display: none.
sam

2
Değiştir visibility: hidden;ile opacity: 0 !important;yine sekme ile sorun yaşıyorsanız.
jabacchetta

40

SW4'ün cevabının tavsiyelerini izlerim - onay kutusunu gizlemek ve özel bir açıklıkla kapatmak için bu HTML'yi öneren:

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

Etiketteki sarma, "id-id" özellik bağlantısı gerektirmeden metnin düzgün bir şekilde tıklanmasına izin verir. Ancak,

visibility: hiddenVeya tuşlarını kullanarak gizlemeyin.display: none

Tıklatarak veya dokunarak çalışır, ancak bu onay kutularını kullanmanın topal bir yoludur. Bazı insanlar hala Tabodağı taşımak, Spaceetkinleştirmek için çok daha etkili kullanır ve bu yöntemle gizlemek onu devre dışı bırakır. Form uzunsa, birinin bileklerini tabindexveya accesskeyözelliklerini kullanmak için kurtaracak . Sistem onay kutusu davranışını gözlemlerseniz, fareyle üzerine gelindiğinde düzgün bir gölge vardır. İyi tasarlanmış onay kutusu bu davranışı izlemelidir.

cobberboy'un cevabı , fontlar ölçeklenebilir vektörler olduğu için genellikle bitmap'ten daha iyi olan Font Awesome'i önerir . Yukarıdaki HTML ile çalışırken, şu CSS kurallarını öneririm:

  1. Onay kutularını gizle

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

    z-indexÖrneğim tamamen kaplayacak kadar büyük onay kutusu kaplaması kullandığından, yalnızca negatif kullanıyorum. left: -999pxHer düzende yeniden kullanılabilir olmadığından tavsiye etmiyorum . Bushan wagh'in cevabı , gizlemek ve tarayıcıyı tabindex kullanmaya ikna etmek için kurşun geçirmez bir yol sağlar, bu yüzden iyi bir alternatiftir. Her neyse, ikisi de sadece bir hack. Bugünün doğru yolu appearance: none, Joost'un cevabına bakınız :

    input[type="checkbox"] {
      appearance: none;
      -webkit-appearance: none;
      -moz-appearance: none;
    }
  2. Stil onay kutusu etiketi

    input[type="checkbox"] + span {
      font: 16pt sans-serif;
      color: #000;
    }
  3. Onay kutusu dış görünümü ekle

    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, dolgu, odakta bile noktalı anahatlar sağlayacak şekilde ayarlanır (aşağıya bakın).

  4. Onay kutusu işaretli kaplama ekle

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

    \00f046yukarıdaki genişlik stilinin nedeni olan Font Awesome's check-square-oile aynı genişlikte değildir square-o.

  5. Odak anahattı ekle

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

    Safari bu özelliği sağlamıyor (@Jason Sankey'nin yorumuna bakın), window.navigatortarayıcıyı tespit etmek ve Safari ise atlamak için kullanmalısınız.

  6. Devre dışı bırakılmış onay kutusu için gri renk ayarlama

    input[type="checkbox"]:disabled + span {
      color: #999;
    }
  7. Devre dışı bırakılmamış onay kutusunda fareyle üzerine gelme gölgesini ayarlama

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

Demo Keman

Fareyi onay kutularının üzerine getirmeye çalışın Tabve taşımak ve değiştirmek için ve Shift+ tuşlarını Tabkullanın Space.


3
Odak sorununu ele almak için oy verin: bunun gibi özelleştirmeler temel işlevselliği kaldırmamalıdır. Safari'nin, odak işlemeyi içeren bir çözüm uygularken beni biraz şaşırtan onay kutularına (varsayılan olanlar bile) klavye odağı sağlamadığını unutmayın.
Jason Sankey

o görünüyor Snippet'te onay kutuları artık çalışmıyor? Chrome windows 10
Félix Gagnon-Grenier

1
Güzel cevap. Çözümümün temelini oluşturduğumda - Ek bir açıklık kullandığınız girişten sonra mevcut etiketi kullandım ve Edge & FF desteği alıyorum.
Jono

2
Bu cevapların çoğu erişilebilirliği görmezden geliyor. Bu cevabın bunu tutar.
maxshuty

1
@maxshuty Ben de sizin yaklaşımınızı seviyorum: birisi bir kütüphane oluşturduğunda, çoğu zaman kendi seçtiği ana dilde basit kod yazamayacağı bir itiraftır. IMHO FontAwesome yazı tipini yüklemek için javascript kullanarak Ücretsiz planı ile berbat, ama yine de açık kaynak ve ücretsiz lisans kaldıkları gibi onları seviyorum. Genellikle belirli bir projede ihtiyacım olan ücretsiz simgelerin yazı tipi dövme alt kümesini bitiririm (genellikle en fazla 5kB). Beni çabadan kurtarırlarsa, Pro planlarında önerdikleri gibi yıllık 99 $ değil, memnuniyetle ödeyeceğim.
Jan Turoň

30

labelAşağıdaki örnekte bulunan öğeyi kullanarak küçük bir hile içeren onay kutularına stil uygulayabilirsiniz:

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

Ve yukarıdaki kod için bir FIDDLE . Bazı CSS'lerin tarayıcıların eski sürümlerinde çalışmadığını unutmayın, ancak eminim bazı süslü JavaScript örnekleri var!


28

Uygulaması kolay ve kolayca özelleştirilebilir çözüm

Birçok arama ve testten sonra uygulanması basit ve özelleştirmesi daha kolay olan bu çözümü aldım. Bu çözümde :

  1. Harici kütüphanelere ve dosyalara ihtiyacınız yok
  2. Sayfanıza fazladan HTML eklemenize gerek yok
  3. Onay kutusu adlarını ve kimliğini değiştirmeniz gerekmez

Akan CSS'yi sayfanızın üstüne koyun, tüm onay kutuları stili şu şekilde değişecektir:

Resim açıklamasını buraya girin

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
Daha basit daha iyidir!
Adrian Moisa

Bu harika bir yanıt, ek bir şeye ihtiyaç duymadan çalışıyor
HeavyHead

Good one and very simple
khalidh

Güzel çözüm. Ama Firefox, IE veya Edge üzerinde çalıştığını görmüyorum (onay kutusu yok)
Jono

20

Ek işaretleme eklemekten kaçınabilirsiniz. Bu, Masaüstü için IE dışında her yerde çalışır (ancak Windows Phone ve Microsoft Edge için IE'de çalışır) CSS ayarı ile 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
Bu yaklaşımı seviyorum - css'de gerçekten görünüm kullanmamanız gerektiği için biraz acayip ama önce ve sonra kullanılan diğer cevaplardan çok daha temiz. Ve bunun gibi bir şey için JavaScript'in tamamen abartılı olduğunu hissediyorum.
Sprose

18

Simge yazı tiplerini (FontAwesome gibi) kullanmayı tercih ederim, çünkü renklerini CSS ile değiştirmek kolaydır ve yüksek piksel yoğunluklu cihazlarda gerçekten iyi ölçeklenirler. İşte yukarıdaki tekniklere benzer teknikler kullanan başka bir saf CSS varyantı.

(Aşağıda sonucu görselleştirebilmeniz için statik bir görüntü bulunmaktadır; etkileşimli bir sürüm için JSFiddle'a bakın .)

Onay kutusu örneği

Diğer çözümlerde olduğu gibi labelelemanı kullanır . Bitişikteki spanonay kutusu karakterimizi tutar.

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>

İşte bunun için JSFiddle .


.... sizin tarif ettiğiniz şey Bhushan wagh, Jake, Jonathan Hodgson ve Blake'in önceki cevapları ile aynıdır;)
SW4

7
@ SW4 Bu cevaba atıfta bulundum, ancak bu cevap ikon fontlarını kullanıyor (önceki cevapların hiçbiri yoktu). İlk paragraf bunu açıkça ortaya koyuyor.
cobberboy

Yeni sürümde çalışmasını istiyorsanız, unicode içeriği font-family: FontAwesome;ile değiştirmeniz font-family: 'Font Awesome\ 5 Free';ve güncellemeniz gerekir .
SuN

12

Son zamanlarda soruna oldukça ilginç bir çözüm buldum.

Sen kullanabilirsiniz appearance: none;onay kutusunu varsayılan stilini kapatın ve daha sonra açıklanan Seviyorum üzerine kendi yazmak için buraya (Örnek 4) .

Örnek keman

Ne yazık ki appearanceseçenek için tarayıcı desteği oldukça kötü . Kişisel testlerimden sadece Opera ve Chrome'un düzgün çalışmasını sağladım. Ancak, daha iyi destek geldiğinde veya yalnızca Chrome / Opera'yı kullanmak istediğinizde bunu basit tutmanın yolu bu olacaktır.

"Kullanabilirmiyim?" bağlantı


Gerçekten appearancebunun için ihtiyacımız olan şey; sadece "standart dışı ve standartlar bir yolda değildir" unutmayın .
sam

12

Saf CSS ile, hiçbir şeyle süslü :beforeve :afterdönüşüm yok, varsayılan görünümü kapatabilir ve ardından aşağıdaki örnekte olduğu gibi satır içi bir arka plan görüntüsü ile stil uygulayabilirsiniz. Bu Chrome, Firefox, Safari ve şimdi Edge'de (Chromium Edge) çalışır.

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
Evet! Sadece bir tane aslında iyi.
odinho - Velmont

10

Çözümüm

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>


Birisi metnimin neden hizalanmadığını önerebilirse bilmek isterim! CSS acemi burada.
agirault

8

appearance: noneModern tarayıcılarda kullanabilirsiniz , böylece varsayılan stil yoktur ve tüm stilleriniz düzgün bir şekilde uygulanır:

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
Bu benim durumum için çalışan özellikle minimalist bir örnek, teşekkürler!
Jason R Stevens CFA

8

JavaScript YOK, harici kitaplıklar YOK, Erişilebilirlik uyumluluğu ve hem Onay Kutuları hem de Radyo Düğmeleri mi istiyorsunuz?

Kaydırma ve kaydırma yapıyorum ve bu cevapların tonları erişilebilirliği kapıdan dışarı atıyor ve WCAG'ı birden fazla şekilde ihlal ediyor . Özel onay kutularını kullandığınızda çoğu zaman özel radyo düğmeleri kullanmak istediğiniz için radyo düğmelerine attım.

Kemanlar :

  • Onay kutuları - saf CSS - 3. taraf kitaplıklardan arınmış
  • Radyo düğmeleri - saf CSS - 3. taraf kitaplıklardan arınmış
  • FontAwesome kullanan ancak Glificons vb. İle kolayca değiştirilebilen onay kutuları *

Partiye geç ama 2019 2020'de bir şekilde bu hala zor, bu yüzden erişilebilir ve kolay bırakılabilir üç çözümümü ekledim .

Bunların tümü JavaScript , harici kitaplık * ve erişilebilir ...

Bunlardan herhangi biriyle tak-kullan-oynamak istiyorsanız, stil sayfasını kemanlardan kopyalayın, CSS'deki renk kodlarını ihtiyaçlarınıza uyacak şekilde düzenleyin ve yola çıkın. Onay kutuları için isterseniz özel bir svg onay işareti simgesi ekleyebilirsiniz. CSS üyesi olmayan kişiler için birçok yorum ekledim.

Uzun metniniz veya küçük bir kabınız varsa ve onay kutusunun veya radyo düğmesi girişinin altında metin kaydırmayla karşılaşıyorsanız, bunun gibi div'lere dönüştürün .

Daha uzun açıklama: WCAG'ı ihlal etmeyen, JavaScript veya harici kitaplıklara dayanmayan ve sekme veya boşluk çubuğu gibi klavye gezinmesini bozmayan, odaklama olaylarına izin veren, devre dışı bırakılmış onay kutularına izin veren bir çözüme ihtiyacım var hem kontrol edilmiş hem de işaretsizdir ve son olarak onay kutusunun görünümünü özelleştirebileceğim bir çözüm, ancak farklı background-color's border-radius, svgarka planlar vb.

@Jan Turoň'dan gelen bu cevabın bir kombinasyonunu kullandım, ki bu da oldukça iyi çalışıyor gibi görünüyor. Ben de radyo düğmeleri ile bu iş yapmak için onay kutularından aynı kodu çok kullanan bir radyo düğmesi keman yaptım.

Ben hala erişilebilirlik öğreniyorum, bu yüzden bir şey kaçırdıysanız lütfen yorum bırakın ve burada düzeltmek için çalışacağım benim onay kutuları bir kod örneğ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>


Buraya kendi cevabımı da ekledim , umarım birine yardımcı olur. Temaları benimkinden kullandım. :) Umarım birisi görür.
Bay Polywhirl

6

İşte herhangi bir jQuery veya JavaScript kodu olmayan basit bir CSS çözümü.

FontAwseome simgeleri kullanıyorum ancak herhangi bir resmi kullanabilirsiniz

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
Diğer cevapların çoğundan farklı olarak, bu ek labelveya spanelemanların oluşturulmasını gerektirmez . Sadece çalışıyor!
KurtPreston

Bir örnek, demo veya en azından bu CSS kodunun çalıştığı HTML bölümünü gösterebilir misiniz? @aWebDeveloper
Sándor Zuboly

@aWebDeveloper ana sayfaya bir cevap ya da soru çarpmak için inane düzenlemeleri yapmak kurallara aykırıdır.
TylerH

@aWebDeveloper Etkin olmayan bir soruda eski bir yanıtı düzenlediniz; bu soru, ön sayfaya çarparak doğrudan cevabınıza bir bağlantı sağlar. Yanıt eklemek veya değiştirmek için ilgili bilginiz varsa, bu iyi olur. Tek yaptığınız, cümlelerinizden birini kimseye faydalı olmayan bir alıntı bloğuna gömmekti.
TylerH

@VadimOvchinnikov çalışmalı ... burada hiçbir şey krom spesifik değil
aWebDeveloper

6

Google'ımdan, onay kutusu şekillendirmenin en kolay yolu bu. Sadece tasarımınıza göre ekleyin :afterve :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>


Sahte elemanları destekleyen tarayıcılar için çok güzel bir çözüm. :)
Jean-François Beauchamp

6

Onay kutusu stilini düz CSS3 ile değiştirin, herhangi bir JS ve HTML manipülasyonu gerektirmez.

.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 Bazı html yapılarını takip etmenizi gerektiren bir çözümümüz var .. stackoverflow.com/questions/23305780/…
BEJGAM SHIVA PRASAD 17:17

4

Basit ve hafif bir şablon:

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
S için sözde öğeler inputyalnızca Chrome'da desteklenir, kodunuz her tarayıcıda aynı şekilde çalışmaz.
Vadim Ovchinnikov

4

Bence bunu yapmanın en kolay yolu a'yı şekillendirmek labelve checkboxgörünmez yapmak .

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

checkboxBu gizli olsa bile, hala erişilebilir olacak ve bir form gönderildiğinde değeri gönderilecektir. Eski tarayıcılar için size sınıfını değiştirmek gerekebilir labelInternet Explorer'ın eski sürümleri anladığını sanmıyorum çünkü JavaScript kullanarak atılı için ::checkedüzerinde checkbox.


4
Cevabınız ve benimki arasındaki fark tam olarak nedir?
Blake Pettersson

@BlakePettersson seninki, :: işaretli sadece yanlış (ben de izin verilirse bile denedim);)
esp

7
Bu kötü bir cevap. (a) ::checkedyanlış - olması gerekir :checked. (b) checkboxyanlış - öyle olmalı[type=checkbox]
Chris Morgan

4

Olmadı! Tüm bu geçici çözümler beni HTML onay kutusunun stilini değiştirmek isterseniz berbat olduğu sonucuna götürdü.

Önsöz olarak, bu bir CSS uygulaması değildir. Başka birinin yararlı bulabilmesi durumunda karşılaştığım geçici çözümü paylaşacağımı düşündüm.


HTML5 canvasöğesini kullandım.

Bunun tersi, harici görüntüleri kullanmak zorunda olmamanız ve muhtemelen bazı bant genişliğinden tasarruf edebilmenizdir.

Dezavantajı, bir nedenden dolayı bir tarayıcı onu doğru bir şekilde oluşturamazsa, o zaman bir geri dönüş yoktur. Bununla birlikte, 2017'de bir sorun olarak kalmaya devam edeceği tartışmalıdır.

Güncelleme

Eski kodu oldukça çirkin buldum, bu yüzden tekrar yazmaya karar verdim.

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

İşte çalışan bir demo .

Yeni sürüm, onay kutuları oluşturmak için verimli bir sistem oluşturmak için prototipler ve diferansiyel kalıtım kullanır. Bir onay kutusu oluşturmak için:

var my_checkbox = Checkbox.create();

Bu onay kutusunu hemen DOM'a ekler ve olayları bağlar. Bir onay kutusunun işaretli olup olmadığını sorgulamak için:

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

Ayrıca dikkat edilmesi gereken nokta, döngüden kurtuldum.

Güncelleme 2

Son güncellemede bahsetmeyi ihmal ettiğim bir şey, tuvali kullanmanın sadece görünmesini istediğiniz gibi görünen bir onay kutusu yapmaktan daha fazla avantajı olmasıdır. İsterseniz, çok durumlu onay kutuları da oluşturabilirsiniz .

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

CheckboxSon snippet'te kullanılanı biraz değiştirdim, böylece daha genel olacak ve 3 durumlu bir onay kutusuyla "genişletebilmeyi" mümkün kıldım. İşte bir demo . Gördüğünüz gibi, zaten yerleşik onay kutusundan daha fazla işlevselliğe sahip.

JavaScript ve CSS arasında seçim yaparken göz önünde bulundurulması gereken bir şey.

Eski, kötü tasarlanmış kod

Çalışma Demosu

İlk önce bir tuval oluşturun

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

Ardından, tuvalin kendisini güncellemesinin bir yolunu bulun.

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

Son bölüm etkileşimli hale getirmektir. Neyse ki, oldukça basit:

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

JavaScript'teki garip olay işleme modelleri nedeniyle IE'de sorun yaşayabileceğiniz yer burasıdır.


Umarım bu birine yardımcı olur; kesinlikle benim ihtiyaçlarına uygun.


Canvas uygulamasının, onay kutularının öykünmesi olarak, yerleşik onay kutularından daha fazla işlevsellik sağladığını unutmayın. Örneğin, "çok durumlu" onay kutuları gibi süslü şeyler (ör unchecked (e.g. unchecked -> checked -> "kinda" checked -> unchecked. Durumlar "açık yanlış", "açık doğru", "varsayılanı kullan" gibi). Cevaba bir örnek eklemeyi düşünüyorum.
Braden Best

Bence korkunç bir fikir.

@Neil lütfen özenle hazırlayın
Braden Best

Neden tekerleği yeniden icat ettiniz?

@Neil neden değil tekerleği yeniden icat? NIH her zaman kötü bir şey değildir, özellikle de mevcut teknoloji ile uygulanması imkansız veya aptalca karmaşık olan avantajlar sağladığı zaman. Bu, yerleşik onay kutularıyla uğraşmak isteyip istemediğinize dair bir soru. Ve eğer web sitemin veya uygulamamın görsel diliyle uyum sağlamak için onları temalamak istiyorsam, tam kontrol istiyorum. Birisi hafif ve kullanımı kolay bağımsız bir UI kütüphanesi yapana kadar, kişisel olarak tekerleklerimin burada icat edilmesini tercih ederim. Başkası olmayabilir, ama bu benim cevabımı geçersiz kılmaz.
Braden Best

3

Bu en basit yoldur ve bu stile hangi onay kutularını vereceğinizi seçebilirsiniz.

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 veya jQuery gerekmez .

Onay kutusu stilinizi basit bir şekilde değiştirin.

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>

İşte JsFiddle bağlantısı


Onay kutusu görünmüyor çünkü artık çevrimiçi olmayan imgh.us/uncheck.png ve imgh.us/check_2.png resim dosyalarına harici bağlantılara dayanıyor .
jkdev

2

İşte sadece bir CSS / HTML sürümü, jQuery veya JavaScript gerekmez, Basit ve temiz HTML ve gerçekten basit ve kısa CSS.

İşte JSFiddle

http://jsfiddle.net/v71kn3pr/

İşte 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>

İşte 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;
}

Bu, bireysel radyo veya onay kutularına, onay kutularının oyuklarına ve radyo düğmesi gruplarına sahip olacak şekilde uyarlanabilir.

Bu html / css, etikete tıklamayı da yakalamanızı sağlar, böylece yalnızca etiketi tıklasanız bile onay kutusu işaretlenir ve işaretlenmez.

Bu tür onay kutusu / radyo düğmesi herhangi bir formla mükemmel çalışır, hiç sorun değil. PHP, ASP.NET (.aspx), JavaServer Faces ve ColdFusion kullanılarak da test edilmiştir .


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

Bir açıklama yapılabilir.
Peter Mortensen

1

Hayır, onay kutusunu hala şekillendiremezsiniz, ancak (nihayet) işlevselliği korurken bir illüzyona nasıl stil verileceğini anladım bir onay kutusunu tıklamanın . Bu, imleç metin seçmeden veya sürükleyip bırakmayı tetiklemeden mükemmel bir şekilde olmasa bile geçiş yapabileceğiniz anlamına gelir!

Bu çözüm muhtemelen radyo düğmelerine de uyar.

Aşağıdakiler Internet Explorer 9, Firefox 30.0 ve Chrome 40.0.2214.91'de çalışır ve sadece temel bir örnektir. Yine de arka plan resimleri ve sözde öğelerle birlikte kullanabilirsiniz.

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 ve Firefox gibi tarayıcılar şunları desteklemediğinden: önce: onay kutusu giriş etiketlerinde sonra, burada sadece HTML ve CSS ile bir alternatif var. Elbette gereksinimlerinize göre CSS'yi düzenlemelisiniz.

Onay kutusunun HTML kodunu şu şekilde yapın:

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

Renk etiketini değiştirmek için onay kutusunun bu stilini uygulayın

<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

Yalnızca CSS kullanarak gri tonlamalı onay kutusunun rengini değiştirebilirsiniz.

Aşağıdaki onay kutularını siyahtan griye dönüştürür (istediğim şey buydu):

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

bu da sınırı aydınlatır. Ayrıca, kontrol ederseniz kontrol gerçekten göremiyorum.
Rachel S

1

SCSS / SASS Uygulaması

Daha modern bir yaklaşım

SCSS kullananlar (veya kolayca SASS'ye dönüştürülenler) için aşağıdakiler yardımcı olacaktır. Etkili bir şekilde, şekillendireceğiniz onay kutusunun yanında bir öğe oluşturun. Onay kutusu tıklandığında, CSS kardeş öğeyi yeniden düzenler (yeni, işaretli stilinize göre). Kod aşağıdadır:

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

Uyarı : aşağıdakiler yazma sırasında doğruydu, ancak bu arada işler ilerledi.

AFAIK modern tarayıcılar, yerel işletim sistemi denetimini kullanarak onay kutularını görüntüler, bu nedenle bunları biçimlendirmenin bir yolu yoktur.


30
'10'da doğru olabilirdi, ama şimdi değil, bu cevabı silmelisin.
Michał K

3
Hala doğru - tüm modern tarayıcılar yerel işletim sistemi kontrolünü kullanarak onay kutularını görüntüler. Sadece bu sınırlamanın üstesinden gelmek için harika yeni teknikler var.
Gal

Evet, "Onları
şekillendirmenin bir
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.