CSS üzerine gelme ve JavaScript fareyle üzerine gelme [kapalı]


84

Bir CSS öğesi kullanmak arasında seçim yapabileceğim zamanlar vardır: html öğelerinin bir sayfadaki görünümünü kontrol etmek için fareyle üzerine gelme veya JavaScript üzerinde fareyle üzerine gelme. Bir div'in bir girdiyi sarmaladığı aşağıdaki senaryoyu düşünün

<div>
<input id="input">
</div>

Fare imleci div'in üzerine geldiğinde girdinin arka plan rengini değiştirmesini istiyorum. CSS yaklaşımı

<style>
  input {background-color:White;}
  div:hover input {background-color:Blue;}
</style>

<div><input></div>

JavaScript yaklaşımı

<div onmouseover="document.getElementById('input').style.backgroundColor='Blue';">
  <input id="input">
</div>

Her yaklaşımın avantajları ve dezavantajları nelerdir? CSS yaklaşımı çoğu web tarayıcısı ile iyi çalışıyor mu? JavaScript css'den daha mı yavaş?


1
CSS yaklaşımı Javascript gerektirmez.
pd.


3
"JavaScript, css'den daha mı yavaş?" Farkına varmayacaksınız, ancak javascript daha fazla kaynak tüketecek ve aynı anda birçok başka komut dosyası çalışıyorsa işleri yavaşlatabilir (özellikle avuç içi cihazlar, mobil web siteleri için düşünün) ve bunun için kullanılması gereken şey bu değil. Öte yandan CSS'ler daha az kaynak kullanır ve tam olarak sunum içindir. Javascript'i yalnızca web sitesinde gezinmeyi ve işlevselliği geliştirmek için kullanmalısınız, ancak js etkin olmayan kullanıcılar için yine de gezilebilir olmalıdır. CSS: hover yaklaşımını öneriyorum.
Jose Faeti

1
Bu eski bir sorudur, bu nedenle yukarıdaki yorumun artık geçerli olmaması ve hiç geçmemiş olması şaşırtıcı değildir. Bunun bir nedeni, yüksek performanslı standart şablon sağlayan iyi JS kitaplıklarının olmamasıdır (bkz. Famo.us). Bir diğeri, hem masaüstü hem de mobil modern tarayıcılardaki JS motorlarının oldukça hızlı olmasıdır. Bunu, yerel C derlenmiş kodunun% 80 performansında ölçen bir kıyaslama var. Elbette istisnai durumlar var, ancak JS'nin tarayıcıdaki etkileyici performansı hala geçerli. İnsanların gerçekten "kastettiği" DOM'un yavaş olmasıdır. JS oldukça hızlıdır, bunu asla fark etmediler.
pmont 09

Yanıtlar:


59

: Hover ile ilgili sorun, IE6'nın bunu yalnızca bağlantılarda desteklemesidir. Bugünlerde bu tür şeyler için jQuery kullanıyorum:

$("div input").hover(function() {
  $(this).addClass("blue");
}, function() {
  $(this).removeClass("blue");
});

İşleri çok daha kolaylaştırır. Bu, IE6, FF, Chrome ve Safari'de çalışacaktır.


hızlı bir test yaptım ... görünüşe göre IE7 div: hover desteklemiyor mu?
John

Evet, IE7'nin CSS2 için% 50 desteği var. Pek çok web tasarımcısının buna dayanamamasının bir nedeni.
Alan

ancak korumalı alanı olabildiğince kötüye kullanan tüm bu izleyiciler, koklayıcılar ve bilgisayar korsanları ile anlaşılabilir. izlemeye karşı yardımcı olduğundan değil, ancak insanların bunu zorlaştırmaya çalışması anlaşılabilir. Çerezlere izin vermeyen insanlar tanıyorum. ve bunun için de geçerli sebepleri var, sadece ateşe bakın. Yine de cevabınızı onayladım, çünkü insanların 2013'te gelmesi, yine de takip edileceğini ve (bizim?) en sevdiğim oyuncağı etkinleştirmesini çok isterim.
jascha

metroui'nin kullanıcıların javascript'i devre dışı bırakıp bırakmadığını merak ediyorum: p ama cidden, chromeos, mozilla's os, metroui hepsi javascript kullanıyor. html5, css3, webgl ve javascript, birkaç yıl içinde istemci tarafı uygulamaları oluşturacak diller olacaktır. sadece sabırlı olun, yakında tarayıcı dışında javascript olacak, artık tarayıcıda onu devre dışı
bırakmanıza

32

CSS olanı çok daha sürdürülebilir ve okunabilir.


18
<a> olmayan öğelerde IE6'yı desteklemeniz gerekene kadar bakımı yapılabilir. O zaman bu bir acı çünkü bir JS-hack kullanmanız gerekiyor. Ancak CSS hala tercih ettiğim yol. 1999 tarayıcı kullanan kişilerin 1999 deneyimine sahip olmasına izin verin.
Tyson

4
İnsanlar bunu güncellemeli en iyi çözüm ... Tarayıcıyı algılayan ve IE <7
Travis Pessetto

11

Neden ikisi de olmasın? Animasyonlu efektler için jQuery'yi ve yedek olarak CSS'yi kullanın. Bu size jQuery'nin avantajlarını zarif bir şekilde düşürerek verir .

CSS:

a {color: blue;}
a:hover {color: red;}

jQuery ( renge animasyon uygulamak için jQueryUI kullanır ):

$('a').hover( 
  function() {
    $(this)
      .css('color','blue')
      .animate({'color': 'red'}, 400);
  },
  function() {
    $(this)
      .animate({'color': 'blue'}, 400);
  }
);

demo


1
CSS geçişleriyle, javascript'i yalnızca şu durumlarda bir yedek olarak kullanmanız gerektiğini savunuyorum: Hover, eski IE tarayıcılarında bağlayıcı olmayan etiketlere uygulandığında.
Adam Youngers

Jsbin'deki bazı değişiklikler demonun çalışmamasına neden oldu. Demoyu jQuery'nin mevcut sürümüne başvuracak şekilde güncelledim ve hepsi tekrar çalışıyor.
kingjeffrey

10

Bunu javascript'te yapmanın bir başka yararı da, farklı zamanlarda fareyle üzerine gelme efektini ekleyip kaldırabilmenizdir - örneğin, tablo satırlarının üzerine gelmek renk değiştirir, tıklama fareyle üzerine gelme efektini devre dışı bırakır ve yer modunda düzenlemeyi başlatır.


teşekkürler - bu aslında aradığım soruyu yanıtladı! :-)
Peter S Magnusson

6

Çok büyük bir fark, fare öğenin dışına çıktığında ": hover" durumunun otomatik olarak devre dışı bırakılmasıdır. Sonuç olarak, fareyle üzerine gelindiğinde uygulanan tüm stiller otomatik olarak tersine çevrilir. Öte yandan, javascript yaklaşımı ile hem "onmouseover" hem de "onmouseout" olaylarını tanımlamanız gerekir. Eğer sadece "onmouseover" ı tanımlarsanız, "onmouseover" uygulanan stiller, "onmouseout" u açıkça tanımlamadıkça fareyi kaldırdıktan sonra bile devam edecektir.


6

DÜZENLEME: Bu yanıt artık geçerli değil. CSS iyi destekleniyor ve Javascript (okuma: JScript) artık herhangi bir web deneyimi için oldukça gerekli ve çok az kişi JavaScript'i devre dışı bırakıyor.

Benim fikrim gibi orijinal cevap 2009'da.

Kafamın üstünden:

CSS ile tarayıcı desteğiyle ilgili sorunlarınız olabilir.

JScript ile insanlar jscript'i devre dışı bırakabilir (yaptığım şey budur).

Tercih edilen yöntemin içeriği HTML, CSS ile Düzen ve JScript'te dinamik yapmak olduğuna inanıyorum. Yani bu durumda, muhtemelen CSS yaklaşımını almak isteyeceksiniz.


4
JavaScript'i neden devre dışı bıraktınız? Milenyum öncesi deneyimi beğendin mi?
Alex

5
Çünkü bu bir güvenlik riski ve çok fazla site javascript'i kötüye kullanıyor. Seçmeli olarak yalnızca istediğiniz sitelerden komut dosyalarını etkinleştirmenize izin veren "NoScript" adlı şık bir firefox eklentisi kullanıyorum.
Alan

5

İkisi arasında akılda tutulması gereken başka bir fark var. CSS ile, fare bir öğeden çıktığında :hoverdurum her zaman devre dışı bırakılır. Ancak JavaScript ile, onmouseoutfare öğeden çıkıp sayfanın geri kalanına değil tarayıcı kromuna gittiğinde olay tetiklenmez.

Bu, özellikle sayfanızın üstünde özel fareyle üzerine gelme durumlarıyla bir gezinti çubuğu oluşturduğunuzda, düşündüğünüzden daha sık gerçekleşir.


4

Internet Explorer'da: hover seçicinin <a> öğesi dışındaki diğer öğeler üzerinde çalışması için bir <! DOCTYPE> bildirilmesi gerekir.




0

Javascript devre dışı bırakıldığında IE6 için% 100 desteğe ihtiyacınız yoksa , IE koşullu yorumları olan ie7-js gibi bir şey kullanabilirsiniz . Ardından, vurgulu efektleri uygulamak için sadece css kurallarını kullanırsınız. Tam olarak nasıl çalıştığını bilmiyorum ama normalde IE7 ve 8'de olmayan birçok css kuralını çalıştırmak için javascript kullanıyor.

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.