Wie man eine Landing Page-Vorlage mit Bootstrap 4 erstellt
German (Deutsch) translation by Tatsiana Bochkareva (you can also view the original English article)
In diesem Tutorial machen wir unsere Tour durch Bootstrap 4. Wir lernen, wie Sie damit eine reaktionsschnelle Zielseite erstellen.
Womit wir beginnen werden
Bevor wir wie immer beginnen, werfen wir einen kurzen Blick auf unser Demo-Projekt:
Überprüfen Sie unbedingt die Vollbildversion und ändern Sie die Größe Ihres Browserfensters, um festzustellen, wie sich das Layout abhängig von der Größe des Ansichtsfensters ändert.
Hinweis: In diesem Lernprogramm wird davon ausgegangen, dass Sie mit Bootstrap 4 vertraut sind. Sie müssen wissen, wie das Rastersystem und die Flex-Komponente funktionieren. Darüber hinaus wird Ihnen ein gutes Verständnis der responsiven Haltepunkte gute Dienste leisten.
Um Ihnen zu helfen, sich auf dem Laufenden zu halten, bieten wir hier bei Tuts+ eine Reihe von Kursen an, die sich auf Bootstrap 4 konzentrieren.
-


Bootstrap 4Das ist Bootstrap 4Adi Purdila -


BootstrapEin Leitfaden für Anfänger zum neuen Bootstrap 4 Grid-SystemAdi Purdila -


BootstrapArbeiten mit Bootstrap 4 und SassAdi Purdila
Die Vermögenswerte
In diesem Projekt werden einige Assets verwendet. Hier finden Sie sie:
- Für die in dieser Demo verwendeten Symbole habe ich die Font Awesome-Bibliothek in unseren Stift integriert.
- Alle Bilder stammen von Unsplash.
1. Legen Sie das Markup fest
Lassen Sie uns anfangen! Wir machen alles mit typischen Seitenmarkierungen: eine Kopfzeile, eine Fußzeile und fünf Abschnitte:
1 |
<header>...</header> |
2 |
<main>
|
3 |
<!-- Banner Section -->
|
4 |
<section>...</section> |
5 |
<!-- Process Section -->
|
6 |
<section>...</section> |
7 |
<!-- Featured Destinations Section -->
|
8 |
<section>...</section> |
9 |
<!-- Popular Destinations Section -->
|
10 |
<section>...</section> |
11 |
<!-- Request a Quote Section -->
|
12 |
<section>...</section> |
13 |
</main>
|
14 |
<footer>...</footer> |
2. Definieren Sie einige grundlegende Stile
Bevor wir uns die einzelnen Teile unserer Seite genauer ansehen, definieren wir zunächst einige CSS-Stile. Das sind oft Rücksetzregeln zusammen mit einigen Hilfsklassen, die wir später an die Zielelemente anhängen werden:
1 |
:root { |
2 |
--lightblue: #F6F9FC; |
3 |
--red: #d64041; |
4 |
}
|
5 |
|
6 |
a, |
7 |
a:hover { |
8 |
color: inherit; |
9 |
}
|
10 |
|
11 |
a:hover { |
12 |
text-decoration: none; |
13 |
}
|
14 |
|
15 |
.bg-lightblue { |
16 |
background: var(--lightblue); |
17 |
}
|
18 |
|
19 |
.bg-red { |
20 |
background: var(--red); |
21 |
}
|
22 |
|
23 |
.text-red { |
24 |
color: var(--red); |
25 |
}
|
26 |
|
27 |
.container-fluid-max { |
28 |
max-width: 1440px; |
29 |
}
|
30 |
|
31 |
.cover { |
32 |
background: no-repeat center/cover; |
33 |
}
|
34 |
|
35 |
.p-15 { |
36 |
padding: 15px; |
37 |
}
|
Hinweis: Wir werden versuchen, unser CSS so leicht wie möglich zu halten und die integrierten Klassen von Bootstrap 4 zu nutzen.
3. Erstellen Sie den Header
Der Seitenkopf hat:
- Das Logo
- Die Navigation
- Die Kontaktinformationen
Wenn Sie die von Bootstrap definierten Haltepunkte verwenden, sollte es auf besonders großen Bildschirmen folgendermaßen aussehen:



Auf den großen Bildschirmen:



Auf den kleineren Bildschirmen sieht es anders aus:



Header HTML
Um das Header-Markup zu erstellen, nutzen wir die von Bootstrap bereitgestellte navbar-Komponente.
So sieht das aus:
1 |
<header class="fixed-top page-header"> |
2 |
<div class="container-fluid container-fluid-max"> |
3 |
<nav id="navbar" class="navbar navbar-expand-lg navbar-dark"> |
4 |
<a class="navbar-brand" href="#home">...</a> |
5 |
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> |
6 |
<span class="navbar-toggler-icon"></span> |
7 |
</button>
|
8 |
<div class="collapse navbar-collapse justify-content-lg-between" id="navbarNav"> |
9 |
<ul class="navbar-nav"> |
10 |
<li class="nav-item"> |
11 |
<a class="nav-link" href="">...</a> |
12 |
</li>
|
13 |
<!-- more list items here -->
|
14 |
</ul>
|
15 |
<div class="text-white"> |
16 |
<a href="" class="mr-2"> |
17 |
<i class="fas fa-phone"></i> |
18 |
<div class="d-none d-xl-inline">...</div> |
19 |
</a>
|
20 |
<a href=""> |
21 |
<i class="fas fa-envelope"></i> |
22 |
<div class="d-none d-xl-inline">...</div> |
23 |
</a>
|
24 |
</div>
|
25 |
</div>
|
26 |
</nav>
|
27 |
</div>
|
28 |
</header>
|
Header CSS
Standardmäßig hat nur der mobile Header (Off-Canvas-Menü) eine Hintergrundfarbe.
In einem nächsten Abschnitt wird jedoch erläutert, wie Sie dem Desktop-Header beim Scrollen der Seite eine Hintergrundfarbe hinzufügen.
1 |
.scroll .page-header { |
2 |
background: var(--red); |
3 |
}
|
4 |
|
5 |
.page-header { |
6 |
transition: background 0.5s ease-in-out; |
7 |
}
|
8 |
|
9 |
.page-header .navbar { |
10 |
padding: 1rem 0; |
11 |
}
|
12 |
|
13 |
.page-header .navbar-toggler { |
14 |
border-color: var(--white); |
15 |
}
|
16 |
|
17 |
@media screen and (max-width: 991px) { |
18 |
.page-header { |
19 |
background: var(--red); |
20 |
}
|
21 |
}
|
4. Erstellen Sie die Heldensektion
Der erste Abschnitt unserer Seite enthält:
- Ein Vollbild-Hintergrundbild
- Eine Überschrift und zwei Handlungsaufforderungstasten, die vertikal über dem Bild zentriert sind.
So sieht es aus:



Abschnitt #1 HTML
1 |
<section id="home" class="d-flex align-items-center position-relative vh-100 cover hero" style="background-image:url(IMG_SRC);"> |
2 |
<div class="container-fluid container-fluid-max"> |
3 |
<div class="row"> |
4 |
<div class="col-12 col-md-8 col-lg-6 col-xl-5"> |
5 |
<h1 class="text-white">...</h1> |
6 |
<div class="mt-3"> |
7 |
<a class="btn bg-red text-white mr-2" href="" role="button">...</a> |
8 |
<a class="btn bg-red text-white" href="" role="button">...</a> |
9 |
</div>
|
10 |
</div>
|
11 |
</div>
|
12 |
</div>
|
13 |
</section>
|
Abschnitt #1 CSS
Aus Gründen der Lesbarkeit erstellen wir eine Überlagerung über dem Hintergrund. Wir werden dann sicherstellen, dass der Text über dieser Überlagerung platziert wird.
Ähnlich wie in header werden wir später erläutern, wie dieser Abschnitt bei jedem Bildlauf der Seite skaliert wird.
1 |
.scroll .hero { |
2 |
transform: scale(0.98); |
3 |
}
|
4 |
|
5 |
.hero { |
6 |
background-attachment: fixed; |
7 |
transition: transform 0.5s ease-in-out; |
8 |
}
|
9 |
|
10 |
.hero::after { |
11 |
content: ’’; |
12 |
position: absolute; |
13 |
top: 0; |
14 |
right: 0; |
15 |
bottom: 0; |
16 |
left: 0; |
17 |
background: linear-gradient( |
18 |
rgba(0, 0, 0, 0.5) 0, |
19 |
rgba(0, 0, 0, 0.3) 50%, |
20 |
rgba(0, 0, 0, 0.1) 100% |
21 |
);
|
22 |
}
|
23 |
|
24 |
.hero .container-fluid { |
25 |
z-index: 10; |
26 |
}
|
5. Erstellen Sie den Übersichtsabschnitt
Der zweite Abschnitt unserer Seite enthält einige Details, die einen schnellen Überblick bieten, sobald unsere Besucher den Helden aufgenommen haben:
- Eine Überschrift
- Vier Textblöcke mit ihren Symbolen
- Eine Handlungsaufforderungstaste
Auf großen Bildschirmen und höher sollte es so aussehen:



Auf kleinen und mittleren Bildschirmen:



Schließlich werden auf extra kleinen Bildschirmen alle Spalten gestapelt:



Abschnitt #2 HTML
1 |
<section id="process" class="process"> |
2 |
<div class="container-fluid container-fluid-max"> |
3 |
<div class="row text-center py-5"> |
4 |
<div class="col-12 pb-4"> |
5 |
<h2 class="text-red">...</h2> |
6 |
</div>
|
7 |
<div class="col-12 col-sm-6 col-lg-3">...</div> |
8 |
<div class="col-12 col-sm-6 col-lg-3">...</div> |
9 |
<div class="col-12 col-sm-6 col-lg-3">...</div> |
10 |
<div class="col-12 col-sm-6 col-lg-3">...</div> |
11 |
<div class="col-12 pt-3"> |
12 |
<a class="btn bg-red text-white" target="_blank" href="" role="button">...</a> |
13 |
</div>
|
14 |
</div>
|
15 |
</div>
|
16 |
</section>
|
Stapeln von Symbolen
Um mehrere Symbole in unseren Spalten zu stapeln, nutzen wir die mit Font Awesome gebündelten Stile. Auf diese Weise können wir ein weißes Symbol über ein farbiges Kreissymbol stapeln.

Sie sehen das Markup für die erste Spalte. Die beiden <i> Elemente sind nebeneinander inline, aber mit den fa-stack-Klassen werden sie gestapelt.
1 |
<div class="col-12 col-sm-6 col-lg-3"> |
2 |
<span class="fa-stack fa-2x"> |
3 |
<i class="fas fa-circle fa-stack-2x text-red"></i> |
4 |
<i class="fas fa-map-marked fa-stack-1x text-white"></i> |
5 |
</span>
|
6 |
<h3 class="mt-3 text-red h4">...</h3> |
7 |
<p>...</p> |
8 |
</div>
|
6. Erstellen Sie den Abschnitt Geteilte Blöcke
Der dritte Abschnitt unserer Seite enthält zwei Vollbildzeilen. Jede Zeile ist geteilt und enthält eine Bildspalte und eine Textspalte. Der Inhalt innerhalb der Textspalten muss vertikal zentriert sein.
Auf mittleren Bildschirmen und darüber sieht das Abschnittslayout folgendermaßen aus:



Auf schmalen Bildschirmen sollten sie so aussehen:



Abschnitt #3 HTML
Sie werden die Reihenfolge der obigen Blöcke bemerken. Auf schmalen Bildschirmen müssen sich Text- und Bildblöcke abwechseln: Bild, Text, Bild, Text. Dфы wäre ohne die unten verwendeten Flexbox-order-klassen nicht möglich:
1 |
<section id="featured-destinations" class="featured-destinations bg-lightblue"> |
2 |
<div class="row no-gutters"> |
3 |
<div class="col-12 col-md-6 d-flex align-items-center order-1 order-md-0"> |
4 |
<div class="p-15">...</div> |
5 |
</div>
|
6 |
<div class="col-12 col-md-6 order-0 order-md-1"> |
7 |
<div class="vh-100 cover" style="bakground-image:url(IMG_SRC);">...</div> |
8 |
</div>
|
9 |
<div class="col-12 col-md-6 order-2"> |
10 |
<div class="vh-100 cover" style="bakground-image:url(IMG_SRC);">...</div> |
11 |
</div>
|
12 |
<div class="col-12 col-md-6 d-flex align-items-center order-3"> |
13 |
<div class="p-15">...</div> |
14 |
</div>
|
15 |
</div>
|
16 |
</section>
|
7. Erstellen Sie den Abschnitt Bildergalerie
Der vierte Abschnitt unserer Seite enthält:
- Eine Überschrift
- Fünf Bildspalten mit ihrer Beschreibung
- Eine Handlungsaufforderungstaste
Auf mittleren Bildschirmen und darüber sieht es so aus:



Auf kleinen Bildschirmen ändert sich das Layout:



Auf extra kleinen Bildschirmen sind alle Bildspalten gestapelt:



Abschnitt #4 HTML
1 |
<section id="popular-destinations" class="popular-destinations py-5"> |
2 |
<div class="container-fluid container-fluid-max"> |
3 |
<div class="row"> |
4 |
<div class="col-12"> |
5 |
<h2 class="pb-3 text-red">...</h2> |
6 |
</div>
|
7 |
<div class="col-12 col-sm-6 col-md-4">...</div> |
8 |
<div class="col-12 col-sm-6 col-md-4">...</div> |
9 |
<div class="col-12 col-sm-6 col-md-4">...</div> |
10 |
<div class="col-12 col-sm-6">...</div> |
11 |
<div class="col-12 col-md-6">...</div> |
12 |
</div>
|
13 |
<div class="row"> |
14 |
<div class="col text-center"> |
15 |
<a class="btn bg-red text-white" href="" role="button">...</a> |
16 |
</div>
|
17 |
</div>
|
18 |
</div>
|
19 |
</section>
|
Das Markup, das für das Festlegen des Spalteninhalts verantwortlich ist, sieht so aus:
1 |
<div class="col-12 col-sm-6 col-md-4"> |
2 |
<a href="" class="text-white"> |
3 |
<figure class="position-relative overflow-hidden"> |
4 |
<img class="img-fluid" src="IMG_SRC" alt=""> |
5 |
<figcaption class="d-flex align-items-center justify-content-center position-absolute"> |
6 |
<h3>...</h3> |
7 |
</figcaption>
|
8 |
</figure>
|
9 |
</a>
|
10 |
</div>
|
Abschnitt #4 CSS
Am Anfang sind alle Bilder verschwommen und grau. Jedes Mal, wenn Sie mit der Maus über ein Bild fahren, werden die Bildskalen und die Standardfilter entfernt.
Dies sind die Stile, um dies zu erreichen:
1 |
.popular-destinations figure { |
2 |
margin-bottom: 30px; |
3 |
}
|
4 |
|
5 |
.popular-destinations figcaption { |
6 |
top: 0; |
7 |
right: 0; |
8 |
bottom: 0; |
9 |
left: 0; |
10 |
background: rgba(0, 0, 0, 0.3); |
11 |
}
|
12 |
|
13 |
.popular-destinations img { |
14 |
filter: grayscale(100%) blur(3px); |
15 |
transition: transform 0.5s, filter 0.75s; |
16 |
}
|
17 |
|
18 |
.popular-destinations a:hover img { |
19 |
transform: scale(1.25); |
20 |
filter: none; |
21 |
}
|
8. Erstellen Sie den Abschnitt Handlungsaufforderung
Der fünfte Abschnitt unserer Seite enthält:
- Ein Textblock
- Eine Handlungsaufforderungstaste
Handlungsaufforderungen sind auf Zielseiten von entscheidender Bedeutung, da sie Besucher dazu ermutigen, etwas zu tun, anstatt zu gehen. Das von uns verwendete Zeigersymbol macht den CTA besonders überzeugend. Auf mittleren Bildschirmen und darüber sieht es wie folgt aus:



Auf kleineren Bildschirmen sind jedoch alle Elemente gestapelt:



1 |
<section id="request-quote" class="py-5 request-quote bg-lightblue"> |
2 |
<div class="container-fluid container-fluid-max"> |
3 |
<div class="row justify-content-center"> |
4 |
<div class="col-12 col-md-auto py-3 text-center"> |
5 |
<h2 class="mb-0 text-red">...</h2> |
6 |
<p class="mb-0 h4 text-red font-weight-normal">...</p> |
7 |
<div>
|
8 |
<div class="col-12 col-md-auto d-flex justify-content-center align-items-center"> |
9 |
<a class="btn bg-red text-white font-weight-bold" href="" role="button"> |
10 |
... |
11 |
<i class="ml-1 fas fa-hand-point-right"></i> |
12 |
</a>
|
13 |
</div>
|
14 |
</div>
|
15 |
</div>
|
16 |
</section>
|
9. Erstellen Sie die Fußzeile
Wir haben das Ende unserer Zielseitenvorlage erreicht! Die Seitenfußzeile enthält:
- Ein Element mit Copyright-Informationen
- Ein Element mit Links zu verschiedenen Seiten
Auf mittleren Bildschirmen und darüber sollte es folgendermaßen aussehen:



Auf kleineren Bildschirmen ändert sich das Layout wie hier:



1 |
<footer class="py-5 page-footer"> |
2 |
<div class="container-fluid container-fluid-max"> |
3 |
<div class="row"> |
4 |
<div class="col-12 col-md-6 footer-child copyright">...</div> |
5 |
<div class="col-12 col-md-6 footer-child footer-links"> |
6 |
<a href="" class="mr-3">...</a> |
7 |
<a href="">...</a> |
8 |
<div>
|
9 |
<small>...</small> |
10 |
</div>
|
11 |
</div>
|
12 |
</div>
|
13 |
</div>
|
14 |
</footer>
|
Fußzeile CSS
Die Ausrichtung der Fußzeilenlinks ändert sich je nach Größe des Ansichtsfensters. Hier sind die Regeln, die dieses Verhalten bestimmen:
1 |
.page-footer .footer-links { |
2 |
text-align: right; |
3 |
}
|
4 |
|
5 |
@media screen and (max-width: 767px) { |
6 |
.page-footer .footer-child { |
7 |
text-align: center; |
8 |
}
|
9 |
}
|
Schauen wir uns an dieser Stelle unsere Seite an:
10. Fügen Sie einige JavaScript-Aktionen hinzu
Es ist jetzt an der Zeit, JavaScript zu schreiben, um das Erlebnis unserer Seite zu verbessern.
Auf Bildlaufanimationen
Wenn die Seite gescrollt wird, sollte das body-Element die scroll-Klasse erhalten. Diese Klasse ist für folgende Dinge verantwortlich:
- Fügen Sie einer Hintergrundfarbe zum Header hinzu. Beachten Sie, dass das Verhalten nur auf mittleren Bildschirmen und höher auftreten sollte. Denken Sie daran, dass wir bereits eine Hintergrundfarbe für das mobile Menü festgelegt haben.
- Skalieren des ersten Abschnitts.
Lassen Sie uns die entsprechenden Stile noch einmal kurz betrachten:
1 |
.scroll .page-header { |
2 |
background: var(--red); |
3 |
}
|
4 |
|
5 |
.scroll .hero { |
6 |
transform: scale(0.98); |
7 |
}
|
8 |
|
9 |
.page-header { |
10 |
transition: background 0.5s ease-in-out; |
11 |
}
|
12 |
|
13 |
.hero { |
14 |
transition: transform 0.5s ease-in-out; |
15 |
}
|
16 |
|
17 |
@media screen and (max-width: 991px) { |
18 |
.page-header { |
19 |
background: var(--red); |
20 |
}
|
21 |
}
|
Und hier ist der erforderliche JavaScript-Code:
1 |
const $body = $("body"); |
2 |
const $header = $(".page-header"); |
3 |
const scrollClass = "scroll"; |
4 |
|
5 |
$(window).on("scroll", () => { |
6 |
if (this.matchMedia("(min-width: 992px)").matches) { |
7 |
const scrollY = $(this).scrollTop(); |
8 |
scrollY > 0 |
9 |
? $body.addClass(scrollClass) |
10 |
: $body.removeClass(scrollClass); |
11 |
} else { |
12 |
$body.removeClass(scrollClass); |
13 |
}
|
14 |
});
|
Bootstraps Scrollspy wird ausgelöst
Danach möchten wir den aktiven Menü-Link abhängig von der Bildlaufposition automatisch aktualisieren.
Dazu nutzen wir das Scrollspy-Plugin von Bootstrap.
Im Anschluss an die Dokumentation müssen wir das body-Element anpassen, um das Scrollspy-Verhalten für die Navigationselemente auszulösen. Genauer:
- Geben Sie ihm
position:relative - Add
data-spy="scroll" - Fügen Sie
data-target="#navbar"hinzu, wobei#navbardie ID unseresnavbar-Elements ist. Innerhalb dieses Elements befinden sich die Menü-Links, dieactiveKlasse von Scrollspy erhalten sollen. - Add
data-offset="72"wobei 72 die Höhe des Desktop-Headers sowie die Höhe des mobilen Headers ist, wenn das Menü geschlossen wird. Diese Option bestimmt den Menülink, der aktiv wird, sobald der entsprechende Abschnitt 72 Pixel vom oberen Rand des Ansichtsfensters entfernt ist.
Hier sind die erforderlichen Änderungen der Seitenstruktur:
1 |
<body data-spy="scroll" data-target="#navbar" data-offset="72" position-relative> |
2 |
... |
3 |
<nav id="navbar" class="navbar navbar-expand-lg navbar-dark"> |
4 |
... |
5 |
</nav>
|
6 |
... |
7 |
</body>
|
Eine Sache zu beachten ist, dass die Dinge schwierig werden, wenn reaktionsfähige Offsets erforderlich sind. Das heißt, wenn die Kopfzeile je nach Bildschirm eine unterschiedliche Höhe hat (aufgrund der Schriftgröße). In einem solchen Fall funktioniert es nicht, dem data-offset attribut einen statischen Wert zuzuweisen und das Plugin über JavaScript (zusammen mit benutzerdefiniertem Code) zu initialisieren. Dies würde den Rahmen unseres Tutorials an dieser Stelle sprengen.
Hinzufügen von reibungslosem Scrollen zu Logo- und Menü-Links
Schließlich sollte der Browser jedes Mal, wenn wir auf das Logo oder einen Menülink klicken, reibungslos zum entsprechenden Abschnitt scrollen.
Dank der animate-Methode von jQuery können wir diese Funktionalität problemlos erreichen. Hier ist der erforderliche JavaScript-Code:
1 |
$(".page-header .nav-link, .navbar-brand").on("click", function(e) { |
2 |
e.preventDefault(); |
3 |
const href = $(this).attr("href"); |
4 |
$("html, body").animate({ |
5 |
scrollTop: $(href).offset().top - 71 |
6 |
}, 600); |
7 |
});
|
Beachten Sie die Nummer 71 im Code. Diese Zahl wird durch Subtrahieren von 1 von 72 abgeleitet (denken Sie daran, dass dies die Kopfhöhe ist).
Mein erster Versuch war, die Nummer 72 in den obigen Code einzufügen. In einigen Browsern ist jedoch ein Problem aufgetreten (z.B. hat Firefox-Chrome funktioniert). Wenn auf einen Link im Header-Menü geklickt wurde, bekommt dieser Link nicht sofort die erwartete active Klasse (die von der Scrollspy-Komponente stammt). Das hat funktioniert, sobald ich um ein Pixel nach unten gescrollt habe. In diesem Sinne bestand eine einfache Lösung darin, die ursprüngliche Zahl um eins zu verringern.
Abschluss
Das war's alles, Leute! Das war eine lange Reise, aber hoffentlich haben Sie die Mühe wert gefunden. Ich hoffe wirklich, dass diese Übung Ihnen genug Wissen und Inspiration gegeben hat, um mit Bootstrap 4 fantastische Zielseiten zu erstellen. Vergessen Sie nicht, die Vollbildversion zu überprüfen und sicherzustellen, dass sie zu Ihrer Arbeit passt.
In Bezug auf diese Demo könnte ein nächster Schritt darin bestehen, sie dynamisch zu gestalten, indem sie mit einer serverseitigen Sprache verbunden wird. Zum Beispiel wäre es großartig, ein WordPress-Theme basierend auf diesem Layout zu erstellen.
Vielen Dank für das Lesen!
Weitere HTML-Landingpage-Ressourcen
-


StartseitenLanding Page Design-PrinzipienAdi Purdila -


HTMLWie man schnell eine großartige Landing Page mithilfe von Vorlagen erstellen kannBrenda Barron -


StartseitenErstellen einer Landing Page, die konvertiertCraig Campbell -


StartseitenÜber 20 großartige Landingpage-Vorlagen für Produkte (Designbeispiele für 2018)Brenda Barron



