Как оформить флажок с помощью CSS? - PullRequest
758 голосов
/ 10 ноября 2010

Я пытаюсь оформить флажок, используя следующее:

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

Но стиль не применяется.Флажок по-прежнему отображает стиль по умолчанию.Как мне придать ему указанный стиль?

Ответы [ 28 ]

734 голосов
/ 10 ноября 2010

ОБНОВЛЕНИЕ: приведенный ниже ответ ссылается на положение вещей до широкого распространения CSS3.В современных браузерах (включая Internet Explorer 9 и более поздние версии) проще создавать замены флажков с использованием предпочитаемого вами стиля без использования JavaScript.

Вот несколько полезных ссылок:

Стоит отметитьчто фундаментальная проблема не изменилась.Вы по-прежнему не можете применять стили (границы и т. Д.) Непосредственно к элементу флажка, и эти стили влияют на отображение флажка HTML.Однако изменилось то, что теперь можно скрыть фактический флажок и заменить его собственным элементом в стиле, используя только CSS.В частности, поскольку CSS теперь имеет широко поддерживаемый селектор :checked, вы можете сделать так, чтобы ваша замена корректно отражала проверенный статус поля.


СТАРЫЙ ОТВЕТ

Вот полезная статья о флажках стиля .По сути, автор обнаружил, что он сильно варьируется от браузера к браузеру, и что многие браузеры всегда отображают флажок по умолчанию, независимо от того, как вы его стилизуете.Так что на самом деле не существует простого способа.

Нетрудно представить обходной путь, при котором вы бы использовали javascript для наложения изображения на флажок, а щелчки по этому изображению приводили к тому, что флажок был установлен.Пользователи без javascript увидят флажок по умолчанию.

Отредактировано, чтобы добавить: вот хороший скрипт, который сделает это за вас ;он скрывает реальный элемент флажка, заменяет его стилизованным диапазоном и перенаправляет события щелчка.

133 голосов
/ 30 августа 2012

Есть способ сделать это, используя только CSS.Мы можем (ab) использовать элемент и стиль label вместо этого.Предостережение заключается в том, что это не будет работать для IE8 и более низких версий.

CSS:

.myCheckbox input {
    // display: none;
    // Better than display: none for accessibility reasons
    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");
}

HTML:

<label for="test">Label for my styled "checkbox"</label>
<label class="myCheckbox">
    <input type="checkbox" name="test"/>
    <span></span>
</label>
126 голосов
/ 09 июня 2013

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

Обратите внимание, что это будет работать только для совместимых браузеров, я думаю, это связано с тем, что некоторые браузеры не позволяют устанавливать :after и :before для элементов ввода. К сожалению, это означает, что на данный момент поддерживаются только браузеры webkit. FF + IE по-прежнему будет позволять функционировать флажкам, просто не установленным, и, надеюсь, это изменится в будущем (код не использует префиксы поставщиков).

Это только решение для браузера Webkit (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>

Скрипка переключателя в стиле бонусного Webkit

$(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>
120 голосов
/ 05 января 2015

Прежде чем начать (по состоянию на январь 2015 г.)

Первоначальному вопросу и ответу теперь ~ 5 лет.Таким образом, это небольшое обновление.

Во-первых, существует несколько подходов, когда дело доходит до стилей флажков.основной принцип:

  1. Вам нужно будет скрыть элемент управления флажка по умолчанию, стилизованный под ваш браузер, и не может быть переопределен каким-либо значимым образом с помощью CSS.

  2. Когда скрытый элемент управления, вам все равно нужно будет иметь возможность обнаруживать и переключать его проверенное состояние

  3. Проверенное состояние флажка должно отражаться стилемновый элемент

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

Вышесказанное может быть достигнуто несколькими способами - и вы часто будете слышать, что использование псевдоэлементов CSS3 - этоправильно.На самом деле, нет правильного или неправильного пути, это зависит от подхода, наиболее подходящего для контекста, в котором вы будете его использовать. Тем не менее, у меня есть предпочтительный.

  1. ОбтеканиеВаш флажок в элементе label.Это будет означать, что даже когда он скрыт, вы все равно можете переключать его отмеченное состояние, щелкая в любом месте метки.

  2. Скрыть свой флажок

  3. Добавьте новый элемент после флажок, который вы будете соответственно стилизовать.Он должен появиться после флажка, чтобы его можно было выбрать с помощью CSS и стилизовать в зависимости от состояния :checked.CSS не может выбрать «назад».

Решение (в коде)

label input {
  visibility: hidden;/* <-- hide the default checkbox, the rest is to hide and alllow tabbing, which display:none prevents */
  display:block;
  height:0;
  width:0;
  position:absolute;
  overflow:hidden;
}
label span {/* <-- style the artificial checkbox */
  height: 10px;
  width: 10px;
  border: 1px solid grey;
  display: inline-block;
}
[type=checkbox]:checked + span {/* <-- style its checked state */
  background: black;
}
<label>
  <input type='checkbox'>
  <span></span>
  Checkbox label text
</label>

Уточнение (с помощью значков)

Но эй!Я слышу, как ты кричишь.А что, если я хочу показать симпатичную галочку или крестик в коробке?И я не хочу использовать фоновые изображения!

Хорошо, это то, где псевдоэлементы 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>
30 голосов
/ 01 октября 2015

Я бы последовал совету ответа SW4 - чтобы скрыть флажок и покрыть его пользовательским диапазоном, предлагая этот HTML

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

Обтекание метки позволяет аккуратно щелкать текст без необходимости связывания атрибута «for-id». Тем не менее,

не скрывайте, используя visibility: hidden или display: none

Он работает, щелкая или нажимая, но это неэффективный способ использовать флажки. Некоторые люди все еще используют гораздо более эффективную вкладку для перемещения фокуса, пробел для активации, и скрытие с помощью этого метода отключает его. Если форма длинная, можно сохранить чьи-то запястья, чтобы использовать атрибуты tabindex или accesskey. И если вы наблюдаете поведение системного флажка, то при наведении появляется приличная тень. Правильный стиль флажка должен следовать за этим поведением.

ответ cobberboy рекомендует 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 - это square-o для Font Awesome, отступы настраиваются так, чтобы обеспечить четкий контур на фокусе (см. Ниже).

  4. Добавить флажок отмеченный скин

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

    \00f046 - это check-square-o от Font Awesome, ширина которого не равна ширине 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;
    }
    

демо Fiddle

Попробуйте навести указатель мыши на флажки и используйте tab и shift + tab для перемещения и пробел для переключения.

29 голосов
/ 18 августа 2013

Вы можете стилизовать флажки с небольшим обманом, используя элемент 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!

24 голосов
/ 05 января 2017

Простое в реализации и легко настраиваемое решение

После долгих поисков и испытаний я получил это решение, которое легко реализовать и настроить. В этом решении :

  1. Вам не нужны внешние библиотеки и файлы
  2. Вам не нужно добавлять дополнительный HTML на вашей странице
  3. Вам не нужно менять названия флажков и id

Просто поместите текущий CSS вверху вашей страницы, и стиль всех флажков изменится следующим образом:

enter image description here

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;
}
17 голосов
/ 30 июня 2017

Вы можете избежать добавления дополнительной разметки.Это работает везде, кроме 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" />
15 голосов
/ 02 июля 2014

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

(ниже статическое изображение, позволяющее визуализировать результат; см. JSFiddle для интерактивной версии)

checkbox example

Как и в других решениях, он использует элемент 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 .

12 голосов
/ 03 декабря 2015

Это довольно старый пост, но недавно я нашел довольно интересное решение проблемы.

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

Пример скрипки

input[type=checkbox] {
  width: 23px;
  height: 23px;
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  margin-right: 10px;
  background-color: #878787;
  outline: 0;
  border: 0;
  display: inline-block;
  -webkit-box-shadow: none !important;
  -moz-box-shadow: none !important;
  box-shadow: none !important;
}

input[type=checkbox]:focus {
  outline: none;
  border: none !important;
  -webkit-box-shadow: none !important;
  -moz-box-shadow: none !important;
  box-shadow: none !important;
}

input[type=checkbox]:checked {
  background-color: green;
  text-align: center;
  line-height: 15px;
}
<input type="checkbox">

К сожалению, поддержка браузера довольно плоха для опции appearance из моего личного тестирования. У меня только Opera и Chrome работают правильно. Но это был бы способ сохранить простоту, когда приходит лучшая поддержка или вы хотите использовать только Chrome / Opera.

"Могу ли я использовать?" ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...