Як стилізувати прапорець за допомогою CSS


831

Я намагаюся стилізувати прапорець за допомогою наступного:

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

Але стиль не застосовується. У прапорці все ще відображається стиль за замовчуванням. Як мені надати вказаний стиль?



1
я думаю , що ви шукаєте що - щось на зразок цього: asimishaq.com/myfiles/image-checkbox Дивіться цей пост: stackoverflow.com/questions/16352864 / ...
Асім-Ісхак


1
посилання знаходиться в коментарі вище. так чи інакше: blog.felixhagspiel.de/index.php/posts/custom-inputs
Фелікс

1
Ого. Дивлячись на всі ці відповіді, я просто мушу сказати: Все це працює лише для того, щоб поставити стильний прапорець на екран
Майкл

Відповіді:


784

ОНОВЛЕННЯ:

Нижченаведена відповідь посилається на стан речей перед широкою доступністю CSS 3. У сучасних браузерах (включаючи Internet Explorer 9 і пізніших версій) простіше створити замінники прапорець у вибраному стилі без використання JavaScript.

Ось кілька корисних посилань:

Варто зазначити, що принципове питання не змінилося. Ви все ще не можете застосовувати стилі (межі тощо) безпосередньо до елемента прапорця, і ці стилі впливають на відображення прапорця HTML. Однак, що змінилося, це те, що тепер можна приховати фактичний прапорець і замінити його власним стильовим елементом, не використовуючи нічого, крім CSS. Зокрема, оскільки у CSS зараз широко підтримується :checkedселектор, ви можете змусити вашу заміну правильно відображати перевірений стан поля.


СТАРИЙ ВІДПОВІДЬ

Ось корисна стаття про стилізаційні прапорці . В основному цей автор виявив, що він дуже відрізняється від браузера до браузера, і що багато браузерів завжди відображає прапорець за замовчуванням незалежно від того, як ви його стилю. Тож насправді непростий спосіб.

Не важко уявити обхід, де ви б використовували JavaScript для накладання зображення на прапорець, а клацання на цьому зображенні перевіряло справжню прапорець. Користувачі без JavaScript побачать прапорець за замовчуванням.

Відредаговано, щоб додати: ось хороший сценарій, який робить це для вас ; він приховує реальний елемент прапорця, замінює його на стильовий проміжок і перенаправляє події клацання.


34
Ця відповідь старіє! Основне посилання веде на сайт, який порівнює стилі IE6 та IE7 ...
Jonatan Littke

7
Справедлива точка - і основна точка вже не справжня в сучасних браузерах. Я оновив деякі новіші посилання, але залишив оригінал як ресурс для старих браузерів.
Якоб Меттісон

3
Легкий генератор прапорців CSS , був дуже легким та n00b дружнім. Поставляється з графічним інтерфейсом для налаштування також! Добре оцінений. :)
CᴴᴀZ

Мене цікавить стара відповідь, оскільки я хочу, щоб ця функція була сумісною з IE8 + та іншими браузерами (chrome, firefox & safari). Однак я не можу знайти багато відгуків щодо плагіна, який ви рекомендуєте. Ryanfait.com/resources/custom-checkboxes-and-radio-buttons
Adrien Be

2
Це не дуже корисна відповідь - це лише перелік статей, більшість з яких зараз дуже старі.
Стів Беннетт

141

Існує спосіб зробити це за допомогою лише CSS. Ми можемо (ab) використовувати labelелемент та стиль, замість цього елемент. Застереження полягає в тому, що це не працюватиме для Internet Explorer 8 та новіших версій.

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

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

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


@GandalfStormCrow це буде працювати для будь-якого браузера, який підтримує: перевірений псевдоклас, який IE8 НЕ підтримує. Ви можете перевірити, чи працює це з selectivizr.com - який додає підтримку для: перевірених та друзів.
Блейк Петтерссон

Іншими словами, IE9 та пізніші версії підтримують: позначено.
Блейк Петтерссон

1
Є поліфайл для IE8 і нижче: github.com/rdebeasi/ checked-polyfill
Тим

Це працює, але перший раз мерехтить. Чому це відбувається?
технофіл

Я вважаю, що приховані inputs ніколи не займають фокусування на клавіатурі, тому вони недоступні для клавіатури.
Сам

139

Ви можете домогтися досить класного користувацького ефекту, використовуючи нові здібності, що постачаються разом із :afterта:before псевдо класами. Перевага цього полягає в тому, що вам більше не потрібно додавати до DOM нічого, лише стандартний прапорець.

Зверніть увагу, це працюватиме лише для сумісних браузерів. Я вважаю, що це пов’язано з тим, що деякі браузери не дозволяють вам встановлювати :afterта :beforeвводити елементи. На жаль, наразі підтримуються лише браузери WebKit. Firefox + Internet Explorer все ще дозволить прапорець функціонувати, просто без стилю, і це, сподіваємось, зміниться в майбутньому (у коді не використовуються префікси постачальника).

Це лише рішення веб-браузера (браузер Chrome, Safari, мобільний)

Див. Приклад 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>

Бонус у стилі Вебкіт

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

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

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

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

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

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


9
Firefox 33.1 / Linux: у скрипці відображаються лише прапорці за замовчуванням. Ніщо не виглядає інакше.
robsch

1
@robsch Це чітко зазначено в оригінальному дописі. Версія firefox або OS не має значення, вона не працює у firefox. "FF + IE все ще дозволить прапорець функціонувати, просто не стилізовані ..."
Josh Mc

Хороший підхід. Але не всі браузери роблять це добре. Тільки Chrome має найкращий вихід, наскільки я перевірив.
EA

Дуже хороший. Однак ... Це знову підхід IE 5.x. Тільки Webkit. Тому що це не завжди дотримується правил ... У цьому вся проблема із браузерами webkit.
Алекс

1
Найкраще рішення! +1 Але я не бачу причини писати такий великий приклад. 30 рядків для опису ідеї вистачило б.
Андрій Богаченко

136

Перед початком (станом на січень 2015 р.)

Оригінальні запитання та відповіді зараз ~ 5 років. Таким чином, це трохи оновлення.

По-перше, існує низка підходів, коли мова йде про стилізаційні прапорці. основний принцип:

  1. Вам потрібно буде приховати контрольний прапорець за замовчуванням, який стилюється у вашому веб-переглядачі, і його не можна перекрити жодним змістовно за допомогою CSS.

  2. З прихованим елементом керування ви все одно будете мати можливість виявляти та змінювати його перевірений стан

  3. Поставлений прапорець повинен бути відображений шляхом стилізації нового елемента

Рішення (в принципі)

Сказане може бути досягнуто різними способами - і ви часто почуєте, що використання псевдоелементів CSS3 - це правильний шлях. Насправді, немає справжнього правильного чи неправильного способу, це залежить від підходу, найбільш підходящого для контексту, в якому ви будете використовувати його. Сказати, я маю перевагу.

  1. Загорніть свій прапорець у labelелемент. Це означатиме, що навіть коли він прихований, ви все одно можете перемикати його перевірений стан, клацнувши в будь-якому місці мітки.

  2. Сховати свій прапорець

  3. Додайте новий елемент після прапорця, який ви будете відповідно стилювати. Він повинен з’являтися після прапорця, щоб його можна було вибрати за допомогою CSS та стилі залежно від :checkedстану. CSS не може вибрати "назад".

Рішення (у коді)

Уточнення (за допомогою піктограм)

Але ей! Я чую, як ти кричиш. Що робити, якщо я хочу показати маленьку кришку або хрестик у полі? І я не хочу використовувати фонові зображення!

Ну, ось тут можуть вступати псевдоелементи CSS3. Вони підтримують contentвластивість, яка дозволяє вводити піктограми Unicode, що представляють будь-який стан. Крім того, ви можете використовувати джерело значків шрифтів сторонньої сторони, наприклад шрифт awesome (хоча переконайтесь, що ви також встановили відповідне font-family, наприклад, для 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
За винятком: спрощеного HTML, спрощеного CSS, детального пояснення.
SW4

4
@AnthonyHayward - оновлена ​​відповідь, це було пов’язано з використанням дисплея: жоден, який не приводить елемент керування в табличний спосіб, я змінив
SW4

1
Я намагався знайти приклад, коли прапорець знаходився всередині етикетки, а не до / після неї. Це дуже добре задокументоване та пояснене рішення. Було б чудово побачити цю відповідь оновленою за січень 2016 року
Clarus Dignus

1
Все ще не вкладка з display: none.
Сам

2
Замінити visibility: hidden;з , opacity: 0 !important;якщо ви все ще виникають проблеми з табуляцією.
jabacchetta

40

Я дотримуюся поради відповіді SW4 - приховати прапорець і прикрити його спеціальним проміжком, пропонуючи цей HTML:

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

Обертання етикетки акуратно дозволяє натискати текст без необхідності посилання на атрибут "for-id". Однак,

Не приховуйте це за допомогою visibility: hiddenабоdisplay: none

Він працює, натискаючи або торкаючись, але це кульгавий спосіб використання прапорців. Деякі люди все ще використовують набагато ефективніше Tabдля переміщення фокусу, Spaceактивації, а приховування цього методу відключає його. Якщо форма довга, ви можете зберегти чиїсь зап’ястя для використання tabindexабо accesskeyатрибутів. І якщо ви спостерігаєте за поведінкою прапорець у системі, на приведенні вказівника з’являється гідна тінь. Добре оформлений прапорець повинен відповідати цій поведінці.

Відповідь cobberboy рекомендує Awesome Font Awesome, що зазвичай краще, ніж растрове зображення, оскільки шрифти є масштабованими векторами. Працюючи з HTML вище, я б запропонував такі правила CSS:

  1. Сховати прапорці

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

    Я використовую лише негатив, z-indexоскільки мій приклад використовує досить велику шкіру прапорця, щоб повністю покрити його. Я не рекомендую, left: -999pxоскільки його не можна використовувати повторно в кожному макеті. Відповідь Бушана Вага надає пуленепробивний спосіб приховати це і переконати браузер використовувати tabindex, тому це хороша альтернатива. У будь-якому випадку, і те, і інше - просто хакер. Правильний шлях сьогодні - appearance: noneдив . Відповідь Джооста :

    input[type="checkbox"] {
      appearance: none;
      -webkit-appearance: none;
      -moz-appearance: none;
    }
  2. Етикетка прапорця стилю

    input[type="checkbox"] + span {
      font: 16pt sans-serif;
      color: #000;
    }
  3. Додати скін прапорця

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

    \00f096є шрифтом Awesome's square-o, накладка налаштована таким чином, щоб надати рівний пунктирний контур у фокусі (див. нижче).

  4. Додайте прапорець підтверджений скін

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

    \00f046це шрифт Awesome's check-square-o, який не є такою ж шириною square-o, що є причиною стилю ширини вище.

  5. Додайте контур фокусу

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

    Safari не забезпечує цю функцію (див. Коментар @Jason Sankey), ви повинні використовувати window.navigatorдля виявлення браузера та пропустити його, якщо це Safari.

  6. Встановіть сірий колір для відключеного прапорця

    input[type="checkbox"]:disabled + span {
      color: #999;
    }
  7. Встановіть тінь наведення курсору на невідключений прапорець

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

Демо-скрипка

Спробуйте навести курсор миші на прапорці, а потім використовувати Tabта Shift+ Tabдля переміщення та Spaceперемикання.


3
Оновлення для вирішення проблеми фокусування: такі налаштування не повинні видаляти основні функції. Зауважте, що Safari не дає фокусу на клавіатурі прапорцям (навіть типовим), що на мить заплутало мене при реалізації рішення, яке включало обробку фокусу.
Джейсон Санкі

Це здається прапорці в сніппаешь не працює більше? На хромованих вікнах 10
Фелікс Ганьон-Греньє

1
Гарна відповідь. Я забезпечив основу для свого рішення - я використовував існуючу мітку після введення, де ви використовували додатковий проміжок, і я отримую підтримку Edge & FF.
Jono

2
Більшість із цих відповідей ігнорує доступність. Мені подобається, що ця відповідь тримає це в такт.
maxshuty

1
@maxshuty Мені також подобається ваш підхід: коли хтось створює бібліотеку, часто це лише визнання, що він не може просто кодувати рідною мовою, яку він обрав. IMHO FontAwesome зіткнувся зі своїм безкоштовним планом за допомогою javascript для завантаження шрифту, але мені все одно подобаються, оскільки вони залишаються з відкритим кодом та безкоштовною ліцензією. Я зазвичай закінчую підмножину шрифтів, які потрібні мені для конкретного проекту (зазвичай максимум 5 КБ). Я б із задоволенням заплатив, якби вони заощадили мені зусилля, але не шалені 99 доларів на рік, як вони пропонують у своєму плані Pro.
Ян Туров

30

Ви можете стилізувати прапорці з невеликою хитрістю, використовуючи labelелемент, наведений нижче.

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

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

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

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

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

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

І FIDDLE для вищевказаного коду. Зауважте, що деякі CSS не працюють у старих версіях веб-переглядачів, але я впевнений, що там є кілька химерних прикладів JavaScript!


28

Просте у виконанні та легко настроюється рішення

Після багатьох пошуків і тестувань я отримав це рішення, яке просте у виконанні та простіше в налаштуванні. У цьому рішенні :

  1. Вам не потрібні зовнішні бібліотеки та файли
  2. Вам не потрібно додавати додатковий HTML на свою сторінку
  3. Не потрібно змінювати імена та ідентифікаційний прапор

Просте розміщення поточного CSS у верхній частині сторінки, і стиль усіх прапорців зміниться так:

Введіть тут опис зображення

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

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

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

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

1
Простіше, краще!
Адріана Мойса

Це чудова відповідь, вона просто працює, не потребуючи нічого додаткового
HeavyHead

Хороший і дуже простий
халід

Приємне рішення. Але я не бачу, як це працює в Firefox, IE або Edge (немає прапорця)
Jono

20

Ви можете уникнути додавання додаткової розмітки. Це працює скрізь, крім IE для робочого столу (але працює в IE для Windows Phone та Microsoft Edge) через налаштування 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
Мені подобається такий підхід - він трохи хакітний, так як ви ніколи не повинні реально використовувати зовнішній вигляд у css, але він набагато чіткіший, ніж деякі інші відповіді, використовуючи до і після. І для чогось подібного я вважаю, що JavaScript є повним непосильним.
Sprose

18

Я вважаю за краще використовувати шрифти значків (наприклад, FontAwesome), оскільки легко змінювати їх кольори за допомогою CSS, і вони дуже добре масштабуються на пристроях високої щільності пікселів. Ось ось ще один чистий варіант CSS, використовуючи подібні методи, описані вище.

(Нижче наведено статичне зображення, щоб ви могли візуалізувати результат; див . JSFiddle для інтерактивної версії.)

Приклад прапорця

Як і в інших рішеннях, тут використовується labelелемент. На сусідньому spanрозміщений наш прапорець.

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

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

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

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

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

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

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

Ось JSFiddle для цього.


.... те, що ви описали, те саме, що і попередні відповіді від Bhushan wagh, Jake, Jonathan Hodgson and Blake;)
SW4

7
@ SW4 Я посилався на цей факт, за винятком випадків, коли використовуються шрифти значків (на які не було жодної попередньої відповіді). Перший абзац робить це досить зрозумілим.
ковбой

Вам необхідно замінити font-family: FontAwesome;з font-family: 'Font Awesome\ 5 Free';, і оновлювати вміст юнікода , якщо ви хочете , щоб змусити його працювати в новій версії.
SuN

12

Нещодавно я знайшов досить цікаве рішення проблеми.

Ви можете використати appearance: none;для вимкнення стилю прапорців за замовчуванням, а потім написати свій власний над ним, як описано тут (Приклад 4) .

Приклад скрипки

На жаль, підтримка браузера є досить поганою для цього appearanceваріанту. З моїх особистих тестувань у мене лише коректно працювали Opera та Chrome. Але це був би спосіб зробити його простим, коли приходить краща підтримка або ви хочете використовувати Chrome / Opera.

"Чи можу я використовувати?" посилання


Дійсно appearance, саме для цього нам потрібно; просто майте на увазі, що "це нестандартно і не стоїть на стандарті" .
сам

12

З чистим CSS, нічого фантазійного :beforeі :after, без перетворень, ви можете вимкнути зовнішній вигляд за замовчуванням, а потім накреслити його за допомогою вбудованого фонового зображення, як у наступному прикладі. Це працює в Chrome, Firefox, Safari та тепер Edge (Chromium Edge).

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

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

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


1
Так! Тільки той, який насправді пристойний.
odinho - Велмонт

10

Моє рішення

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

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

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

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

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

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

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


Якщо хтось міг би порадити, чому мій текст не вирівнюється після цього, я хотів би знати! Тут для початківців CSS.
agirault

8

Ви можете просто використовувати appearance: noneв сучасних браузерах, щоб не було типових стилів і всі ваші стилі застосовувалися належним чином:

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

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

1
Це особливо мінімалістичний приклад, який працював на мою справу, дякую!
Джейсон Р Стівенс CFA

8

Хочете НІ JavaScript, НЕ зовнішніх бібліотек, відповідності доступності та обох прапорців та радіо кнопок?

Я прокручував і прокручував, і тонни цих відповідей просто викидають доступ до дверей і порушують WCAG більш ніж одним способом. Я перекинув радіо кнопки з більшості випадків, коли ви користуєтеся власними прапорцями, ви також бажаєте користувацьких перемикачів.

Загадки :

  • Прапорці - чистий CSS - вільний від сторонніх бібліотек
  • Кнопки радіо - чистий CSS - вільний від сторонніх бібліотек
  • Поле прапорців *, які використовують FontAwesome, але їх можна легко замінити гліфіконами тощо

Пізно на вечірку, але чомусь це все ще складно в 2019 2020 році, тому я додав свої три рішення, які доступні і прості в них.

Все це безкоштовно JavaScript , зовнішня бібліотека * і доступні ...

Якщо ви хочете підключити будь-яку з них, просто скопіюйте аркуш стилів із скриптів, відредагуйте кольорові коди у CSS, щоб відповідати вашим потребам, та йдіть у дорогу. Ви можете додати спеціальну піктограму svg, якщо ви хочете для цих прапорців. Я додав багато коментарів для тих, хто не є CSS.

Якщо у вас довгий текст або маленький контейнер, ви стикаєтесь із загортанням тексту під прапором або введенням перемикача, тоді просто перетворіть у подібні символи .

Більш тривале пояснення: мені потрібно було рішення, яке не порушує WCAG, не покладається на JavaScript або зовнішні бібліотеки, і це не порушує навігацію по клавіатурі, як вкладки або пробіл, щоб вибрати, що дозволяє фокусувати події, рішення, яке дозволяє відключити прапорці, які обидва перевірені і безконтрольно, і , нарешті, рішення , в якому я можу налаштувати зовнішній вигляд прапорця , проте я хочу з різними background-color«s, border-radius,svg фони і т.д.

Я використав деяку комбінацію цієї відповіді від @Jan Turoň, щоб придумати власне рішення, яке, здається, працює досить добре. Я зробив загадку радіо кнопок, яка використовує багато того самого коду з прапорців, щоб зробити цю роботу і за допомогою радіо кнопок.

Я все ще навчаюся доступності, тому якщо я щось пропустив, будь ласка, залиште коментар, і я спробую виправити це ось приклад коду моїх прапорців:

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

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

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

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

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

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


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

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

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

<br>

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

<br>

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

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

<br>

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


Я також додав тут свою власну відповідь , сподіваюся, це комусь допоможе. Я використовував тематизацію в моєму. :) Сподіваюсь, хтось це побачить.
Містер Polywhirl

6

Ось просте CSS-рішення без жодного jQuery чи JavaScript-коду.

Я використовую піктограми FontAwseome, але ви можете використовувати будь-яке зображення

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

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

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

1
На відміну від більшості інших відповідей, цей не потребує створення додаткових labelчи spanелементів. Це просто працює!
KurtPreston

Чи можете ви показати приклад чи демонстрацію, або принаймні HTML-частину, з якою працює цей CSS-код? @aWebDeveloper
Sándor Zuboly

@aWebDeveloper внесення нерегулярних редагувань, щоб знайти відповідь чи запитання на домашній сторінці, суперечить правилам.
TylerH

@aWebDeveloper Ви відредагували стару відповідь на неактивне запитання, яка нарікає її на головну сторінку та надає посилання прямо на вашу відповідь. Це добре, якщо у вас є відповідна інформація, яку потрібно додати або змінити у відповідь. Все, що ви зробили, було вбудувати одне зі своїх пропозицій у блок цитат, який нікому не корисний.
TylerH

повинен працювати @VadimOvchinnikov ... тут нічого не є специфічним для хрому
aWebDeveloper

6

З мого googling, це найпростіший спосіб стилізації прапорців. Просто додайте :afterта :checked:afterCSS на основі вашого дизайну.

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

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

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


Дуже круте рішення для браузерів, які підтримують псевдоелементи. :)
Жан-Франсуа Бошамп

6

Змініть стиль прапорця за допомогою простого CSS3, не потрібно жодних маніпуляцій JS та HTML.

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

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

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

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


@VadimOvchinnikov У нас є одне рішення , яке вимагає , щоб пішов HTML структура .. stackoverflow.com/questions/23305780 / ...
BEJGAM SHIVA Прасад

4

Простий і легкий шаблон:

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

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

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

https://jsfiddle.net/rvgccn5b/


1
Псевдоелементи для inputs підтримуються лише в Chrome, ваш код працює не однаково у кожному браузері.
Вадим Овчинников

4

Я думаю, що найпростіший спосіб це зробити, labelстворивши стилі і зробивши checkboxневидимою.

HTML

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

CSS

checkbox {
  display: none;
}

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

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

checkbox, Навіть якщо він прихований, по- , як і раніше буде доступний, і його значення буде відправлено , коли форма була відправлена. Для старих браузерів вам, можливо, доведеться змінити клас labelперевіреного за допомогою JavaScript, оскільки я не думаю, що старі версії Internet Explorer розуміють ::checkedна checkbox.


4
Різниця між вашою відповіддю та моєю полягає в тому, що саме?
Блейк Петтерссон

@BlakePettersson ваш правильно, :: перевіряється просто неправильно (я навіть намагався на всякий випадок , це також допускається);)
осіб

7
Це погана відповідь. (а) ::checkedнеправильно - так і має бути :checked. (б) checkboxпомиляється - це має бути[type=checkbox]
Кріс Морган

4

Yikes! Усі ці обхідні шляхи привели мене до висновку, що прапорець HTML начебто відстійний, якщо ви хочете його стилізувати.

Як попередження, це не реалізація CSS. Я просто думав, що поділюсь вирішенням, з яким я придумав, на випадок, якщо хтось інший вважатиме це корисним


Я використовував canvasелемент HTML5 .

Перевагою цього є те, що вам не доведеться використовувати зовнішні зображення і, ймовірно, ви можете зберегти деяку пропускну здатність.

Мінус полягає в тому, що якщо веб-переглядач з якихось причин не може виправити його належним чином, тоді немає жодного запасного варіанту. Незважаючи на те, чи залишається це питання у 2017 році, є дискусійним.

Оновлення

Я знайшов старий код досить некрасивим, тому вирішив дати його переписати.

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

    retobj.constructor(args || null);

    return retobj;
}

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

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

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

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

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

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

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

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

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

Ось робоча демонстрація .

Нова версія використовує прототипи та диференційоване успадкування для створення ефективної системи для створення прапорців. Щоб створити прапорець:

var my_checkbox = Checkbox.create();

Це негайно додасть прапорець у DOM та підключить події. Щоб запитати, чи встановлено прапорець:

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

Також важливо зазначити, що я позбувся циклу.

Оновлення 2

Щось я нехтував зазначити в останньому оновлення, це те, що використання полотна має більше переваг, ніж просто виготовлення прапорця, який виглядає, проте ви хочете, щоб воно виглядало. Ви також можете створити прапорці для багатьох держав , якщо цього хочете.

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

    retobj.constructor(args || null);

    return retobj;
}

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

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

    return Object.seal(oldobj);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

Я трохи змінив Checkboxвикористаний в останньому фрагменті, щоб він був більш загальним, що дозволяє "розширити" його за допомогою прапорця, який має 3 стани. Ось демонстрація . Як бачите, він вже має більше функціональних можливостей, ніж вбудований прапорець.

Що слід враховувати, коли ви обираєте JavaScript та CSS.

Старий, погано розроблений код

Робоча демонстрація

Спочатку встановіть полотно

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

Далі придумайте спосіб оновити полотно.

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

Остання частина - зробити її інтерактивною. На щастя, це досить просто:

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

Тут можуть виникнути проблеми в IE через їх дивну модель обробки подій у JavaScript.


Я сподіваюся, що це комусь допоможе; це безумовно відповідало моїм потребам.


Зауважте, що реалізація Canvas як емуляція прапорців дозволяє отримати більше функціональних можливостей, ніж вбудовані прапорці. Наприклад, модні речі, такі як "багатодержавні" прапорці (наприклад unchecked (e.g. unchecked -> checked -> "kinda" checked -> unchecked, стани можуть представляти, наприклад, "явна помилка", "явна правда", "використовувати за замовчуванням", наприклад). Я розглядаю можливість додати приклад до відповіді.
Бреден Кращий

Страшна ідея на мій погляд.

@Neil, будь ласка, докладно
Braden Best

Навіщо винаходити колесо?

@Neil чому б не винаходити колесо? NIH - це не завжди погана річ, особливо коли вона дає переваги, які в іншому випадку було б неможливо або нерозумно складно реалізувати з існуючими технологіями. Отже, це питання, чи готові ви мати справу з вбудованими прапорцями. І якщо я хочу, щоб тематика їх поєднувалася з візуальною мовою мого веб-сайту чи програми, я хочу повністю контролювати. Тому, поки хтось не створить самостійну бібліотеку інтерфейсу користувача, яка є легкою та простою у використанні, я особисто вважаю за краще, щоб мої колеса були винайдені тут. Хтось ще не може, але це не визнає моєї відповіді.
Бреден Кращий

3

Це найпростіший спосіб, і ви можете вибрати, яким прапорцям надавати цей стиль.

CSS:

.check-box input {
  display: none;
}

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

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

HTML:

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

3

Не потрібно JavaScript або jQuery .

Змініть свій прапорець простим способом.

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

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

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

Ось посилання JsFiddle


Цей прапорець не відображається, оскільки він покладається на зовнішні посилання на файли зображень imgh.us/uncheck.png та imgh.us/check_2.png, які більше недоступні в Інтернеті.
jkdev

2

Ось версія CSS / HTML, взагалі не потрібні jQuery чи JavaScript, простий та чистий HTML, а також дуже простий та короткий CSS.

Ось JSFiddle

http://jsfiddle.net/v71kn3pr/

Ось HTML:

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

Ось CSS

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

Це може бути адаптовано для того, щоб мати можливість мати окремі радіо або прапорці, групи прапорців та групи радіо кнопок.

Цей html / css дозволить вам також фіксувати натискання на етикетку, тому прапорець буде встановлений і знятий, навіть якщо натиснути просто на етикетку.

Цей тип прапорців / перемикачів відмінно працює з будь-якою формою, взагалі немає проблем. Тестувались також за допомогою PHP, ASP.NET (.aspx), JavaServer Faces та ColdFusion .


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

Пояснення було б в порядку.
Пітер Мортенсен

1

Ні, ви все одно не можете самі стилізувати прапорець, але я (нарешті) зрозумів, як створити ілюзію, зберігаючи функціональність клацання прапорця. Це означає, що ви можете перемикати його, навіть якщо курсор не ідеально нерухомий, не ризикуючи вибирати текст або запускати перетягування!

Це рішення, ймовірно, також підходить для перемикачів.

Наведені нижче роботи в Internet Explorer 9, Firefox 30.0 та Chrome 40.0.2214.91 є лише базовим прикладом. Ви все ще можете використовувати його в поєднанні з фоновими зображеннями та псевдоелементами.

http://jsfiddle.net/o0xo13yL/1/

label {
    display: inline-block;
    position: relative; /* Needed for checkbox absolute positioning */
    background-color: #eee;
    padding: .5rem;
    border: 1px solid #000;
    border-radius: .375rem;
    font-family: "Courier New";
    font-size: 1rem;
    line-height: 1rem;
}

label > input[type="checkbox"] {
    display: block;
    position: absolute; /* Remove it from the flow */
    width: 100%;
    height: 100%;
    margin: -.5rem; /* Negative the padding of label to cover the "button" */
    cursor: pointer;
    opacity: 0; /* Make it transparent */
    z-index: 666; /* Place it on top of everything else */
}

label > input[type="checkbox"] + span {
    display: inline-block;
    width: 1rem;
    height: 1rem;
    border: 1px solid #000;
    margin-right: .5rem;
}

label > input[type="checkbox"]:checked + span {
    background-color: #666;
}

<label>
    <input type="checkbox" />
    <span>&nbsp;</span>Label text
</label>

1

Оскільки браузери, такі як Edge та Firefox, не підтримують: до: після введення тегів у прапорець, тут є альтернатива виключно з HTML та CSS. Звичайно, ви повинні редагувати CSS відповідно до своїх вимог.

Зробіть прапорець HTML таким чином:

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

Застосуйте цей стиль для прапорця, щоб змінити кольорову мітку

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

1

Здається, ви можете змінити колір прапорця в градаціях сірого лише за допомогою CSS.

Далі перетворює прапорці з чорного в сірий (що стосується того, що я хотів):

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

це також робить світло кордону. Крім того, ви не можете бачити чек, якщо ви перевіряєте його.
Рейчел S

1

Впровадження SCSS / SASS

Більш сучасний підхід

Для тих, хто використовує SCSS (або легко перетворюється на SASS), корисним буде наступне. Ефективно зробіть елемент біля прапорця, який ви будете стилювати. Коли клацніть прапорець, CSS перевстановлює сестринський елемент (у ваш новий перевірений стиль). Код нижче:

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

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

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


0

Увага : на момент написання справи було вірно наступне, але тим часом справи прогресували.

Сучасні браузери AFAIK відображають прапорці за допомогою нативного керування ОС, тому немає можливості їх стилізувати.


30
Це могло бути правдою у 10 році, але не зараз, ви повинні видалити цю відповідь.
Michał K

3
Це все ще вірно - усі сучасні браузери відображають прапорці за допомогою нативного керування ОС. Справа лише в тому, що існують кілька прикольних нових методик, щоб подолати це обмеження.
Гал

Так, я мав на увазі частину "немає способу їх стилізувати" ^ ^
Йоріл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.