Skip to content

Commit 2fe2333

Browse files
Merge pull request #4 from muhammadowaismushtaq/enhancement/ui-update
Added Loader on Page Load
2 parents 79acc55 + c6e6a45 commit 2fe2333

File tree

3 files changed

+95
-1
lines changed

3 files changed

+95
-1
lines changed

assets/css/style.css

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -974,6 +974,57 @@ textarea.input-field {
974974
transform: translateY(0);
975975
}
976976

977+
/* ===== Preloader Styles ===== */
978+
#preloader {
979+
position: fixed;
980+
inset: 0;
981+
z-index: 9999;
982+
display: flex;
983+
flex-direction: column; /* Stack GIF and text vertically */
984+
align-items: center;
985+
justify-content: center;
986+
text-align: center;
987+
background-color: #0d1013;
988+
transition: opacity 0.45s ease, visibility 0.45s ease;
989+
opacity: 1;
990+
visibility: visible;
991+
}
992+
993+
/* ===== Loader GIF ===== */
994+
#preloader-img {
995+
width: 150px;
996+
height: 150px;
997+
object-fit: contain;
998+
user-select: none;
999+
-webkit-user-drag: none;
1000+
display: block;
1001+
}
1002+
1003+
/* ===== Loading Text ===== */
1004+
.preloader-text {
1005+
margin-top: 12px; /* gap between GIF and text */
1006+
font-family: 'Poppins', sans-serif;
1007+
font-size: 1rem;
1008+
font-weight: 500;
1009+
color: #ffffff; /* you can change to #00A9FF for accent */
1010+
letter-spacing: 2px;
1011+
text-transform: uppercase;
1012+
animation: pulse 1.6s ease-in-out infinite;
1013+
}
1014+
1015+
/* ===== Text Pulse Animation ===== */
1016+
@keyframes pulse {
1017+
0%, 100% { opacity: 0.4; }
1018+
50% { opacity: 1; }
1019+
}
1020+
1021+
/* ===== Fade-out (applied by JS) ===== */
1022+
#preloader.preloader--hidden {
1023+
opacity: 0;
1024+
visibility: hidden;
1025+
pointer-events: none;
1026+
}
1027+
9771028

9781029
/*-----------------------------------*\
9791030
* #MEDIA QUERIES

assets/js/script.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,3 +116,43 @@ navLinks.forEach(link => {
116116
document.body.classList.remove("active");
117117
});
118118
});
119+
120+
/**
121+
* Easy selector helper function (Used in the existing file structure)
122+
*/
123+
const select = (el, all = false) => {
124+
el = el.trim();
125+
if (all) {
126+
return [...document.querySelectorAll(el)];
127+
} else {
128+
return document.querySelector(el);
129+
}
130+
}
131+
132+
/**
133+
* Preloader: fade out after short delay, then remove
134+
*/
135+
let preloader = select('#preloader');
136+
137+
if (preloader) {
138+
window.addEventListener('load', () => {
139+
// ⏳ Force loader to stay for at least 2 seconds
140+
setTimeout(() => {
141+
preloader.classList.add('preloader--hidden');
142+
143+
const onTransitionEnd = (e) => {
144+
if (e.propertyName === 'opacity') {
145+
preloader.removeEventListener('transitionend', onTransitionEnd);
146+
if (preloader.parentNode) preloader.parentNode.removeChild(preloader);
147+
}
148+
};
149+
150+
preloader.addEventListener('transitionend', onTransitionEnd);
151+
152+
// Fallback removal
153+
setTimeout(() => {
154+
if (preloader.parentNode) preloader.parentNode.removeChild(preloader);
155+
}, 1000);
156+
}, 2000); // <-- duration before fade-out (in ms)
157+
});
158+
}

index.html

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,10 @@
4444
</head>
4545

4646
<body class="dark_theme" id="top">
47-
47+
<div id="preloader" aria-hidden="true">
48+
<img src="assets/images/loader-01.gif" alt="Loading…" id="preloader-img" />
49+
<p class="preloader-text">Loading...</p>
50+
</div>
4851
<header class="header" data-header>
4952
<div class="container">
5053
<h1 class="h1 logo">

0 commit comments

Comments
 (0)