main.halloctober.p-flex
	.halloctober__banner.p-flex
		h1.typo Spooky
		.fog.p-circle
//- If you change the h1 word, don't forget to also replace it in the CSS before/after pseudo elements created for the text-shadow effects.
View Compiled
:root {
	// COLOR CSS VARIABLES
	--color_base: #191919; // Black 
	--color_pen: #fff; // White
	
	// SIZE VARIABLES
	--size: 20vmin; // Resize typo by only editing this variable
	--fog: calc(var(--size) / 1.2);
	--scale: 4.8; // Increase/decrease fog's size animation effect. Specially if you change the HTML h1, you might need to tweak this value.
}

// MIXINS
@mixin size($w, $h: $w) {
	width: $w;
	height: $h;
}

// PATTERNS
.p-flex {
	display: flex;
}

.p-circle {
	border-radius: 50%;
}

// LAYOUT
body {
	height: 100vh;
	background-color: var(--color_base);
	margin: 0;
	overflow: hidden;
}

::selection {
	background-color: transparent;
}

.halloctober {
	@include size(100%);
	
	&__banner {
		margin: auto; // Center magic after parent's display flex
		padding: 3%;
		position: relative; // To place fog
		overflow: hidden;
	}
}

// TYPOGRAPHY
.typo {
	color: var(--color_pen);
	cursor: default;
	font-family: 'Fredoka One', sans-serif;
	font-size: var(--size);
	font-weight: normal;
	letter-spacing: 0.1rem;
	margin: auto; // Center magic
	outline: none;
	position: relative; // To place text-shadows
	
	&:hover {
		+ .fog {
			animation-play-state: paused;
		}
	}
	
	$red: #b30808; 
	$blue: #1A237E; 
	$anim: 2s ease-in-out infinite;

	// Text Shadow Effects
	// We add them here to improve animation's performance
	&::before,
	&::after {
		color: transparent;
		content: 'Spooky'; // Same word as in HTML h1
		position: absolute;
		top: 0;
		left: 0;
		z-index: -10;
	}
	
	// Upper Shadow
	&::before {
		animation: move_upper_shadow $anim;
		opacity: 0;
		text-shadow: 
			6px 0 2px rgba($red, 0.4),
			12px 0 2px rgba($blue, 0.3);
	}
	
	// Bottom Shadow
	&::after {
		animation: move_bottom_shadow $anim;
		text-shadow: 
			2px 4px 2px rgba($red, 0.4),
			4px 8px 2px rgba($blue, 0.3);
	}

	transform: skew(10deg, 2deg);
	animation: float $anim;
	@at-root {		
		@keyframes move_upper_shadow {
			0%, 90%, 100% {
				opacity: 0;
				transform: translateX(-2%);
			}
			30% {
				opacity: 1;
				transform: translateX(0);
			}
		}
		@keyframes move_bottom_shadow {
			0%, 90%, 100% {
				opacity: 1;
				transform: translate(0, 0);
			}
			30% {
				opacity: 0;
				transform: translateY(-3.5%);
			}
		}
		@keyframes float {
			50% {
				transform: scaleY(1.01) skew(-10deg, -2deg);
			}
		}
	}
	@media (prefers-reduced-motion: reduce) {
		animation: none;
		transform: none;
		
		&::before,
		&::after {
			animation: none;
		}
	}
}

.fog {
	--fog_neg: calc(var(--fog) * -1);
		
	@include size(var(--fog));
	background-color: var(--color_base);
	position: absolute;
	top: var(--fog_neg);
	left: var(--fog_neg);
	
	transform: translate3d(0, 0, 0); // Fixes Safari mouseover flickering bug
	transform-origin: 0 50%; // Fixes Firefox laggy animation bug and smooths animation across Browsers
	animation: move_fog 13s 2s ease-in-out alternate infinite;
	@at-root {
		@keyframes move_fog {
			50% {
				transform: scale(var(--scale));
			}
		}
	}
	@media (prefers-reduced-motion: reduce) {
		animation: none;
	}
	
	// Blurry Effect
	&::after {
		--blur: calc(var(--fog) * 2);
		--blur_neghalf: calc(var(--blur) / -2);
		--filter: calc(var(--fog) / 30);
		
		@extend .p-circle;
		
		@include size(var(--blur));
		content: '';
		background-color: var(--color_base);
		filter: blur(var(--filter));
		margin-top: var(--blur_neghalf);
		margin-left: var(--blur_neghalf);
		position: absolute;
		top: 50%;
		left: 50%;
	}
}
View Compiled
/* 
 * PURE CSS SPOOKY TYPO
 * Yet another Spooky Pen :)
 *
 * Experimenting with a CSS blur filter, text-shadow, and transform skew effects animated. Pause the animation on typo mouseover, not fog. 
 * On mobile touch typo to pause and touch anywhere else on the screen to run it again.
 * Firefox mouseover/touch is not as smooth x.x
 *
 * Prefers-reduced-motion is applied. To test it:
 * Windows 10, Settings > Ease of Access > Display > Show animations.
 * MacOS, System Preferences > Accessibility > Display > Reduce motion.
 *
 * #halloctober
 * #018 - #100DaysOfCode
 * By ilithya | 2019
 */

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.