Komplizierter Clip-Pfad / SVG-Hintergrund eines Elements

8

Ich muss etwas wie das Bild unten erstellen:

Wo:

  • Der schwarze Hintergrund repräsentiert ein Element auf der Seite, header zum Beispiel
  • Der cyanfarbene Hintergrund repräsentiert den gesamten Hintergrund unter dem schwarzen Hintergrund
  • das schwarze Hintergrundelement muss wie ein einzelnes Element behandelt werden, da es oben eine Musterüberlagerung hat, die innerhalb der Grenzen des schwarzen Elements bleiben muss und nicht außerhalb davon erscheint

Es wäre sehr einfach, einfach das schwarze Element mit :pseudo-elements zu erstellen, aber dieses Muster darüber hat das Ganze zum Stillstand gebracht.

Ich habe über clip-path prop gelesen. aber ich bin mir nicht sicher, ob ich in der Lage wäre, einen komplexen Clip wie diesen zu erstellen (oder vielleicht scheint es mir komplex zu sein).

Das Ganze wird in einer iOS-App verwendet, und bisher scheint diese Clip-Pfad-Eigenschaft damit kompatibel zu sein. Eine andere Sache zu erwähnen, das schwarze Element wird eine feste Höhe haben, aber muss 100% Breite des übergeordneten Elements sein. Ich habe mir gedacht, dass ich stattdessen mit svg durchkommen würde, aber da es eine feste Höhe sein muss, scheint es, als würde es verzerren, wenn es gestreckt ist.

UPDATE: Die rechte Seite muss die gleiche Breite haben. Ich habe mir gedacht, dass ich vielleicht zwei SVGs in einem <g> -Tag verwenden und sie absolut positionieren könnte, eine wäre flüssig und die andere hätte eine feste Breite. Ich bin mir jedoch nicht sicher, ob eine filter beide abdeckt, oder ob die filter überhaupt auf ein <g> -Tag in einer svg

angewendet werden kann

SVG Beispiel unten:

%Vor% %Vor%

Irgendwelche Tipps oder Hinweise werden sehr geschätzt!

    
RGLSV 26.12.2015, 00:48
quelle

2 Antworten

6

Vielleicht wäre es eine bessere Lösung mit Maskierung gehen?

%Vor% %Vor%

Ein Ansatz mit fester Breite

Ersetzen Sie die Abmessungen der Breite der Rahmen durch einen festen Wert in Pixel. Verwenden Sie calc für das innere Rechteck.

%Vor% %Vor%

Ein elliptisches Beispiel

%Vor% %Vor%
    
vals 26.12.2015, 09:15
quelle
6

Dies kann erreicht werden, indem Sie den von Ana in diesem CSS beschriebenen Ansatz verwenden Tricks Artikel .

Verwenden von CSS-Clippfad:

Alles was wir tun müssen, ist ein polygon für das Clipping wie im folgenden Snippet zu verwenden und es auf den Container anzuwenden. Ein solcher Pfad würde das Hintergrundbild in der Lücke zwischen der äußersten Box und der mittleren Box anzeigen, das Hintergrundbild zwischen der mittleren Box und der innersten Box ausblenden oder abschneiden.

%Vor% %Vor%

Verwenden von SVG Clip-path:

SVG clip-path bietet eine bessere Browser-Unterstützung als die CSS-Version, da es auch von Firefox unterstützt wird. Alles, was wir tun müssen, ist ein path wie im folgenden Snippet zu erstellen und es zum Abschneiden des Containers zu verwenden.

%Vor% %Vor%

Die SVG-Implementierung wäre viel einfacher gewesen, wenn die Abmessungen Ihres Containers statisch wären. Da sie nicht statisch sind, können Bruchzahlen nicht verwendet werden, da der Wert basierend auf der tatsächlichen Breite des Elements abweichen würde (was auch immer 100% entspricht). Angenommen, ein Bruchwert von 0,2 würde 40 Pixel für ein 200 Pixel breites Element bedeuten und würde 80 Pixel für ein 400 Pixel breites Element bedeuten. Sie können sehen, wie sich dies auf die Ausgabe im ersten Beispiel des Snippets auswirkt.

Eine Möglichkeit, dies zu umgehen, wäre die Verwendung von JavaScript (oder einer anderen Skriptbibliothek, die Sie bevorzugen), die tatsächliche berechnete Breite des Elements in Pixeln und die Berechnung der Koordinaten des d -Attributs des Pfads darauf. Das zweite Beispiel im folgenden Snippet verwendet diese Methode.

Hinweis: Clip-Pfad wird nicht von IE unterstützt, aber da Sie eine iOS-App erstellen, sollte dies meiner Meinung nach kein großes Problem darstellen.

%Vor% %Vor% %Vor%
    
Harry 26.12.2015 09:17
quelle

Tags und Links