1. Web Design
  2. HTML/CSS
  3. CSS

CSS-Aktualisierungen: Rahmen

Scroll to top

German (Deutsch) translation by Valentina (you can also view the original English article)

Sicher, wir alle kennen Rahmen. Gibt es etwas Neues, das möglicherweise eingeführt werden könnte? Ich wette, in diesem Artikel gibt es einige Dinge, von denen Sie nie etwas gewusst haben!

Mit CSS3 können nicht nur abgerundete Ecken erstellt werden, sondern mit einfachem CSS können auch benutzerdefinierte Formen angezeigt werden. Das stimmt; In der Vergangenheit, bevor diese Techniken entdeckt wurden, haben wir möglicherweise auf absolut positionierte Hintergrundbilder zurückgegriffen, um Kreise oder Pfeile anzuzeigen. Zum Glück ist dies nicht mehr der Fall, da wir uns fröhlich noch einen Schritt von Photoshop entfernen.


Die Grundlagen

Sie sind wahrscheinlich mit der grundlegendsten Verwendung von Rahmen vertraut.

1
border: 1px solid black;

Mit dem obigen Code wird ein 1px-Rand auf ein Element angewendet. Schlicht und einfach; Wir können aber auch die Syntax etwas ändern.

1
border-width: thick;
2
border-style: solid;
3
border-color: black;

Zusätzlich zur Übergabe eines bestimmten Werts an border-width können alternativ drei Schlüsselwörter verwendet werden: thinmedium und thick.

imageimageimage

Während es zunächst unnötig erscheint, jemals das Langhand-Formular zu verwenden, gibt es eine Handvoll Fälle, in denen dies vorteilhaft ist, z. B. wenn Sie einen Aspekt eines Rahmens aktualisieren müssen, wenn ein bestimmtes Ereignis eintritt.

Möglicherweise müssen Sie die Farbe eines Rahmens ändern, wenn der Benutzer mit der Maus über ein bestimmtes Element fährt. Die Verwendung der Kurzform erfordert, dass Sie die Pixelwerte wiederholen.

1
.box {
2
    border: 1px solid red;   
3
}
4
5
.box:hover {
6
    border: 1px solid green;
7
}

Ein eleganterer und trockener Ansatz wäre die gezielte Aktualisierung der border-color-Eigenschaft.

1
.box {
2
    border: 1px solid red;   
3
}
4
5
.box:hover {
6
    border-color: green;
7
}

Wie Sie in Kürze feststellen werden, ist diese Langhand-Technik außerdem hilfreich, wenn Sie benutzerdefinierte Formen mit CSS erstellen.


Randradius (border-radius)

border-radius ist das goldene Kind von CSS3 - die erste neue Eigenschaft, die in der Community weit verbreitet ist. Dies bedeutet, dass mit Ausnahme von Internet Explorer 8 und darunter alle Browser abgerundete Ecken anzeigen können.

Bisher mussten Herstellerpräfixe sowohl für Webkit als auch für Mozilla verwendet werden, damit das Styling korrekt angewendet wurde.

1
-webkit-border-radius: 10px;
2
-moz-border-radius: 10px;
3
border-radius: 10px;

Heutzutage können wir jedoch die Herstellerversionen ohne Sorgen abschneiden und uns einfach an das offizielle Formular halten: border-radius.

image

Wie zu erwarten, können wir auch benutzerdefinierte Werte für jede Seite einer Box angeben.

imageimageimage
1
border-top-left-radius: 20px;
2
border-top-right-radius: 0;
3
border-bottom-right-radius: 30px;
4
border-bottom-left-radius: 0;

Im obigen Code wäre es überflüssig, border-top-right-radius und border-bottom-left-radius auf Null zu setzen, es sei denn, das Element erbt Werte, die zurückgesetzt werden müssen.

Ähnlich wie bei margin oder bei padding können diese Einstellungen bei Bedarf zu einer einzigen Eigenschaft zusammengefasst werden.

1
/* top left, top right, bottom right, bottom left */
2
border-radius: 20px 0 30px 0;

Beispielsweise (und wie Webdesigner dies häufig tun) kann die Form einer Zitrone mit CSS und der border-radius-Eigenschaft wie folgt reproduziert werden:

1
.lemon {
2
   width: 200px; height: 200px; 
3
4
   background: #F5F240;
5
   border: 1px solid #F0D900;      
6
   border-radius: 10px 150px 30px 150px;
7
}
imageimageimage

Mehr als die Grundlagen

Viele Designer halten gerne an dem Wissen fest, das bisher in diesem Kapitel beschrieben wurde. Es gibt jedoch einige Möglichkeiten, wie wir es weiter vorantreiben können!


Mehrere Rahmen

Es gibt eine Vielzahl von Techniken, auf die wir verweisen können, wenn wir mehrere Rahmen auf ein Element anwenden sollen.

Rahmenstil

soliddashed und dotted Werte sind die häufigsten Werte für die border-style-Eigenschaft. Es gibt jedoch auch einige andere Werte, die wir verwenden können, einschließlich groove und ridge.

1
border: 20px groove #e3e3e3;

Oder mit der Langhandform:

1
border-color: #e3e3e3;
2
border-width: 20px;
3
border-style: groove;
imageimageimage

Dies ist sicherlich hilfreich, aber ein Ridge- oder Groove-Effekt besteht nicht aus mehreren Rahmen.

Gliederung

Die beliebteste Technik zum Erstellen von zwei Rahmen besteht darin, die outline-Eigenschaft zu nutzen.

1
.box {
2
   border: 5px solid #292929;
3
   outline: 5px solid #e3e3e3;
4
}
imageimageimage

Diese Methode funktioniert wunderbar, ist jedoch auf zwei Rahmen beschränkt. Wenn Sie einen geschichteten, gradientenartigen Effekt erstellen müssen, ist ein anderer Ansatz erforderlich.

Pseudoelemente

Wenn die outline-Technik nicht ausreicht, besteht ein alternativer Ansatz darin, die Pseudoelemente :before und :after zu nutzen und alle erforderlichen zusätzlichen Rahmen auf den generierten Inhalt anzuwenden.

1
.box {
2
  width: 200px; height: 200px;
3
  background: #e3e3e3;
4
  position: relative;
5
6
  border: 10px solid green;  
7
}
8
9
/* Create two boxes with the same width of the container */
10
.box:after, .box:before {
11
  content: '';
12
  position: absolute;
13
  top: 0; left: 0; bottom: 0; right: 0;
14
}
15
16
.box:after {
17
  border: 5px solid red;
18
  outline: 5px solid yellow;
19
}
20
21
.box:before {
22
  border: 10px solid blue;
23
}
imageimageimage

Dies ist vielleicht nicht der eleganteste Ansatz, aber es wird auf jeden Fall den Job bekommen. Eine Einschränkung ist, dass es leicht ist, die Reihenfolge zu verwechseln, in der die Rahmenfarben angewendet werden. Oft ist ein gewisses Maß an „Raten und Prüfen“ erforderlich, um die richtige Reihenfolge anzuwenden.

Box Schatten

Die coole Möglichkeit für Kinder, eine unendliche Anzahl von Rahmen zu erstellen, besteht darin, den spread-Parameter in der CSS3-Eigenschaft von box-shadow zu nutzen.

1
.box {
2
    border: 5px solid red;
3
     box-shadow: 
4
       0 0 0 5px green, 
5
       0 0 0 10px yellow,
6
       0 0 0 15px orange;
7
}
imageimageimage

In diesem Fall sind wir klug und verwenden box-shadow auf eine Weise, die möglicherweise nicht unbedingt beabsichtigt war, als die Spezifikation ursprünglich geschrieben wurde.

Wenn Sie die Komponenten x, y und blur auf 0 setzen, können Sie stattdessen den spread-Wert verwenden, um an den gewünschten Stellen durchgezogene Rahmen zu erstellen. Da box-shadows mithilfe eines Kommas gestapelt werden können, ist die Anzahl der möglichen Ebenen unendlich.

Diese Technik verschlechtert sich anmutig sehr gut. In älteren Browsern, die die box-shadow-Eigenschaft nicht erkennen, wird einfach der einzelne rote 5px-Rand gerendert.

Denken Sie daran: Designs müssen nicht in allen Browsern identisch sein. Schreiben Sie Ihr CSS für die modernsten Browser und stellen Sie dann entsprechende Fallbacks bereit.


Winkel ändern

Zusätzlich zur Übergabe eines einzelnen Werts an border-radius können wir alternativ zwei - durch ein / - getrennte Werte angeben, um eindeutige Werte sowohl für den horizontalen als auch für den vertikalen Radius anzugeben.

Beispielsweise…

1
border-radius: 50px / 100px; /* horizontal radius, vertical radius */

…ist äquivalent zu:

1
border-top-left-radius: 50px 100px;
2
border-top-right-radius: 50px 100px;
3
border-bottom-right-radius: 50px 100px;
4
border-bottom-left-radius: 50px 100px;

Diese Technik ist besonders hilfreich, wenn Sie eine subtile, lange Kurve anstelle einer generischen abgerundeten Ecke nachahmen müssen. Mit dem folgenden Code können wir uns beispielsweise leicht von einer quadratischen Form lösen, was zu einem eher gewellten, papierähnlichen Effekt führt.

1
.box {
2
    width: 200px; height: 200px;
3
    background: #666;
4
5
    border-top-left-radius: 15em 1em;
6
    border-bottom-right-radius: 15em 1em;
7
8
}
imageimageimage

CSS-Formen

Die vielleicht beste Verwendung von Rahmen ist, wenn sie geschickt auf Elemente angewendet werden, die eine Breite und Höhe von Null haben. Verwirrend, oder? Sehen wir uns eine Demonstration an.

Nehmen Sie für die nächsten Beispiele das folgende Markup an…

1
<div class="box"></div>

… Und das folgende Basis-Styling:

1
.box {
2
   width: 200px;
3
   height: 200px;
4
   background: black;
5
}

Das am häufigsten genannte Beispiel für die Demonstration der Verwendung von CSS-Formen in einem Projekt ist das Erstellen des obligatorischen Pfeils.

Der Schlüssel zum Verständnis, wie ein Pfeil mit CSS gebildet werden kann, besteht darin, für jede Seite eine eindeutige border-color festzulegen und dann sowohl die Werte für width als auch height  für den Container auf 0 zu reduzieren.

Angenommen, ein div mit einer arrow-Klasse als Container:

1
.arrow {
2
  width: 0; height: 0;
3
4
  border-top: 100px solid red;
5
  border-right: 100px solid green;
6
  border-bottom: 100px solid blue;
7
  border-left: 100px solid yellow;  
8
}

Wie zu Beginn dieses Kapitels gezeigt, besteht eine sauberere Syntax darin, nicht die umfassende Kurzhandversion zu verwenden:

1
.arrow {
2
  width: 0; height: 0;
3
4
  border: 100px solid;  
5
  border-top-color: red;
6
  border-right-color: green;
7
  border-bottom-color: blue;
8
  border-left-color: yellow;
9
}

Wir können dies sogar weiter reduzieren, indem wir die Farbwerte gruppieren.

1
.arrow {
2
  width: 0; height: 0;
3
4
  border: 100px solid;
5
  border-color: red green blue yellow;
6
}
imageimageimage

Interessant, oder? Es macht jedoch durchaus Sinn, wenn wir einen Schritt zurücktreten. Dies ist die einzig mögliche Möglichkeit, die Farben auszurichten, wenn für den Container eine width und height von Null angenommen wird. Was ist nun, wenn wir alle Randfarben bis auf die blaue Seite auf transparent setzen?

1
.arrow {
2
  width: 0; height: 0;
3
4
  border: 100px solid;
5
  border-bottom-color: blue;
6
}
imageimageimage

Ausgezeichnet! Es scheint jedoch nicht zu semantisch, ein .arrow div zu erstellen, um der Seite einen Pfeil hinzuzufügen. Stattdessen können Pseudoelemente verwendet werden, um den Pfeil nach oder vor dem zugeordneten Element anzuwenden.

Erstellen einer Sprechblase

Um eine 100% CSS-Sprechblase zu erstellen, beginnen wir mit dem Markup.

1
<div class="speech-bubble">Hi there!</div>

Als nächstes sollte ein grundlegendes Styling angewendet werden.

1
.speech-bubble {
2
    position: relative;
3
    background-color: #292929;
4
5
    width: 200px;
6
    height: 150px;
7
    line-height: 150px; /* vertically center */
8
9
    color: white;
10
    text-align: center;
11
}
imageimageimage

Der Pfeil wird mit dem after-Pseudo-Element angewendet.

1
.speech-bubble:after {
2
    content: '';    
3
}

Die :before- und :after-Pseudo-Elemente können verwendet werden, um generierten Inhalt entweder vor oder nach dem Inhalt eines Elements einzufügen.

An diesem Punkt geht es einfach darum, den Pfeil zu reproduzieren und an der richtigen Stelle zu positionieren. Wir beginnen damit, den Inhalt absolut zu positionieren, die width und height zurückzusetzen und die Rahmenfarben anzuwenden.

1
.speech-bubble:after {
2
  content: '';
3
  position: absolute;
4
5
  width: 0;
6
  height: 0;
7
8
  border: 10px solid;
9
  border-color: red green blue yellow;
10
}
imageimageimage

Da wir wissen, dass der Pfeil nach unten zeigen soll, zeigt das obige Bild, dass alle außer dem roten (oder oberen) Rand entweder weggelassen oder auf transparent gesetzt werden sollten.

1
.speech-bubble:after {
2
  content: '';
3
  position: absolute;
4
5
  width: 0;
6
  height: 0;
7
8
  border: 10px solid;
9
  border-top-color: red;
10
}
imageimageimage

Beim Erstellen von CSS-Formen sollte stattdessen die width-Eigenschaft verwendet werden, da mit der border-width-Eigenschaft nicht festgelegt werden kann, wie breit der Pfeil sein soll. In diesem Fall sollte der Pfeil etwas größer sein. So kann die border-width auf 15px erhöht werden. Wir positionieren den Pfeil auch unten und in der Mitte des Containers, indem wir die top und left Eigenschaften verwenden.

1
.speech-bubble:after {
2
  content: '';
3
  position: absolute;
4
5
  width: 0;
6
  height: 0;
7
8
  border: 15px solid;
9
  border-top-color: red;
10
11
  top: 100%;
12
  left: 50%;
13
}
imageimageimage

Fast dort; der letzte Schritt besteht darin, die Farbe des Pfeils so zu aktualisieren, dass sie dem Hintergrund des Containers entspricht. Die Positionierung muss ebenfalls geändert werden, um die Breite der Rahmen (15px) zu berücksichtigen. Während wir hier sind, wenden wir auch einen subtilen border-radius an, damit der Container blasenartiger erscheint.

1
.speech-bubble { 
2
   /* … other styles */
3
   border-radius: 10px;
4
}
5
6
.speech-bubble:after {
7
  content: '';
8
  position: absolute;
9
10
  width: 0;
11
  height: 0;
12
13
  border: 15px solid;
14
  border-top-color: #292929;
15
16
  top: 100%;
17
  left: 50%;
18
  margin-left: -15px; /* adjust for border width */
19
}
imageimageimage

Nicht schlecht, ja? Wenn Sie diesen Code in einige wiederverwendbare Klassen abstrahieren, können Sie alle zukünftigen Projekte durchführen.

1
/* 

2
   Speech Bubbles

3
   Usage: Apply a class of .speech-bubble and .speech-bubble-DIRECTION

4
   <div class="speech-bubble speech-bubble-top">Hi there</div>

5
*/
6
7
.speech-bubble {
8
  position: relative;
9
  background-color: #292929;
10
11
  width: 200px;
12
  height: 150px;
13
  line-height: 150px; /* vertically center */
14
15
  color: white;
16
  text-align: center;
17
  border-radius: 10px;
18
19
  font-family: sans-serif;
20
}
21
22
.speech-bubble:after {
23
  content: '';
24
  position: absolute;
25
26
  width: 0;
27
  height: 0;
28
29
  border: 15px solid;
30
}
31
32
33
/* Position the Arrow */
34
35
.speech-bubble-top:after {
36
  border-bottom-color: #292929;
37
38
  left: 50%;
39
  bottom: 100%;
40
  margin-left: -15px;   
41
}
42
.speech-bubble-right:after {
43
  border-left-color: #292929;
44
45
  left: 100%;
46
  top: 50%;
47
  margin-top: -15px;    
48
}
49
50
.speech-bubble-bottom:after {
51
  border-top-color: #292929;
52
53
  top: 100%;
54
  left: 50%;
55
  margin-left: -15px;   
56
}
57
58
.speech-bubble-left:after {
59
  border-right-color: #292929;
60
61
  top: 50%;
62
  right: 100%;
63
  margin-top: -15px;    
64
}
image

Bonus: Bessere vertikale Zentrierung

Ein Nachteil bei der Verwendung der line-height zum vertikalen Zentrieren von Text besteht darin, dass Sie auf eine einzelne Zeile beschränkt sind. Sollte der Text zwei oder mehr Zeilen erfordern, ist jede Zeilenhöhe viel zu groß. Eine clevere Lösung besteht darin, der Sprechblase ein display von table und dem Absatz, der den Text umschließt, ein display von table-cell zuzuweisen. Dies erlaubt uns dann, den Text entsprechend mittig auszurichten.

1
<div class="speech-bubble speech-bubble-top">
2
    <p>Text goes here.</p>
3
</div>

Als nächstes das modifizierte CSS.

1
.speech-bubble {
2
 /* other styles */
3
4
  display: table;
5
}
6
7
.speech-bubble p {
8
  display: table-cell;
9
  vertical-align: middle;
10
}
imageimageimage

Machen Sie sich keine Sorgen, wenn Verweise auf display: table schreckliche Erinnerungen an altmodische, tischbasierte Layouts wecken. Diese Eigenschaften beziehen sich lediglich auf den Stil, in dem ein Element angezeigt werden soll.

Wir sind nicht auf Dreiecke beschränkt. CSS ist in der Lage, alle Arten von Formen zu produzieren - sogar Herzen und Biogefährdungszeichen!

imageimageimage
1
.biohazard {
2
  width: 0; height: 0;
3
4
  border: 60px solid;
5
  border-radius: 50%;
6
7
  border-top-color: black;
8
  border-bottom-color: black;
9
  border-left-color: yellow;
10
  border-right-color: yellow;
11
}

Zusammenfassung

Obwohl es stimmt, dass der einfache border: 1px solid black-Syntax einen langen Weg zurücklegt, können wir, wenn wir klug sind, eine Vielzahl hilfreicher Effekte, Symbole und Formen erstellen. Wer hätte gedacht, dass Rahmen so mächtig sein könnten? Der Schlüssel ist, sich daran zu erinnern, dass das Styling für gängige Formen oder Sprechblasen nur einmal erstellt und dann für die zukünftige Verwendung in Dienstprogrammklassen abstrahiert werden sollte.