Giriş öğelerini bir etiket öğesinin içine koymalı mıyım?


606

Yuvalanmasını ilişkin en iyi yöntem var mıdır labelve inputHTML öğeleri?

klasik yol:

<label for="myinput">My Text</label>
<input type="text" id="myinput" />

veya

<label for="myinput">My Text
   <input type="text" id="myinput" />
</label>

107
<input />İçine koymanın büyük profesyonellerinden biri , örneğin <label>atlayabileceğiniz forve id: <label>My text <input /></label>Çok daha hoş!
Znarkus

16
inputAnlamsal olarak a'nın içine girmediğini kabul etsem de label, bugün Bootstrap geliştiricilerinin benimle aynı fikirde olmadığını fark ettim . Satır içi onay kutuları gibi bazı öğeler, inputiçeride veya dışarıda olmasına bağlı olarak farklı şekilde stilize edilir.
Blazemonger

6
BTW Bu <label for="id">sayfada oluşturmak için çok kötü bir fikir oldu ve ben tuzağa iddüşmeden birçok widget için öznitelik kullanamazsınız unique id per page. Widget'a erişmenin kabul edilebilir tek yolu şudur form + widget_name.
MaxZoom

5
@MaxZoom Sayfanızda, benzersiz kimliklerle karşılaşmakta sorun yaşadığınız aynı alan adlarına sahip çok fazla farklı formunuz varsa, sayfa tasarımınızı biraz daha gözden geçirmek isteyebilirsiniz, IMHO; Açıkçası durumunuzu bilmiyorum, ama bu benim için kötü kokuyor
Ken Bellows

5
@kenbellows Bir sayfaya iki Arama formu koymak bir tasarımcı / işletme (benim değil) fikri. En iyi kullanıcı deneyimi uygulamaları zaman içinde değişebilir, ancak HTML görünür senaryoları kapsayacak kadar esnek olmalıdır (IMHO).
MaxZoom

Yanıtlar:


529

W3'ten: Etiketin kendisi ilişkili kontrolün önüne, arkasına veya çevresine yerleştirilebilir.

<label for="lastname">Last Name</label>
<input type="text" id="lastname" />

veya

<input type="text" id="lastname" />
<label for="lastname">Last Name</label>

veya

<label>
   <input type="text" name="lastname" />
   Last Name
</label>

Üçüncü tekniğin, tablo bir etiket kullanılırken, etiketi bir hücrede ve ilişkili form alanı başka bir hücrede olacak şekilde, tablo için kullanıldığında kullanılamayacağını unutmayın.

Her ikisi de geçerlidir. Size daha fazla stil kontrolü sağladığı için birinci veya ikinci örneği kullanmayı seviyorum.


14
Yanıtlandığı gibi, hepsi geçerlidir, ancak kendi pratiğimde tipik olarak burada superUntitled tarafından metin kutuları, textareas ve seçimler için verilen ilk örneğe yerleşiyorum. Ancak radyo düğmeleri ve onay kutuları için, genellikle eşlik eden metinden önce girdiyi istediğim ve etiketlerin ve alanların geri kalanının kullandığı sabit genişlik ve / veya kayan istemediğim üçüncü örneği kullanıyorum. Yani verilen herhangi bir formda, beni bu formatların her ikisini birlikte kullanırken bulabilirsiniz.
Funka

6
<label for="inputbox"><input id="inputbox" type="text" /></label>Kriterlerine göre bir geçiş olup olmadığını merak ediyorum .
Matt

64
Bir etiketi bir giriş etiketinin içine yerleştiremediğiniz için çok kötü. Soyut bir bakış açısından görürseniz, etiket gerçekten girişin bir özelliği olduğundan, çok daha anlamsal olarak rasyonel olurdu.
Alex

9
Bağlantılı WCAG belgesi şu seçeneği içerir: "Denetim, etiket metnini içeren bir etiket öğesinde bulunur." @Sorcy yorumundan bu yana yıllar içinde eklenmiş olup olmadığını bilmiyorum, ancak etiket giriş senaryosu şimdi geçerli kabul edilir.
Alex Weitzer

6
Etikete bir tıklama olayı işleyicisi eklediğinizde, etiketin içindeki girişte, en azından kromda bir sorun var, etiket tıklandığında işleyici iki kez tetiklenir. Bunu return false;işleyicinin sonunda alabilirsiniz , ancak daha sonra yürütmesi gereken başka işleyicileriniz varsa ve yayılmayı durdurmak bir seçenek değilse, bu bir sorun haline gelir.
wired_in

67

tercih ederim

<label>
  Firstname
  <input name="firstname" />
</label>

<label>
  Lastname
  <input name="lastname" />
</label>

bitmiş

<label for="firstname">Firstname</label>
<input name="firstname" id="firstname" />

<label for="lastname">Lastname</label>
<input name="lastname" id="lastname" />

Temel olarak HTML'yi daha okunabilir hale getirdiği için. Ve aslında ilk örneğimin CSS ile stil oluşturmanın daha kolay olduğunu düşünüyorum, çünkü CSS iç içe öğelerle çok iyi çalışıyor.

Ama sanırım bu bir zevk meselesi.


Daha fazla stil seçeneğine ihtiyacınız varsa, bir span etiketi ekleyin.

<label>
  <span>Firstname</span>
  <input name="firstname" />
</label>

<label>
  <span>Lastname</span>
  <input name="lastname" />
</label>

Kod bence daha iyi görünüyor.


3
Etiketin içine giriş eklemek, düzen için HTML kullanmakla aynıdır.
Emil

8
Bu çözümü aşağıdaki gibi durumlar için de seviyorum: <label>Expires after <input name="exp" /> days</label>(etiket giriş öğesinden önce ve sonra)
Philipp

İçin ve kimliği niteliklerini yanında - - Geçen örnek olduğunu düşünüyorum gerçekten herhangi bir sonraki girişine etiketi sahip olmaktan farklı ve her ikisi de bir içine sarılmış değil div, liya da ne değildir, öyle !?
retrovertigo

1
@retrovertigo - işlevsel olarak? Hayır. İşaretlemeyi azaltır ve terimlerin anlamsal olarak aşırı kullanımını azaltır. Girişin firstnameetikete uygun olması gerektiğini biliyoruz firstname, ancak tarayıcıların bildirime ihtiyacı var. Her şey bir zevk meselesi ve kodunuzda SİZİN en iyi göründüğü (ve hata ayıklaması en kolay olanı) düşündüğünüz. Şimdi iç içe kullanmayı tercih ediyorum, ama alışmam biraz zaman aldı.
Xhynk

3
@MPavlak - kısa bir bakış ve bu kılavuzu w3.org'dan buldum. w3.org/WAI/tutorials/forms/labels . Daha sonra w3.org/TR/WCAG20-TECHS/H44.html adresini kontrol ettim . En altta (belirsizdir), uygunluğu iddia etmek için test kriterlerini geçmeniz gerektiğini ve özellikle for özelliğini kullanmanız gerektiğini belirtir. Gerçekte bunu Apple Voiceover'de en son test ettiğimde (% 10 pazar payı ekran okuyucular masaüstü,% 60 pazar payı ekran okuyucular mobil) örtük etiketler işe yaramadı, bu da başka bir önemli faktördü. Umarım yardımcı olur!
James Westgate

39

Girdi etiketini etiket etiketine eklerseniz, 'for' özelliğini kullanmanız gerekmez.

Bununla birlikte, giriş etiketini etiketlerime dahil etmekten hoşlanmıyorum, çünkü bunların ayrı, içermeyen varlıklar olduğunu düşünüyorum.


8
For, bir kimliğinizi kullanmanızı gerektirir, bu da düzeni hiyerarşik olarak çok zorlaştırır :-(
ölümcül

39

Davranış farkı: etiket ve giriş arasındaki boşluğu tıklatma

Etiket ile giriş arasındaki boşluğa tıklarsanız, yalnızca etiket girişi içeriyorsa girişi etkinleştirir.

Bu mantıklıdır çünkü bu durumda boşluk etiketin sadece bir başka karakterinden ibarettir.

<p>Inside:</p>

<label>
  <input type="checkbox" />
  |&lt;----- Label. Click between me and the checkbox.
</label>

<p>Outside:</p>

<input type="checkbox" id="check" />
<label for="check">|&lt;----- Label. Click between me and the checkbox.</label>

Etiket ve kutu arasında tıklama yapabilmek şu anlama gelir:

  • tıklamak daha kolay
  • işlerin başladığı ve bittiği yerde daha az net

Bootstrap onay kutusu v3.3 örnekleri içindeki girişi kullanır: http://getbootstrap.com/css/#forms Bunları takip etmek akıllıca olabilir . Ama akıllarını v4.0'da değiştirdiler https://getbootstrap.com/docs/4.0/components/forms/#checkboxes-and-radios böylece artık bilge olanı bilmiyorum:

Onay kutuları ve radyo kullanımı, HTML tabanlı form doğrulamayı desteklemek ve kısa, erişilebilir etiketler sağlamak için oluşturulmuştur. Bu nedenle, <input>s ve <label>s, <input>a <label>. Bu biraz daha sen kimlik belirtmelidir olarak ayrıntılı ve nitelikleri ilişkilendirmek içindir <input>ve <label>.

Bu noktayı ayrıntılı olarak tartışan UX sorusu: /ux/23552/should-the-space-between-the-checkbox-and-label-be-clickable


Bu bir özellik farkı değil. Geçiş, tüm uyumlu tarayıcılarda her iki durumda da çalışır.
hexalys

@hexalys Rapor için teşekkürler. Cevabı güncelledim. Her iki durumda da uyumlu tarayıcıların geçiş yapması veya değiştirmemesi gerektiği anlamına mı geliyor? İlgili standart pasajla bağlantı kurabilseydiniz, bu harika olurdu.
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

1
Evet. Alanınızın gerçekten bir metin alanı olmadığı için örneğinizin yanıltıcı olduğunu fark etmeme rağmen . Bu bir marginonay kutusundan. Örneğinizdeki Firefox davranışı tuhaf ve bir hata gibi görünüyor. A label, satır içi içeriğin etrafında tıklanabilir olarak boşluklar veya dolgu içerir. Ancak, bir etiketin İçerik modelinin satır içi / Kelime öbeği içeriği olduğu düşünüldüğünde, etiketiniz yapılmadıkça giriş marjı tıklanmamalıdırdisplay: block ; bu durumda etiketin içi blocktüm tarayıcılarda tıklanabilir hale gelir.
hexalys

1
Yanıttaki Bootstrap bağlantısının v3.3 için belgelere gittiğine dikkat edin. V4.0 için dokümanlar onların fikrimi değiştirdim gösterir gibi görünmektedir. "Onay kutuları ve radyolar destek HTML tabanlı form doğrulama için inşa ve özlü, erişilebilir etiketler sağlamaktadır kullanıldıkça böyle, bizim <input> lar ve <label> lar <label> içindeki bir <input> yerine kardeş öğeleri. Bu, id belirtmeniz ve <input> ve <label> "ile ilgili nitelikler için" biraz daha ayrıntılı. "
Michael Krebs

2
Bu davranış farkı benim için en büyük fark. Öğeler kardeş olduğunda, her iki öğedeki herhangi bir kenar boşluğu , giriş öğesini tetikleyecek tıklanabilir yüzey alanını azaltır . Girdiyi etiketin içine yerleştirmek, tıklanabilir alanı korur ve hassas fare veya dokunma hareketleriyle mücadele eden kullanıcılar için bile maksimum erişilebilirlik sağlar. Bootstrap 4'te, yuvalama hala çalışıyor ve herhangi bir Bootstrap CSS'sini ayarlamanıza veya geçersiz kılmanıza gerek kalmadan aynı şekilde görüntüleniyor.
Turgs

17

Şahsen etiketi ikinci örnekteki gibi dışarıda tutmayı seviyorum. Bu nedenle FOR özniteliği oradadır. Nedeni, formun güzel görünmesini sağlamak için etikete, genişlik gibi, genellikle stil uygulayacağım (aşağıda kısayol):

<style>
label {
  width: 120px;
  margin-right: 10px;
}
</style>

<label for="myinput">My Text</label>
<input type="text" id="myinput" /><br />
<label for="myinput2">My Text2</label>
<input type="text" id="myinput2" />

Tabloları ve formlarımdaki tüm önemsiz şeylerden kaçınabilmem için yapar.


3
<br />Girişleri ayırmak için kullanmak yerine sunumu CSS'ye bırakmamalısınız ?
Znarkus

1
@Znarkus - evet, normalde böyle biçimlendirmeyle başa çıkmak için onları OL / LI'lere sararım, bu sadece kısa bir steno örneğiydi.
Papağanlar

1
@Parrots: Anlamsal olarak çok mantıklı değil, imo. Ve onları sarmanız gerekiyorsa, neden sadece etiketle sarmıyorsunuz?
Znarkus

1
@Parrots Bu akıl yürütme ile bir sayfadaki her şeyin ul / li içine girmesi gerektiğini düşünüyorum. Ve ihtiyacınız olan <label> <span>My text</span> <input /> </label>tüm stil seçeneklerine sahipsiniz.
Znarkus

1
"For" kullanmak, hiyerarşik düzenler için kötü olan bir kimlik kullanmanızı sağlar.
lethalman

15

W3 önerileri için http://www.w3.org/TR/html401/interact/forms.html#h-17.9 adresine bakın .

Her iki şekilde de yapılabileceğini söylüyorlar. İki yöntemi açık (öğenin kimliğiyle "for" kullanarak) ve örtük (öğeyi etikete gömerek) olarak tanımlarlar:

Açık:

For özniteliği bir etiketi başka bir denetim ile açıkça ilişkilendirir: for özniteliğinin değeri, ilişkili kontrol öğesinin id özniteliğinin değeri ile aynı olmalıdır.

örtülü:

Bir etiketi dolaylı olarak başka bir kontrolle ilişkilendirmek için kontrol elemanının LABEL elemanının içeriğinde olması gerekir. Bu durumda, LABEL yalnızca bir kontrol elemanı içerebilir.


Ben sadece örtük IE ... .any fikirlerin olmadığını keşfettim?
carinlynchin

11

Her ikisi de doğrudur, ancak girişi etiketin içine koymak, CSS ile şekillendirirken çok daha az esnek olmasını sağlar.

İlk olarak, a <label>, içerebileceği elementler ile sınırlıdır . Örneğin, yalnızca koyabilirsiniz <div>arasında <input>ise ve etiket metni <input>içinde değil<label> .

İkincisi, stilin iç etiket metnini bir açıklıkla sarmak gibi stil yapmayı kolaylaştırmak için geçici çözümler olsa da, bazı stiller, stilin daha karmaşık hale gelmesine neden olabilecek ana öğelerden devralınır.


çok daha az esnek mi? detaylandırabilir misin Diğerlerinin de belirttiği gibi, iç etiket metnini bir açıklıkla sarabilirsiniz, bu daha az esnek kılan şey değilse?
MPavlak

7

Dikkate değer bir 'gotcha', bir <label> öğesinin içine hiçbir zaman açık bir "for" özelliği içeren birden fazla giriş öğesi eklememeniz gerektiğini belirtir;

<label for="child-input-1">
  <input type="radio" id="child-input-1"/>
  <span> Associate the following text with the selected radio button: </span>
  <input type="text" id="child-input-2"/>
</label>

Bu, özel bir metin değerinin bir radyo düğmesine veya onay kutusuna ikincil olduğu form özellikleri için cazip olsa da, etiket öğesinin tıklama odaklama işlevi, kimliği hemen 'for' özelliğinde açıkça tanımlanan öğeye hemen odak atar kullanıcının bir metin girmek için içerdiği metin alanını tıklamasını neredeyse imkansız hale getirir.

Şahsen, girdi çocukları olan etiket elemanlarından kaçınmaya çalışıyorum. Bir etiket öğesinin etiketin kendisinden daha fazlasını kapsaması anlamsal olarak uygunsuz görünmektedir. Belirli bir estetik elde etmek için girişleri etiketlerde iç içe yerleştiriyorsanız, bunun yerine CSS kullanmalısınız.


4
Bu bir "yakaladım" değil. Bu açıkça spec bir parçasıdır; etiket içinde en fazla 1 kontrol içerebilir. Ayrıca burada örtük ve açık stilleri karıştırıyorsunuz - kontrolü etiketin içine koyarsanız, ihtiyacınız yoktur for... ve kullanmak istiyorsanız for, o zaman kontrolün etiketin içinde olması pek mantıklı değildir .
cHao

Doğru, ancak bu şartnamenin iyi anlaşılmadığı anlaşılıyor. Bu sorunu Drupal 6'nın yukarıda açıklananlardan farklı olmayan bir senaryo oluşturan biçimlendirme oluşturan form API'sı ile karşılaştık. Meslektaşım vardı ve bir iki dakika boyunca kafalarımızı kaşıyorum, bu yüzden gelecekte olası karışıklığı önlemek için sorunu burada yayınlayacağımı düşündüm.
Aaron

label-> input senaryosunda "for" gerekmez. etiket başına bir giriş ve adı veya kimliğini bilmek zorunda olmama avantajına sahiptir ve şeyleri kapsüllenmiş tutmak için güzel css stilinin yanı sıra içindeki diğer herhangi bir öğe tıklandığında odak oluşmasını sağlayabilirsiniz. Bunu yapmanın temiz yolu için bkz. zipstory.com/signup.
Jason Sebring

Teşekkür ederim; bu başka bir soruya, yani bir etiketin içinde birden fazla girişe sahip olup olmayacağını yanıtladı. (Bağlam: Her satırda bir tane olmak üzere birkaç radyo düğmesi seçeneği, her radyo düğmesi girişi 1, 2, 3 veya muhtemelen daha fazla türde metin girişine sahiptir, eğer o satırın radyo düğmesini seçme sonucu olan bir satıra tıklamak niyetindeyse, seçili değildir ve bu satırdaki giriş / girişlerin düzenlenmesine izin verir.) Bu, kapıyı formda girilmemiş metin için birden çok etikete sahip olmaya açık bırakır, ancak düşündüğüm şeyin iyi olup olmadığı hakkındaki sorumu yanıtladı. (Bu değildi.)
Christos Hayward

6

Çoğu insanın söylediği gibi, her iki yol da gerçekten işe yarıyor, ama bence sadece ilk yol. Anlamsal olarak katı olan etiket, girdiyi "içermez". Bence, biçimlendirme yapısında çevreleme (ebeveyn / çocuk) ilişkisi görsel çıktıdaki çevreyi yansıtmalıdır . yani, işaretlemede başka bir öğeyi çevreleyen bir öğe tarayıcıdaki öğenin çevresine çizilmelidir . Buna göre, etiket girişin kardeşi olmalı, üst öğesi değil. Yani ikinci seçenek keyfi ve kafa karıştırıcı. Python'un Zen'ini okuyan herkes Zen'i muhtemelen aynı fikirde olacaktır (Düz iç içe geçmişten daha iyi, Seyrek yoğundan daha iyi, Bir tane olmalı - ve tercihen sadece bir tane yapmalı ...).

W3C ve büyük tarayıcı satıcılarının ("bunu doğru şekilde yapın" yerine "hangi yolu tercih ederseniz seçin") gibi kararlar nedeniyle, web bugün çok karışık ve biz geliştiriciler karışık başa çıkmak zorunda ve çok çeşitli eski kodlar.


5

Genellikle ilk iki seçeneğe giderim. Üçüncü seçenek kullanıldığında, etiketlere ve css'e gömülü radyo seçimleri gibi bir senaryo gördüm

label input {
    vertical-align: bottom;
}

radyolar için uygun dikey hizalama sağlamak için.



2

Öğeleri içine sarmayı çok tercih ederim <label>Kimliklerimi oluşturmak zorunda olmadığım için .

Ben bir Javascript geliştiricisiyim ve React veya Angular benim veya başkaları tarafından yeniden kullanılabilecek bileşenler oluşturmak için kullanılıyor. Daha sonra sayfada bir kimliği çoğaltmak kolay olur , bu da garip davranışlara yol açar.


1

Dikkate almanız gereken bir şey, onay kutusunun ve radyo girişlerinin javascript ile etkileşimi.

Aşağıdaki yapıyı kullanarak:

<label>
  <input onclick="controlCheckbox()" type="checkbox" checked="checkboxState" />
  <span>Label text</span>
</label>

Kullanıcı "Metni etiketle" yi tıkladığında controlCheckbox () işlevi bir kez tetiklenir.

Ancak giriş etiketi tıklatıldığında, bazı eski tarayıcılarda controlCheckbox () işlevi iki kez tetiklenebilir. Bunun nedeni, hem giriş hem de etiket etiketlerinin onay kutusuna eklenen onclick olayını tetiklemesidir.

Sonra onay kutunuzda bazı hatalar olabilir.

Bu konuya son zamanlarda IE11'de rastladım. Modern tarayıcıların bu yapı ile ilgili sorunları olup olmadığından emin değilim.


-1

inputİçine yerleştirmenin birincil avantajılabel insanlar için verimlilik yazmak ve bilgisayarlar için bayt depolamaktır.

@Znarkus OP'ye yaptığı açıklamada,

Büyük profesyonellerden biri <input />İçine , örneğin <label>atlayabileceğiniz forve id: <label>My text <input /></label>Çok daha hoş!

Not: @Znarknus kodunda, yorumda açıkça belirtilmeyen başka bir verimlilik eklenmiştir. type="text"ayrıca atlanabilir ve inputvarsayılan olarak bir metin kutusu oluşturur.

Tuş vuruşlarının ve baytların yan yana karşılaştırılması [1].

31 tuş vuruşu, 31 bayt

<label>My Text<input /></label>

58 tuş vuruşu, 58 bayt

<label for="myinput">My Text</label><input id="myinput" />

Aksi takdirde, parçacıklar görsel olarak eşittir ve aynı düzeyde kullanıcı erişilebilirliği sunar. Kullanıcı imleci metin kutusuna yerleştirmek için etikete tıklayabilir veya ona dokunabilir.

[1] Windows'ta Not Defteri'nde, Windows Dosya Gezgini özelliklerinden gelen baytlarda oluşturulan metin dosyaları (.txt)

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.