Gezinme çubuğumdaki bir liste öğesinin tüm alanını bağlantı olarak tıklanabilir hale nasıl getirebilirim?


97

Sırasız bir listeden yapılmış yatay bir gezinme çubuğum var ve her liste öğesinin güzel görünmesi için birçok dolgusu var, ancak bağlantı olarak çalışan tek alan metnin kendisidir. Bağlantıyı etkinleştirmek için kullanıcının liste öğesinin herhangi bir yerine tıklamasını nasıl sağlayabilirim?

#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>

Yanıtlar:


110

'Li' maddesine dolgu koymayın. Bunun yerine bağlantı etiketini olarak ayarlayın ve display:inline-block;ona dolgu uygulayın.


display: inline; zoom: 1;IE6 ve IE7 için bir koşullu yorumunda yerini alacak display: inline-block;evet olsa liste öğeleri zaten süzülüyor eğer, display: block;çok Tamam olacak
FelipeAls

Bu sadece tek bir şikayette işe yaradı,: after seçici ile işe yaramadı. >Bağlantı metnimden sonra bir sembolün görünmesini istedim , ancak içeriğe koymadım ... Sonunda içeriğe koydum. Bunu başarmanın daha iyi bir yolu olup olmadığını merak ediyorum.
counterbeing

47

Bağlantı etiketi css özelliğinizi şu şekilde tanımlayın:

{display:block}

Daha sonra bağlantı tüm liste alanını kaplar, böylece tıklamanız listenizin yanındaki boş alanda çalışacaktır.


1
Keşke bu cevabı cevap listesinin en üstüne sürükleyebilseydim ... Bu problem için en iyi çözüm bu !!!!
Rishabh

1
İçinde lisimge gibi başka bir şey varsa satırları keser.
Gringo Suave

13

Bağlantı etiketinin li. Bu şekilde tüm alanı kaplayacaktır.


3
Ayrıca, daha iyi tarayıcı desteği için fareyle üzerine gelme durumunu bağlantıya ve li'nin dışına taşımanızı öneririm.
NinjaBomb

12

Bu partiye çok geç, ama yine de: çapayı esnek bir öğe olarak da şekillendirebilirsiniz. Bu, özellikle dinamik olarak boyutlandırılmış / düzenlenmiş liste öğeleri için kullanışlıdır.

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;
}

(Uyarı: flexbox'lar obv'lerdir hala iyi desteklenmemektedir. Kurtarmaya otomatik düzeltme!)


1
Ama şimdi (birkaç yıl sonra), flex iyi çalışıyor, bu yüzden bence menüyü ulve flexbox ile oluştururken en iyi cevap bu .
Ludovic Kuty

Flexbox tüm tarayıcılarda uygulandığına göre, bu cevabın en üstte olması gerektiğini düşünüyorum
Mohammad Faisal

11

Aşağıdakileri kullanın:

a {
  display: list-item;
  list-style-type: none;
}

7

Veya jQuery'yi kullanabilirsiniz:

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

3
Bu çözümün 'css ile kolayca yapabileceğiniz için ihtiyaç duyulmayan kirli jquery çözümü' olduğu söylenebilir. Ama dürüst olmak gerekirse - bazen kendinizi kodunuz olmayan bir durumda çalışırken bulursunuz ve tüm DOM yapısını ve css stil sayfalarını tanımaya (ve 'ne kodlayıcının düşündüğünü' anlamaya çalışırken) zamanınız olmaz. Yani +1.
lemoid

@Lemoid ile anlaşın, "güzel" çözümlerin Gerçek Hayatta her zaman pratik olmadığını hatırlamalıyız.
UncaAlby

1

Bu CSS özelliğini ve değerini aşağıdakiler için kullanmalısınız li:

pointer-events:all;

Dolayısıyla, bağlantıyı jQuery veya JavaScript ile işleyebilir veya bir aetiket kullanabilirsiniz , ancak içindeki diğer tüm etiket öğeleri liCSS özelliğine sahip olmalıdır:

pointer-events:none;

0

Aşağıdaki css'yi uygulamanız yeterlidir:

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

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

0

işte böyle yaptım

Make <a>inline-block ve dolguyu kaldırın Bir<li>

Sonra birlikte oynayabilir widthve heightbir <a>de<li>

Put widthiçin 100%bir başlangıç olarak ve nasıl çalıştığını görmek

Not: - heightve değiştirirken Chrome Geliştirici Araçlarından yardım alın.width


-2

Liste öğesini tersi yerine köprü içine koyun.

Örneğin kodunuzla:

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

@DannyBeckett HTML5'te geçerlidir.
Tek


Haklısın, çapaların içinde engelleme elemanlarına izin vermeyi düşünüyordum ama ul çocukların kuralın istisnalarından biri olduğunu bilmiyordum. w3.org/html/wg/drafts/html/master/… Hızlı düzeltme için teşekkürler.
Tek

Oh hayır hayır hayır ... sözdiziminiz ve anlamsal biçimlendirmeniz pencereden dışarı çıktı. Bunu bir daha asla yapma dostum, bu sadece interneti korkunç bir yer yapıyor.
Teodor Sandu
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.