การวางเมาส์เหนือ CSS เทียบกับการวางเมาส์บน JavaScript [ปิด]


84

มีหลายครั้งที่ฉันมีตัวเลือกระหว่างการใช้องค์ประกอบ CSS: hover หรือ JavaScript onmouseover เพื่อควบคุมลักษณะที่ปรากฏขององค์ประกอบ html บนหน้า พิจารณาสถานการณ์ต่อไปนี้ที่ div ห่ออินพุต

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

ฉันต้องการให้อินพุตเปลี่ยนสีพื้นหลังเมื่อเคอร์เซอร์ของเมาส์วางเมาส์เหนือ div แนวทาง CSS คือ

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

<div><input></div>

วิธีการของ JavaScript คือ

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

แต่ละแนวทางมีข้อดีข้อเสียอย่างไร? แนวทาง CSS ทำงานได้ดีกับเว็บเบราว์เซอร์ส่วนใหญ่หรือไม่? JavaScript ช้ากว่า css หรือไม่


1
วิธี CSS ไม่ต้องใช้ Javascript
pd.

ฉันอยากจะแนะนำให้ใช้Whatever: hover : http://www.xs4all.nl/~peterned/csshover.html
cheeaun

3
"javascript ช้ากว่า css หรือไม่" คุณจะไม่สังเกตเห็น แต่จาวาสคริปต์จะใช้ทรัพยากรมากขึ้นและอาจทำให้สิ่งต่างๆช้าลงหากสคริปต์อื่น ๆ จำนวนมากทำงานในเวลาเดียวกัน (คิดว่าเป็นพิเศษสำหรับอุปกรณ์มือถือเว็บไซต์บนมือถือ) และไม่ใช่สิ่งที่ควรใช้ CSS ในทางกลับกันใช้ทรัพยากรน้อยและมีความหมายสำหรับการนำเสนอ คุณควรใช้ javascript เพื่อปรับปรุงการนำทางและฟังก์ชันการทำงานของเว็บไซต์เท่านั้น แต่ยังควรใช้งานได้สำหรับผู้ใช้ที่ไม่ได้เปิดใช้งาน js ฉันแนะนำ CSS: hover approach
Jose Faeti

1
นี่เป็นคำถามเก่าดังนั้นจึงไม่น่าแปลกใจที่ความคิดเห็นด้านบนใช้ไม่ได้อีกต่อไปและอาจไม่เคยเป็นมาก่อน สาเหตุหนึ่งคือการขาดไลบรารี JS ที่ดีซึ่งให้ต้นแบบที่มีประสิทธิภาพสูง (ดู Famo.us) อีกประการหนึ่งคือเอ็นจิ้น JS ในเบราว์เซอร์สมัยใหม่ทั้งเดสก์ท็อปและมือถือนั้นค่อนข้างเร็ว มีเกณฑ์มาตรฐานที่วัดได้ที่ 80% ของประสิทธิภาพของโค้ดที่คอมไพล์ C ดั้งเดิม แน่นอนว่ามีกรณียกเว้น แต่ประสิทธิภาพที่น่าประทับใจของ JS ในเบราว์เซอร์ยังคงมีอยู่ สิ่งที่ผู้คน "หมายถึง" จริงๆก็คือ DOM นั้นทำงานช้า JS ค่อนข้างเร็วพวกเขาไม่เคยตระหนักถึงมัน
pmont

คำตอบ:


59

ปัญหาเกี่ยวกับ: hover คือ IE6 รองรับเฉพาะลิงก์เท่านั้น ฉันใช้ jQuery สำหรับสิ่งนี้ในทุกวันนี้:

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

ทำให้สิ่งต่างๆง่ายขึ้นมาก ซึ่งจะทำงานใน IE6, FF, Chrome และ Safari


ฉันทำการทดสอบอย่างรวดเร็ว ... เห็นได้ชัดว่า IE7 ไม่รองรับ div: hover ??
John

ใช่ IE7 มีบางอย่างเช่นรองรับ CSS2 50% สาเหตุส่วนหนึ่งที่นักออกแบบเว็บหลายคนทนไม่ได้
Alan

แต่ด้วยเครื่องมือติดตามนักดมกลิ่นและแฮ็กเกอร์ทั้งหมดที่ละเมิดแซนด์บ็อกซ์ให้มากที่สุดเท่าที่จะเข้าใจได้ ไม่ใช่ว่าจะช่วยต่อต้านการติดตาม แต่เป็นที่เข้าใจได้ว่าผู้คนพยายามทำให้ยากขึ้น ฉันรู้จักคนที่ไม่อนุญาตให้ใช้คุกกี้ และพวกเขาก็มีเหตุผลที่ถูกต้องเช่นกันเพียงแค่ดูที่ firesheep ฉันยังคงโหวตคำตอบของคุณเพราะฉันจะชอบถ้าผู้คนจะมาถึงในปี 2013 ตระหนักว่าพวกเขาได้รับการติดตามและเปิดใช้งานของเล่นโปรดของฉัน (ของเรา?)
jascha

ฉันสงสัยว่า metroui เปิดให้ผู้ใช้ปิดการใช้งาน javascript: p แต่จริงๆแล้ว chromeos, ระบบปฏิบัติการของ mozilla, metroui ทั้งหมดใช้ javascript html5, css3, webgl และ javascript จะเป็นภาษาสำหรับสร้างแอปฝั่งไคลเอ็นต์ในอีกไม่กี่ปี อดใจรอเร็ว ๆ นี้จะมีจาวาสคริปต์นอกเบราว์เซอร์ไม่จำเป็นต้องปิดการใช้งานในเบราว์เซอร์อีกต่อไป :)
jascha

32

CSS หนึ่งสามารถบำรุงรักษาและอ่านได้ง่ายกว่ามาก


18
สามารถบำรุงรักษาได้จนกว่าคุณจะต้องรองรับ IE6 บนองค์ประกอบที่ไม่ใช่ <a> ถ้าอย่างนั้นก็ปวดเพราะต้องใช้ JS-hack แต่ CSS ยังคงเป็นวิธีที่ฉันชอบ ให้ผู้ที่ใช้เบราว์เซอร์ปี 1999 ได้สัมผัสประสบการณ์ปี 1999
Tyson

4
ผู้คนควรอัปเดตนี่เป็นทางออกที่ดีที่สุด ... ฉันขอแนะนำให้เพิ่มแท็กที่ตรวจจับเบราว์เซอร์และบอกให้พวกเขาอัปเดตหากใช้ IE <7
Travis Pessetto

11

ทำไมไม่ทั้งสอง? ใช้ jQuery สำหรับเอฟเฟกต์ภาพเคลื่อนไหวและ CSS เป็นทางเลือก นี้จะช่วยให้คุณประโยชน์ของ jQuery กับการย่อยสลายที่สง่างาม

CSS:

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

jQuery (ใช้jQueryUIเพื่อทำให้สีเคลื่อนไหว):

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

การสาธิต


1
ด้วยการเปลี่ยน CSS ฉันขอยืนยันว่าคุณควรใช้ javascript เป็นทางเลือกเท่านั้นเมื่อ: ใช้โฮเวอร์กับแท็กที่ไม่ใช่จุดยึดในเบราว์เซอร์ IE รุ่นเก่า
Adam Youngers

การเปลี่ยนแปลงบางอย่างที่ jsbin ทำให้การสาธิตไม่ทำงาน ฉันอัปเดตการสาธิตเพื่ออ้างอิง jQuery เวอร์ชันปัจจุบันและทั้งหมดใช้งานได้อีกครั้ง
kingjeffrey

10

ข้อดีอีกอย่างหนึ่งของการทำในจาวาสคริปต์คือคุณสามารถเพิ่ม / ลบเอฟเฟกต์โฮเวอร์ในช่วงเวลาต่างๆได้เช่นการวางเมาส์เหนือแถวของตารางจะเปลี่ยนสีคลิกปิดใช้เอฟเฟกต์โฮเวอร์และเริ่มแก้ไขในโหมดสถานที่


ขอบคุณ - นี่ตอบคำถามที่ฉันกำลังมองหาจริงๆ! :-)
Peter S Magnusson

6

ความแตกต่างที่ยิ่งใหญ่มากคือสถานะ ": hover" จะปิดใช้งานโดยอัตโนมัติเมื่อเมาส์เคลื่อนออกจากองค์ประกอบ ด้วยเหตุนี้รูปแบบใด ๆ ที่ใช้กับโฮเวอร์จะถูกย้อนกลับโดยอัตโนมัติ ในทางกลับกันด้วยวิธีการใช้จาวาสคริปต์คุณจะต้องกำหนดทั้งเหตุการณ์ "onmouseover" และ "onmouseout" หากคุณกำหนดเฉพาะ "onmouseover" สไตล์ที่ใช้ "onmouseover" จะยังคงมีอยู่แม้ว่าคุณจะเลื่อนเมาส์ออกไปเว้นแต่คุณจะกำหนด "onmouseout" ไว้อย่างชัดเจน


6

แก้ไข: คำตอบนี้ไม่เป็นจริงอีกต่อไป CSS ได้รับการสนับสนุนเป็นอย่างดีและ Javascript (อ่าน: JScript) นั้นค่อนข้างจำเป็นสำหรับประสบการณ์การใช้งานเว็บใด ๆ และมีเพียงไม่กี่คนที่ปิดการใช้งานจาวาสคริปต์

คำตอบเดิมตามความเห็นของฉันในปี 2009

ปิดด้านบนของหัวของฉัน:

ด้วย CSS คุณอาจมีปัญหากับการรองรับเบราว์เซอร์

ด้วย JScript ผู้คนสามารถปิดใช้งาน jscript (นั่นคือสิ่งที่ฉันทำ)

ฉันเชื่อว่าวิธีที่ต้องการคือการทำเนื้อหาใน HTML, Layout ด้วย CSS และอะไรก็ได้ที่เป็นไดนามิกใน JScript ดังนั้นในกรณีนี้คุณอาจต้องการใช้แนวทาง CSS


4
ทำไมคุณถึงปิดการใช้งานจาวาสคริปต์ คุณชอบประสบการณ์ก่อนพันปีหรือไม่?
Alex

5
เนื่องจากมีความเสี่ยงด้านความปลอดภัยและเว็บไซต์จำนวนมากใช้จาวาสคริปต์ในทางที่ผิด ฉันใช้ปลั๊กอิน firefox ที่เรียกว่า "NoScript" ซึ่งช่วยให้คุณสามารถเลือกเปิดใช้งานสคริปต์จากไซต์ที่คุณต้องการเท่านั้น
Alan

5

มีความแตกต่างอีกประการหนึ่งที่ควรทราบระหว่างทั้งสอง เมื่อใช้ CSS :hoverสถานะจะถูกปิดใช้งานเสมอเมื่อเมาส์เลื่อนออกจากองค์ประกอบ อย่างไรก็ตามด้วย JavaScript onmouseoutเหตุการณ์จะไม่เริ่มทำงานเมื่อเมาส์เคลื่อนออกจากองค์ประกอบไปยังเบราว์เซอร์ Chrome แทนที่จะไปที่ส่วนที่เหลือของหน้า

สิ่งนี้เกิดขึ้นบ่อยกว่าที่คุณคิดโดยเฉพาะอย่างยิ่งเมื่อคุณสร้างแถบนำทางที่ด้านบนสุดของหน้าเว็บด้วยสถานะโฮเวอร์ที่กำหนดเอง




2

เกี่ยวกับการใช้ jQuery เพื่อทำโฮเวอร์ฉันมักจะใช้ปลั๊กอินHoverIntentเนื่องจากจะไม่เริ่มเหตุการณ์จนกว่าคุณจะหยุดองค์ประกอบชั่วคราวในช่วงเวลาสั้น ๆ ... สิ่งนี้จะหยุดการยิงเมาส์จำนวนมากเหนือเหตุการณ์หากคุณทำงานโดยไม่ได้ตั้งใจ วางเมาส์เหนือพวกเขาหรือเพียงแค่เลือกตัวเลือก


0

หากคุณไม่ต้องการการสนับสนุน 100% สำหรับ IE6 ที่ปิดการใช้งานจาวาสคริปต์คุณสามารถใช้บางอย่างเช่นie7-jsกับความคิดเห็นตามเงื่อนไขของ IE จากนั้นคุณก็ใช้กฎ css เพื่อใช้เอฟเฟกต์โฮเวอร์ ฉันไม่รู้ว่ามันทำงานอย่างไร แต่มันใช้ javascript เพื่อทำให้กฎ css จำนวนมากทำงานได้ซึ่งปกติจะไม่ทำงานใน IE7 และ 8

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.