Як змінити стиль межі прапорця в CSS?


122

Як я можу змінити стиль межі поля (вхідного)? Я поставив border:1px solid #1e5180це, але у FireFox 3.5 нічого не відбувається!

Відповіді:


63

Якщо щось трапиться в будь-якому браузері, я був би здивований. Це один із тих видатних елементів форми, що браузери, як правило, не дозволяють вам так стильно, і що люди зазвичай намагаються замінити javascript, щоб вони могли стилювати / кодувати щось, щоб виглядати та діяти як прапорець.


4
Opera дуже добре впорається зі стилізацією на прапорець. IE має певний стиль, який обертається навколо прапорця (не на самій прапорці).
трепет

4
Сьогодні вони насправді некрасиві: D
Гергелі Фехерварі

1
все ще потворні у 2020 році
Павло

210

Я пропоную використовувати "контур" замість "межі". Наприклад: outline: 1px solid #1e5180.


3
Контур - чудова альтернатива.
Nippysaurus

4
контур дуже хороший, і він працює для всіх полів введення та вибору, що робить це корисним для класів ".error".
SztupY

2
Можливо, вам доведеться додати !importantдо свого css, використовуючи контур. Я тестував це в Firefox 12.0 і без! Важливо, контур буде зникати, поки я натискав прапорець.
Weezle

3
Це чудова альтернатива, але проблема структури полягає в тому, що в IE7 він не працює !!
Yises

13
@Yises Ви повинні турбуватися про IE7? Так, вибачте
theblang

71

Ви повинні використовувати

-moz-appearance:none;
-webkit-appearance:none;
-o-appearance:none;

Тоді ви позбудетесь зображення / стилю прапорця за замовчуванням і зможете його стилізувати. У будь-якому випадку кордон все ще буде у Firefox


2
Opera дозволяє вам розміщувати прапорці без зайвих хакерів - я б залишив стиль -o-зовнішній вигляд. -moz-зовнішній вигляд та -webkit-зовнішній вигляд чудові, хоча.
Нелл

7
На жаль, заговорили занадто рано: "-webkit-поява: жодна;" Здається, вимкніть поведінку прапорця.
Нелл

6
для мене (хром 5) це не потрібно, вам потрібно стилізувати: перевірений стан додатково
Валерій

1
зовнішній вигляд ніколи не був частиною стандарту CSS. Не використовуйте.
Євген

Ух, це дивовижно, я позбудусь плагінів. я можу зробити що завгодно => | введення [тип = прапорець] | input [type = checkbox]: навести курсор | input [type = checkbox]: Позначено | input [type = checkbox]:
Позначено

21

Ви можете використовувати тіньові коробки для підробки межі:

-webkit-box-shadow: 0px 0px 0px 1px rgba(255,0,0,1);
-moz-box-shadow: 0px 0px 0px 1px rgba(255,0,0,1);
box-shadow: 0px 0px 0px 1px rgba(255,0,0,1);

@retrovertigo, яка версія?
Денніс Хайден

Версія 12.0.2 (14606.3.4) / остання на macOS 10.14
ретровертиго

@retrovertigo Я перевірив своє рішення, і ти маєш рацію. Моя відповідь не працює для Safari без додаткових модифікацій (як -webkit-зовнішній вигляд: немає;). Через 3 роки я б застосував рішення, надані pendingfox або Adan. Але я спробую продовжити свою відповідь протягом декількох тижнів. Спасибі за ваш відгук.
Денніс Хайден

11

Ось чисте перехресне браузерне рішення CSS (без зображень), засноване на користувальницьких прапорцях Мартіна та радіо кнопок з CSS3 LINK: http://martinivanov.net/2012/12/21/imageless-custom-checkboxes-and-radio-buttons -з-css3-переглянуто /

Ось jsFiddle: http://jsfiddle.net/DJRavine/od26wL6n/

Я перевірив це в наступних браузерах:

  • FireFox (41.0.2) (42)
  • Google Chrome (46.0.2490.80 м)
  • Опера (33.0.1990.43)
  • Internet Explorer (11.0.10240.16431 [Оновлення версій: 11.0.22])
  • Microsoft Edge (20.10240.16384.0)
  • Safari Mobile iPhone iOS9 (601.1.46)

label,
input[type="radio"] + span,
input[type="radio"] + span::before,
label,
input[type="checkbox"] + span,
input[type="checkbox"] + span::before
{
    display: inline-block;
    vertical-align: middle;
}
 
label *,
label *
{
    cursor: pointer;
}
 
input[type="radio"],
input[type="checkbox"]
{
    opacity: 0;
    position: absolute;
}
 
input[type="radio"] + span,
input[type="checkbox"] + span
{
    font: normal 11px/14px Arial, Sans-serif;
    color: #333;
}
 
label:hover span::before,
label:hover span::before
{
    -moz-box-shadow: 0 0 2px #ccc;
    -webkit-box-shadow: 0 0 2px #ccc;
    box-shadow: 0 0 2px #ccc;
}
 
label:hover span,
label:hover span
{
    color: #000;
}
 
input[type="radio"] + span::before,
input[type="checkbox"] + span::before
{
    content: "";
    width: 12px;
    height: 12px;
    margin: 0 4px 0 0;
    border: solid 1px #a8a8a8;
    line-height: 14px;
    text-align: center;
     
    -moz-border-radius: 100%;
    -webkit-border-radius: 100%;
    border-radius: 100%;
     
    background: #f6f6f6;
    background: -moz-radial-gradient(#f6f6f6, #dfdfdf);
    background: -webkit-radial-gradient(#f6f6f6, #dfdfdf);
    background: -ms-radial-gradient(#f6f6f6, #dfdfdf);
    background: -o-radial-gradient(#f6f6f6, #dfdfdf);
    background: radial-gradient(#f6f6f6, #dfdfdf);
}
 
input[type="radio"]:checked + span::before,
input[type="checkbox"]:checked + span::before
{
    color: #666;
}
 
input[type="radio"]:disabled + span,
input[type="checkbox"]:disabled + span
{
    cursor: default;
     
    -moz-opacity: .4;
    -webkit-opacity: .4;
    opacity: .4;
}
 
input[type="checkbox"] + span::before
{
    -moz-border-radius: 2px;
    -webkit-border-radius: 2px;
    border-radius: 2px;
}
 
input[type="radio"]:checked + span::before
{
    content: "\2022";
    font-size: 30px;
    margin-top: -1px;
}
 
input[type="checkbox"]:checked + span::before
{
    content: "\2714";
    font-size: 12px;
}



input[class="blue"] + span::before
{
    border: solid 1px blue;
    background: #B2DBFF;
    background: -moz-radial-gradient(#B2DBFF, #dfdfdf);
    background: -webkit-radial-gradient(#B2DBFF, #dfdfdf);
    background: -ms-radial-gradient(#B2DBFF, #dfdfdf);
    background: -o-radial-gradient(#B2DBFF, #dfdfdf);
    background: radial-gradient(#B2DBFF, #dfdfdf);
}
input[class="blue"]:checked + span::before
{
    color: darkblue;
}



input[class="red"] + span::before
{
    border: solid 1px red;
    background: #FF9593;
    background: -moz-radial-gradient(#FF9593, #dfdfdf);
    background: -webkit-radial-gradient(#FF9593, #dfdfdf);
    background: -ms-radial-gradient(#FF9593, #dfdfdf);
    background: -o-radial-gradient(#FF9593, #dfdfdf);
    background: radial-gradient(#FF9593, #dfdfdf);
}
input[class="red"]:checked + span::before
{
    color: darkred;
}
 <label><input type="radio" checked="checked" name="radios-01" /><span>checked radio button</span></label>
 <label><input type="radio" name="radios-01" /><span>unchecked radio button</span></label>
 <label><input type="radio" name="radios-01" disabled="disabled" /><span>disabled radio button</span></label>

<br/>

 <label><input type="radio" checked="checked" name="radios-02"  class="blue" /><span>checked radio button</span></label>
 <label><input type="radio" name="radios-02" class="blue" /><span>unchecked radio button</span></label>
 <label><input type="radio" name="radios-02" disabled="disabled" class="blue" /><span>disabled radio button</span></label>

<br/>

 <label><input type="radio" checked="checked" name="radios-03"  class="red" /><span>checked radio button</span></label>
 <label><input type="radio" name="radios-03" class="red" /><span>unchecked radio button</span></label>
 <label><input type="radio" name="radios-03" disabled="disabled" class="red" /><span>disabled radio button</span></label>

<br/>
 
<label><input type="checkbox" checked="checked" name="checkbox-01" /><span>selected checkbox</span></label>
<label><input type="checkbox" name="checkbox-02" /><span>unselected checkbox</span></label>
<label><input type="checkbox" name="checkbox-03" disabled="disabled" /><span>disabled checkbox</span></label>

<br/>
 
<label><input type="checkbox" checked="checked" name="checkbox-01" class="blue" /><span>selected checkbox</span></label>
<label><input type="checkbox" name="checkbox-02" class="blue" /><span>unselected checkbox</span></label>
<label><input type="checkbox" name="checkbox-03" disabled="disabled" class="blue" /><span>disabled checkbox</span></label>

<br/>
 
<label><input type="checkbox" checked="checked" name="checkbox-01" class="red" /><span>selected checkbox</span></label>
<label><input type="checkbox" name="checkbox-02" class="red" /><span>unselected checkbox</span></label>
<label><input type="checkbox" name="checkbox-03" disabled="disabled" class="red" /><span>disabled checkbox</span></label>


10

Я застарів, я знаю. Але невеликим рішенням було б поставити прапорець всередині тегу мітки, а потім накреслити мітку з облямівкою:

<label class='hasborder'><input type='checkbox' /></label>

потім стилюйте етикетку:

.hasborder { border:1px solid #F00; }

1
Також пам’ятайте, що елемент мітки перевірятиме прапорець кожного разу, коли його клацніть, навіть якщо прапорець не відображається всередині нього. Отже, на етикетці ви можете зробити щось на кшталт, label { position: relative; overflow: hidden; width: 16px; height: 16px; border: 1px solid #0f0; }і тоді label > input[type=checkbox] { position: absolute; left: -999px; }це дозволить вам налаштувати стиль власного прапорця, і початковий прапорець все одно буде перевірятись / зніматися, але користувач цього не побачить. Вони побачать лише ваш власний прапорець.
Гавін

1
Забули додати, тоді ви можете використовувати селектори, як :hoverі :checkedдля стилю інших станів у вашому користувальницькому прапорець.
Гавін

10

Ось моя версія, яка використовує FontAwesome для галочки, я думаю, що FontAwesome використовується майже всіма, тому можна припустити, що у вас її теж є. Не перевірена в IE / Edge, і я не думаю, що це когось хвилює.

input[type=checkbox] {
	-moz-appearance:none;
	-webkit-appearance:none;
	-o-appearance:none;
	outline: none;
	content: none;	
}

input[type=checkbox]:before {
	font-family: "FontAwesome";
    content: "\f00c";
    font-size: 15px;
    color: transparent !important;
    background: #fef2e0;
    display: block;
    width: 15px;
    height: 15px;
    border: 1px solid black;
    margin-right: 7px;
}

input[type=checkbox]:checked:before {

	color: black !important;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css" rel="stylesheet"/>

<input type="checkbox">


9

Для Firefox , Chrome та Safari нічого не відбувається.

Для IE межа застосовується за межами прапорця (не як частина прапорця), і ефект "замисленого" затінення в цьому полі відсутній (відображається як старомодна прапорець).

Для Opera стиль межі фактично застосовує межу на елементі прапорця.
Opera також обробляє інші стилі на галочці краще, ніж інші веб-переглядачі: колір застосовується як колір галочки, колір тла застосовується як колір тла всередині прапорця (IE застосовує фон, як ніби прапорець знаходився всередині <div>з фоном)) .

Висновок

Найпростіше рішення - загорнути прапорець всередину, <div>як запропонували інші.
Якщо ви хочете повністю контролювати зовнішній вигляд, вам доведеться скористатися вдосконаленим підходом зображення / JavaScript, а також іншими і іншими.


2
+1 для дослідження, але загортання його всередині div не є рішенням. Це не дозволяє вам стилізувати прапорець, він дозволяє стилізувати навколо прапорця, якщо тільки ви не почнете грати зі спробами приховати його і зафарбувати його, що матиме свої проблеми.

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

7

Позначення стилів (та багатьох інших вхідних елементів для цієї матриці) дійсно неможливо із чистим css, якщо ви бажаєте кардинально змінити візуальний вигляд.

Ваша найкраща ставка полягає в тому, щоб реалізувати щось на зразок jqTransform , що насправді замінює ваші входи зображеннями та застосовує до нього поведінку javascript, щоб імітувати прапорець (або інший елемент для цього)


4

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

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

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

Наведені нижче роботи в IE9, FF30.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>

2

Ось простий спосіб (використовувати до або після псевдоелементів / класів):

input[type=checkbox] {
    position: relative;
}

input[type=checkbox]:after {
    position: absolute;
    top: 0;
    left: 0;
    /* Above three lines allow the checkbox:after position at checkbox's position */
    content: '';
    width: 32px;
    height: 32px;
    z-index: 1; /* This allows the after overlap the checkbox */
    /* Anything you want */
}

Я думаю, що це розумний спосіб змінити свій прапорець і щось подібне.
Алекс Фанг

1
Не працює на Firefox та IE. Що ще важливіше, це неправильна реалізація Chrome, оскільки недійсні елементи НЕ дозволяють містити вмісту.
Лев

Лео, ви неправильно трактуєте термін "вміст". Все, що він говорить, - це те, що між недійсними елементами не може бути вмісту між ними, тому що немає жодного закриття тегу. наприклад, у <a> вмісту </a> є закриваючий тег, тому між цими тегами може бути вміст. але вхід не має завершального тегу, тому він не може мати вміст за принципом. З іншого боку, псевдоелементи мають властивість під назвою "content", яку можна використовувати скрізь.
pendingfox

-1

<!DOCTYPE html>
<html>
<head>
<style> 

.abc123
{
	-webkit-appearance:none;
    width: 14px;
    height: 14px;
    display: inline-block;
    background: #FFFFFF;
	border: 1px solid rgba(220,220,225,1);
}
.abc123:after {
  content: "";
  display: inline-block;
  position: relative;
  top: -3px;
  left: 4px;
  width: 3px;
  height: 5px;
  border-bottom: 1px solid #fff;
  border-right: 1px solid #fff;
  -webkit-transform: rotate(45deg);
}

input[type=checkbox]:checked   {
    background: #327DFF;
    outline: none;
    border: 1px solid rgba(50,125,255,1);
}
input:focus,input:active {
	outline: none;
}

input:hover {
   border: 1px solid rgba(50,125,255,1);
}

</style>
</head>
<body>

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


</body>
</html>


Перший: ": після" створити √; Друге: "-webkit-izgled: none" нехай стиль оригіналу не може працювати, і тоді ви можете визначити свій стиль.
KeepLearn

2
Напишіть, будь ласка, короткий опис вашої відповіді.
Angel F Syrus

-5

помістіть його в div і додайте межу до div


5
Тоді у вас буде подвійний кордон.
Єгор Павлихін

<DIV стиль = "стиль кордону: твердий; ширина: 120px;"> <вхідний тип = ім'я "прапорець" = "mycheck"> Мої Checkbox </ вхід> </ DIV> відмінно працює з htmlsandbox
Мидхат

8
Визначте "працює добре". Наприклад, я ніколи не бачив прапорця шириною 120 пікселів.

-8
<div style="border-style: solid;width:13px"> 
   <input type="checkbox" name="mycheck" style="margin:0;padding:0;">
   </input> 
</div>

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