Как стать автором
Обновить

Комментарии 89

Я думаю, ничто не мешает для IE сделать JavaScript-хак.
Осталось ещё для input file и select. А что там с кроссбраузерностью и с какой версии браузеров работает?
С file все проще: jsfiddle.net/tsLyW/ и будет работать во всех браузерах. Есть еще мысль заменить span на :before, но в любом случае понадобится контейнер.

А с select вариантов стилизации не особо много. Меня лично бесят кастомные селект-боксы. В большинстве своем они выглядят куда более отвратительно нежели нативные.
НЛО прилетело и опубликовало эту надпись здесь
Только вот JS уже используется. Но да, так проще.
Я с селектами поступаю так же, как и с file — при opacity:0; сам селект скрывается, а вот список имеет 100% видимость. Правда, чтобы в стилизованном спане показывать выбранный пункт, приходится все-таки использовать скрипт, но там буквально пара строк.
В IE 9 у меня только по двойному клику окно открывается
Нет поля, где бы отображалось название выбранного файла. Непонятно, выбран уже файл (и какой) или нет.
В лисе не вся область кликабельна.
НЛО прилетело и опубликовало эту надпись здесь
Всё хорошо, но вместо лишнего SPAN ведь можно использовать ::before?
А как скроете оригинальный контрол?
НЛО прилетело и опубликовало эту надпись здесь
Как вы будете ловить нажатие на контрол? Получится, что клик по тексту label будет работать, а по самой картинке (т. е. псевдоэлементу) — нет.
НЛО прилетело и опубликовало эту надпись здесь
Можете показать пример? У меня не работает нажатие на псевдо-элемент, когда вешаю его на label.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
А теперь уберите оттуда:

input[type="checkbox"] + label {
    color:#f2f2f2;
    font-family:Arial, sans-serif;
    font-size:14px;
}


и удивитесь))
НЛО прилетело и опубликовало эту надпись здесь
Это из-за font-size, проверил в хроме и сафари на макоси — не работает, если убрать это свойство. Нет возможности сейчас в других браузерах посмотреть, интересно, как поведут себя не-webkit.
НЛО прилетело и опубликовало эту надпись здесь
Да, в 9 действительно работает.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
сделал деградацию добавлением body:not(#foo) вначало так

body:not(#foo) input[type=«checkbox»] {
display:none;
}

body:not(#foo) input[type=«checkbox»] + label span {
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Нет, т.к. при изменении этого параметра, сам аттрибут не измениться, тут в css нужен именно псевдокласс.
Нужно, чтобы можно было табуляцией фокус устанавливать.
НЛО прилетело и опубликовало эту надпись здесь
А что мешает подложить рядышком check_radio_sheet@2x.png для ретины?
НЛО прилетело и опубликовало эту надпись здесь
А что, нативные чекбоксы как-то себя ведут при масштабировании в десктопном браузере? Проверил в вебкитах, они не масштабируются.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Псевдоклассы, в частности используемый :checked, отлично работают в большинстве браузеров, за исключением Internet Explorer 9 (и ниже)

Уверены, что в IE9 не работает :checked?
НЛО прилетело и опубликовало эту надпись здесь
Надо же как можно, оказывается:

input + label span
Опять управление с клавиатуры убито напрочь.
В Safari в iOS :checked работает, там не работает привязанный label.
Чтобы он заработал достаточно прописать ему пустой атрибут onclick.

<input type="checkbox" id="c1" name="cc" />
<label for="c1" onclick=""><span></span>Check Box 1</label>
НЛО прилетело и опубликовало эту надпись здесь
В общем решение в посте так себе. Учитывая баги Webkit, которые обнаружены выше, я бы сделал примерно так (если опустить красивости):

<input type="checkbox" id="c1" name="cc">
<label for="c1">Check Box</label>

input[type="checkbox"] {
  display: none;
}

input[type="checkbox"] + label {
  font-size: 14px; /* для webkit */
  cursor: pointer;
}

input[type="checkbox"] + label::before {
  display: inline-block;
  width: 19px;
  height: 19px;
  background: url('check_radio_sheet.png') left top no-repeat;
  content: "";
  vertical-align: middle;
}

input[type="checkbox"]:checked + label::before {
  background-position: -19px top;
}
НЛО прилетело и опубликовало эту надпись здесь
Ну, в продакшн я бы вообще так не делал)
Имел ввиду конкретно этот пост.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Очень жаль, что по спецификации нельзя применять псевдоэлементы ::before и ::after к инпутам. Только Вебкит нарушает спецификацию.
НЛО прилетело и опубликовало эту надпись здесь
Из комментариев узнал больше чем из статьи
Сейчас меня «накроет морем минусов» и всего такое, не важно, но сколько еще можно постить на хабру такую «воду»?

Хотите написать статью, изучите тему вдоль и поперек, то, что другие не знают, какие-то мелочи, детали, оставшиеся за сценой, что за унылое говно, ну, почему так, а?
В ключе данной статьи «изучить вдоль и поперек» это слишком громко. Способов это сделать на самом деле масса. Не стоит быть настолько уж суровым, бывают статьи и похуже, и скушнее, и водянистее… Причем в разы.

Хотя я бы не отказался от статейки по обзору различных способов стилизации форм.
Написать на изображении «No JavaScript» это совсем не комильфо. Если уж что-то и делать, то с обратной совместимостью и с учетом graceful degradation.

Есть такие (глубоко нативные, привычные и необходимые) вещи, которые никто не отменял, например Tab или Shift + Tab. Это должно поддерживаться. Ровно, как и выбрать чекбокс тем же «пробелом».

Фокуса на элементе не видно, без мыши — ноль копеек цена такой форме с такими элементами. Да что это я в самом деле…
НЛО прилетело и опубликовало эту надпись здесь
Я о том и пишу, смысл это статьи какой?

Ее нужно было назвать как,
«Охуенные чекбоксы, которые как-бы не везде работают и не совсем правильно работают. Но охуенные.».
Мне больше нравится вариант без использования label. Как-то так jsfiddle.net/9AFKW/8/
НЛО прилетело и опубликовало эту надпись здесь
Можно, но я предпочитаю такие вещи в цельный блок объединять.
Статья хорошая, спасибо. Поставил Like

Но меня всегда печалила необходимость придумывать и указывать идентификатор для атрибута «for», конечно, если форма собирается шаблонизатором, то никаких проблем нету, но для production ваше решение тоже не подходит, хотя бы потому, что не работает управление с клавиатуры.
Я лично предпочту маленький js-файл (~700 байт) для отказа от атрибута «for» и для работающего управления с клавиатуры
Пример

А вообще, в CSS4 Selector API предусмотрен Reference Combinator и Parent Selector для таких случаев. Возможно, в будущем мы сможем написать:
label! /for/ input:checked {
    box-shadow: yellow 0 0 10px;  
}  

Правило применится к элементу <label>

Жду не дождусь статей «Красивые чекбоксы и радиокнопки на CSS4 без JavaScript» :)
НЛО прилетело и опубликовало эту надпись здесь
Почему же огорчать? CSS такой же живой стандарт, как и HTML. CSS4 всего лишь сокращение для CSS Selector API level 4 и он таки будет, просто под именем CSS. Но я вас уверяю, когда браузеры начнут внедрять CSS Selector API level 4, они в своих пресс-релизах будут использовать именно термин CSS4, как было с HTML5.
НЛО прилетело и опубликовало эту надпись здесь
Смотрите мой комментарий выше.
Добавил ещё выделение при фокусе jsfiddle.net/9AFKW/30/
Это круто, но, для меня лично, семантически некрасиво. Да и добавьте теперь сюда текст для инпута, да чтобы он ещё был связан с инпутом: клик по тексту -> клик по инпуту

Что уж говорить, я даже twitter bootstrap отредактировал, чтобы он поддерживал <input> вложенный в <label>
Сила визуализации налицо.
Да, пожалуй, нужно больше картинок.
использую этот способ уже второй год, докопался до него через анализ родных чекбоксов в Google Chrome.
а, знаете, вру — в способе моём Google Chrome в сам label подставляется непосрдственно битмэп, через псевдокласс :before — таким образом, те же яйца, только без спана.
Очень круто, спасибо)
у этого способа есть еще один серьезный недостаток.

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



Мало того, при высоте битмэпа большей, чем line-height, прыгнет межстрочник.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории