ฉันจะปิดใช้งานเขตข้อมูลฟอร์มโดยใช้ CSS ได้อย่างไร


180

เป็นไปได้หรือไม่ที่จะปิดการใช้งานเขตข้อมูลฟอร์มโดยใช้ CSS? แน่นอนฉันรู้เกี่ยวกับคุณลักษณะที่ปิดใช้งาน แต่มันเป็นไปได้ที่จะระบุสิ่งนี้ในกฎ CSS? สิ่งที่ต้องการ -

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

เหตุผลที่ฉันถามก็คือฉันมีแอปพลิเคชันที่มีเขตข้อมูลแบบอัตโนมัติและฟิลด์ถูกซ่อน / แสดงตามกฎบางอย่าง (ซึ่งทำงานใน Javascript) ตอนนี้ฉันต้องการขยายเพื่อรองรับการปิด / เปิดใช้งานเขตข้อมูล แต่วิธีการเขียนกฎเพื่อจัดการคุณสมบัติสไตล์ของเขตข้อมูลฟอร์มโดยตรง ดังนั้นตอนนี้ฉันต้องขยายเครื่องมือกฎเพื่อเปลี่ยนคุณสมบัติรวมถึงสไตล์ของเขตข้อมูลฟอร์มและอย่างใดก็ดูเหมือนน้อยกว่าอุดมคติ

เป็นเรื่องแปลกมากที่คุณมองเห็นและแสดงคุณสมบัติใน CSS แต่ไม่เปิด / ปิดการใช้งาน มีอะไรที่เหมือนในมาตรฐาน HTML5 ที่ยังทำงานไม่ได้หรือแม้แต่บางอย่างที่ไม่ได้มาตรฐาน (เฉพาะเบราว์เซอร์)?


5
มันถูกกล่าวถึงหลายครั้งด้านล่าง แต่เสียงดังหายไป ลองตัวชี้เหตุการณ์: ไม่มี;
Corey Alix

คำตอบ:


89

สิ่งนี้มีประโยชน์:

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

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

ปรับปรุง:

และหากต้องการปิดการใช้งานจากดัชนีแท็บคุณสามารถใช้วิธีนี้ได้:

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

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

3
ดูเหมือนว่าฉันจะปิดการใช้งานทุกช่องข้อมูลของฉัน แต่ถึงแม้ว่ามันจะปิดกั้นพวกเขาจากเหตุการณ์ของเมาส์พวกเขายังคงสามารถเข้าถึงและเปลี่ยนแปลงได้โดยใช้แท็บแป้นพิมพ์
Ken

11
คุณสมบัติ css ของ tab-index ไม่มีอยู่ จำเป็นต้องเป็นแอตทริบิวต์ html (tabindex = -1)
N4ppeL

1
แท็บดัชนีไม่พบและไม่ทำงานในโครเมี่ยมการกดแป้น TAB ผ่านไปแล้วปิดใช้งานคุณลักษณะเพื่อให้นี่ไม่ใช่โซลูชันที่สมบูรณ์
QMaster

172

คุณสามารถปลอมผลกระทบที่ปิดการใช้งานโดยใช้ CSS

pointer-events:none;

คุณอาจต้องการเปลี่ยนสีเป็นต้น


68
สิ่งนี้ช่วยได้ แต่ไม่ได้ป้องกันการแท็บลงในฟิลด์
jerwood

ฉันต้องการที่จะ "ปิดการใช้งาน" ลิงค์สุดท้ายของเกล็ดขนมปังและฉันไม่ได้อยู่ในใจของการแก้ปัญหานี้ ... ขอบคุณที่มีการเปลี่ยนแปลงสีและไม่มีขีดเส้นใต้มันทำเคล็ดลับ! : D
Facundo Colombier

2
สิ่งนี้ไม่ได้ป้องกันการส่งค่าแบบฟอร์ม
Ken Wayne VanderLinde

1
@KenWayneVanderLinde แอตทริบิวต์ที่ปิดใช้งานไม่ถูกต้องหรือไม่
theonlygusti

2
@thonlygusti องค์ประกอบ <input> ปิดใช้งานในแบบฟอร์มจะไม่ถูกส่ง
dougd_in_nc

113

เนื่องจากกฎกำลังทำงานใน JavaScript ทำไมไม่ปิดใช้งานโดยใช้ javascript (หรือในกรณีตัวอย่างของฉัน jQuery)

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

UPDATE

attrฟังก์ชั่นไม่เป็นวิธีการหลักในการนี้เป็นที่ชี้ให้เห็นในความคิดเห็นด้านล่าง สิ่งนี้จะเสร็จสิ้นด้วยpropฟังก์ชั่น

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

1
ไม่ควรเป็น $ ('# ฟ้องร้อง') removeAttr ('ปิดใช้งาน'); // เปิดใช้งาน
Anupam Jain

6
อาจเป็นไปได้ว่าการแก้ไขปัญหานี้จะไม่ทำงานหากผู้ใช้ปิดการใช้งาน JavaScript
josh-fuggle

1
Firefox 20.0 (ไม่แน่ใจเกี่ยวกับเวอร์ชันอื่นนี่เป็นเพียงสิ่งที่ฉันใช้ในการพัฒนา) จำเป็นต้องลบแอตทริบิวต์ ในขณะที่ @ Dutchie432 ถูกต้องตามทฤษฎีแล้วใช้ .removeAttr ('พิการ') เป็นทางออกที่ถูกต้อง (อย่างน้อยในเบราว์เซอร์ปัจจุบันของฉัน)

1
ถ้าคุณไม่สามารถใช้ JQuery ได้
นาวิกโยธิน

3
FYI - เอกสาร jQuery แนะนำให้ใช้.prop()แทน.attr()กรณีนี้ "ตั้งแต่ jQuery 1.6 เมธอด .attr () จะส่งกลับค่าที่ไม่ได้กำหนดสำหรับแอ็ตทริบิวต์ที่ยังไม่ได้ตั้งค่าในการเรียกคืนและเปลี่ยนคุณสมบัติ DOM เช่นสถานะที่เลือกถูกเลือกหรือปิดใช้งาน " เอกสารต้นฉบับ: .attr ()และ. prop ()
Nicholas Ryan Bowers

54

เป็นเรื่องแปลกมากที่คุณมองเห็นและแสดงคุณสมบัติใน CSS แต่ไม่เปิด / ปิดการใช้งาน

มันแปลกมากที่คุณคิดว่ามันแปลกมาก คุณเข้าใจผิดวัตถุประสงค์ของ CSS CSS ไม่ได้หมายถึงการเปลี่ยนพฤติกรรมขององค์ประกอบแบบฟอร์ม มันหมายถึงการเปลี่ยนสไตล์ของพวกเขาเท่านั้น การซ่อนช่องข้อความไม่ได้หมายความว่าช่องข้อความจะไม่อยู่ที่นั่นอีกต่อไปหรือเบราว์เซอร์จะไม่ส่งข้อมูลเมื่อคุณส่งแบบฟอร์ม ทั้งหมดจะซ่อนจากสายตาของผู้ใช้

หากต้องการปิดใช้งานเขตข้อมูลของคุณจริงคุณต้องใช้disabledแอตทริบิวต์ใน HTML หรือdisabledคุณสมบัติ DOM ใน JavaScript


35
แน่นอนฉันรู้ว่า CSS คือ "คาดคะเน" สำหรับ แต่สำหรับ webapps ที่ทันสมัยความแตกต่างระหว่าง "งานนำเสนอ" และ "พฤติกรรม" นั้นช่างน่าเบื่อกว่าโคลน เนื่องจากฟิลด์ที่ปิดใช้งานไม่ได้ถูกส่งไปยังเซิร์ฟเวอร์จึงเป็นการเปลี่ยนแปลงพฤติกรรม แต่แล้วการซ่อนเขตข้อมูลฟอร์มทั้งหมดไม่ได้เป็นหนึ่งเดียวได้อย่างไร! บางทีในสมัยก่อนที่ทุกสิ่งที่คุณทำได้บนเว็บคืออ่านข้อความและกรอกแบบฟอร์มความแตกต่างนั้นชัดเจนยิ่งขึ้น ในเว็บแอปที่ทันสมัยหากคุณต้องการแยกงานนำเสนอออกจากพฤติกรรม CSS กับ HTML / JS เป็นวิธีที่ผิดที่จะทำ
Anupam Jain

17
พิการเป็นสถานะไม่ใช่พฤติกรรม สิ่งที่เขาขอมีเหตุผลอย่างสมบูรณ์แบบ ตัวอย่างเช่นคุณอาจต้องการเพิ่มคลาสที่ไม่ว่างไปยังหลายเขตข้อมูลในขณะที่กำลังประมวลผลข้อมูล นอกจากนี้ W3C ดูเหมือนจะเห็นด้วยเพราะมันช่วยให้การเลือกองค์ประกอบ CSS ผ่านชั้นเรียนหลอกปิดการใช้งาน
IAmNaN

3
@IAmNaN: 1) "ปิดใช้งานเป็นสถานะไม่ใช่พฤติกรรม" ดังนั้นเป็นเพียงเกี่ยวกับคุณลักษณะอื่น ๆ HTML / DOM 2) "ตัวอย่างเช่นคุณอาจต้องการเพิ่มคลาสที่ไม่ว่างไปยังหลายเขตข้อมูลในขณะที่กำลังประมวลผลข้อมูล" คุณทำเช่นนั้นในสคริปต์ 3) "นอกจากนี้ W3C ดูเหมือนจะเห็นด้วยเพราะมันช่วยให้การเลือก CSS ขององค์ประกอบผ่านคลาสหลอก" ความสามารถในการเลือกองค์ประกอบโดยพิจารณาจากการเปิดใช้งานหรือปิดใช้งานนั้นไม่เกี่ยวข้องกับการเปลี่ยนสถานะนั้นด้วย CSS
BoltClock

5
มีหลายสิ่งใน CSS ที่จริงอาจถือได้ว่าเป็นการเปลี่ยนแปลงพฤติกรรมเช่นตัวชี้เหตุการณ์: ไม่มี; พูดถึงโดย @ANaimi ผู้พิการจึงสามารถพิจารณาได้ง่ายว่าเป็นคุณสมบัติการแสดงเช่นกัน น่าเสียดายที่มันไม่ได้ทำให้ง่ายขึ้น
Mikael Lepistö

1
@ Mikael Lepistö: ใช่ฉันไม่เห็นด้วยกับpointer-eventsการเป็นคุณสมบัติ CSS ด้วย FYI, pointer-events มาจาก SVG
BoltClock

22

คุณไม่สามารถใช้ CSS เพื่อปิดการใช้งานกล่องข้อความ โซลูชันจะเป็นแอตทริบิวต์ HTML

disabled="disabled"

ในขณะที่มันใช้งานได้ตามหลักการถ้าคุณอ่านคำถามเต็มมันบอกว่าเขตข้อมูลฟอร์มจะถูกสร้างขึ้นโดยอัตโนมัติแล้วจะต้องปิดการใช้งานหลังจากนั้น
เธเลม

1
@mr_eclair มันเป็นไปได้โดยใช้ ---> pointer-events: none; คุณสมบัติ Css
Fereydoon Barikzehy

3
หมายเหตุ: องค์ประกอบที่มีdisabledแอตทริบิวต์จะไม่ถูกส่ง - ค่าจะไม่ถูกโพสต์ไปยังเซิร์ฟเวอร์ อ่านต่อไป: stackoverflow.com/q/8925716/1066234
Kai Noack

17

วิธีแก้ปัญหาในทางปฏิบัติคือการใช้ CSS เพื่อซ่อนอินพุตจริง

ในการสรุปสิ่งนี้คุณสามารถเขียนอินพุต html สองรายการสำหรับอินพุตจริง (เปิดใช้งานหนึ่งรายการและปิดใช้งานหนึ่งรายการ) จากนั้นใช้จาวาสคริปต์เพื่อควบคุม CSS เพื่อแสดงและซ่อนไว้


3
หากคุณใช้ Javascript คุณควรปิดการใช้งาน / เปิดใช้งานตามที่ต้องการหรือไม่?
MindVox

แน่นอน แต่ในบริบทของคำถามเฉพาะนี้อาจเป็นแนวทางที่ปฏิบัติได้
graphicdivine

10

ครั้งแรกที่ตอบคำถามและดูเหมือนจะสายไปสักหน่อย ...

ฉันเห็นด้วยที่จะทำมันด้วยจาวาสคริปต์หากคุณใช้งานไปแล้ว

สำหรับโครงสร้างคอมโพสิตเช่นฉันมักจะใช้ฉันได้ทำ css หลอกหลังจากองค์ประกอบเพื่อป้องกันองค์ประกอบจากการมีปฏิสัมพันธ์ของผู้ใช้และอนุญาตให้จัดแต่งทรงผมโดยไม่ต้องจัดการโครงสร้างทั้งหมด

ตัวอย่างเช่น:

<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>

ฉันสามารถวางdisabledชั้นเรียนบนห่อdiv

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

นี่จะเป็นข้อความสีเทาภายในdivและทำให้ผู้ใช้ไม่สามารถใช้งานได้

ตัวอย่าง JSFiddle ของฉัน


4
BTW: คุณยังคงต้องจัดการกับแท็บซึ่งยังอนุญาตให้ผู้ใช้ไปที่สนามและเปลี่ยนมัน
K Kimble

2
ดังนั้น <select> ไม่ควรมี class = "disabled" หรือไม่
TimoSolo

นี่ยอดเยี่ยมฉันรู้ว่ามีบางอย่างเช่นนี้ :) ขอบคุณ
James Harrington

มันมีประโยชน์จริงๆ ฉันรู้ว่าการใช้ javascript เพื่อตั้งค่าการปิดการใช้งานจะดีกว่า แต่สิ่งนี้จะแก้ไขปัญหาของฉันในการทำให้ผู้ใช้ชัดเจน (นอกเหนือจากข้อความแสดงข้อผิดพลาด) ที่การส่งไม่ทำงาน
jerclarke

8

ฉันมักจะใช้:

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

จากนั้นใช้คลาส css กับฟิลด์อินพุต:

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

4

อินพุต [name = ชื่อผู้ใช้] {ปิดใช้งาน: จริง /* ไม่ทำงาน, ไม่เป็นผล */ }

ฉันรู้ว่าคำถามนี้ค่อนข้างเก่า แต่สำหรับผู้ใช้รายอื่นที่พบปัญหานี้ฉันคิดว่าวิธีที่ง่ายที่สุดในการปิดใช้งานการป้อนข้อมูลคือเพียงโดย ': ปิดใช้งาน'

<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>

ในความเป็นจริงถ้าคุณมีสคริปต์ที่จะปิดการใช้งานการป้อนข้อมูลแบบไดนามิก / โดยอัตโนมัติด้วย javascript หรือ jquery ที่จะปิดการใช้งานโดยอัตโนมัติตามเงื่อนไขที่คุณเพิ่ม

ใน jQuery สำหรับตัวอย่าง:

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

หวังว่าคำตอบใน CSS จะช่วยได้


2

คุณไม่สามารถทำสิ่งที่ฉันกลัวได้ แต่คุณสามารถทำสิ่งต่อไปนี้ใน jQuery หากคุณไม่ต้องการเพิ่มคุณสมบัติลงในฟิลด์ เพียงวางสิ่งนี้ไว้ใน<head></head>แท็กของคุณ

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

หากคุณกำลังสร้างฟิลด์ใน DOM (ด้วย JS) คุณควรทำสิ่งนี้แทน:

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

1

สามารถทำได้เพื่อวัตถุประสงค์ที่ไม่สำคัญโดยการวางซ้อนทับด้านบนขององค์ประกอบการป้อนข้อมูลของคุณ นี่คือตัวอย่างของฉันใน HTML บริสุทธิ์และ CSS

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

ไม่มีวิธีใช้ CSS สำหรับจุดประสงค์นี้ คำแนะนำของฉันคือการรวมรหัสจาวาสคริปต์ที่คุณกำหนดหรือเปลี่ยนคลาส CSS ที่ใช้กับอินพุต อะไรแบบนั้น :

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

รูปแบบของpointer-events: none;โซลูชันที่แก้ไขปัญหาของอินพุตที่ยังคงสามารถเข้าถึงได้ผ่านทางตัวควบคุมหรือแท็บแท็บคือการตัดอินพุตใน div ซึ่งถูกจัดรูปแบบเป็นอินพุตข้อความที่ปิดใช้งานและการตั้งค่าinput { visibility: hidden; }เมื่ออินพุตถูก "ปิดใช้งาน" .
Ref: 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>

สไตล์ที่ปิดใช้งานที่นำไปใช้ในตัวอย่างด้านบนนั้นนำมาจาก Chrome UI และอาจไม่เหมือนกับภาพอินพุตที่ปิดใช้งานในเบราว์เซอร์อื่น อาจเป็นไปได้ที่จะสามารถปรับแต่งสำหรับแต่ละเบราว์เซอร์โดยใช้ส่วนขยาย CSS เฉพาะเครื่องยนต์ - คำนำหน้า แม้ว่าภาพรวมฉันไม่คิดว่าจะทำได้:
ส่วนขยาย CSS ของ Microsoft , ส่วนขยายMozilla CSS , ส่วนขยายWebKit CSS

มันจะดูเหมือนไกลที่เหมาะสมมากขึ้นที่จะแนะนำมูลค่าเพิ่มvisibility: disabledหรือdisplay: disabledหรือบางทีก็appearance: disabledให้ที่visibility: hiddenอยู่แล้วมีผลกระทบต่อพฤติกรรมขององค์ประกอบที่บังคับควบคุมองค์ประกอบที่เกี่ยวข้องใด ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.