Portfolio one-page moderne développé en JavaScript vanilla avec architecture modulaire et performances optimisées.
Ce portfolio a été conçu avec les priorités suivantes :
- Performance : Chargement ultra-rapide sans frameworks lourds
- Accessibilité : Navigation intuitive et responsive
- Maintenabilité : Code propre, commenté et modulaire
- UX/UI moderne : Animations fluides et design épuré
Frontend Pure
├── HTML5 sémantique
├── CSS3 (variables, flexbox, grid)
├── JavaScript ES6+ vanilla
└── Font Awesome 6.5.1 (icônes)
portfolio/
├── index.html # Structure HTML sémantique
├── styles.css # Styles avec variables CSS
├── script.js # Logique applicative
├── projects.json # Base de données des projets
├── images/ # Assets optimisés
│ ├── profil.jpg
│ ├── IMG_2212.JPG
│ └── CDFR2026/
└── README.md
Le projet utilise un système de variables CSS pour une personnalisation facile :
:root {
--primary-color: #2563eb;
--secondary-color: #7c3aed;
--accent-color: #06b6d4;
--bg-color: #ffffff;
--text-color: #1e293b;
}- Détection et sauvegarde des préférences utilisateur
- Toggle manuel avec icône animée
- Transition fluide entre les modes
- Persistence avec
localStorage
Breakpoints optimisés :
- Desktop : 1200px+ (3 colonnes de projets)
- Tablette : 768px-1199px (2 colonnes)
- Mobile : <768px (1 colonne, menu caché)
@media (max-width: 768px) {
.navbar { background-color: transparent; }
.tech-items { grid-template-columns: 1fr; }
}// Intersection Observer pour animations au scroll
const observer = new IntersectionObserver(entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
}
});
});- Chargement JSON asynchrone avec
fetch() - Rendu dynamique des cartes
- Filtrage côté client sans rechargement
- Transform : Scale, translateY pour les hover
- Transitions : 0.3s ease pour fluidité
- Keyframes : Gradient animé, typing effect, bounce
// Typing effect du hero
const texts = [
{ text: "Explorateur de ", highlight: "Technologies" },
{ text: "Créateur de ", highlight: "Projets" },
{ text: "Chercheur d'", highlight: "Idées ingénieuses" }
];- Smooth scroll vers les sections
- Active state automatique selon la position
- Sticky navbar avec effet au scroll
- Scroll indicator animé sur le hero
.tech-group
.tech-group-title
.tech-item
.tech-item:hover- Fonctionne sans JavaScript (navigation basique)
- Améliorations progressives (animations, filtres)
.tech-items {
grid-template-columns: 1fr; /* Mobile par défaut */
}
@media (min-width: 768px) {
.tech-items {
grid-template-columns: repeat(2, 1fr); /* Desktop */
}
}- Variables CSS réutilisables
- Classes utilitaires (
.section-title,.btn) - Fonctions JavaScript modulaires
- ⚡ Performance : 95+
- ♿ Accessibility : 90+
- 🎯 Best Practices : 95+
- 🔍 SEO : 90+
- ✅ Minification CSS/JS potentielle
- ✅ Images optimisées (< 500KB)
- ✅ Utilisation de
object-fit: cover - ✅ Lazy loading des images projets
- ✅ Pas de frameworks lourds (React, Vue, etc.)
- ✅ CSS critique inline potentiel
- Background image avec overlay
- Typing effect animé
- CTA buttons avec hover effects
- Scroll indicator bounce animation
.project-card {
display: flex;
flex-direction: column;
transition: transform 0.3s ease;
}
.project-card:hover {
transform: translateY(-5px);
box-shadow: var(--shadow-lg);
}.tech-item:hover {
background: linear-gradient(135deg,
var(--primary-color),
var(--secondary-color));
transform: scale(1.05);
}filterButtons.forEach(button => {
button.addEventListener('click', () => {
const filter = button.dataset.filter;
filterProjects(filter);
});
});Dans styles.css, lignes 4-23 :
:root {
--primary-color: #2563eb; /* Couleur principale */
--secondary-color: #7c3aed; /* Couleur secondaire */
--accent-color: #06b6d4; /* Accent */
--border-radius: 12px; /* Rayon des bordures */
}Dans projects.json :
{
"title": "Nom du projet",
"category": "electronique | robotique | programmation",
"date": "Mois AAAA",
"description": "Description détaillée",
"technologies": ["Tech1", "Tech2"],
"image": "chemin/image.jpg",
"link": "https://github.com/..."
}Structure HTML modulaire dans index.html :
<section id="nom-section" class="nom-classe">
<div class="container">
<h2 class="section-title">Titre</h2>
<!-- Contenu -->
</div>
</section>- Push sur la branche
main - Settings → Pages → Source: main / root
- Site disponible à :
username.github.io/portfolio/
- Service Worker pour offline support
- WebP avec fallback pour images
- Critical CSS inline
- Preload des fonts
- Schema.org markup pour SEO
- Formulaire de contact avec validation
- Blog avec Markdown
- Recherche full-text dans projets
- i18n (multi-langues)
- Analytics privacy-friendly
Option 1 : Live Server (VS Code)
# Extension: ritwickdey.liveserver
Right-click index.html → Open with Live ServerOption 2 : Python
python -m http.server 8000
# → http://localhost:8000Option 3 : Node.js
npx serve .
# → http://localhost:3000- Chrome DevTools (F12)
- Firefox Responsive Design Mode (Ctrl+Shift+M)
- BrowserStack pour tests réels
- ✅ Sémantique (header, nav, section, article)
- ✅ Attributs alt sur images
- ✅ Meta description et Open Graph
- ✅ Aria labels sur boutons
- ✅ Variables CSS pour maintenabilité
- ✅ Mobile-first media queries
- ✅ Transitions sur interactions
- ✅ Pas de !important (sauf exceptions)
- ✅ ES6+ (const, let, arrow functions)
- ✅ Event delegation
- ✅ Async/await pour fetch
- ✅ Error handling
- ✅ Minification potentielle
- ✅ Compression gzip/brotli
- ✅ Caching headers optimaux
- ✅ CDN pour Font Awesome
Code disponible sous licence MIT pour consultation et apprentissage.
Développé avec ❤️ en JavaScript vanilla | Hébergé sur GitHub Pages