Standard Stil-Sprache des webs: definiert Layout und Stil von HTML-Seiten
<h1 style="color: grey; font-size: 30px">Hello</h1>
üblicherweise im head
:
<link rel="stylesheet" href="style.css" />
/* comment */
h1 {
font-family: sans-serif;
color: grey;
}
#home-button {
color: white;
}
*
h1
.important
#home-button
Falls sich zwei CSS-Attribute widersprechen, "gewinnt":
h1 {
color: red; /* Schriftfarbe */
background-color: blue; /* Hintergrundfarbe */
}
grey
, blue
, lightblue
, ...rgb(255, 128, 128)
#ff8080
hsl(180, 60%, 70%)
p {
font-family: Arial, sans-serif;
font-size: 16px;
line-height: 1.5;
font-style: italic;
font-weight: bold;
text-decoration: underline;
text-align: center;
}
Es können mehrere Schriftarten angegeben werden. Der Browser verwendet die erste, die installiert ist.
p {
font-family: Arial, sans-serif;
}
Drei allgemeine Schriftarten, die in jedem Browser vorhanden sind:
serif
, sans-serif
, monospace
mögliche Einheiten:
px
: "Pixel"%
: Prozent relativ zum umgebenden Textem
: relativ zum umgebenden Textrem
: relativ zur Schriftgröße des html
-Elementsübliche Standardgröße in Browsern: 16px
übliche Standardgröße in Browsern: 1.2
wird oft auf größere Werte gesetzt, z.B. 1.5
dient ausschließlich für kursive Schrift
h1 {
font-style: italic;
}
Um die Schriftstärke zu verändern, mögliche Werte:
100
200
300
(auch: light
)400
(auch: regular
)500
600
(auch: semibold
)700
(auch: bold
)800
900
h1 {
text-decoration: underline, overline, line-through;
}
center
justify
left
right
start
end
px, em, rem, %, vh, vw
früher:
1px = ein Pixel am Bildschirm
heutzutage:
z.B. beim iPhone 4: 1px = zwei Pixel am Bildschirm (device pixel ratio = 2)
abfragbar über JavaScript-Variable devicePixelRatio
rem = Schriftgröße des html
-Elements
Standard in Browsern: 1rem = 16px
1vh = 1% der Viewport-Höhe
1vw = 1% der Viewport-Breite
Resets: Stylesheets, die grundlegende Stile über verschiedene Browser hinweg vereinheitlichen:
verbreitete CSS-Libraries:
einfache, grundlegende CSS-Library:
Definieren von CSS-Variablen:
:root {
--primary-color: #1565c0;
--secondary-color: #f50057;
}
Verwenden von Variablen:
h1 {
color: var(--primary-color);
}
button {
background-color: var(--primary-color);
color: white;
}
Inline-Elemente:
a
, em
, strong
, (img
)Block-Elemente:
h1
, ul
, li
, p
span
= allgemeinstes inline-Element
div
= allgemeinstes block-Element
"Schichten" von von Block-Elementen von innen nach außen:
Beispiel: zwei Boxen
Größe des Inhalts:
height
/ width
min-height
/ min-width
max-height
/ max-width
Wenn wir einen Prozentsatz angeben (z.B. 50%
), bezieht sich dieser auf das Elternelement
Die Attribute height
, width
u.s.w. beziehen sich standardmäßig auf den Inhalt (ohne padding und border)
Heute setzt man oft:
* {
box-sizing: border-box;
}
dann beziehen sie sich auf die Gesamtgröße (mit padding und border, aber ohne margin)
padding: 10px
padding: 10px 20px 30px 40px
(top - right - bottom - left)padding: 10px 20px;
(top und bottom - left und right)margin: 10px auto;
padding: 10px; padding-left: 20px;
Border-Beispiel: border: 1px solid blue
abgerundete Ecken: border-radius: 5px
Achtung: vertikales margin und padding wirken sich bei Inline-Elementen nicht auf die Positionierung aus und führen zu Überlappungen
div {
width: 800px;
margin: auto;
}
div {
max-width: 800px;
margin: auto;
}
Standardmäßig: Body ist nur so groß wie dessen Inhalt
Um Body immer die volle Seitenhöhe einnehmen zu lassen:
html {
height: 100%;
}
body {
height: 100%;
}
Standardmäßig hat jede Zelle in einer Tabelle einen eigenen Rahmen.
"Zusammenlegen" der Rahmen benachbarter Zellen:
table {
border-collapse: collapse;
}
Standardverhalten, wenn ein Kindelement höher oder breiter als das Elternelement ist:
Das Kindelement ragt über das Elternelement hinaus
Um bei Bedarf beim Elternelement Scrollleisten anzuzeigen:
#parent {
overflow: auto;
}
Beispiel: Anzeigen eines Hintergrunds für die ganze Seite durch einen body, der auf Fensterhöhe skaliert ist - aber Anzeigen von Scrollbars, falls der Inhalt darüber hinaus geht
body {
height: 100vh;
overflow: auto;
background-color: lightgrey;
}
Sonderfall: das body-Element verhält sich immer so, als ob overflow: auto;
gesetzt wäre
* {
box-sizing: border-box;
}
Body margin (default: 8px) is commonly set to 0 - e.g. so a navbar can be at the very top
body {
margin: 0;
}
Einfache Deklaration für serifenlose Schrift:
body {
font-family: sans-serif;
}
Standard-Auswahl für serifenlose Schriften in Bootstrap / Reboot - beinhaltet native Schriftarten für verschiedene Plattformen:
body {
font-family: system-ui, -apple-system, 'Segoe UI', Roboto,
'Helvetica Neue', Arial, 'Noto Sans', 'Liberation Sans',
sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',
'Noto Color Emoji' !default;
}
Sicherstellen, dass der body das ganze Fenster ausfüllt (z.B. um den Hintergrund zu setzen):
html {
height: 100%;
}
body {
height: 100%;
padding: 0;
}
Beispiel für einen Button mit angewendetem Stil:
button {
background-color: #0074d9;
color: #ffffff;
padding: 0.5em 1em;
border: none;
border-radius: 4px;
cursor: pointer;
}
"fluid Container" - ähnlich wie bei Bootstrap:
.container-fluid {
padding-left: 12px;
padding-right: 12px;
}
Container ähnlich wie bei bootstrap:
.container {
padding-left: 12px;
padding-right: 12px;
margin-left: auto;
margin-right: auto;
}
@media (min-width: 576px) {
.container {
max-width: 540px;
}
}
@media (min-width: 768px) {
.container {
width: 720px;
}
}
/* ... (more media queries) ... */
standard Viewport-Breiten und Container-Größen in Bootstrap:
einfaches Beispiel aus Picnic CSS:
.flex {
display: flex;
flex-wrap: wrap;
}
Möglichkeiten:
display: block
display: inline
display: none
display: flex
Einfache Möglichkeit, Elemente nebeneinander oder untereinander anzuordnen
container:
flex-direction
flex-wrap
justify-content
align-content
align-items
items:
flex-basis
flex-grow
#container {
display: flex;
flex-direction: row;
}
#container {
display: flex;
flex-direction: column;
}
Beispiel: Seitenlayout mit Navbar auf der Seite und Hauptbereich
body {
display: flex;
flex-direction: row;
}
body > nav {
flex-basis: 5em;
}
body > main {
flex-grow: 1;
}
Beispiel: article-Element mit header und scrollbarem Hauptbereich
article {
height: 240px;
display: flex;
flex-direction: column;
}
article > header {
height: 48px;
}
article > .main-content {
flex-grow: 1;
overflow-y: auto;
}
Möglichkeit, insbesondere die Bildschirmgröße und Orientierung abzufragen
.menu {
display: flex;
flex-direction: column;
}
@media (min-width: 800px) {
.menu {
flex-direction: row;
}
}
@media (orientation: landscape) {
.layout {
flex-direction: row;
}
}
@media (min-width: 576px) {
/* small screen */
}
@media (min-width: 768px) {
/* medium screen */
}
/* ... */
common breakpoints (roughly every 200px):
size | min (bootstrap) | min (tailwind) |
---|---|---|
xs | N/A | N/A |
sm | 576px | 640px |
md | 768px | 768px |
lg | 992px | 1024px |
xl | 1200px | 1280px |
xxl | 1400px | 1536px |
input[type='checkbox'] {
/* ... */
}
ein Link, der irgendwo im header
auftritt:
header a {
/* ... */
}
ein nav
, das direkt im body
liegt:
body > nav {
/* ... */
}
Pseudoklassen können mittel Doppelpunkt abgefragt werden:
a:hover {
text-decoration: underline;
}
button:disabled {
background-color: lightgrey;
}
tr:nth-child(2n) {
background-color: grey;
}
tr:hover:nth-child(n) {
background-color: lightgreen;
}
:checked
:empty
:valid
:invalid
:required
:hover
:visited
:active
:first-child
:last-child
:nth-child(2n)
Pseudoelemente erlauben das Hinzufügen zusätzlicher HTML-Elemente via CSS:
.todo-item.completed::before {
content: '✓';
}
nav button[aria-haspopup='true']::after {
content: 'â–¾';
}
Schatten-Beispiel:
.shadow {
box-shadow: rgba(0, 0, 0, 0.15) 0px 8px 16px;
}
0px
8px
16px
rgba(0, 0, 0, 0.15)
(transparentes Schwarz)Beispiel: ein div
soll je 10px
von der rechten unteren Ecke seines Elternelements positioniert sein
<div id="outer">
<div id="inner"></div>
</div>
#outer {
position: relative;
}
#inner {
position: absolute;
bottom: 10px;
right: 10px;
}
position
: absolute
position
: relative
)position
: fixed
)position
: static
: Standardwert)Beispiel für position: relative
: hochgestellter oder tiefgestellter Text
Facebook-Klon mit Chat
Beispiel: Layout mit Header und Sidebar
#layout {
display: grid;
height: 100vh;
grid-template-areas: "header header" "sidebar main";
grid-template-rows: auto 1fr;
grid-template-columns: 200px 1fr;
}
Inhalte im Layout ausrichten:
#header {
grid-area: header;
}
#main {
grid-area: main;
}
/* ... */
#element1 {
transform: translsate(100px, 0);
}
#element2 {
transform: translate(100px, 0) rotate(45deg);
transform-origin: 0 0;
}
Element wird zuerst um 45 Grad im Uhrzeigersinn gedreht, dann um 100 Pixel nach rechts verschoben
Punkt, um den gedreht wird: linke obere Ecke des Elements
Die Änderung verschiedener CSS-Properties kann wie folgt animiert werden:
#animated {
transition: background-color: 3s, margin-top: 1s;
}
div.box {
width: 40px;
height: 40px;
background-color: blue;
transform: rotate(0);
transition: transform 9s, background-color 9s;
}
div.box:hover {
background-color: red;
transform: rotate(360deg) scale(2);
transition: transform 0.5s, background-color 0.5s;
}
div {
width: 40px;
height: 40px;
background-color: blue;
transform: translate(0, 0) rotate(0);
transition: transform 9s, background-color 9s;
}
div:hover {
background-color: red;
transform: translate(200px, 0) rotate(360deg);
transition: transform 3s, background-color 3s;
}
Dropdown, das bei einem Buttonklick aktiv wird
HTML-Vorlage:
<div id="dropdown">dropdown</div>
<button
id="dropdown-button"
onclick="dropdown.className = 'active'"
>
menu
</button>
Achtung: Wir verwenden nun CSS-Transformationen, nicht SVG-Transformationen; wir müssen nun beispielsweise transform-origin
separat setzen