Как сделать так, чтобы HTML-ссылка активировалась при нажатии на ‹li›?

У меня есть следующая разметка,

<ul id="menu">              
    <li><a href="#">Something1</a></li>
    <li><a href="#">Something2</a></li>
    <li><a href="#">Something3</a></li>
    <li><a href="#">Something4</a></li>
</ul>

<li> немного великоват, с маленьким изображением слева от него, мне нужно нажать на <a>, чтобы активировать ссылку. Как мне сделать так, чтобы клик по <li> активировал ссылку?

Редактировать1:

ul#menu li
{
    display:block;
    list-style: none;
    background: #e8eef4 url(images/arrow.png) 2% 50% no-repeat;
    border: 1px solid #b2b2b2;
    padding: 0;
    margin-top: 5px;
}

ul#menu li a
{

    font-weight: bold;
    text-decoration: none;
    line-height: 2.8em;
    padding-right:.5em;
    color: #696969;
}

person San    schedule 13.07.2009    source источник


Ответы (14)


#menu li { padding: 0px; }
#menu li a { margin: 0px; display: block; width: 100%; height: 100%; }

Для IE6 может потребоваться некоторая настройка, но это примерно то, как вы это делаете.

person MiffTheFox    schedule 13.07.2009
comment
Вот как бы я это сделал. Он расширяет ссылку до размера тега ‹li›. - person Austin Hyde; 14.07.2009
comment
Это работает, но текст (ссылка) прилипает к правой границе, когда я дал padding-right: .5em, ‹a› выходит из ‹li› - person San; 14.07.2009
comment
Продолжайте настраивать, и вы получите идеальный внешний вид. Проверьте отрицательные поля и отступы, возможно, что-то не складывается и рушится. Кроме того, убедитесь, что у вас нет ошибочного text-align: right; застрял там. - person Curtis Tasker; 14.07.2009
comment
Я дал тексту (ссылке) правильный отступ, на самом деле задав ‹li› padding-right:0.5em и задав ‹li› и ‹a› один и тот же цвет фона. Но теперь эта правая часть .5em ‹li ›недоступна для щелчка, но это нормально. - person San; 14.07.2009
comment
Сан: Устранил эту проблему, разумно разместив отступы на самой ссылке: li { padding-top: .3em; заполнение снизу: .3em; { дисплей: блок; поле: 0px; отступ слева: 10%; ширина: 90%; высота: 100%; } } - person Ari Gesher; 28.08.2012

Как сказал Маринио, вы можете использовать атрибут onclick <li> для изменения location.href через javascript:

<li onclick="location.href='http://example';"> ... </li>

Кроме того, вы можете удалить все поля или отступы в <li> и добавить большой отступ слева от <a>, чтобы текст не выходил за пределы маркера.

person Eric    schedule 13.07.2009
comment
Вы можете расширить это? Почему это плохая идея - person NuclearPeon; 24.06.2015

Просто чтобы бросить этот вариант там:

<ul id="menu">
    <a href="#"><li>Something1</li></a>
    <a href="#"><li>Something2</li></a>
    <a href="#"><li>Something3</li></a>
    <a href="#"><li>Something4</li></a>
</ul>

Это стиль, который я использую в своих меню, он делает сам элемент списка гиперссылкой (аналогично тому, как можно сделать изображение ссылкой).
Для стиля я обычно применяю что-то вроде этого:

nav ul a {
    color: inherit;
    text-decoration: none;
}

Затем я могу применить любой стиль к ‹li›, который захочу.

Примечание. Валидаторы будут жаловаться на этот метод, но если вы похожи на меня и не строите свою жизнь вокруг них, это должно работать нормально.

person Duncan    schedule 05.07.2013
comment
Все дочерние элементы (прямые потомки) элемента ul должны быть элементами li. Это чисто синтаксическое требование. в соответствии с правильной семантикой для ul in ul - этот ответ приведет к недопустимому HTML - person EGC; 04.02.2020
comment
Появился дикий валидатор. :) - person Duncan; 17.07.2020

Просто добавьте текст ссылки в тег «p» или что-то подобное и добавьте поля и отступы к этому элементу, таким образом, это не повлияет на настройки, которые дал вам MiffTheFox, т.е.

<li> <a href="#"> <p>Link Text </p> </a> </li>
person Adam    schedule 20.02.2012
comment
Этот был действительно лучшим для меня. Я использовал <span> и установил блокировку дисплея. Span просто казался более правильным, чем абзац. В любом случае это сработало хорошо. - person Storm Muller; 04.03.2018

Это сделает весь объект <li> ссылкой:

<li onclick="location.href='page.html';"  style="cursor:pointer;">...</li>
person DejanR    schedule 06.11.2011

Кажется, работает следующее:

ul#menu li a {
    color:#696969;
    display:block;
    font-weight:bold;
    line-height:2.8;
    text-decoration:none;
    width:100%;
}
person Sinan Ünür    schedule 13.07.2009

jqyery это еще одна версия с jquery немного короче. предполагая, что элемент <a> находится внутри элемента de <li>

$(li).click(function(){
    $(this).children().click();
});
person Mijail    schedule 16.01.2014
comment
Это вызовет непрерывный цикл. Так как щелчок по дочернему элементу-›нажимает и на родителя. - person Rocky Kev; 26.06.2020

Или вы можете создать пустую ссылку в конце вашего <li>:

<a href="link"></a>

.menu li{position:relative;padding:0;}
.link{
     bottom: 0;
     left: 0;
     position: absolute;
     right: 0;
     top: 0;
}

Это создаст полный интерактивный <li> и сохранит ваше форматирование на вашей реальной ссылке. Это может быть полезно и для тега <div>

person MrFlo    schedule 30.08.2014

Анкорная ссылка href применяется к li:

#menu li a {
       display:block;
    }
person Khandoker Hirok    schedule 02.04.2019

Вы можете попробовать событие «onclick» внутри тега LI и изменить «location.href», как в javascript.

Вы также можете попробовать поместить теги li в теги a, однако это, вероятно, недопустимый HTML.

person Marineio    schedule 13.07.2009
comment
По моему опыту, подделка ссылок через Javascript почти всегда приводит к плохому взаимодействию с пользователем. - person Chuck; 14.07.2009
comment
Это просто один из вариантов, который он может рассмотреть, в конце концов, это его веб-сайт. И он мог оставить там обычную ссылку ‹a›, и она работала бы как обычно, даже если Javascript был выключен (только не при нажатии на li). - person Marineio; 14.07.2009

a {
  display: block;
  position: relative;
}

Думаю, это все, что вам нужно.

person Abaas Skills    schedule 13.08.2020

Как активировать HTML-ссылку, нажав на ‹li› ?

Сделав ссылку такой же большой, как ваш li: просто переместите инструкцию

display: block;

от ли к а, и все готово.

Это:

#menu li
{
    /* no more display:block; on list item */

    list-style: none;
    background: #e8eef4 url(arrow.gif) 2% 50% no-repeat;
    border: 1px solid #b2b2b2;
    padding: 0;
    margin-top: 5px;
}

#menu li a
{
    display:block; /* moved to link */
    font-weight: bold;
    text-decoration: none;
    line-height: 2.8em;
    padding-right:.5em;
    color: #696969;
}

Дополнительное примечание: вы можете удалить «ul» из двух ваших селекторов: #menu является достаточным указанием, за исключением случаев, когда вам нужно придать вес этим двум правилам, чтобы переопределить другие инструкции.

person FelipeAls    schedule 13.07.2009
comment
Это не работает для меня. Когда я меняю отображение ссылки ‹a› на блокировку, она помещается на другую строку, а не на маркер. - person cartbeforehorse; 07.09.2012
comment
Позвольте мне уточнить этот ответ... Поведение, которое я объяснил выше, происходит в Firefox и Opera, но не в Chrome. Он отлично работает в Chrome. - person cartbeforehorse; 07.09.2012
comment
Что, если вы сохраните display: block и для li, и для a? В противном случае, пожалуйста, опубликуйте свою проблему в отдельном вопросе. - person FelipeAls; 07.09.2012

Я нашел простое решение: сделать тег "li" внутри тега "a":

<a href="#"><li>Something1</li></a>
person rafaelsimoes85    schedule 27.12.2018
comment
Это недействительно. Единственный элемент, который может быть дочерним элементом <ul>, — это <li> . <a> должен быть внутри <li> . w3c.github.io/html-reference/ul.html - person Daniel Sixl; 28.12.2018
comment
Не обязательно существует связь между валидностью и функциональностью. - person Daniel Sixl; 29.01.2019

Используйте jQuery, чтобы вам не приходилось писать встроенный javascript для элемента <li>:

$(document).ready(function(){
    $("li > a").each(function(index, value) {
        var link = $(this).attr("href");
        $(this).parent().bind("click", function() {
            location.href = link;
        });
    });
}); 
person Ignacio Pascual    schedule 30.05.2013