Neulich habe ich ein Bild gepostet, ganz wörtlich als Gedankenexperiment, darüber, wie man „verschachtelte“ Links erreichen könnte. Das heißt, ein großer Container, der mit einer URL verknüpft ist und darin einen kleineren Container oder Textlink enthält, der zu einer anderen URL führt. Das ist schwieriger, als es auf den ersten Blick scheint. Der Hauptgrund ist, dass…
<!-- this is invalid and won't render as expected -->
<a href="#one">
Outside
<a href="#two">
Inside
</a>
</a>
Eric Meyer forderte einst mehr flexible Verknüpfungen, aber selbst das behandelt nicht ganz eine Situation, in der ein Link in einen anderen verschachtelt ist.
Hier ist übrigens, was mit diesem HTML passiert

Meine erste Idee wäre, die Links einfach nicht im Markup zu *verschachteln*, sondern sie optisch *verschachtelt erscheinen* zu lassen. Einige Leute antworteten auf den Tweet, darunter Nathan Smith, der denselben Gedanken teilte: einen relativ positionierten Elternelement zu haben und beide Links absolut zu positionieren. Der größere könnte den gesamten Bereich ausfüllen und der kleinere könnte darauf sitzen.
Siehe den Pen „Nested“ Links von Nathan Smith (@nathansmith) auf CodePen.
Es ist knifflig, da Sie bis zu einem gewissen Grad magische Zahlen benötigen, um Abstände und variable Inhalte zu handhaben.
Meine zweite Idee wäre, es mit JavaScript zu lösen.
<div
onclick="window.location='https://codepen.io'"
style="cursor: pointer;"
tabindex="1"
>
Outside
<a href="https://css-tricks.de">
Inside
</a>
</div>
Ich habe buchstäblich keine Ahnung, wie koscher das aus Sicht der Barrierefreiheit ist. Es sieht für mich hässlich aus, daher gehe ich einfach davon aus, dass es schlechte Nachrichten sind.
Apropos Barrierefreiheit: Heydon Pickering hat einen ganzen Artikel über Kartenkomponenten, ein beliebtes Designmuster, bei dem diese Situation häufig auftritt. Seine Lösung besteht darin, ein relativ positioniertes Elternelement zu haben, dann einen normal platzierten und funktionalen Hauptlink. Dieser erste Link hat ein absolut positioniertes Pseudoelement, das die gesamte Karte abdeckt. Alle Unterlinks sind relativ positioniert und kommen nach dem ersten Link, sodass sie durch z-index auf dem ersten Link sitzen würden.

Und apropos Stapel von Pseudoelementen, das ist der Ansatz, den Sean Curtis hier verfolgt
Siehe den Pen Pretend nested links von Sean Curtis (@seancurtis) auf CodePen.
Andere Lösungen im „raffinierten“ Bereich könnten sein
- Die Verwendung eines
<form>-Elements, bei dem dasaction-Attribut als Link fungiert. - Die Verwendung eines
<object>-Elements, um den inneren Link zu umschließen.
Sara Soueidan antwortete mit ihrem eigenen Beitrag!
Ich hatte vor ein paar Jahren dieselbe Anforderung, als ich die Frontend-Grundlagen für Smashing Magazine erstellte. Also dachte ich, ich schreibe meine Antwort auf Chris' Thread in Form eines Blogbeitrags auf.
Sara hat darüber mit viel mehr Details und Sorgfalt geschrieben, als ich es hier getan habe, also schaut es euch unbedingt an. Es sieht so aus, als hätten sie und Heydon sich auf fast dieselbe Lösung geeinigt, wobei das Pseudoelement die Abdeckung enthält, die Unterlinks nach Bedarf darüber hinausragen lässt.
Hast du es schon mal anders gemacht? Viel UX und Barrierefreiheit zum Nachdenken!
Nun, das ist eine bizarre Sache, die man tun möchte! Erstens, philosophisch gesehen, ist es ein UI-Problem – schlechtes Design visuell (und semantisch!). Wenn es jemals einen „echten“ Bedarf dafür gibt, überarbeiten Sie die Komponente! (Ich bin auf dasselbe Dilemma gestoßen, weshalb ich überhaupt kommentiere). ABER, aus akademischen Gründen… ich denke, Sie überkomplizieren das Problem stark. Der unumstößliche Weg, etwas wie dieses zu tun, ist mit dem alten Bild-Map (für diejenigen, die zu jung sind, um zu wissen, was das ist: https://www.w3schools.com/Tags/tag_map.asp). Ich habe es nicht getestet, das ist theoretisch, daher weiß ich nicht, was priorisiert wird, wenn Sie ein Bild in einen href einbetten und eine Bild-Map hinzufügen, aber… Plan B wäre, das Bild selbst in relativer positiver Position zu verankern, dann absolut positionierte Clip-Path 'Hotspots' (höherer z-index) für Ihr verschachteltes Bild/Links. Alte Schule.
Aber warum, warum, warum? :-)
„Ihre Wissenschaftler waren so damit beschäftigt, ob sie es konnten oder nicht, dass sie nicht innehielten, um nachzudenken, ob sie es tun sollten.“ - Dr. Ian Malcolm.
Ich weiß, dass dies ein Gedankenexperiment war, aber aus Sicht der Benutzererfahrung ist es wahrscheinlich am besten, dass es keine einfache Möglichkeit gibt, dies zu tun. Das Potenzial für verwirrendes Verhalten ist einfach viel zu hoch.
Wir sind dieser Anforderung kürzlich (wieder) bei The Telegraph begegnet, wir hatten quasi ein grünes Feld im Frontend für diese Arbeitslast.
Wir haben uns für die z-index-Lösung für das Schichtungsproblem entschieden, aber wir haben JavaScript verwendet, um einen beliebigen Link zu nehmen und einen seiner Vorfahren zum klickbaren Block zu machen.
Daher funktionieren ohne JS alle Links mit ihrem Standardverhalten, während das Verhalten und das Muster in verschiedenen Kontexten leicht wiederverwendbar sind und hoffentlich ein grundlegendes Maß an Barrierefreiheit durch Design erzwingen. Es bedeutet auch, dass wir (obwohl hoffentlich nicht) verschachtelte klickbare Blöcke haben können!
Ich werde versuchen, später einen kurzen Bericht zu schreiben, und dann hierher zurückkommen und den Code in der Produktion verlinken … und daher wahrscheinlich von einer großen Menge ausgezeichneter Tests und Feedbacks profitieren :)
Interessante Ansätze. Mir gefiel der Ansatz, den Material Design für sekundäre Aktionen auf Karten vorsieht, den sie unter https://material.io/design/components/cards.html#actions zeigen.
Die kurze Version ist, dass die oberen 2/3 der Karte ein primärer Aktionsbereich für das Hauptthema der Karte sind und dass das untere 1/3 oder 1/4 der Karte für sich genommen nicht klickbar ist, sondern zusätzliche Handlungsaufforderungen enthält.
Vergessen zu erwähnen, dass die Demo der Webversion der Kartenkomponente unter https://material-components.github.io/material-components-web-catalog/#/component/card sehr gut zeigt, wie dies durch Tabbing, Touch und Maus funktioniert.
David, mir gefällt die Material.io-Implementierung.
Aber… wie so oft, da hat man einen Designer (oder jemand anderen „höheren“ im „Zahnrad“) der darauf besteht, dass die ganze Karte klickbar sein soll! Grrrr.
Können CSS Grids dafür verwendet werden? Beide Linkelemente als direkte Kinder des Grids haben, wobei eines von Rand zu Rand positioniert ist und das andere nur eine einzige Zelle des Grids einnimmt?
Klar! Das funktioniert!
Mein Ansatz dafür war schon immer, sanft zu versuchen, den Kunden davon zu überzeugen, dass das, was er tun möchte, eine schlechte Idee ist. Ich habe es zweimal implementiert, einmal, weil wir als zusätzliche Entwicklungshände engagiert wurden und sie bereits ein etabliertes Muster hatten, und einmal, weil die Argumentation ins Leere lief. Beide Male wurden Pseudoelemente verwendet, die absolut innerhalb einer relativen "Karten"-Elternelement positioniert waren.
Verwenden Sie verschachtelte Elemente, um die Struktur darzustellen, und innerhalb der Elemente können Sie die Links platzieren. Jedes HTML-Element, das verschachtelt werden kann, kann Links als inneren HTML-Code enthalten und CSS verwenden, um ihm visuelle Attraktivität zu verleihen.
Wir hatten dieses Problem auch auf unserer Suchergebnisseite.
Kartenähnliche Anzeige, Bild, Titel, Zusammenfassung und ein paar Schaltflächen.
Sie sollten die gesamte Karte für Details oder die Schaltflächen für direkte Aktionen anklicken können.
Unter Berücksichtigung der Barrierefreiheit wollten wir keine doppelten Links und der Kartentitel musste eine klickbare Überschrift sein.
Der Leser sollte also hören: Kartentitel, Schaltfläche 1, Schaltfläche 2. Während ein Maussutzer immer noch die gesamte Karte oder einzelne Links anklicken kann.
Dafür haben wir der Karte einen zusätzlichen Details-Link hinzugefügt und ihm einen tabindex=-1 gegeben, um zu verhindern, dass er ein TAB-Stopp wird.
Dann wurde er so positioniert, dass er die gesamte Karte abdeckte und mit einem z-index unter den Schaltflächen platziert wurde.
Es ist immer gut, Ihre Seite ohne Maus zu testen. Ergibt es noch Sinn, wenn Sie mit (Shift-)TAB durch sie hindurchgehen?
Oder installieren Sie einen Screenreader (NVDA ist zum Beispiel kostenlos) und erleben Sie aus erster Hand, wie verwirrend das sein könnte ;)
Ich bin mit dem Ansatz, den ich für https://fastmail.blog/ gefunden habe, ziemlich zufrieden, bei dem die „Karte“ jedes Blogbeitrags
position: relativeist und drei oder so verschiedene Links darin enthalten sind, aber die gesamte „Karte“ als Link innerhalb der h2 fungiert. Dies geschieht mit einem::beforean diesem Link mit ungefährposition: absolute; top: 0; left: 0; right: 0; bottom: 0;, und indem die *anderen* Links einen z-index erhalten, damit sie darauf sitzen können. Das Endergebnis ist erfolgreich für die Barrierefreiheit und den normalen Gebrauch, ohne JavaScript zu benötigen. Der einzige Vorbehalt ist, dass man den anderen Text nicht ohne Weiteres auswählen kann – aber das ist bei Links sowieso fast immer der Fall und daher kein großes Problem.Sie können verschachtelte Links erstellen, indem Sie sie mit jQuery im DOM verschieben.
Löst die Verwendung von CSS, um die Anzeige des äußeren
<a>-Elements auf block oder inline-block zu setzen, nicht das Problem? Ich erinnere mich, dass ich das in der Vergangenheit getan habe und es funktionierte.Ich kann mir keinen Browser vorstellen, in dem das jemals funktioniert hätte. Es liegt nicht daran, dass Sie diese Eigenschaft nicht setzen können, sondern daran, dass das DOM den inneren Link herausschmeißt. Probieren Sie es aus.