Bir çapanın içine div koymak hiç doğru mu?


530

Bir satır öğesinin satır içi öğenin içine yerleştirilmesinin bir HTML günahı olduğunu duydum:

<a href="http://www.mydomain.com"><div>
What we have here is a problem. 
You see, an anchor element is an inline element,
and the div element is a block level element.
</div></a>

Peki ya dış çapayı display:blockstil sayfasında olduğu gibi şekillendirirseniz ne olur? Hala yanlış mı? Blok düzeyinde ve satır içi öğelerde HTML 4.01 spesifikasyonu böyle düşünüyor gibi görünüyor:

Stil sayfaları, bir öğenin blok veya satır içi olarak oluşturulup oluşturulmadığı da dahil olmak üzere rastgele öğelerin oluşturulmasını belirtmek için araçlar sağlar. Liste öğeleri için satır içi bir stil gibi bazı durumlarda, bu uygun olabilir, ancak genel olarak, yazarların HTML öğelerinin geleneksel yorumunu bu şekilde geçersiz kılmaktan vazgeçirilir.

Bu sorunla ilgili başka ipucu veren var mı?



@DisgruntledGoat - Bağlantı için teşekkürler - keşke daha erken görseydim :-)
Tom

Bağlantı ve \ veya bağlantı öğesi bir tarayıcı otomasyon kontrolüdür. Bu nedenle tarayıcı için önceden tanımlanmış bir oluşturma ve davranışa sahiptir. Orijinal bir düz html öğesini sarmak için: div bir yayılma alanı içinde günahtır. Bir etiketin herhangi bir seviye davranışı eklememesinin nedeni, satır içi öğeler olması gerektiği için değil, metin akışının bölümlerini belge akışını bozmadan işaretlemede bir gereksinimdir. Bu pov'dan A, hiçbir şey yapma etiketi. Varlığı sorunun ötesindedir ve bir günah değildir, ancak kod çirkinliğine ve \ veya belirsizliğine katkıda bulunabilir.
Bekim Bacaj

Gelecekte burada kontrol eden herkes, bağlantı etiketleri HTML5'te blok düzeyinde öğeler içerebilse de, diğer bağlantı etiketleri içeren bir blok düzeyinde öğe içeremeyeceğini lütfen unutmayın! Çünkü temelde, tutturucu etiketlerin içinde başka tutturucu etiketler olamaz. Bununla ilgili daha fazla
bilgiyi

Yanıtlar:


748

Hazırladığınız HTML sürümüne bağlı olarak:

  • HTML 5 ,<a>"içinde hiçbir etkileşimli içerik olmadığı sürece (örneğin, düğmeler veya diğer bağlantılar)" tüm paragraflar, listeler, tablolar vb. Tüm bölümlerin etrafına sarılabileceğinibelirtir.

  • HTML 4.01 ,<a>öğelerin yalnızca satır içi öğeler içerebileceğinibelirtir. A<div>bir blok öğesidir , bu nedenle bir içinde görünmeyebilir<a>.

    Tabii ki, bir satır içi öğeyi bir blok gibi görünecek ya da gerçekten bir satırın satır içinde işlenecek şekilde biçimlendirmek için özgürsünüz. Terimlerin inlineve blockHTML'nin kullanımı , öğelerin belgenin semantik yapısı ile ilişkisini ifade ederken, CSS'deki aynı terimler öğelerin görsel stiliyle daha fazla ilgilidir. Satır içi öğelerin bloklu bir şekilde görüntülenmesini sağlarsanız sorun olmaz.

    Bununla birlikte, örneğin ekran okuyucu gibi yardımcı bir teknoloji aracılığıyla erişildiğinde veya gerçekten de güçlü Googlebot tarafından incelendiğinde, CSS'nin bulunmadığı durumlarda dokümanın yapısının hala anlamlı olduğundan emin olmalısınız.


4
W3.org/TR/REC-html40/sgml/dtd.html adresinde 4.01 için bir DTD bulunmaktadır . A% satır içi% içerebilir; % inline% farklı bir gruptur (bağlantıları takip edebilirsiniz), ancak DIV bunlar arasında değil. Bu nedenle, içinde DIV bulunan bir A XML ile doğrulanamaz. DTD'nin komitenin niyetlerini oldukça iyi ifade ettiğini düşünüyorum, bu yüzden şunu söyleyebilirim: Hayır.
Carl Smotricz

2
@Ewan: Cevabımdaki ilk bağlantı HTML 4.01'in ilgili bölümüne.
NickFitz

62
HTML5 ile ilgili son satırı okuyana kadar bunu bir projede yapma olasılığını bırakmak üzereydim, bunu bilmek güzel, teşekkürler.
Elaine Marley

16
Mozilla Geliştirici Ağı ( developer.mozilla.org/en-US/docs/Web/HTML/Element/a ), HTML5 <a> öğelerinin artık <div>, <ul> veya <table> gibi akış içeriği öğelerini desteklediğini yansıtmaktadır .
AxeEffect

12
HTML5 altında, bir eleman olarak kabul şeffaf bu içerebilen araçlar, akış (okuma elemanları varsayılan = blok üst SADECE) bir elemanı içerebilir akış elemanları. Aksi takdirde, yalnızca ifade öğelerine ( varsayılanı okuyun = satır içi ) izin verilir. Dolayısıyla, a bir formda veya divdeyse , bir div içerebilir , ancak p'nin içinde olamaz. Bkz. W3.org/TR/html-markup/terminology.html
Patanjali

81

Hayır geçerli kılmayacak, ancak evet genellikle modern tarayıcılarda çalışacaktır. Bununla birlikte, çapanızın içinde bir açıklık kullanın ve display: blocküzerine de yerleştirin, kesinlikle her yerde çalışacak ve geçerli olacak!


7
Ayarlarsanız display: block, teknik olarak bir blok öğesi haline gelmez mi?
WhyNotHugo

20
@hugo Teknik olarak önemli mi?
Andy Chase

5
HTML 4.01, aöğelerin yalnızca satır içi öğeler içerebileceğini belirtir . Bir spanöğeyi bir blok öğesi yaparsanız , teknik olarak bir sabitlemenin içinde olmamalıdır.
WhyNotHugo

22
@Hugo: Görünüşe göre HTML4'teki kısıtlama sunum değil, anlamsal. Anlamsal olarak, a <div>, blok düzeyinde ve a <span>satır içinde, belgeye eşlik eden CSS aksini belirtse bile.
Roy Tinker

Eklendi style = "display: block;" span etiketi ve bir cazibe gibi çalıştı. İstediğim sonucu elde etmek için dolgu ile yeni oynadım
Harif87

31

W3C doc gibi kavramları kullanmaz yanlış ve günah , ama sanki o kullanıyor araçlar temin , uygun olabilir ve cesaretini .

Aslında, 4. bölümün ikinci paragrafında , 4.01 özellikleri kelimelerini şu şekilde sıralamaktadır:

Bu belgede "ZORUNLU", "ZORUNLU DEĞİL", "GEREKLİ", "SHALL", "SHALL NOT", "SHOULD", "ÖNERİLMEMELİ", "ÖNERİLEN", "MAYIS" ve "İSTEĞE BAĞLI" anahtar kelimeleri [RFC2119] 'da anlatıldığı gibi yorumlanmalıdır. Ancak, okunabilirlik için, bu sözcükler bu belirtimdeki tüm büyük harflerde görünmez.

Bunu göz önünde bulundurarak, ben kesin ifadesi olduğunu düşünüyoruz 7.5.3 Blok seviyesinden ve satır içi öğeler yazan yere

Genel olarak, satır içi öğeler yalnızca veri ve diğer satır içi öğeleri içerebilir.

"Genellikle" koşulu, HTML 4.01'in satır içi öğelerin blok öğeleri içermesine izin verdiğini söylemek için yeterli belirsizliği ortaya koymaktadır.

Kesinlikle, CSS2, tanımladığınız amaca uygun gibi görünen bir satır içi blok özellikli bir görüntüleme özelliği değerine sahiptir . Hiç yaygın olarak desteklenip desteklenmediğinden emin değilim, ancak birileri bu tür davranışlara ihtiyaç duyduğunu öngörüyor.

DTD burada daha az bağışlayıcı görünüyor, ancak DTD metni spesifikasyona göre değişiyor:

HTML 4.01 belirtimi, DTD'lerde ifade edilemeyen ek sözdizimsel kısıtlamalar içerir.

Başka bir yorumda, bir bloğu bir sabitleyiciye sararak etkin hale getirmek istediğinizi önerirsiniz. HTML'nin bunu yasakladığına inanmıyorum ve CSS buna açıkça izin veriyor. Bu yüzden, başlığın doğru olup olmadığı hakkındaki soruya cevap vermek için evet diyorum. Standartlara göre, bazen doğrudur.


2
Sen doktrinden bahsedene kadar bana sahiptin.
Robert Harvey

Doctype değil, doctype.com
Ewan Todd

Muhtemelen haklısın - doctype.com'u kullanmalıydım. Opps - Bir dahaki sefere hatırlamaya çalışacağım. PHP -> SO, HTML -> doctype.com
Tom

2
Benim almam, "doctype.com'a ait olduğu gibi kapatılacak oy" seçeneğinin olmaması (ne de olması gerektiği).
Robert Harvey

7
Rob - Stack Overflow'ın programlama için olduğunu kabul ediyorum. HTML / CSS bence kesinlikle programlıyor.
DisgruntledGoat

13

HTML5 spesifikasyonu ile ... Artık satır içi öğenin içine blok düzeyinde bir öğe koymak mümkündür. Bu yüzden şimdi bir 'a' öğesinin içine 'div' veya 'h1' koymak mükemmel bir şekilde uygundur.


1
Sadece içeride akış (default = blok ) elemanları veya saydam (gibi unsurları bir izin ebeveynleri ile) akış elemanları. Örneğin, s izin vermez akış (benzeri elemanlar div ), ama sadece phrasing elemanları (varsayılan = içi bir çok) bir bölümü içindeki p bir içeremez div . Bununla birlikte, bir bir iç div içerebilir p s, div s ya da başka bir akış elemanı.
Patanjali

4

Sen koyamazsınız <div><a>- bu geçerli değil (X) HTML.

Display: block ile bir yayılma alanı stilinde olsanız bile, içine blok düzeyinde öğeler koyamazsınız: (X) HTML, (X) HTML DTD'ye (hangisini kullanırsanız kullanın) nasıl olursa olsun, yine de şeyleri değiştirir.

Tarayıcı muhtemelen istediğiniz gibi görüntüler, ancak bu doğru yapmaz.


4

Http://www.w3.org/TR/REC-html40/sgml/dtd.html adresinde HTML 4 için bir DTD var . Bu DTD, bir DTD'nin XML ve HTML 4'ü, özellikle "geçici" lezzetini yönetmesi sınırlamasıyla, spesifikasyonun makine ile işlenebilir biçimidir, "yasal" XML olmayan birçok şeye izin verir. Yine de, şartnamelerin niyetini kodlamaya yaklaştığını düşünüyorum.

<!ELEMENT A - - (%inline;)* -(A)       -- anchor -->

<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">

<!ENTITY % fontstyle "TT | I | B | BIG | SMALL">

<!ENTITY % phrase "EM | STRONG | DFN | CODE | SAMP | KBD | VAR | CITE | ABBR | ACRONYM" >

<!ENTITY % special "A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO">

<!ENTITY % formctrl "INPUT | SELECT | TEXTAREA | LABEL | BUTTON">

Bu hiyerarşide listelenen etiketleri izin verilen toplam etiket olarak yorumlardım.

Spesifikasyon "satır içi elemanlar" diyebilse de , bir blok elemanının ekran türünü satır içi olarak bildirerek niyetin etrafından dolaşabileceğinizden emin değilim . Satır içi etiketler, bunları nasıl kötüye kullanabileceğinizden bağımsız olarak farklı anlambilime sahiptir.

Öte yandan, dahil edilmesinin specialyuvalama Aelemanlarına izin verdiğini merak uyandırıcı buluyorum . Muhtemelen XML sözdizimsel olarak doğru olsa bile buna izin vermeyen bazı güçlü ifadeler var, ancak sorunun konusu olmadığı için bunu daha fazla sürdürmeyeceğim.


Ne anlama - - geldiğini biliyor musun ? Bir açıklama bulmaya çalıştım ama bir tane bulamadım.
Ewan Todd

4

Blok düzeyi öğeler HTML5'teki etiketlerle <div>sarılabilir <a>. Bir rağmen <div>bir olduğu düşünülür akış içerik konteyner / sarıcı ve <a>sitesindeki kabul edilir akış içeriğine göre MDN . Anlamsal olarak, blok düzeyinde elemanlar olarak işlev gören satır içi elemanlar oluşturmak daha iyi olabilir.


1
Gibi bir unsurlarıdır şeffaf , ana unsuru yalnızca a izin veren akışını (aynı varsayılan blok elemanları).
Patanjali

2

Div'ları bağlantı etiketlerinin içine yerleştirme anlamsal sorununu önlemek istiyorsanız, bağlantı etiketini div'lerle aynı düzeye yerleştirin, hepsini konum: göreceli olan bir kapla sarın, bağlantı etiketi konumunuzu kesin yapın: kabı doldurun. Ayrıca içerik akışının sonunda değilse, içeriğin üzerine yerleştirmek için oraya bir z-endeksi attığınızdan emin olun.

Önerildiği gibi bir biçimlendirme kodu ekledim:

<div class="div__container>
  <div class="div__one>
  </div>
  <div class="div__two">
  </div>
  <a href="#"></a>
</div>

Ve css:

.div__container {
  position: relative; 
}
.div__container a {
  position: absolute;
  top: 0;
  bottom: 0;      
  left: 0;
  right: 0;
  z-index: 999;
}

1
Cevabınız doğru olsa da, cevapla işaretlemeniz yardımcı olacaktır.
datashaman

1

Eğer <a>blok yapma çabasına gidecekseniz , neden <a>div'in içine koymuyorsunuz, bir blok elemanı olarak size aynı etkiyi verecektir.


36
Çünkü çapanın birden fazla div içermesini isteyebilirim.
Tom

1

Bir blok stili öğeye değiştirirseniz, hayır, artık 'yanlış' değildir, ancak muhtemelen doğrulanmayacaktır. Ama yaptığınız şeyi yapmak pek mantıklı değil. Bağlantı etiketini yalnızca iç div olmayan bir blok düzeyi öğesi olarak tutmalı veya div'i dışarıya koymalısınız.


1

Yanlış. Bir açıklık kullanın .


4
rofl bu bir div kullanmakla aynı şey. i blip.tv bu (div ile) yapılan gördük ama diğerleri div veya span veya ne olursa olsun aynı spec blok = blok göre bahsettiğini gördüm!
James Mitch

0

Çoğu zaman insanlar bu soruyu sorduklarında, sadece div içeren bir site oluşturduklarını ve şimdi div'den birinin bir bağlantı olması gerektiğini düşünüyorum.

Birisinin sadece bir div içinde bir bağlantı yapmak için bir çapa etiketi içinde şeffaf bir boş resim, PNG kullandığını gördüm ve görüntü div ile aynı boyuttaydı.

Aslında çok üzücü ... ama işe yarıyor ...


0

":: before" sözde elemanı ekleyerek bunu başarabilirsiniz

Saf CSS Hile;)

a:before{
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: 1;
  pointer-events: auto;
  content: "";
  background-color: rgba(0,0,0,0);
}
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet"/>
<div class="card" style="width: 18rem;">
  <img src="https://via.placeholder.com/250" class="card-img-top" alt="...">
  <div class="card-body">
    <h5 class="card-title">Card with stretched link</h5>
    <p class="card-text">Some quick example text to build on the card title and make up the bulk of the card's content.</p>
    <a href="#" class="btn btn-primary stretched-link">Go somewhere</a>
  </div>
</div>


-9

Tıpkı bir FYI gibi.

Hedefiniz div'inizi tıklanabilir yapmaksa jQuery / Java Script kullanabilirsiniz.

Div'inizi şu şekilde tanımlayın:

<div class="clickableDiv" style="cursor:pointer">
  This is my div. Try clicking it!
</div>

Daha sonra jQuery şu şekilde uygulanır:

 <script type="text/javascript">

    $(document).ready(function () {

        $("div.clickableDiv").click(function () {
            alert("Peekaboo"); 
        });
    });
</script>

Bu aynı zamanda birden çok div için de işe yarayacaktır - Tom'un bu konudaki yorumuna göre


17
Bu korkunç, klavye ile kullanılamıyor, bağlantıyı fareyle göremiyorum. Neredeyse bir bağlantı gibi çalışır, ancak gerçek bir bağlantı değildir. Ortaya da tıklayamaz veya bağlantı olarak sağ tıklayamazsınız.
WhyNotHugo

1
Kesinlikle yararları vardır. Div'ın içine bir çapa koyabilir ve div-click alt çapanın konumuna yönlendirmesini sağlayabilirsiniz. Div üzerindeki imleci işaretçiye ayarlayarak, bir çapa görünümüne ve hissine ek olarak, javascript'e izin verilmiyorsa veya erişilebilirlik nedenleriyle yalnızca div içindeki çapa ile geçerli bir geri dönüş çözümüne sahip olursunuz. Anlamsal ve sözdizimsel olarak doğru html alırsınız ve görüntüleme stilinin şüpheli değişiklikleriyle uğraşmak zorunda kalmazsınız.
Pedery

Bağlantı içeren bir div öğeniz varsa, bir tıklama işleyicisinin etkinliği yakalamasını sağlayabilirsiniz, bağlantı noktasını bulun (yalnızca bir tane olduğundan emin olun) ve ardından bunu kullanın. Normal bağlantı etiketi ile erişilebilir. Bu, örneğin bir resim ve resim yazısı ve "daha fazla bilgi" bağlantısı içeren şekillerden oluşan bir kovaya izin verir. Düşünceler?
Julix
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.