Як зробити цілу область елемента списку на навігаційній панелі, натиснувши як посилання?


95

У мене є горизонтальна панель навігації, зроблена з не упорядкованого списку, і кожен елемент списку має багато прокладки, щоб зробити його красивим, але єдиною областю, яка працює як посилання, є сам текст. Як я можу дозволити користувачу клацнути в будь-якому місці пункту списку, щоб активувати посилання?

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

Відповіді:


109

Не кладіть накладки в елемент 'li'. Замість цього встановіть тег прив’язки до display:inline-block;та застосуйте до нього набивання.


display: inline; zoom: 1;в умовному коментарі для IE6 і IE7 замінить, display: inline-block;хоча так, якщо елементи списку вже display: block;
плаваючі, це

Це добре спрацювало лише з однією скаргою, схоже, не працювало з селектором: after. Я хотів, щоб >символ з’явився після тексту мого посилання, але не вклав його у вміст ... У підсумку я просто помістив його у вміст. Було б цікаво, чи є кращий спосіб це зробити.
протидія

46

Визначте властивість css тега якоря як:

{display:block}

Тоді якір займе всю область списку, тому ваш клік буде працювати в порожньому просторі поруч із вашим списком.


1
Бажаю, я міг би перетягнути цю відповідь поверх списку відповідей ... Це найкраще рішення цієї проблеми !!!!
Рішабх

1
Перерве рядки, якщо щось інше є li, наприклад, значок.
Gringo Suave

13

Зробіть так, щоб тег якоря містив замість прокладки, а не li. Таким чином, вона займе всю площу.


3
Я б також запропонував перенести стан наведення курсора на якір, а також лі, щоб покращити підтримку браузера.
NinjaBomb

10

Супер, супер пізно для цієї вечірки, але все одно: ви також можете стилізувати якір як гнучкий предмет. Це особливо корисно для елементів динамічного розміру / впорядкованого списку.

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: флексбокси - це не завжди добре підтримувані пристрої. Autoprefixer на допомогу!)


Але зараз (через кілька років) флекс працює добре, тому я вважаю, що це найкраща відповідь при створенні меню з ulфлексбоком.
Людович Куті

10

Використовуйте наступне:

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

6

Або ви можете використовувати jQuery:

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

3
Можна сказати, що це рішення - "брудне рішення jquery, яке не потрібне, тому що ви можете легко це зробити за допомогою css". Але якщо бути чесним - іноді ви опиняєтесь у ситуації, що працює з не-вашим кодом, і у вас просто немає часу на ознайомлення з усією структурою DOM та таблицями стилів css (і намагаєтесь зрозуміти, "що думає кодер"). Отже +1.
лемоїд

Погодьтеся з @lemoid, ми маємо пам’ятати, що «гарні» рішення не завжди практичні в реальному житті.
UncaAlby

Я люблю тебе!!
Кастібланко

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


-1

Ви завжди можете обгортати весь тег li тегом гіперпосилання. Ось моє рішення:

#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;
  text-align: center;
  float: left;
  width: 40px;
  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>
    <a href="#"><li>One1</li></a>
    <a href="#"><li>Two</li></a>
    <a href="#"><li>Three</li></a>
    <a href="#"><li>Four</li></a>
  </ul>
</div>
<div>
  <h2>Heading</h2>
</div>


Щоб вкрасти коментар з іншої зворотної відповіді: "Це працює, але синтаксично недійсне".
topskip

-2

Помістіть елемент списку в гіперпосилання замість навпаки.

Наприклад, зі своїм кодом:

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

@DannyBeckett Це дійсно в HTML5.
Текст


Ви маєте рацію, я думав про блоки елементів, дозволених всередині якорів, але я не знав, що ul діти є одним із винятків із правила. w3.org/html/wg/drafts/html/master/… Дякуємо за швидке виправлення.
Тек

О ні ні ні ... ваш синтаксис та семантична розмітка просто вийшли з вікна. Ніколи більше цього не роби, друже, це просто робить Інтернет жахливим місцем.
Теодор Санду
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.