Form mit einer schrägen Seite (ansprechend)

90

Ich versuche, eine Form wie im Bild unten mit einer schrägen Kante auf nur einer Seite (z. B. der Unterseite) zu erstellen , während die anderen Kanten gerade bleiben.

CSS div mit einer schrägen Seite

Ich habe versucht, die Rahmenmethode zu verwenden (Code ist unten angegeben), aber die Abmessungen meiner Form sind dynamisch und daher kann ich diese Methode nicht verwenden.

.shape {
    position: relative;
    height: 100px;
    width: 200px;
    background: tomato;
}
.shape:after {
    position: absolute;
    content: '';
    height: 0px;
    width: 0px;
    left: 0px;
    bottom: -100px;
    border-width: 50px 100px;
    border-style: solid;
    border-color: tomato tomato transparent transparent;
}
<div class="shape">
    Some content
</div>


Ich habe auch versucht, Farbverläufe für den Hintergrund zu verwenden (wie im folgenden Code), aber es wird durcheinander gebracht, wenn sich die Abmessungen ändern. Sie können sehen, was ich meine, indem Sie im folgenden Ausschnitt über der Form schweben.

Wie kann ich diese Form mit einer schrägen Seite erstellen und auch dynamische Größen unterstützen ?

Harry
quelle

Antworten:

125

Es gibt viele Möglichkeiten, die Form mit einer schrägen Kante nur auf einer Seite zu erstellen.

Die folgenden Methoden können keine dynamischen Größen unterstützen, wie bereits in der Frage erwähnt:

  • Randdreieckmethode mit Pixelwerten für border-width.
  • Lineare Verläufe mit der Winkelsyntax (wie 45 Grad, 30 Grad usw.).

Die Methoden, die dynamische Größen unterstützen können, werden unten beschrieben.


Methode 1 - SVG

( Browserkompatibilität )

SVG kann verwendet werden, um die Form entweder mit polygons oder paths zu erzeugen . Das folgende Snippet verwendet polygon. Jeder erforderliche Textinhalt kann über der Form positioniert werden.

Vorteile

  • SVG wurde entwickelt, um skalierbare Grafiken zu erstellen und kann mit allen Dimensionsänderungen gut funktionieren.
  • Rahmen und Schwebeeffekt können mit minimalem Codierungsaufwand erzielt werden.
  • Der Form kann auch ein Bild- oder Verlaufshintergrund bereitgestellt werden.

Nachteile

  • Die Browserunterstützung ist wahrscheinlich der einzige Nachteil, da IE8 SVG nicht unterstützt. Dies kann jedoch durch die Verwendung von Bibliotheken wie Raphael und auch VML verringert werden. Darüber hinaus ist die Browserunterstützung keineswegs schlechter als die anderen Optionen.

Methode 2 - Gradientenhintergrund

( Browserkompatibilität )

Lineare Farbverläufe können weiterhin verwendet werden, um die Form zu erzeugen, jedoch nicht mit Winkeln, wie in der Frage erwähnt. Wir müssen die to [side] [side]Syntax (dank vals ) verwenden, anstatt Winkel anzugeben. Wenn Seiten angegeben werden, werden die Verlaufswinkel automatisch basierend auf den Abmessungen des Containers angepasst.

Vorteile

  • Die Form kann auch dann erreicht und beibehalten werden, wenn die Abmessungen des Behälters dynamisch sind.
  • Der Hover-Effekt kann durch Ändern der Verlaufsfarbe hinzugefügt werden.

Nachteile

  • Der Hover-Effekt wird auch dann ausgelöst, wenn sich der Cursor außerhalb der Form, aber innerhalb des Containers befindet.
  • Das Hinzufügen von Rahmen würde schwierige Manipulationen des Verlaufs erfordern.
  • Farbverläufe sind dafür bekannt, gezackte Ecken zu erzeugen, wenn die Breite (oder Höhe) sehr groß ist.
  • Bildhintergründe können nicht für die Form verwendet werden.

Methode 3 - Skew-Transformationen

( Browserkompatibilität )

Bei dieser Methode wird ein Pseudoelement hinzugefügt, verzerrt und so positioniert, dass es so aussieht, als ob eine der Kanten geneigt / abgewinkelt ist. Wenn die obere oder untere Kante geneigt ist, sollte der Versatz entlang der Y-Achse liegen, andernfalls der Die Drehung sollte entlang der X-Achse erfolgen. Die Seite transform-originsollte der schrägen Seite gegenüberliegen.

Vorteile

  • Form kann auch mit Rändern erreicht werden.
  • Der Hover-Effekt wird auf die Form beschränkt.

Nachteile

  • Die Abmessungen müssen proportional erhöht werden, damit die Form beibehalten wird. Wenn ein Element schief ist, nimmt sein Versatz in der Y-Achse mit zunehmender widthGröße zu und umgekehrt (versuchen Sie width, 200pxdas To im Snippet zu erhöhen ). Weitere Informationen hierzu finden Sie hier .

Methode 4 - Perspektiventransformationen

( Browserkompatibilität )

Bei dieser Methode wird der Hauptcontainer mit etwas Perspektive entlang der X- oder Y-Achse gedreht. Wenn Sie den entsprechenden Wert auf transform-origineinstellen, wird nur auf einer Seite eine schräge Kante erzeugt.

Wenn die Ober- oder Unterseite geneigt ist, sollte die Drehung entlang der Y-Achse erfolgen, andernfalls sollte die Drehung entlang der X-Achse erfolgen. Die Seite transform-originsollte der schrägen Seite gegenüberliegen.

Vorteile

  • Form kann mit Rändern erreicht werden.
  • Die Abmessungen müssen nicht proportional erhöht werden, damit die Form erhalten bleibt.

Nachteile

  • Der Inhalt wird ebenfalls gedreht, und daher müssen sie gegengedreht werden, um normal auszusehen.
  • Das Positionieren von Text ist mühsam, wenn die Abmessungen nicht statisch sind.

Methode 5 - CSS-Clip-Pfad

( Browserkompatibilität )

Bei dieser Methode wird der Hauptcontainer mithilfe eines Polygons in die gewünschte Form geschnitten. Die Punkte des Polygons sollten abhängig von der Seite geändert werden, auf der die schräge Kante benötigt wird.

Vorteile

  • Die Form kann auch dann beibehalten werden, wenn die Größe des Containers dynamisch geändert wird.
  • Der Hover-Effekt wird innerhalb der Grenzen der Form perfekt eingeschränkt.
  • Das Bild kann auch als Hintergrund für die Form verwendet werden.

Nachteile

  • Die Browserunterstützung ist derzeit sehr schlecht.
  • Rahmen können hinzugefügt werden, indem ein absolut positioniertes Element über der Form platziert und ihr der erforderliche Clip zugewiesen wird. Über einen Punkt hinaus passt es jedoch nicht gut, wenn die Größe dynamisch geändert wird.

Methode 6 - Leinwand

( Browserkompatibilität )

Leinwand kann auch verwendet werden, um die Form durch Zeichnen von Pfaden zu erzeugen. Das folgende Snippet enthält eine Demo. Jeder erforderliche Textinhalt kann über der Form positioniert werden.

Vorteile

  • Die Form kann auch dann erreicht und beibehalten werden, wenn die Abmessungen des Behälters dynamisch sind. Rahmen können ebenfalls hinzugefügt werden.
  • Der Hover-Effekt kann mithilfe der pointInpathMethode auf die Grenzen der Form beschränkt werden.
  • Der Form kann auch ein Bild- oder Verlaufshintergrund bereitgestellt werden.
  • Bessere Wahl, wenn Echtzeit-Animationseffekte benötigt werden, da keine DOM-Manipulation erforderlich ist.

Nachteile

  • Canvas basiert auf Raster und daher werden die abgewinkelten Kanten pixelig oder unscharf, wenn sie über einen Punkt * hinaus skaliert werden .

* - Um eine Pixelierung zu vermeiden, müssen Sie die Form bei jeder Größenänderung des Ansichtsfensters neu streichen. Hier gibt es ein Beispiel dafür , aber das ist ein Overhead.

Harry
quelle
35

Ich habe versucht, die Rahmenmethode zu verwenden, aber die Abmessungen meiner Form sind dynamisch und daher kann ich diese Methode nicht verwenden.


Methode 7 - Ansichtsfenstereinheiten (Border Redux )

( Browserkompatibilität )

Ansichtsfenster-Einheiten sind eine großartige Innovation in CSS3. Während Sie normalerweise Prozentwerte verwenden können, um Ihre Eigenschaften zu dynamisieren, können Sie dies nicht für border-widths ( noch für font-sizes ) tun .

Mit Ansichtsfenstereinheiten können Sie stattdessen Ihre Rahmenbreiten sowie die Größe Ihrer Objekte im Vergleich zur Ansichtsfensterdimension dynamisch festlegen .

Hinweis: Prozentwerte beziehen sich auf das übergeordnete Objekt und nicht auf das Ansichtsfenster (sichtbarer Bereich des Fensters).

Starten Sie zum Testen der Methode das folgende Snippet Full Page und ändern Sie die Größe horizontal und vertikal.

.shape {
    position: relative;
    height: 20vh;
    width: 40vw;
    background: tomato;
}
.shape:after {
    position: absolute;
    content: '';
    left: 0px;
    right: 0px;
    top: 20vh;
    border-width: 10vh 20vw;
    border-style: solid;
    border-color: tomato tomato rgba(0,0,0,0) rgba(0,0,0,0);
}
<div class="shape">Some content</div>

Vorteile - (1) Alles ist dynamisch, die Browserabdeckung ist breit.

Nachteile - (1) sollten Sie achten auf , wie Sie Ihr Betriebssystem die Scrollbar Griffe mit overflow: auto;.

Andrea Ligios
quelle
3
Es scheint in der neuesten Version von Chrom gezackt.
Mr_Green
Wahr! Ich denke, Browser-Engines brauchen noch einige Zeit, um dies reibungslos zu rendern. Firefox hat auch dieses Problem, wenn diese Technik mit Pixeln anstelle von Ansichtsfenstereinheiten verwendet wird. Sie kann jedoch behoben werden, indem rgba (,,, 0) anstelle von transparent verwendet wird. Zum Glück haben wir gerade andere Möglichkeiten;)
Andrea Ligios
1

Meine Lösung ist inspiriert von der Methode 7 - Ansichtsfenster-Einheiten von Andrea Ligios oben auf dieser Seite.

Ich habe die "horizontale" Einheit auch für die Höhe verwendet ( height:10vw), um die angegebenen Proportionen im Trapez beizubehalten, wenn die Breite des Navigationsfensters geändert wird. Wir könnten diese Methode 7b - Ansichtsfensterbreite nennen .

Darüber hinaus ermöglicht die Verwendung von zwei verschachtelten divs anstelle von einem und dem :afterSelektor meiner Meinung nach eine bessere Abstimmung der Textinhaltsstile (z text-align. B. usw.).

.dtrapz {
  position: relative;
  margin: 10px 40vw;
  width: 0;
  height: 10vw;
  border: none;
  border-right: 20vw solid #f22;
  border-bottom: 5vw solid transparent;
}

.dtcont {
  position: absolute;
  width: 20vw;
  height: 10vw;
  text-align: center;
  color: #fff;/* just aesthetic */
}
<div class="dtrapz">
  <div class="dtcont">Some content</div>
</div>

MattAllegro
quelle
@ Downvoter Hallo! Lassen Sie mich wissen, was mit meiner Antwort nicht stimmt, damit ich sie bearbeiten oder löschen kann, wenn dies sinnvoll ist! Ich bin kein Spezialist, aber es scheint mir, dass dies auf vielen Seiten angewendet werden könnte, mit längerem Textinhalt arbeiten, nur abhängig von der Breite :)
MattAllegro