Dürfen Sie einen Link innerhalb eines Links verschachteln?

71

Dies mag ziemlich einfach erscheinen. Dürfen Sie einen Link in einen Link einfügen? Siehe beigefügtes Bild unten:

Geben Sie hier die Bildbeschreibung ein

Ich versuche, die gesamte graue Leiste anklickbar zu machen, um irgendwohin zu gelangen, aber wenn der Benutzer auf das Rad oder den Bewegungspfeil klickt, handelt es sich um andere Links. Siehe meinen aktuellen Code:

<a href="#" class="sp_mngt_bar">
    <h1><?php echo $v; ?></h1>
    <a href="#" class="t_icons t_icons_settings sp_mngt_settings"></a>
    <a href="#" class="t_icons t_icons_move sp_mngt_move"></a>
</a>

Ist das eine gute Praxis? Mache ich es falsch Wie würdest du das machen? Danke für die Hilfe!

denislexisch
quelle
Stattdessen ist eine Blockebene <h1>sicherlich innerhalb einer verlegt <a>.
Täuschung
3
@deceze: Nicht mehr in HTML5.
BoltClock
1
Was ist der Sinn, warum nicht einfach h1 in den Link einwickeln, anstatt ein Loch in den Link zu wickeln, nur um 2 andere Gegenstände auf andere Links zu setzen
SpYk3HH
Eine Warum-Version: stackoverflow.com/questions/18666915/…
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功
Eine beste Workaround-Version: stackoverflow.com/questions/12874342/…
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

Antworten:

75

Direkt aus dem W3C für HTML4:

12.2.2 Verschachtelte Links sind illegal

Vom A-Element definierte Links und Anker dürfen nicht verschachtelt sein. Ein A-Element darf keine anderen A-Elemente enthalten.

Da die DTD das LINK-Element als leer definiert, sind LINK-Elemente möglicherweise auch nicht verschachtelt.

HTML 5

Und für HTML5 ist das etwas anders .

Sie können keinen interaktiven Inhalt in einem A-Element haben. Interaktiver Inhalt enthält Ankertags.

Josh
quelle
1
Danke für die Links, sehr informativ und direkt! FWIW, obwohl es ungültig ist, können Sie mit jedem von mir getesteten Browser (Firefox 26, Chrome 34, IE8 +) Link-Tags ohne Auswirkungen verschachteln - es wurden keine impliziten schließenden Tags eingefügt. Es ist allerdings ein strittiger Punkt - ich denke, dass die UX, verschachtelte Links zu unterschiedlichen URLs zu haben, so schwer zu verstehen ist, dass dies niemals getan werden sollte.
Jon z
1
Nur zur Verdeutlichung: HTML5-Ankertags können keine Ankertags enthalten, auch keine Ankertags, die kein interaktiver Inhalt sind (dh Ankertags ohne das href-Attribut).
fzzfzzfzz
2
@ Jonz Schnellvorlauf einige Jahre - Chrome Version 59.0.3071.115 auf einem Mac passt den HTML-Code an, wenn ein Anker in einen anderen Anker eingebettet ist ...
ngoue
54

Um die Frage einfach zu beantworten: Nein.

Davon abgesehen ist hier eine reine HTML / CSS-Problemumgehung:

https://codepen.io/pwkip/pen/oGMZjb

.block {
  position:relative;
}

.block .overlay {
  position:absolute;
  left:0; top:0; bottom:0; right:0;
}

.block .inner {
  position:relative;
  pointer-events: none;
  z-index: 1;
}

.block .inner a {
  pointer-events: all;
}
<div class="block">
  <a class="overlay" href="#overlay-link"></a>
  <div class="inner">
    This entire box is a hyperlink. (Kind of)<br><br><br><br>
    <a href="#inner-link">I'm a W3C compliant hyperlink inside that box</a>
  </div>
</div>

Jules Colle
quelle
1
Das ist toll. Danke, dass du auch den Codepen gepostet hast. Mir gefällt besonders, wie dies HTML gültig ist.
Millar248
4
Geniale Lösung - wenn ich mehr als eine Gegenstimme abgeben könnte, würde ich!
Steve Eynon
Hinweis für zukünftige Benutzer: Das .innermuss immer das Element direkt über dem inneren Link sein - egal wie weit es relativ zu verschachtelt ist.block
Raven
Ich brauchte die Z-Index-Eigenschaft nicht
ruediste
20

Wickeln Sie Ihren verschachtelten Link in ein Objekt-Tag:

<a href="#" class="sp_mngt_bar">
    <h1><?php echo $v; ?></h1>
    <object><a href="#" class="t_icons t_icons_settings sp_mngt_settings"></a></object>
    <object><a href="#" class="t_icons t_icons_move sp_mngt_move"></a></object>
</a>
BENARD Patrick
quelle
6
Ich würde vorschlagen, Ihre Leistung zu überprüfen, nachdem Sie diesen Hack angewendet haben. Wir haben es der App hinzugefügt und später festgestellt, dass unsere Seitengeschwindigkeit gesunken ist. Es stellt sich heraus, dass das Umschließen der Links in unserem Fall der Grund war.
Sasha Kastsiushkin
@ Sasha Kannst du näher darauf eingehen? Warum? Und wie haben Sie das behoben?
Enrico
4

Ich würde es so umgestalten, dass es eher diesem Format ähnelt:

<div class="sp_mngt_bar">
    <h1><a href="#"<?php echo $v; ?></a></h1>
    <a href="#" class="t_icons t_icons_settings sp_mngt_settings"></a>
    <a href="#" class="t_icons t_icons_move sp_mngt_move"></a>
</a>
Mikevoermans
quelle
Die aElemente sollten Inhalt enthalten. Obwohl formal korrekt, ist ein leeres aElement für die Zugänglichkeit schlecht. (Ich nehme an, die Idee ist, dass sie CSS-Einstellungen einschließlich eines Hintergrundbilds haben, aber das ist schlecht für die Zugänglichkeit.)
Jukka K. Korpela
Warum ist ein leeres Element für die Barrierefreiheit schlecht? Ich benutze dies oft, um die HTML-Anfragen und für Sprites zu reduzieren.
denislexic
4

Obwohl ich der ausgewählten Antwort voll und ganz zustimme und ja, sollten Sie keinen interaktiven Inhalt in einem A-Element haben. Manchmal benötigen Sie möglicherweise eine Problemumgehung.

Hier ist ein Beispiel , wo Sie benötigen ein interaktives Element in einem A - Tag zu setzen. Dieser kleine Schließknopf oben rechts.

Interaktives Element in einem A-Tag

Hier ist der HTML-Code dafür. (Es ist nicht der eigentliche Build, ich habe es etwas einfacher gemacht)

<a href="#">
    <span class="hide">X</span> <!-- THIS IS THE SMALL 'X' WHICH HIDES THE WHOLE BOX -->
    <img src="images/camera.svg" width="50" alt="Camera" />
    <em>
        Upload a profile picture
        <small>
            Here's the deal. Make your profile look awesome and even get 25 karma for it. We're not kidding.
        </small>
    </em>
    <strong>
        + 25 K
    </strong>
</a>

Im Grunde wollen wir dieses Feld ausblenden, wenn der Benutzer auf das 'X' klickt. Ansonsten sollte es einfach wie ein einfaches A-Tag funktionieren. Hier ist die jQuery, die den Trick gemacht hat.

$('.hide').click(function(e) {
        e.preventDefault();
        e.stopPropagation(); // THIS IS THE KEY PART

        // DO WHATEVER YOU WANT, I FADED OUT THE BOX FOR EXAMPLE
        $(this).parent().fadeOut(300);

    });

Ich hoffe das hilft jemandem mit dem gleichen Problem. ;)

omgitsdrobinoha
quelle
1

Verschachtelte Links sind illegal. Um dasselbe Verhalten wie bei verschachtelten Links zu erzielen, können Sie Folgendes tun:

Verwenden Sie das HTML-Format @mikevoermans wie unten gezeigt und binden Sie das Klickereignis

<div class="sp_mngt_bar">
    <h1><a href="#"<?php echo $v; ?></a></h1>
    <a href="#" class="t_icons t_icons_settings sp_mngt_settings"></a>
    <a href="#" class="t_icons t_icons_move sp_mngt_move"></a> 
</div>

Ihr Klickereignis sollte folgendermaßen aussehen:

$(".sp_mngt_bar").bind("click", function(e) {   
    var target = $(e.target);
    if(target.has('.t_icons_settings') { //Do something for settings } 
    else if(target.has('.t_icons_move') { //Do something for move }
    else { //Do something for sp_mngt_bar
});
Epuri
quelle
1

Obwohl dies technisch gesehen keine Antwort auf die Frage ist, besteht eine andere Problemumgehung darin, das Klickereignis an ein spanoder zu binden div:

<a href="outer-link">
  Outer Link
  <span class='inner-link'>Inner Link</span>
</a>

$('.inner-link').click(function (e) {
    // Prevent the click-through to the underlying anchor
    e.stopPropagation();

    // Go to a link
    window.location.href = 'page.html';
    // Or call a javascript method
    doSomething();

    return false;
});
Wild
quelle
1
Beachten Sie, dass Benutzer beispielsweise den Link nicht in einer neuen Registerkarte öffnen können.
cdauth
0

Eine Lösung besteht darin, eine Verknüpfung innerhalb des übergeordneten Verknüpfungscontainers absolut zu positionieren

<div style="position: relative">
  <a href="#">
    <h1><a href="#"<?php echo $v; ?></a></h1>
    <div id="placeholder" style="height: 24px">
  </a>
  <div style="position: absolute; bottom: 0">
    <a href="#"></a>
  </div>
</div>
moto
quelle