CSS kullanarak form alanlarını nasıl devre dışı bırakabilirim?


180

CSS kullanarak form alanlarını devre dışı bırakmak mümkün mü? Elbette devre dışı bırakılan özniteliği biliyorum, ancak bunu bir CSS kuralında belirtmek mümkün mü? Gibi bir şey -

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

Sormamın nedeni, form alanlarının otomatik olarak oluşturulduğu ve alanların bazı kurallara (Javascript'te çalışan) göre gizlendiği / gösterildiği bir uygulamam olması. Şimdi alanları devre dışı bırakmayı / etkinleştirmeyi desteklemek için genişletmek istiyorum, ancak form alanlarının stil özelliklerini doğrudan değiştirmek için kuralların yazılma şekli. Bu yüzden şimdi kural motorunu niteliklerin yanı sıra form alanlarının stilini de değiştirmek için genişletmeliyim ve bir şekilde idealden daha az görünüyor.

CSS'de görünür ve görüntüleme özelliklerinizin olması, ancak etkinleştirme / devre dışı bırakmamanız çok ilginç. Halen çalışmakta olan HTML5 standardında veya standart olmayan bir şeyde (tarayıcıya özgü) böyle bir şey var mı?


5
Aşağıda birkaç kez bahsedildi, ancak gürültü kaybetti. İşaretçi olaylarını deneyin: none;
Corey Alix

Yanıtlar:


89

Bu yardımcı olabilir:

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

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

Güncelleme:

ve sekme dizininden devre dışı bırakmak istiyorsanız, dizini şu şekilde kullanabilirsiniz:

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

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

3
Bu, tüm girdi alanlarımı devre dışı bırakmak için ne olduğuma benziyordu, ancak fare olaylarından engellemelerine rağmen, klavye sekmesini kullanarak yine de erişilebilir ve değiştirilebilirler
Ken

11
tab-index css özelliği mevcut değil. Bir html özelliği olması gerekiyor (tabindex = -1)
N4ppeL

1
sekme-dizini kromda bulamıyor ve çalışmıyor, SEKME tuşuna basmak devre dışı bırakma özelliğini devre dışı bırakıyor, bu yüzden bu tam bir çözüm değil.
QMaster

172

Devre dışı bırakılan efekti CSS kullanarak taklit edebilirsiniz.

pointer-events:none;

Ayrıca renkleri vb. Değiştirmek de isteyebilirsiniz.


68
Bu yardımcı olur, ancak alanlara sekmeyi engellemez.
jerwood

Bir ekmek kırıntısının son bağlantısını "devre dışı bırakmak" istedim ve bu geçici çözüm göz önünde bulundurulmadı ... Bu, bazı renk değişimi ve alt çizgi olmadan, hile yaptı! : D
Facundo Colombier

2
Bu, form değerlerinin gönderilmesini de engellemez.
Ken Wayne VanderLinde

1
@KenWayneVanderLinde ne özürlü özelliği doğru değil?
theonlygusti

2
@theonlygusti Bir formdaki devre dışı <input> öğeleri gönderilmez.
dougd_in_nc

113

Kurallar JavaScript'te çalıştığından, neden javascript (veya benim örneklerimde jQuery) kullanarak bunları devre dışı bırakmıyorsunuz?

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

GÜNCELLEME

Aşağıdaki attryorumlarda belirtildiği gibi, işlev artık bunun birincil yaklaşımı değildir. Bu şimdi propfonksiyon ile yapılır .

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

1
$ ('# FiledId') olmamalı. RemoveAttr ('devre dışı'); // Etkinleştir
Anupam Jain

6
Kullanıcı JavaScript'i devre dışı bıraktıysa, bu çözümün işe yaramayacağını unutmayın.
josh-fuggle

1
Firefox 20.0 (diğer sürümlerden emin değilim, bu sadece geliştirmek için kullandığım şey) özelliğin kaldırılmasını gerektirir. @ Dutchie432 teoride doğruyken, .removeAttr ('devre dışı') kullanarak; (en azından mevcut tarayıcımda) doğru pratik çözümdür.

1
JQuery kullanamazsanız.
marines

3
FYI - jQuery belgeleri bu durum .prop()yerine kullanılmasını önerir .attr(). "JQuery 1.6'dan itibaren .attr () yöntemi ayarlanmamış öznitelikler için tanımsız olarak döner. Form öğelerinin denetlenen, seçilen veya devre dışı bırakılmış durumu gibi DOM özelliklerini almak ve değiştirmek için .prop () yöntemini kullanın. " Kaynak Belgeler: .attr () ve .prop ()
Nicholas Ryan Bowers

54

CSS'de görünür ve görüntüleme özelliklerinizin olması, ancak etkinleştirme / devre dışı bırakmamanız çok ilginç.

Bunun çok meraklı olduğunu düşündüğün çok merak ediyor. CSS'nin amacını yanlış anlıyorsunuz. CSS, form öğelerinin davranışını değiştirmeyi amaçlamaz . Sadece stillerini değiştirmek için. Bir metin alanını gizlemek, metin alanının artık orada olmadığı veya formu gönderdiğinizde tarayıcının verilerini göndermeyeceği anlamına gelmez. Tek yaptığı kullanıcının gözünden gizlemek.

Alanlarınızı gerçekten devre dışı bırakmak için HTML'deki niteliği veya JavaScript'teki DOM özelliğini kullanmanız gerekir .disableddisabled


35
Tabii ki CSS'nin "sözde" ne olduğunu biliyorum. Ancak modern webapps için "sunum" ve "davranış" arasındaki ayrım çamurdan daha çamurludur. Devre dışı bırakılan alanlar sunucuya gönderilmediğinden, bu bir davranış değişikliğidir. Peki o zaman tüm form alanlarını gizlemek nasıl değil ?! Belki de web'de yapabileceğiniz her şeyin metin okumak ve formları doldurmak olduğu eski günlerde, ayrım daha açıktı. Modern web uygulamasında, sunumu davranıştan ayırmak istiyorsanız, HTML / JS'ye karşı CSS bunu yapmanın yanlış yoludur.
Anupam Jain

17
devre dışı bırakılmış bir durumdur, davranış değildir. Sorduğu şey gayet makul. Örneğin, veriler işlenirken birden çok alana meşgul bir sınıf eklemek isteyebilirsiniz. Dahası, W3C, devre dışı bırakılmış sözde sınıf aracılığıyla öğelerin CSS seçimine izin verdiği için aynı fikirde görünüyor.
IAmNaN

3
@IAmNaN: 1) "devre dışı bir durumdur, davranış değildir." Yani hemen hemen her diğer HTML / DOM özelliği. 2) "Örneğin, veriler işlenirken birden çok alana meşgul bir sınıf eklemek isteyebilirsiniz." Bunu bir senaryoda yaparsınız. 3) "Ayrıca, W3C, devre dışı bırakılan sözde sınıf aracılığıyla öğelerin CSS seçimine izin verdiği için hemfikir görünüyor." Edebilme seçmek etkin veya edememek ile ilgisi engelli sahiptir olmasından bağımsız dayanan bir öğe değiştirmek devlet kullanarak CSS.
BoltClock

5
CSS'de aslında davranıştaki değişiklikler olarak kabul edilebilecek birçok şey vardır, örneğin pointer-events: none; @ANaimi tarafından bahsedildi. Bu nedenle engelliler de görüntülü reklam özelliği olarak kolayca düşünülebilir. Çok kötü değil, birkaç şeyi kolaylaştırırdı.
Mikael Lepistö

1
@Mikael Lepistö: Evet, ben de pointer-eventsCSS malı olmayı kabul etmiyorum . FYI, pointer-events SVG kaynaklı .
BoltClock

22

Metin Kutusunu devre dışı bırakmak için CSS kullanamazsınız. çözüm HTML Özelliği olacaktır.

disabled="disabled"

Bu prensipte çalışır, ancak soruyu tam okursanız, form alanının otomatik olarak oluşturulduğunu ve daha sonra devre dışı bırakılması gerektiğini söyler.
thelem

1
@mr_eclair. ---> pointer-events kullanarak mümkündür: none; Css özelliği.
Fereydoon Barikzehy

3
Not: disabledÖzniteliğe sahip öğeler gönderilmez - değerleri sunucuya gönderilmez. Daha fazla okuyun: stackoverflow.com/q/8925716/1066234
Kai Noack

17

Pratik çözüm, girişi gerçekten gizlemek için CSS kullanmaktır.

Bunu doğal sonucuna götürmek için, her bir gerçek giriş (biri etkin ve biri devre dışı) için iki html girişi yazabilir ve daha sonra bunları göstermek ve gizlemek için CSS'yi kontrol etmek için javascript kullanabilirsiniz.


3
Javascript kullanmanız gerektiğinde sadece devre dışı bırakmak / etkinleştirmek mantıklı olur?
MindVox

Gerçekten de, bu özel soru bağlamında, bu uygulanabilir bir yaklaşım olabilir.
graphicdivine

10

bir şeyi ilk kez yanıtlıyor ve görünüşe göre biraz geç ...

Zaten kullanıyorsanız, javascript ile yapmayı kabul ediyorum.

Genellikle kullandığım gibi kompozit bir yapı için, elemanların kullanıcı etkileşimini engellemek ve tüm yapıyı manipüle etmeden stil oluşturmaya izin vermek için bir css sözde öğesi yaptım.

Örneğin:

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

disabledSargı üzerine bir sınıf yerleştirebilirimdiv

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

Bu, içindeki metni grileştirir divve kullanıcı tarafından kullanılamaz hale getirir.

Örneğim JSFiddle


4
BTW: Hala kullanıcının alana girmesine ve değiştirmesine izin veren sekmeyi işlemeniz gerekir.
K Kimble

2
<select> 'in bir class = "devre dışı" olması gerekmez mi?
TimoSolo

Bu harika bir şey olduğunu biliyordum. :) teşekkürler
James Harrington

Bu gerçekten faydalı. Ben devre dışı ayarlamak için javascript kullanarak daha iyi olacağını biliyorum, ama bu gönderme bir işe yaramaz kullanıcılar (bir hata iletisine ek olarak) açık yapma sorunumu çözer.
jerclarke

8

Ben her zaman kullanıyorum:

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

ve daha sonra giriş alanına css sınıfının uygulanması:

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

4

input [name = kullanıcı adı] {devre dışı: true; /* Çalışmıyor */ }

Bu sorunun oldukça eski olduğunu biliyorum, ancak bu sorunla karşılaşan diğer kullanıcılar için, girişi devre dışı bırakmanın en kolay yolunun sadece ': devre dışı'

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

Gerçekte, eklediğiniz koşula bağlı olarak otomatik olarak devre dışı bırakılacak javascript veya jquery ile girdiyi dinamik / otomatik olarak devre dışı bırakacak bir komut dosyanız varsa.

Örnek jQuery'de:

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

Umarım CSS'deki cevap yardımcı olur.


2

Korkarım bunu yapamazsınız, ancak alanları öznitelikler eklemek istemiyorsanız jQuery'de aşağıdakileri yapabilirsiniz. Bunu <head></head>etiketinizin içine yerleştirin

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

DOM'daki alanları (JS ile) oluşturuyorsanız, bunun yerine bunu yapmalısınız:

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

1

Bu, kritik olmayan bir amaç için giriş öğenizin üstüne bir kaplama koyarak yapılabilir. İşte benim saf HTML ve CSS örneğim.

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

Bu amaçla CSS kullanmanın bir yolu yoktur. Tavsiyem, girdilere uygulanan css sınıfını atadığınız veya değiştirdiğiniz bir javascript kodu eklemektir. Bunun gibi bir şey :

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;Girişin etiketli denetimi veya tabindex aracılığıyla hala erişilebilir olması sorununu çözen bir çözüm varyasyonu , girdiyi devre dışı bırakılmış metin girişi olarak biçimlendirilmiş bir div'a sarmak ve girişin input { visibility: hidden; }"devre dışı bırakıldığında" ayarlanmasıdır . .
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>

Yukarıdaki snippet'te uygulanan devre dışı stil, Chrome kullanıcı arayüzünden alınır ve diğer tarayıcılardaki devre dışı girişlerle görsel olarak aynı olmayabilir. Muhtemelen motora özgü CSS uzantısı ön düzeltmeleri kullanılarak tek tek tarayıcılar için özelleştirilebilir. Bir bakışta, bunun olabileceğini düşünmüyorum:
Microsoft CSS uzantıları , Mozilla CSS uzantıları , WebKit CSS uzantıları

Bir ek değer tanıtmak çok daha mantıklı görünüyor visibility: disabledveya display: disabledhatta belki appearance: disabled, göz önüne alındığında visibility: hiddenzaten etkileyen davranış uygulanabilir elementlerin tüm ilişkili denetim elemanları arasında.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.