Làm cách nào để thay đổi kiểu đường viền của hộp kiểm trong CSS?


122

Làm cách nào để thay đổi kiểu đường viền hộp kiểm (đầu vào)? Tôi đã đặt border:1px solid #1e5180nó, nhưng trong FireFox 3.5, không có gì xảy ra!

Câu trả lời:


63

Nếu điều gì đó xảy ra trong bất kỳ trình duyệt nào, tôi sẽ rất ngạc nhiên. Đây là một trong những phần tử biểu mẫu nổi bật mà các trình duyệt có xu hướng không cho phép bạn tạo kiểu nhiều như vậy và mọi người thường cố gắng thay thế bằng javascript để họ có thể tạo kiểu / mã thứ gì đó trông và hoạt động giống như một hộp kiểm.


4
Opera xử lý rất tốt việc tạo kiểu trên hộp kiểm. IE có một số kiểu dáng bao quanh hộp kiểm (không phải trên chính hộp kiểm).
awe

4
Họ đang thực sự xấu xí ngày nay: D
Gergely Fehérvári

1
vẫn còn xấu vào năm 2020
Paul

210

Tôi đề nghị sử dụng "đường viền" thay vì "đường viền". Ví dụ: outline: 1px solid #1e5180.


3
Phác thảo là một sự thay thế tuyệt vời.
Nippysaurus vào

4
phác thảo rất tốt và nó hoạt động cho tất cả các hộp nhập và chọn, làm cho điều này hữu ích cho các lớp ".error".
SztupY

2
Bạn có thể cần thêm !importantvào css của mình khi sử dụng dàn ý. Tôi đã thử nghiệm điều này trong Firefox 12.0 và không có! Quan trọng là đường viền sẽ biến mất miễn là tôi nhấp vào hộp kiểm.
Weezle

3
Đây là một sự thay thế tuyệt vời, nhưng vấn đề của phác thảo là trong IE7 nó không hoạt động !!
Yises

13
@Yises Bạn phải lo lắng về IE7? Rất tiếc, tôi xin lỗi.
theblang 7/12/12

71

Bạn nên sử dụng

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

Sau đó, bạn loại bỏ hình ảnh / kiểu hộp kiểm mặc định và có thể tạo kiểu cho nó. Dù sao thì một đường viền vẫn sẽ ở đó trong Firefox


2
Opera cho phép bạn tạo kiểu cho các hộp kiểm mà không cần thêm bất kỳ thủ thuật nào - tôi sẽ loại bỏ kiểu -o-interface. -moz-ngoại hình và -webkit-ngoại hình đều tuyệt vời.
Neall

7
Rất tiếc - đã nói quá sớm: "-webkit-ngoại hình: không có;" dường như vô hiệu hóa hành vi hộp kiểm.
Neall

6
cho tôi (chrome 5) nó không, bạn cần phải phong cách: thêm trạng thái kiểm tra
Valerij

1
ngoại hình chưa bao giờ là một phần của tiêu chuẩn CSS. Đừng sử dụng nó.
Evgeny

wow, điều này thật tuyệt, tôi sẽ loại bỏ các plugin. tôi có thể làm bất cứ điều gì => | input [type = checkbox] | input [type = checkbox]: hover | input [type = checkbox]: đã chọn | input [type = checkbox]: đã kiểm tra: sau khi ...
h0mayun

21

Bạn có thể sử dụng bóng hộp để giả mạo đường viền:

-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 phiên bản nào?
Dennis Heiden

Phiên bản 12.0.2 (14606.3.4) / mới nhất trên macOS 10.14
retrovertigo

@retrovertigo Tôi đã thử nghiệm giải pháp của mình và bạn đúng. Câu trả lời của tôi không hoạt động cho Safari nếu không có sửa đổi thêm (như -webkit-ngoại hình: không có;). 3 năm sau, tôi sẽ sử dụng các giải pháp do pendingfox hoặc Adan đưa ra. Nhưng tôi sẽ cố gắng mở rộng câu trả lời của mình trong vòng vài tuần. Cảm ơn phản hôi của bạn.
Dennis Heiden

11

Đây là giải pháp trình duyệt chéo CSS (không có hình ảnh) thuần túy dựa trên Hộp kiểm tùy chỉnh và Nút radio của Martin với CSS3 LINK: http://martinivanov.net/2012/12/21/imageless-custom-checkboxes-and-radio-buttons -with-css3-đã xem lại /

Đây là jsFiddle: http://jsfiddle.net/DJRavine/od26wL6n/

Tôi đã thử nghiệm điều này trên các trình duyệt sau:

  • FireFox (41.0.2) (42)
  • Google Chrome (46.0.2490,80 m)
  • Opera (33.0.1990.43)
  • Internet Explorer (11.0.10240.16431 [Phiên bản cập nhật: 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

Tôi biết là đã lỗi thời .. Nhưng một giải pháp nhỏ sẽ là đặt hộp kiểm của bạn bên trong thẻ nhãn, sau đó tạo kiểu cho nhãn bằng đường viền:

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

sau đó tạo kiểu cho nhãn:

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

1
Cũng xin lưu ý rằng phần tử nhãn sẽ chọn hộp kiểm bất cứ khi nào nó được nhấp vào, ngay cả khi hộp kiểm không thể xem được bên trong nó. Vì vậy, trên nhãn, bạn có thể làm điều gì đó như label { position: relative; overflow: hidden; width: 16px; height: 16px; border: 1px solid #0f0; }và sau đó label > input[type=checkbox] { position: absolute; left: -999px; }Điều này sẽ cho phép bạn tùy chỉnh kiểu hộp kiểm của riêng mình và hộp kiểm ban đầu sẽ vẫn được chọn / bỏ chọn nhưng người dùng sẽ không nhìn thấy nó. Họ sẽ chỉ thấy hộp kiểm tùy chỉnh của bạn.
Gavin

1
Quên thêm, sau đó bạn có thể sử dụng các bộ chọn như :hover:checkedđể tạo kiểu cho các trạng thái khác của hộp kiểm tùy chỉnh của bạn.
Gavin

10

Đây là phiên bản của tôi sử dụng FontAwesome cho mã đánh dấu hộp kiểm, tôi nghĩ rằng FontAwesome được hầu hết mọi người sử dụng nên thật an toàn nếu bạn cũng có nó. Không được thử nghiệm trong IE / Edge và tôi không nghĩ rằng có ai quan tâm.

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

Đối với Firefox , ChromeSafari , không có gì xảy ra.

Đối với IE , đường viền được áp dụng bên ngoài hộp kiểm (không phải là một phần của hộp kiểm) và hiệu ứng tô bóng "lạ mắt" trong hộp kiểm đã biến mất (được hiển thị dưới dạng hộp kiểm cũ).

Đối với Opera , kiểu đường viền thực sự đang áp dụng đường viền trên phần tử hộp kiểm.
Opera cũng xử lý các kiểu khác trên hộp kiểm tốt hơn so với các trình duyệt khác: màu được áp dụng làm màu của dấu đánh dấu, màu nền được áp dụng làm màu nền bên trong hộp kiểm (IE áp dụng nền như thể hộp kiểm nằm bên trong hộp <div>có nền)) .

Phần kết luận

Giải pháp đơn giản nhất là bọc hộp kiểm bên trong <div>giống như những người khác đã đề xuất.
Nếu bạn muốn kiểm soát hoàn toàn sự xuất hiện, bạn sẽ phải sử dụng phương pháp tiếp cận hình ảnh / javascript nâng cao, cũng được những người khác chấp nhận.


2
+1 cho nghiên cứu, nhưng gói nó bên trong một div không phải là một giải pháp. Nó không cho phép bạn tạo kiểu cho hộp kiểm, nó cho phép bạn tạo kiểu xung quanh hộp kiểm, trừ khi bạn bắt đầu thử ẩn nó đi và tô lên nó, điều này sẽ có vấn đề riêng.

Chà, trình duyệt duy nhất cho phép bạn tạo kiểu cho hộp kiểm là Opera. Gói nó bên trong một div là một giải pháp có thể đủ tốt, nhưng điều đó thực sự phụ thuộc vào những gì bạn muốn. IE thực sự hoạt động giống như bạn đặt nó trong một div nếu bạn cố gắng tạo kiểu cho hộp kiểm!
kinh ngạc

7

Hộp kiểm tạo kiểu (và nhiều yếu tố đầu vào khác cho trường cũ đó) không thực sự khả thi với css thuần túy nếu bạn muốn thay đổi đáng kể giao diện trực quan.

Đặt cược tốt nhất của bạn là triển khai một cái gì đó như jqTransform thực sự thay thế bạn đầu vào bằng hình ảnh và áp dụng hành vi javascript cho nó để bắt chước hộp kiểm (hoặc phần tử khác cho vấn đề đó)


4

Không, bạn vẫn không thể tạo kiểu cho chính hộp kiểm, nhưng tôi (cuối cùng) đã tìm ra cách tạo kiểu ảo ảnh trong khi vẫn giữ chức năng nhấp vào hộp kiểm. Nó có nghĩa là bạn có thể chuyển đổi nó ngay cả khi con trỏ không nằm yên hoàn hảo mà không gặp rủi ro khi chọn văn bản hoặc kích hoạt kéo và thả!

Ví dụ đang sử dụng một "nút" span cũng như một số văn bản trong nhãn, nhưng nó cung cấp cho bạn ý tưởng về cách bạn có thể ẩn hộp kiểm và vẽ bất cứ thứ gì đằng sau nó.

Giải pháp này có lẽ cũng phù hợp với các nút radio.

Phần sau hoạt động trên IE9, FF30.0 và Chrome 40.0.2214.91 và chỉ là một ví dụ cơ bản. Bạn vẫn có thể sử dụng nó kết hợp với ảnh nền và các yếu tố giả.

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

Đây là một cách đơn giản (để sử dụng trước hoặc sau các phần tử / lớp giả):

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 */
}

Tôi nghĩ đây là một cách thông minh để thiết kế lại hộp kiểm của bạn và bất kỳ thứ gì tương tự.
Alex Fang

1
Không hoạt động trên Firefox và IE. Quan trọng hơn, đó là cách triển khai Chrome không chính xác , vì các phần tử void KHÔNG được phép có bất kỳ nội dung nào.
Leo

Leo, bạn đang hiểu sai thuật ngữ "nội dung", tất cả những gì nó nói là những phần tử trống không thể có nội dung ở giữa vì không có thẻ đóng. ví dụ <a> nội dung </a> có thẻ đóng để có thể có nội dung giữa các thẻ đó. nhưng đầu vào không có thẻ đóng nên nó không thể có nội dung theo nguyên tắc. Mặt khác, Pseudo-element có một thuộc tính gọi là "nội dung" được phép sử dụng ở mọi nơi.
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>


Đầu tiên: ": sau" tạo √; Thứ hai: "-webkit-ngoại hình: không" để kiểu origion không thể hoạt động, và sau đó bạn có thể xác định phong cách của mình.
KeepLearn

2
Vui lòng viết một mô tả ngắn về câu trả lời của bạn.
Angel F Syrus

-5

đặt nó trong một div và thêm đường viền vào div


5
Sau đó, bạn sẽ có một đường viền kép.
Egor Pavlikhin

<div style = "border-style: solid; width: 120px;"> <input type = "checkbox" name = "mycheck"> Hộp kiểm của tôi </input> </div> hoạt động tốt với htmlsandbox
Midhat

8
Xác định 'hoạt động tốt'. Ví dụ, tôi chưa bao giờ thấy một hộp kiểm rộng 120px.

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

7
@lexu Không có cái gì giống như </input>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.