Làm cách nào để tắt các trường biểu mẫu bằng CSS?


180

Có thể vô hiệu hóa các trường mẫu bằng CSS? Tất nhiên tôi biết về thuộc tính bị vô hiệu hóa, nhưng có thể chỉ định điều này trong quy tắc CSS không? Cái gì đó như -

<input type="text" name="username" value="admin" >
<style type="text/css">
  input[name=username] {
    disabled: true; /* Does not work */
  }
</style>

Lý do tôi hỏi là, tôi có một ứng dụng trong đó các trường biểu mẫu được tự động tạo và các trường được ẩn / hiển thị dựa trên một số quy tắc (chạy trong Javascript). Bây giờ tôi muốn mở rộng nó để hỗ trợ vô hiệu hóa / kích hoạt các trường, nhưng cách các quy tắc được viết để thao tác trực tiếp các thuộc tính kiểu của các trường biểu mẫu. Vì vậy, bây giờ tôi phải mở rộng công cụ quy tắc để thay đổi các thuộc tính cũng như kiểu của các trường biểu mẫu và bằng cách nào đó nó có vẻ ít hơn lý tưởng.

Điều rất tò mò là bạn có các thuộc tính hiển thị và hiển thị trong CSS nhưng không bật / tắt. Có bất cứ điều gì giống như nó trong tiêu chuẩn HTML5 vẫn còn hoạt động, hoặc thậm chí một cái gì đó không chuẩn (cụ thể của trình duyệt) không?


5
Nó được đề cập nhiều lần dưới đây nhưng nó bị mất trong tiếng ồn. Hãy thử các sự kiện con trỏ: none;
Corey Alix

Câu trả lời:


89

Điều này có thể hữu ích:

<input type="text" name="username" value="admin" >

<style type="text/css">
input[name=username] {
    pointer-events: none;
 }
</style>

Cập nhật:

và nếu muốn tắt từ chỉ mục tab, bạn có thể sử dụng nó theo cách này:

 <input type="text" name="username" value="admin" tabindex="-1" >

 <style type="text/css">
  input[name=username] {
    pointer-events: none;
   }
 </style>

3
Nó trông giống như những gì tôi đã làm sau đó để vô hiệu hóa tất cả các trường nhập liệu của mình, nhưng mặc dù nó chặn chúng khỏi các sự kiện chuột, chúng vẫn có thể được truy cập và thay đổi bằng cách sử dụng tab bàn phím
Ken

11
thuộc tính css tab-index không tồn tại. Nó cần phải là một thuộc tính html (tabindex = -1)
N4ppeL

1
chỉ mục tab không tìm thấy và không hoạt động trong chrome, nhấn phím TAB đã bỏ qua tính năng vô hiệu hóa để đây không phải là giải pháp hoàn chỉnh.
QMaster

172

Bạn có thể giả mạo hiệu ứng bị vô hiệu hóa bằng CSS.

pointer-events:none;

Bạn cũng có thể muốn thay đổi màu sắc, vv


68
Điều này giúp, nhưng không ngăn cản việc nhập vào các lĩnh vực.
jerwood

Tôi muốn "vô hiệu hóa" liên kết cuối cùng của mẩu bánh mì, và tôi đã không nghĩ đến cách giải quyết này ... nhờ điều này với một số thay đổi màu sắc và không có gạch chân, nó đã tạo nên mánh khóe! : D
Facundo Colombiaier

2
Điều này cũng không ngăn chặn giá trị biểu mẫu được gửi.
Ken Wayne VanderLinde

1
@KenWayneVanderLinde cũng không thuộc tính bị vô hiệu hóa phải không?
theonlygusti

2
@theonlygusti Các phần tử <input> bị vô hiệu hóa trong một biểu mẫu sẽ không được gửi.
dougd_in_nc

113

Vì các quy tắc đang chạy trong JavaScript, tại sao không vô hiệu hóa chúng bằng cách sử dụng javascript (hoặc trong trường hợp ví dụ của tôi, jQuery)?

$('#fieldId').attr('disabled', 'disabled'); //Disable
$('#fieldId').removeAttr('disabled'); //Enable

CẬP NHẬT

Các attrchức năng không còn là cách tiếp cận chính cho điều này, như đã được chỉ ra trong các ý kiến ​​dưới đây. Điều này bây giờ được thực hiện với propchức năng.

$( "input" ).prop( "disabled", true ); //Disable
$( "input" ).prop( "disabled", false ); //Enable

1
Không nên là $ ('# tệpId'). RemoveAttr ('khuyết tật'); // Kích hoạt
Anupam Jain

6
Có lẽ đáng lưu ý rằng giải pháp này sẽ không hoạt động nếu người dùng đã tắt JavaScript.
josh-fugg

1
Firefox 20.0 (không chắc chắn về các phiên bản khác, đây chỉ là những gì tôi đang sử dụng để phát triển) yêu cầu xóa thuộc tính. Trong khi lý thuyết @ Dutchie432 đúng, sử dụng .removeAttr ('khuyết tật'); là giải pháp thực tế chính xác (ít nhất là trong trình duyệt hiện tại của tôi).

1
Trừ khi bạn không thể sử dụng JQuery.
thủy quân lục chiến

3
FYI - tài liệu jQuery đề nghị sử dụng .prop()thay vì .attr()cho trường hợp này. "Kể từ jQuery 1.6, phương thức .attr () trả về không xác định cho các thuộc tính chưa được đặt. Để truy xuất và thay đổi các thuộc tính DOM như trạng thái đã chọn, đã chọn hoặc bị vô hiệu hóa của các phần tử biểu mẫu, hãy sử dụng phương thức .prop (). " Tài liệu nguồn: .attr ().prop ()
Nicholas Ryan Bowers

54

Điều rất tò mò là bạn có các thuộc tính hiển thị và hiển thị trong CSS nhưng không bật / tắt.

Thật tò mò khi bạn nghĩ rằng điều đó rất tò mò. Bạn đang hiểu sai mục đích của CSS. CSS không có nghĩa là thay đổi hành vi của các thành phần biểu mẫu. Nó chỉ nhằm thay đổi phong cách của họ . Ẩn trường văn bản không có nghĩa là trường văn bản không còn ở đó hoặc trình duyệt sẽ không gửi dữ liệu của nó khi bạn gửi biểu mẫu. Tất cả những gì nó làm là che giấu nó khỏi mắt người dùng.

Để thực sự vô hiệu hóa các trường của bạn, bạn phải sử dụng disabledthuộc tính trong HTML hoặc thuộc tính disabledDOM trong JavaScript.


35
Tất nhiên tôi biết CSS "được cho là" để làm gì. Nhưng đối với các ứng dụng web hiện đại, sự khác biệt giữa "trình bày" và "hành vi" còn lầy hơn bùn. Vì các trường bị vô hiệu hóa không được gửi đến máy chủ, đó là thay đổi hành vi. Nhưng làm thế nào để ẩn tất cả các trường mẫu không phải là một?! Có lẽ trong những ngày xưa tốt đẹp khi tất cả những gì bạn có thể làm trên web là đọc văn bản và điền vào các biểu mẫu, sự khác biệt đã rõ ràng hơn. Trong ứng dụng web hiện đại, nếu bạn muốn tách bản trình bày khỏi hành vi, CSS so với HTML / JS là cách làm sai.
Anupam Jain

17
tàn tật là một trạng thái, không phải là một hành vi. Những gì anh ấy yêu cầu là hoàn toàn hợp lý. Chẳng hạn, bạn có thể muốn thêm một lớp bận rộn vào nhiều trường trong khi dữ liệu đang được xử lý. Hơn nữa, W3C dường như đồng ý vì nó cho phép lựa chọn các yếu tố CSS thông qua lớp giả bị vô hiệu hóa.
IAmNaN

3
@IAmNaN: 1) "bị vô hiệu hóa là một trạng thái, không phải là hành vi." Vì vậy, chỉ là về mọi thuộc tính HTML / DOM khác. 2) "Chẳng hạn, bạn có thể muốn thêm một lớp bận rộn vào nhiều trường trong khi dữ liệu đang được xử lý." Bạn làm điều đó trong một kịch bản. 3) "Hơn nữa, W3C dường như đồng ý vì nó cho phép lựa chọn các yếu tố CSS thông qua lớp giả bị vô hiệu hóa." Có thể chọn một yếu tố dựa trên việc nó được bật hay tắt không liên quan gì đến việc có thể thay đổi trạng thái đó bằng CSS.
BoltClock

5
Có nhiều thứ trong CSS thực sự có thể được coi là thay đổi trong hành vi, ví dụ như các sự kiện con trỏ: none; được đề cập bởi @ANaimi. Vì vậy, vô hiệu hóa có thể dễ dàng được coi là tài sản hiển thị là tốt. Quá tệ là không, sẽ làm cho vài điều dễ dàng hơn.
Mikael Lepistö

1
@Mikael Lepistö: Vâng, tôi cũng không đồng ý với pointer-eventsviệc là một tài sản CSS. FYI, pointer-events bắt nguồn từ SVG .
BoltClock

22

Bạn không thể sử dụng CSS để vô hiệu hóa Textbox. giải pháp sẽ là thuộc tính HTML.

disabled="disabled"

Mặc dù điều này không hoạt động trên nguyên tắc, nếu bạn đọc toàn bộ câu hỏi, nó cho biết trường biểu mẫu đang được tạo tự động, và sau đó cần phải được tắt.
thelem

1
@mr_eclair. có thể sử dụng ---> các sự kiện con trỏ: none; Css tài sản.
Fereydoon Barikzehy

3
Lưu ý: Các thành phần có disabledthuộc tính không được gửi - giá trị của chúng không được đăng lên máy chủ. Đọc trên: stackoverflow.com/q/8925716/1066234
Kai Noack

17

Giải pháp thực tế là sử dụng CSS để thực sự ẩn đầu vào.

Để đưa ra kết luận tự nhiên này, bạn có thể viết hai đầu vào html cho mỗi đầu vào thực tế (một được bật và một bị tắt) và sau đó sử dụng javascript để điều khiển CSS để hiển thị và ẩn chúng.


3
Nếu bạn sử dụng Javascript, có nghĩa là chỉ cần vô hiệu hóa / kích hoạt khi cần không?
MindVox

Thật vậy, nhưng trong bối cảnh của câu hỏi đặc biệt này, đây có thể là một cách tiếp cận khả thi.
graphicdivine

10

lần đầu tiên trả lời một cái gì đó, và dường như chỉ hơi muộn ...

Tôi đồng ý thực hiện bằng javascript, nếu bạn đã sử dụng nó.

Đối với cấu trúc hỗn hợp, như tôi thường sử dụng, tôi đã tạo một giả css sau phần tử để chặn các phần tử khỏi sự tương tác của người dùng và cho phép tạo kiểu mà không phải thao tác trên toàn bộ cấu trúc.

Ví dụ:

<div id=test class=stdInput>
    <label class=stdInputLabel for=selecterthingy>A label for this input</label>
    <label class=selectWrapper>
         <select id=selecterthingy>
             <option selected disabled>Placeholder</option>
             <option value=1>Option 1</option>
             <option value=2>Option 2</option>
         </select>
    </label>
</div>

Tôi có thể đặt một disabledlớp trên bao bìdiv

.disabled { 
    position : relative; 
    color    : grey;
}
.disabled:after {
    position :absolute;
    left     : 0;
    top      : 0;
    width    : 100%;
    height   : 100%;
    content  :' ';
}

Điều này sẽ làm xám văn bản trong divvà làm cho nó không sử dụng được cho người dùng.

Ví dụ của tôi


4
BTW: Bạn vẫn cần xử lý tab mà vẫn cho phép người dùng truy cập vào trường và thay đổi nó.
K Kimble

2
vì vậy không nên chọn <select> có một lớp = "bị vô hiệu hóa"?
TimoSolo

Thật tuyệt vời tôi biết có một cái gì đó như thế này. :) cảm ơn
James Harrington

Điều này thực sự hữu ích. Tôi biết sử dụng javascript để đặt bị vô hiệu hóa sẽ tốt hơn, nhưng điều này giải quyết vấn đề của tôi là làm cho nó rõ ràng với người dùng (ngoài thông báo lỗi) rằng việc gửi sẽ không hoạt động.
jerclarke

8

Tôi luôn luôn sử dụng:

input.disabled {
    pointer-events:none;
    color:#AAA;
    background:#F5F5F5;
}

và sau đó áp dụng lớp css cho trường đầu vào:

<input class="disabled" type="text" value="90" name="myinput" id="myinput" />

4

đầu vào [tên = tên người dùng] {bị vô hiệu hóa: đúng; /* Không hoạt động */ }

Tôi biết câu hỏi này khá cũ nhưng đối với những người dùng khác gặp phải vấn đề này, tôi cho rằng cách dễ nhất để vô hiệu hóa đầu vào chỉ đơn giản là ': tật'

<input type="text" name="username" value="admin" disabled />
<style type="text/css">
  input[name=username]:disabled {
    opacity: 0.5 !important; /* Fade effect */
    cursor: not-allowed; /* Cursor change to disabled state*/
  }
</style>

Trong thực tế, nếu bạn có một số tập lệnh để vô hiệu hóa đầu vào / tự động với javascript hoặc jquery sẽ tự động vô hiệu hóa dựa trên điều kiện bạn thêm.

Trong jQuery ví dụ:

if (condition) {
// Make this input prop disabled state
  $('input').prop('disabled', true);
}
else {
// Do something else
}

Hy vọng câu trả lời trong CSS sẽ giúp.


2

Bạn không thể làm điều đó tôi sợ, nhưng bạn có thể làm như sau trong jQuery, nếu bạn không muốn thêm các thuộc tính vào các trường. Chỉ cần đặt nó trong <head></head>thẻ của bạn

$(document).ready(function(){ 
  $(".inputClass").focus(function(){
    $(this).blur();
  }); 
});

Nếu bạn đang tạo các trường trong DOM (với JS), bạn nên thực hiện việc này thay thế:

$(document).ready(function(){ 
  $(document).on("focus", ".inputClass", function(){
    $(this).blur();
  }); 
});

1

Điều này có thể được thực hiện cho mục đích không quan trọng bằng cách đặt lớp phủ lên trên phần tử đầu vào của bạn. Đây là ví dụ của tôi trong HTML và CSS thuần túy.

https://jsfiddle.net/1tL40L99/

    <div id="container">
        <input name="name" type="text" value="Text input here" />
        <span id="overlay"></span>
    </div>

    <style>
        #container {
            width: 300px;
            height: 50px;
            position: relative;
        }
        #container input[type="text"] {
            position: relative;
            top: 15px;
            z-index: 1;
            width: 200px;
            display: block;
            margin: 0 auto;
        }
        #container #overlay {
            width: 300px;
            height: 50px;
            position: absolute;
            top: 0px;
            left: 0px;
            z-index: 2;
            background: rgba(255,0,0, .5);
        }
    </style>

1

Không có cách nào để sử dụng CSS cho mục đích này. Lời khuyên của tôi là bao gồm một mã javascript nơi bạn gán hoặc thay đổi lớp css được áp dụng cho các đầu vào. Một cái gì đó như thế:

function change_input() {
	$('#id_input1')
		.toggleClass('class_disabled')
		.toggleClass('class_enabled');
		
	$('.class_disabled').attr('disabled', '');
	$('.class_enabled').removeAttr('disabled', '');
}
.class_disabled { background-color : #FF0000; }
.class_enabled { background-color : #00FF00; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<form> 	
	Input: <input id="id_input1" class="class_enabled" />		
	<input type="button" value="Toggle" onclick="change_input()";/>	
</form>


0

Một biến thể của pointer-events: none;giải pháp, giải quyết vấn đề đầu vào vẫn có thể truy cập được thông qua điều khiển được gắn nhãn hoặc tabindex, là bọc đầu vào trong div, được đặt kiểu là đầu vào văn bản bị vô hiệu hóa và cài đặt input { visibility: hidden; }khi đầu vào bị "vô hiệu hóa" .
Tham chiếu: https://developer.mozilla.org/en-US/docs/Web/CSS/visibility#Values

div.dependant {
  border: 0.1px solid rgb(170, 170, 170);
  background-color: rgb(235,235,228);
  box-sizing: border-box;
}
input[type="checkbox"]:not(:checked) ~ div.dependant:first-of-type {
  display: inline-block;
}
input[type="checkbox"]:checked ~ div.dependant:first-of-type {
  display: contents;
}
input[type="checkbox"]:not(:checked) ~ div.dependant:first-of-type > input {
  visibility: hidden;
}
<form>
  <label for="chk1">Enable textbox?</label>
  <input id="chk1" type="checkbox" />
  <br />
  <label for="text1">Input textbox label</label>
  <div class="dependant">
    <input id="text1" type="text" />
  </div>
</form>

Kiểu bị tắt được áp dụng trong đoạn trích ở trên được lấy từ Giao diện người dùng Chrome và có thể không giống hệt với các đầu vào bị vô hiệu hóa trên các trình duyệt khác. Có thể nó có thể được tùy chỉnh cho các trình duyệt riêng lẻ bằng cách sử dụng phần mở rộng CSS dành riêng cho động cơ. Mặc dù nhìn thoáng qua, tôi không nghĩ nó có thể:
tiện ích mở rộng CSS của Microsoft , tiện ích mở rộng CSS của Mozilla , tiện ích mở rộng CSS của WebKit

Có vẻ hợp lý hơn nhiều khi giới thiệu một giá trị bổ sung visibility: disabledhoặc display: disabledthậm chí appearance: disabled, thậm chí , được cho là visibility: hiddenđã ảnh hưởng đến hành vi của các yếu tố áp dụng bất kỳ yếu tố kiểm soát liên quan nào.

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.