15 - Du CSS et Sass avec la création de la page d'accueil (Symfony 7)

Temps de lecture : 19 minutes environ.

Dans ce tutoriel, nous allons continuer à travailler sur le projet OpenBlog, en nous concentrant sur la finalisation de la page d'accueil. Nous allons aborder des aspects avancés du SCSS en utilisant des boucles, des variables, et une gestion plus intelligente des composants réutilisables dans la conception de la page. Vous verrez également comment gérer le responsive design de manière fluide, en utilisant une approche mobile-first.

Ce tutoriel repose sur la base de code OpenBlog.

Objectifs du tutoriel

  • Finaliser la mise en page de la page d’accueil, en particulier l’en-tête et la grille des articles.
  • Utiliser des variables SCSS et des boucles pour améliorer la gestion des marges et des espacements.
  • Créer des composants réutilisables (badges, cartes) pour une meilleure organisation du CSS.
  • Appliquer une approche responsive avec des media queries et des breakpoints.

Mise à jour du fichier index.html.twig

Nous allons commencer par adapter le fichier HTML de la page d’accueil en y ajoutant des éléments comme des cartes d’articles, un header, et des badges. Voici à quoi ressemble la structure :

{% extends 'base.html.twig' %}

{% block title %}Accueil{% endblock %}

{% block body %}
<header class="hero">
<img src="{{ asset('uploads/articles/') ~ lastPost.featuredImage }}" alt="{{ lastPost.title }}">
<div class="hero-content">
{% for category in lastPost.categories %}
<span class="badge badge-primary badge-lg">{{ category.name }}</span>
{% endfor %}
<h2>{{ lastPost.title }}</h2>
<div class="post-content">{{ lastPost.content }}</div>
<p>{{ lastPost.users.nickname }}</p>
</div>
</header>
<div class="clear"></div>
<main class="container">
<section>
<h2 class="text-center my-5">Derniers articles</h2>
<div class="grid">
{% for post in posts %}
<article class="card">
<img src="{{ asset('uploads/articles/mini/300x300-') ~ post.featuredImage }}" alt="{{ post.title }}">
<div class="card-body">
{% for category in post.categories %}
<span class="badge badge-primary">{{ category.name }}</span>
{% endfor %}
<h3>{{ post.title }}</h3>
<p>{{ post.users.nickname }}</p>
</div>
</article>
{% endfor %}
</div>

</section>
<section>
<h2>Auteurs actifs</h2>
{% for author in authors %}
<h3>{{ author[0].nickname }} {{author.total}}</h3>
{% endfor %}
</section>
</main>
{% endblock %}

Gestion des espacements avec SCSS

Dans cette section, nous allons créer un système d’espacement basé sur des variables SCSS pour gérer les marges et paddings.

Création des variables

Commençons par créer un fichier _variables.scss dans lequel nous allons définir des variables pour les espacements et les couleurs.

$primary: #657ae7;
$sizes: (
0: 0,
1: 0.25rem,
2: 0.5rem,
3: 1rem,
4: 1.5rem,
5: 3rem
)

Création des classes d'espacement

Ensuite, nous allons créer un fichier _spacing.scss pour générer dynamiquement les classes de marge et de padding à l’aide d’une boucle SCSS.

/*
* Margins
*/
@each $key, $value in $sizes{
// .m-0, .m-1...
.m-#{$key} {
margin: #{$value};
}
.mt-#{$key} {
margin-top: #{$value};
}
.mb-#{$key} {
margin-bottom: #{$value};
}
.ml-#{$key} {
margin-left: #{$value};
}
.mr-#{$key} {
margin-right: #{$value};
}
.my-#{$key} {
margin-top: #{$value};
margin-bottom: #{$value};
}
.mx-#{$key} {
margin-left: #{$value};
margin-right: #{$value};
}
}
/*
* Paddings
*/
@each $key, $value in $sizes{
// .m-0, .m-1...
.p-#{$key} {
padding: #{$value};
}
.pt-#{$key} {
padding-top: #{$value};
}
.pb-#{$key} {
padding-bottom: #{$value};
}
.pl-#{$key} {
padding-left: #{$value};
}
.pr-#{$key} {
padding-right: #{$value};
}
.py-#{$key} {
padding-top: #{$value};
padding-bottom: #{$value};
}
.px-#{$key} {
padding-left: #{$value};
padding-right: #{$value};
}
}

En important ce fichier dans notre fichier principal app.scss, nous obtenons automatiquement des classes comme .m-3, .p-2, .mt-4, etc., pour appliquer les marges et paddings de manière efficace.

@import 'spacing';

Création des composants réutilisables

Les badges

Les badges sont des petits éléments visuels utilisés pour mettre en avant des informations. Nous allons les créer dans un fichier _badge.scss.

.badge{
&.badge-primary{
background-color: $primary;
color: #fff;
border-radius: 5px;
font-size: 0.8rem;
padding: 4px;
font-weight: 700;
}
&.badge-lg{
font-size: 1rem;
padding: 5px;
}
}

Les cartes d’articles

Les cartes affichent chaque article dans une boîte avec une image, un titre et un extrait. Nous les définissons dans _card.scss.

.card{
box-shadow: 0 4px 4px rgba(0, 0, 0, 0.25);
img{
width: 100%;
}
.card-body{
padding: 15px;
}
}
@media screen and (min-width: 768px){
.card{
border-radius: 15px;
overflow: hidden;
}
}

Ces cartes s’adaptent automatiquement à leur conteneur grâce à l’utilisation de flexbox ou de grid.

Gestion du design responsive

Nous utilisons une approche mobile-first, où les styles de base sont conçus pour les petits écrans, et des media queries sont ajoutées pour les écrans plus grands.

Le système de grille

Nous créons un fichier _grid.scss pour gérer la disposition des articles en grille.

.grid {
display: grid;
gap: 30px;
}
@media screen and (min-width: 768px) {
.grid{
grid-template-columns: 1fr 1fr 1fr;
}
}
@media screen and (min-width: 992px) {
.grid{
grid-template-columns: repeat(4, 1fr);
}
}
@media screen and (min-width: 1200px) {
.grid{
grid-template-columns: repeat(5, 1fr);
}
}
@media screen and (min-width: 1500px) {
.grid{
grid-template-columns: repeat(6, 1fr);
}
}

Cette grille s'adapte aux différentes résolutions d’écran, passant d'une colonne en mobile à plusieurs colonnes sur desktop.

Les media queries pour l’en-tête

Le fichier _hero.scss contient les styles spécifiques à l’en-tête de la page d’accueil.

header{
position: relative;
margin-top: 0;
margin-bottom: 60px;
img{
width: 100%;
}
.hero-content{
position: absolute;
left: 25px;
right: 25px;
bottom: -50px;
background-color: #fff;
box-shadow: 0 4px 4px rgba(0, 0, 0, 0.25);
padding: 15px;
.post-content{
display: none;
}
}
}
@media screen and (min-width: 768px) {
header{
max-width: 700px;
margin: 1rem auto 60px;
margin-top: 1rem;
img{
border-radius: 15px;
}
.hero-content{
left: 80px;
right: 50%;
border-radius: 15px;
}
}
}
@media screen and (min-width: 992px) {
header{
max-width: 900px;
.hero-content{
.post-content{
display: initial;
}
}
}
}
@media screen and (min-width: 1200px) {
header{
max-width: 1100px;
}
}
@media screen and (min-width: 1500px) {
header{
max-width: 1400px;
}
}
@media screen and (min-width: 1900px) {
header{
max-width: 1700px;
}
}

Résultat final

Le résultat final est une page d’accueil moderne et responsive, où :

  • Les badges s’adaptent aux différentes résolutions.
  • Les cartes d’articles sont disposées en grille, avec des colonnes qui changent en fonction de la taille de l’écran.
  • L’en-tête (hero) change également de forme pour s'adapter aux écrans de petite ou grande taille.

Conclusion

Grâce à ce tutoriel, vous avez appris à utiliser des outils avancés de SCSS pour gérer les espacements, les composants réutilisables comme les badges et les cartes, ainsi que le responsive design. Ce système vous permet de créer une page d'accueil flexible et maintenable, qui s’adapte à différents types d’appareils, tout en restant propre et optimisée.

N’hésitez pas à explorer et à adapter ces concepts pour d’autres parties de votre projet OpenBlog.

Obtenir de l'aide

Pour obtenir de l'aide, vous pouvez accéder au serveur Discord pour une entraide par chat.

15 - Du CSS et Sass avec la création de la page d'accueil (Symfony 7)
Article publié le

Catégories : Symfony Symfony 7

Mots-clés : Symfony css css3 Sass Scss Symfony 7

Partager : Partager sur Facebook Partager sur Twitter Partager sur LinkedIn