ฉันจะทำให้พื้นที่ทั้งหมดของรายการในแถบนำทางของฉันสามารถคลิกเป็นลิงก์ได้อย่างไร


97

ฉันมีแถบนำทางแนวนอนที่สร้างขึ้นจากรายการที่ไม่เรียงลำดับและแต่ละรายการมีช่องว่างภายในมากมายเพื่อให้ดูดี แต่พื้นที่เดียวที่ใช้เป็นลิงก์ได้คือข้อความ ฉันจะให้ผู้ใช้คลิกที่ใดก็ได้ในรายการเพื่อเปิดใช้งานลิงก์ได้อย่างไร

#nav {
  background-color: #181818;
  margin: 0px;
  overflow: hidden;
}

#nav img {
  float: left;
  padding: 5px 10px;
  margin-top: auto;
  margin-bottom: auto;
  vertical-align: bottom;
}

#nav ul {
  list-style-type: none;
  margin: 0px;
  background-color: #181818;
  float: left;
}

#nav li {
  display: block;
  float: left;
  padding: 25px 10px;
}

#nav li:hover {
  background-color: #785442;
}

#nav a {
  color: white;
  font-family: Helvetica, Arial, sans-serif;
  text-decoration: none;
}
<div id="nav">
  <img src="/images/renderedicon.png" alt="Icon" height="57" width="57" />
  <ul>
    <li><a href="#">One1</a></li>
    <li><a href="#">Two</a></li>
    <li><a href="#">Three</a></li>
    <li><a href="#">Four</a></li>
  </ul>
</div>
<div>
  <h2>Heading</h2>
</div>

คำตอบ:


110

อย่าใส่ช่องว่างในรายการ 'li' แทนที่จะตั้งค่าแท็กจุดยึดdisplay:inline-block;และใช้ช่องว่างภายในแทน


display: inline; zoom: 1;ในความคิดเห็นที่มีเงื่อนไขสำหรับ IE6 และ IE7 จะแทนที่display: inline-block;แม้ว่าใช่หากรายการถูกลอยไปแล้วdisplay: block;ก็จะใช้ได้เช่นกัน
FelipeAls

นั่นใช้งานได้ดีเพียงข้อร้องเรียนเดียวดูเหมือนว่าจะใช้ไม่ได้กับ: after selector ฉันต้องการให้>สัญลักษณ์ปรากฏหลังข้อความลิงก์ของฉัน แต่ไม่ได้ใส่ไว้ในเนื้อหา ... ฉันลงเอยด้วยการใส่ไว้ในเนื้อหา คงอยากรู้ว่ามีวิธีที่ดีกว่านี้หรือไม่
counterbeing

47

กำหนดคุณสมบัติ css แท็กจุดยึดของคุณเป็น:

{display:block}

จากนั้นจุดยึดจะครอบครองพื้นที่รายการทั้งหมดดังนั้นการคลิกของคุณจะทำงานในพื้นที่ว่างถัดจากรายการของคุณ


1
ฉันหวังว่าฉันจะลากคำตอบนี้ไปไว้ด้านบนของรายการคำตอบ ... นี่คือทางออกที่ดีที่สุดสำหรับปัญหานี้ !!!!
Rishabh

1
จะแตกบรรทัดหากมีสิ่งอื่นอยู่ในliเช่นไอคอน
Gringo Suave

13

ทำให้แท็กจุดยึดมีช่องว่างภายในแทนที่จะเป็นli. วิธีนี้จะใช้พื้นที่ทั้งหมด


3
ฉันขอแนะนำให้ย้ายสถานะโฮเวอร์ไปที่จุดยึดและออกจาก li เพื่อการรองรับเบราว์เซอร์ที่ดีขึ้น
NinjaBomb

12

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

a {
  /* This flexbox code stretches the link's clickable 
   * area to fit its parent block. */
  display:        flex;
  flex-grow:      1;
  flex-shrink:    1;
  justify-content: center;
}

(Caveat: flexboxes เป็น obvs ที่ยังไม่รองรับอย่างดี Autoprefixer เพื่อช่วยเหลือ!)


1
แต่ตอนนี้ (ไม่กี่ปีต่อมา) flex ทำงานได้ดีดังนั้นฉันคิดว่ามันเป็นคำตอบที่ดีที่สุดเมื่อสร้างเมนูด้วยulและ flexbox
Ludovic Kuty

ฉันคิดว่าคำตอบนี้ควรอยู่ที่ด้านบนตอนนี้มีการนำ flexbox มาใช้ในทุกเบราว์เซอร์แล้ว
Mohammad Faisal


7

หรือคุณสามารถใช้ jQuery:

$("li").click(function(){
   window.location=$(this).find("a").attr("href"); 
   return false;
});

3
เราสามารถพูดได้ว่าโซลูชันนี้เป็น 'วิธีแก้ปัญหา jquery ที่สกปรกซึ่งไม่จำเป็นเพราะคุณสามารถทำได้อย่างง่ายดายด้วย css' แต่พูดตามตรง - บางครั้งคุณพบว่าตัวเองอยู่ในสถานการณ์ที่ทำงานโดยไม่ใช้โค้ดของคุณและคุณก็ไม่มีเวลาทำความรู้จักโครงสร้าง DOM และสไตล์ชีต css ทั้งหมด (และพยายามทำความเข้าใจว่า 'coder คิดอะไรอยู่') ดังนั้น +1
lemoid

เห็นด้วยกับ @lemoid เราต้องจำไว้ว่าโซลูชันที่ "สวย" ไม่สามารถใช้ได้จริงเสมอไป
UncaAl ภายใน

1

คุณควรใช้คุณสมบัติและค่า CSS นี้ในli:

pointer-events:all;

ดังนั้นคุณสามารถจัดการลิงก์ด้วย jQuery หรือ JavaScript หรือใช้aแท็ก แต่องค์ประกอบแท็กอื่น ๆ ทั้งหมดภายในliควรมีคุณสมบัติ CSS:

pointer-events:none;

0

เพียงแค่ใช้ css ด้านล่าง:

<style>
  #nav ul li {
    display: inline;
  }

  #nav ul li a {
    background: #fff;// custom background
    padding: 5px 10px;
  }
</style>

0

นี่คือวิธีที่ฉันทำ

สร้าง<a>อินไลน์บล็อกและลบช่องว่างภายในออกจากไฟล์<li>

จากนั้นคุณสามารถเล่นกับwidthและheightของ<a>ใน<li>

ใส่widthเพื่อ100%เป็นจุดเริ่มต้นและดูวิธีการทำงาน

PS: - รับความช่วยเหลือของเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ Chrome เมื่อเปลี่ยนheightและwidth


-2

ใส่รายการภายในไฮเปอร์ลิงก์แทนที่จะเป็นวิธีอื่น

ตัวอย่างเช่นรหัสของคุณ:

<a href="#"><li>One</li></a>

@DannyBeckett ใช้ได้ใน HTML5
เต็ก

@ เต๊กไม่เป็นครับ
Danny Beckett

คุณพูดถูกฉันกำลังคิดถึงองค์ประกอบบล็อกที่อนุญาตให้อยู่ในจุดยึด แต่ฉันไม่รู้ว่าเด็ก ul เป็นหนึ่งในข้อยกเว้นของกฎ w3.org/html/wg/drafts/html/master/… ขอบคุณสำหรับการแก้ไขอย่างรวดเร็ว
เต็ก

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