Чистий CSS-прапорець заміни зображення


78

У мене є список прапорців у таблиці. (один із ряду КБ на ряду)

 <tr><td><input type="checkbox" class="custom_image" value="1" id="CB1" /><label for='CB1'>&nbsp;</label></td></tr>
 <tr><td><input type="checkbox" class="custom_image" value="2" id="CB2" /><label for='CB2'>&nbsp;</label></td></tr>
 <tr><td><input type="checkbox" class="custom_image" value="3" id="CB3" /><label for='CB3'>&nbsp;</label></td></tr>
 <tr><td><input type="checkbox" class="custom_image" value="4" id="CB4" /><label for='CB4'>&nbsp;</label></td></tr>

Я хотів би замінити зображення прапорця на пару власних зображень для ввімкнення / вимкнення, і мені було цікаво, чи хтось краще розумів, як це зробити за допомогою CSS?

Я знайшов цей підручник "CSS-ніндзя", але мушу визнати, що для мене це складно. http://www.thecssninja.com/css/custom-inputs-using-css

Наскільки я можу зрозуміти, вам дозволено використовувати псевдо-клас

 td:not(#foo) > input[type=checkbox] + label
 {
     background: url('/images/off.png') 0 0px no-repeat;
     height: 16px;
     padding: 0 0 0 0px;
 }

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

 td:not(#foo) > input[type=checkbox]:checked + label {
     background: url('/images/on.png') 0 0px no-repeat;
 }

На жаль, здається, я десь пропускаю критичний крок. Я намагався використати власний синтаксис селектора CSS3, щоб відповідати моїм поточним налаштуванням, але, мабуть, чогось не вистачає (розміри зображень 16x16, якщо це важливо)

http://www.w3.org/TR/css3-selectors/# проверено

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


Існує плагін jQuery під назвою Uniform, який дуже добре справляється з цим.
Matt Sherman

на жаль, ми використовуємо прототип, і я не можу цього змінити (стук ефектів може скалічити). Я б шукав прототип плагіна (вигадливі форми) ... але частиною моєї "особистої" мети є змусити його працювати за допомогою методу non-js. Я знаю, що це можна зробити (див. Підручник). Я відчуваю, що мені близько ... і я думаю, що знання, як це зробити, покращить мою здатність працювати з майбутніми подібними завданнями. Очевидно, що якщо це неможливо, я здадуся і перейду до якогось трюку JS.
Alex C

1
Зачекайте - "Чистий CSS" як у CSS без зображень або CSS без Javascript?
arbales

о - я мав на увазі "напівчистий", на даний момент я безумовно використовую зображення, але я гадаю, можна було б використовувати тег "data / mime", щоб помістити зображення всередину CSS. (нещодавно я бачив статтю про це, хоча в даний момент точне місце розташування мені не вистачає)
Alex C

3
Зачекайте, "Чистий CSS", як у CSS з javascript та / або додатковими вузлами dom?
канон

Відповіді:


124

Ви вже близько. Просто не забудьте приховати прапорець і пов’язати його з міткою, за допомогою якої ви стилізуєтеinput[checkbox] + label

Повний код: http://gist.github.com/592332

JSFiddle: http://jsfiddle.net/4huzr/


3
Це покладається на labelелемент, який може бути відсутнім. див. мою відповідь нижче.
Mo Valipour

Думаю, якщо замість цього встановити непрозорість 0, ви все одно зможете досягти поведінки табуляції. Не 100% на цьому.
gdbj

без імені та для jsfiddle.net/ajshres/4huzr/2486 при використанні для великої таблиці може бути зручним при використанні проти ajax
Ajay Gopal Shrestha

Заперечення @Valipour відхилено. Якщо ваш прапорець не має мітки, поставте мітку на вашому полі. Це вирішує ваші проблеми з користувальницьким інтерфейсом та WAG тим самим махом.
j4k3

40

Використання javascript здається непотрібним, якщо ви вибрали CSS3.

За допомогою :beforeселектора ви можете зробити це у двох рядках CSS. (сценарій не задіяний).

Ще однією перевагою цього підходу є те, що він не покладається на <label>тег і працює, навіть якщо він відсутній.

Примітка: у браузерах без підтримки CSS3 прапорці будуть виглядати нормально. (зворотно сумісний).

input[type=checkbox]:before { content:""; display:inline-block; width:12px; height:12px; background:red; }
input[type=checkbox]:checked:before { background:green; }​

Демонстрацію ви можете побачити тут: http://jsfiddle.net/hqZt6/1/

а цей із зображеннями:

http://jsfiddle.net/hqZt6/6/


8
Це виглядає дуже багатообіцяючим, але, на жаль, схоже, це не працює на Firefox 14.0.1 Mac
Мюррей Сміт

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

7
Добре. Я щойно дізнався, що це можна виправити, встановивши прапорець на visibility: hiddenта :beforeна visibility: visible. Я припускаю, що це порушує зворотну сумісність.
Джимбалі

3
Jsfiddles, вони нічого не роблять. Показується як звичайні прапорці. Firefox 27.
raveren

3
Те саме з Windows (вибачте, доводиться використовувати його на роботі): Працює в Chrome 35, але не у Firefox 30.
Michael Scheper

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