Hallo Felix,
kommt immer darauf an, was einfach sein soll 🤣.
Mein SVG-Markup hat jetzt dieses minimalistische Aussehen:
<g id="dark"></g>
<g id="chain">
<g id="flats">
<rect /><rect />
</g>
<g id="bridge">
<rect />
<circle /><circle />
</g>
</g>
Dass der bridge-Bereich eine Gruppe ist, hat 2 Gründe:
- x1, x2 sind keine Presentation-Attribute, ich kann ein <line> Element also nicht per CSS positionieren und in den Attributen auch nicht mit var() arbeiten. Ich KÖNNTE natürlich mit transform arbeiten, aber je nach Skalierung bleiben die Linienenden dann nicht kreisförmig.
- rx, ry sind zwar Presentation-Attribute, aber nicht für Safari.
Deswegen kann ich das Brückenglied, das eigentlich ein einfacher Strich sein könnte, nicht mit CSS-Kontrolle als Strich zeichnen. Und auch nicht als rect mit abgerundeten Ecken. Es ist ein Rechteck, und die „Linienenden“ sind zwei darauf gemalte Kreise.
Die übrigen 80 Zeilen im SVG sind SVG-Rahmen, Maskendefinition und Styles
Die #flats
-Rechtecke:
:root {
--width: 250px;
--height: 180px;
--thickness: 70px;
--corner: 70px;
--gap: 10px;
--xwidth: calc(var(--width) + var(--thickness));
--xheight: calc(var(--height) + var(--thickness));
}
#chain {
color: black;
transform: translate(300px, 300px) rotate(-45deg);
}
#flats rect {
--rotate: 0deg;
x: calc(-0.5 * var(--xwidth));
y: calc(-0.5 * var(--xheight));
width: var(--xwidth);
height: var(--xheight);
stroke: none;
stroke-width: 0px;
fill: currentColor;
transform: rotate(var(--rotate))
translate(calc(var(--thickness) - var(--width)), 0px);
mask: url(#chainlink);
}
#flats rect:nth-of-type(1) {
--rotate: 180deg;
}
Die zugehörige #chainlink
Maske ist:
<style>
#chainlink rect.link {
x: calc(-0.5 * var(--width));
y: calc(-0.5 * var(--height));
width: var(--width);
height: var(--height);
rx: var(--corner);
ry: var(--corner);
stroke: white;
stroke-width: var(--thickness);
fill: none;
}
#chainlink rect.gap {
--gheight: calc(2*var(--gap) + var(--thickness));
x: 0px;
y: calc(-0.5 * var(--gheight));
width: calc(0.55 * var(--xwidth));
height: var(--gheight);
stroke: none;
fill: black;
}
</style>
<mask id="chainlink">
<rect class="link" rx="12%" ry="12%"></rect>
<rect class="gap" ></rect>
</mask>
Die 12% sind eine ganz gute Annäherung an --corner:70px
. Leider geht's im Safari nicht anders, sagt MDN, und ich weiß noch nicht, ob es überhaupt funktioniert.
Die Brücke sieht so aus:
#bridge rect {
x: calc(-0.5*var(--width));
y: calc(-0.5*var(--thickness));
width: var(--width);
height: var(--thickness);
stroke-width: 0;
fill: currentColor;
}
#bridge circle {
cx: calc(0.5 * var(--width));
cy: 0;
r: calc(0.5 * var(--thickness));
fill: currentColor;
}
#bridge circle:nth-of-type(2) {
cx: calc(-0.5 * var(--width));
}
Und schließlich noch die Dark-Mode Umschaltung:
#dark:target ~ #chain {
color: gold;
}
D.h. wenn ich das SVG mit link_chain.svg#dark
abrufe, wird die Kette golden dargestellt. Sonst schwarz. Auch ein Safari-Zugeständnis, @media (prefers-color-scheme:dark) funktioniert da nicht.
Sieht wüst aus, aber dafür kann ich nun ganz einfach die Größe und Dicke der Kettenglieder einstellen. Sie werden automatisch richtig platziert und die visuelle Lücke in den flachen Gliedern passt sich automatisch an.
Die Darstellung erfolgt so, dass die #flats-Rechtecke zunächst mit Mittelpunkt (0,0) gezeichnet und dann gerade soweit zur Seite verschoben werden, dass die flachen Glieder und das Brückenglied einander exakt mit den Innenkanten berühren, passend zu Seitenlänge (--width) und Materialdicke (--thickness) der Glieder. Das Brückenglied wird symmetrisch zu (0,0) gezeichnet.
Danach wird das Ganze um 45° gegen die Uhr gedreht und nach (300,300) geschoben, damit es mittig in der 600×600 Viewbox sitzt. Das kann man vielleicht auch ohne die Transforms machen, aber dann bekäme ICH Kopfschmerzen über die nötigen Rechenschritte.
Wenn das SVG online ist, gebe ich noch mal Bescheid.
Rolf
--
sumpsi - posui - obstruxi