Как сделать так, чтобы вся область элемента списка на панели навигации отображалась как ссылка?


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. Я хотел, >чтобы после текста ссылки появлялся символ, но не помещал его в контент ... В итоге я просто поместил его в контент. Было бы любопытно, есть ли лучший способ сделать это.
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;
}

(Предостережение: гибкие боксы - это obvs, которые все еще плохо поддерживаются. Autoprefixer спешит на помощь!)


1
Но сейчас (несколько лет спустя) flex работает хорошо, поэтому я думаю, что это лучший ответ при создании меню с помощью ulflexbox.
Людовик Куты,

Я думаю, что этот ответ должен быть вверху, теперь, когда flexbox реализован во всех браузерах,
Мохаммад Фейсал,

11

Используйте следующее:

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

7

Или вы можете использовать jQuery:

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

3
Можно сказать, что это решение является «грязным решением jquery, которое не нужно, потому что вы можете легко сделать это с помощью css». Но, честно говоря, иногда вы попадаете в ситуацию, когда работаете с не вашим кодом, и у вас просто нет времени, чтобы узнать всю структуру DOM и таблицы стилей css (и попытаться понять, «о чем думал кодер»). Итак, +1.
lemoid

Согласитесь с @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


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