Neden div kullanmak zorundayız?


13

Bu sabah, bazı html ve haml yazarken, divlerin kullanım şeklinin saçma olduğu bana geldi. Div'ler neden ima edilmiyor? Şunu düşünün:

<div class="hero-img">
   <img src="http://whatever.com/this.jpg">
</div>

şuydu:

<hero-img>
   <img src="http://whatever.com/this.jpg">
</hero-img>

Elemanın "div sınıfı" kısmı varsayılırsa, HTML daha semantik ve eşleşen kapanış etiketleri ile daha fazla okunabilir olacaktı!

Bu, sahip olduğumuz HAML'ye benzer:

.content Hello, World!

Hangi olur:

<div class='content'>Hello, World!</div>

Bana öyle geliyor ki bunun tarayıcılarda çalışması için olması gereken tek şey, tarayıcıların mevcut bir html öğesi tanımı olmadan her öğeyi yorumlamaya başlayabilmesidir <div class="<element name>">.

Bu tamamen geriye dönük uyumlu olabilir; CSS ve jQuery seçicileri vb. için "div.hero-img" yine de çalışabilir ve öğeleri seçmek için gerekli sözdizimi olabilir.

Yeni web bileşenleri spesifikasyonunu biliyorum, ancak burada önerilenden çok daha karmaşık. Bir web sitesinin kaynağına bakmanın ve bunun gibi görünen html'yi görmenin ne kadar hoş olacağını hayal edebiliyor musunuz ?!

Öyleyse neden div kullanmalıyız?

Mozilla'nın html5 öğe listesine bakarsanız , her öğenin anlamsal bir anlamı vardır ve sonra ulaşırız <div>ve der ki:

"Özel bir anlamı olmayan genel bir kapsayıcıyı temsil eder."

..ve sonra html5'e ekledikleri keyfi öğeleri listelerler <details>.

Tabii ki, bu ima edilen div kavramı html spesifikasyonuna eklenmişse, standart hale gelmek on yıl sürecektir, bu da web zamanında bir milyon yıldır.

Yani bunun henüz gerçekleşmemiş olmasının iyi bir nedeni olduğunu düşünüyorum. Lütfen, bana açıkla!


Aslında iki anlamsal olmayan kap vardır: div ve span
Lie Ryan

Yanıtlar:


7

Sorun 1: Beyaz boşluklar

Bunun genel olarak ortaya çıkmadığına inanıyorum. Bununla birlikte, bunun olmaması ve muhtemelen olmaması gereken iyi bir neden, white-spacesCSS'de classesöğe için birden çok sınıf tanımlaması, HTML'de ise tanımlamalarıdır attributes.

Aşağıdaki kodu açıklayın (veya bir tarayıcıdan ayrıştırmasını isteyin):

<pet family style=" ... ">
  <img src="my-pets-family.jpg"/>
</pet family>

familyHTML öğesinin ikinci sınıf veya öznitelik tanımı mı ? Muhtemelen bu sitenin ayrıştırıcısından gördüğünüz gibi, bunun bir özellik olduğunu düşünüyor.

Yani, istersem <div class="pet family">, aslında bir sınıf yerine bir sınıf kullanmamın iki ana nedeninden biri olan iki sınıfı tanımlamanın hiçbir yolu yoktur.

Sorun 2: İleri uyumluluk!

<div>Şu anda s'yi kullanmak , bizi (en azından bazılarımızı) kodumuza düzgün bir şekilde girintilemeye ve yorum yapmaya zorlar, bu da tüm programlama dilleri için iyi bir uygulamadır.

Bunun yerine, HTML bloklarını değişkenlere dönüştürmek, yeni programcıların HTML'de neyin spesifik olduğu ve neyin yapmadığı konusunda büyük karışıklığa neden olur .

Ayrıca, div'inizin sınıfları için yaptığınız aynı adla gelmediklerinden emin olmak için eski kodunuzu yeni HTML5 etiketleriyle karşılaştırmaya başlamanız gereken komik yan etkiye neden olacaktır ...

Aynı sorun için de geçerlidir variableskullanarak reserved wordsbazı dillerde. PHP bir dolar işareti ile çözdü, bu yüzden HTML'de benzer bir yaklaşım mevcut kullanımından çok daha iyi olmayan bir şeyle sonuçlanacaktır <div class="something">.


"Sınıf" icat eden <z:name1 attr1=foo attr2=bar> ... <z/name2 attr3=boz ... </z>, semantik olarak eşdeğer olacağını <div class="name1" attr1="foo" attr2="bar">...</div><div class="name2" attr1="boz"> ... </div>ancak 14.4K modem üzerinden göndermek için daha az zaman ayıracağını belirten herhangi bir sorun olur mu?
supercat

Sanırım hayır. Ancak bu, aynı şeyi yazmak için farklı bir sözdizimi olacaktır, kavramını <div class="">hiçbir şekilde geliştirmez. Sonra tekrar, neden bunu tanımlayın z:name1ya z/name2da HTML etiketi classdeğil idmi? Ve beyaz boşluk sorunu burada tekrar ortaya çıkıyor. Bu yüzden z:"name1 name2", yine aynı şey haline gelen iki sınıf ilan etmek gerekir .
mavrosxristoforos

Çok sayıda sözdizimi olasılığı vardır. Demek istediğim, birçok insanın 14.4K veya daha yavaş modem kullandığı bir çağda, bant genişliği sorunlarına en azından biraz önem veren bir form olması gerektiğiydi.
supercat

Bunu kesinlikle anlıyorum. Bir web geliştiricisi olarak, daha hızlı web siteleri ve daha fazlasını üretmek için her şeyi en aza indirmeye çalışıyorum. Yine de birçok açıdan iyi bir yaklaşım olduğuna inanıyorum.
mavrosxristoforos

5

<div>Süslemenizi gıdıklayan yerine kullanmaktayız çünkü tarayıcı tarafından işlenmeyi ve oluşturmayı kolaylaştırır.

Karşı örnek olarak XML, istediğiniz herhangi bir etiket adının oluşturulmasına izin verir. Rasgele etiket adları oluşturma yeteneği bir işlem maliyetiyle birlikte gelir. XML ayrıştırıcıları, belgeyi ayrıştırırken / parçası olarak bir belgede kullanılan etiketlerin sözlüğünü oluşturmalıdır.

<div>Tarayıcıları kullanarak orada bir kap olduğunu ve kabı görmezden gelebileceğini veya kapta bir şey yapabilen zincirdeki başka bir araca geçirebileceğini bilin.


Tarayıcılar, belirtilen zımni div yöntemini kullandıysa, işlem maliyetinin kaybolacak kadar küçük olacağından eminim. Ve okunacak faydalar ve yazılabilirlik çok büyük olurdu.
Jordan Davis

3
<div>daha az karmaşıklık demektir, bu her zaman iyi bir şeydir. Özünde HTML iki tür yapıdan oluşur: blok düzeyi ve satır içi işaretleme. Aynı şeyi ifade etmenin daha fazla yolu olması, yalnızca HTML olan karmaşaya katkıda bulunur.

" tarayıcı tarafından işlenmeyi ve oluşturmayı kolaylaştırır. " Bu gerçekten doğru değil. Tarayıcının tanınmayan etiketleri ayrıştırması gerekir ve tüm DOM yöntemleri ve CSS seçicilerinin beklediğiniz gibi üzerinde çalışması gerekir ve tarayıcılar tanınmayan öğelere hala CSS uygular. Tarayıcının tanınmayan etiketlerle yapmadığı tek şey, varsayılan stilleri (kullanıcı aracısı stilleri) ve davranışları uygulamaktır.
Lie Ryan

3

Web yazarlarının özel (standartlaştırılmamış) amaçlar için HTML'ye rastgele öğe adları eklemesine izin vermeyi öneriyorsunuz. Bunun büyük bir sorunu var: HTML standardına yeni öğeler eklemeyi tehlikeli hale getirecektir, çünkü çeşitli yazarlar aynı öğe adını özel amaçlar için zaten kullanıyor olabilirler, böylece sayfanın anlamını geriye dönük olarak değiştirirler. Tarayıcıların yeni sürümleri mevcut web sayfalarını bozduğunda insanlar mutlu olmazlar, bu nedenle bu hareketsizdir.

Aynı sorun özel amaçlar için rastgele özellik adlarının kullanılmasıdır. Bu nedenle HTML5, özel kullanım özellikleri için "data-" önekini zorunlu kılar, bu nedenle standarttaki yeni özelliklerle çarpışmazlar.

Div ve span semantik olarak nötr öğeler olarak tanımlanır, yani bunları semantiklerin gelecekteki tarayıcılarda değişeceğinden korkmadan özel amaçlar için kullanabilirsiniz. Elbette, bir sınıf adı eklemek için birkaç karakter daha gerektirir, ancak ileri uyumluluk buna değecektir.


2

Kendi örneğiniz, div'ların neden bu kadar gülünç olmadığını bir özellik gösterir.

<div class="hero-img">
  <img src="http://whatever.com/this.jpg">
</div>

imgEtiketi doğru bir şekilde kapatmadınız . Bazı etiketler, gibi img, br, hrve diğerleri herhangi bir içeriği yok ve bu nedenle kapalı olması değildir. Ayrıştırıcı bunu biliyor.

divO içerik içerdiğinden etiketi, diğer taraftan, kapalı olması gerekiyordu. Sadece kendi etiketinizi çırptıysanız, ayrıştırıcının etiketin kapatılıp kapanmayacağını düşünmesi konusunda hiçbir fikri yoktur.

Bazı öğelerin kapatılmasının ve diğerlerinin olmamasının nedeni, bu blog yazısının güzel açıkladığı SGML mirasından geliyor: http://www.colorglare.com/2014/02/03/to-close-or-not- to-close.html


2

Bu bir tanım meselesidir. Saf XML olan XHTML kullanıyorsanız, bu nedenle tam olarak tanımlanmışsa, burada bir önek aracılığıyla kendi ad alanınızı kullanabilirsiniz q::

<q:hero-img>
    <img src="http://whatever.com/this.jpg">
</q:hero-img>

(X) HTML'ye dönüştürmek için XML kullanırsanız, ücretsiz etiketli "HTML" gerçek HTML'nizden oluşturmak tamamen ücretsizdir <div class="hero-img">.


Bazı etiketlerde, kendi (sahte) URL'nizle bir ad alanı niteliği:

xmlns:q="http://..."

1
Basit çözüm için +1. Bir ad alanı öneki eklemek zorunda bile değildir ve tüm doküman için varsayılan bir NS bildirebilir ve (X) HTML'ye dönüştürmek için bir XSLT sağlayabilir.
DougM

1
XML ad alanı önekle değil, bu önekin xmlns bildiriminin değeriyle tanımlanır. qxmlns'i belgenin herhangi bir yerinde bildirmedikçe, burada tamamen anlamsız bir önek bulunur (ve geçersiz XML'dir). Aynı ad alanını farklı öneklerle yeniden bildirebilir veya belgenin belirli bir bölümü için varsayılan ad alanını ayarlayabilirsiniz ve xmlns değerleri eşit olduğu sürece, bu farklı öneklere CSS uygulanırken veya DOM'da eşit şekilde davranılır.
Yalan Ryan

@ LieRyan iyi bir nokta. Bahsetmeliydim. Gerçeklerin bilindiği varsayıldı. Eklendi
Joop Eggen

0

HTML'nin temel öğelerinden biri aslında önceden tanımlanmış etiket öğelerine sahip olmaktır. Bu yüzden.

Div class = bu "sınırlama" yı aşmanın bir yoludur.

İşte bu yüzden bu "zımni" yapıları görmüyorsunuz.


Bunu, yeni web bileşenleri spesifikasyonunu tanımlayan tüm Google mühendislerine söyleyin ... Ne demek istediğinizi anlıyorum, ancak nihayetinde önümüzdeki birkaç yıl ne olursa olsun geliştirici tarafından üretilen elemanların patlaması olacak. Benim fikrim sadece daha kullanıcı dostu. Yine de alınan nokta.
Jordan Davis

0

Bir div öğesinin amacı tek başına yapıdır. Öğeleri tek bir ortak öğe altında gruplandırmanıza olanak tanır. Beyaz boşluk, hız, render, anlambilim veya başka bir şeyle ilgisi yoktur. CSS ile stil ve javascript seçiciler açısından size yardımcı oluyor. Başka bir öğeyle değiştirirseniz, amacı değiştirirsiniz.

Kendi adlandırılmış öğenizi oluşturmak için, gösterdiğiniz gibi, arama motorlarının ve diğer araçların öğelerinizin ne anlama geldiğini bilmemesi konusunda bir sorunu vardır. "Hero-img" nedir ve "kahraman resmimden" farkı nedir ve sayfanızı ziyaret ettiğimde API'm bunu nasıl ele almalıdır? Bir tarayıcı bu öğeyi nasıl ele almalıdır? Blok seviyesi mi yoksa satır içi mi? Çok fazla soru.


0

Div etiketleri genellikle bir web sayfasına bölme veya bölüm uygulamak için kullanışlıdır. Div etiketini, diğer öğelerin uygulanabileceği bir kapsayıcı olarak kullanabilirsiniz. Ayrıca, belirli bir öğeye CSS ve bazı komut dosyaları uygulanmasına da yardımcı olacaktır.

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.