.container
	h1 Fancy CSS Loaders
	p Single element pure CSS spinners & loaders
	.loader-list
		.loader-item
			.loader.loader-1
		.loader-item
			.loader.loader-2
		.loader-item
			.loader.loader-3

		.loader-item
			.loader.loader-4
		.loader-item
			.loader.loader-5
		.loader-item
			.loader.loader-6

		.loader-item
			.loader.loader-7
		.loader-item
			.loader.loader-8
		.loader-item
			.loader.loader-9
View Compiled
@import url('https://fonts.googleapis.com/css?family=Delius+Unicase')

*, *::before, *::after
	box-sizing: border-box

html, body
	width: 100%
	height: 100%
	display: flex
	background: #00ACC1
	color: #80DEEA
	font-family: 'Delius Unicase', cursive

h1, p
	width: 100%
	text-align: center

h1
	margin: 0 0 10px

p
	font-size: 10px
	margin: 0 0 50px

.container
	margin: auto

.loader
	width: 30px
	height: 30px
	position: relative
	margin: auto

	&::before, &::after
		content: ''
		position: absolute

	&-list
		display: grid
		grid-template: repeat(3, 120px) / repeat(3, 120px)
		grid-gap: 30px
	
	&-item
		display: flex
		background: rgba(0, 0, 0, 0.05)
		
.loader-1
	&::before, &::after
		border-radius: 50%
		width: 100%
		height: 100%
		top: calc(50% - 15px)
		left: calc(50% - 15px)
		animation:
			duration: 3s
			timing-function: linear
			iteration-count: infinite
	&::before
		border:
			style: solid
			width: 3px 3px 3px 0
			color: #fff transparent transparent
		transform: scale(0.3) rotate(0deg)
		opacity: 0.5
		animation-name: foregroundCircle
	&::after
		background: #fff
		opacity: 0.5
		transform: scale(0)
		animation-name: backgroundCircle

@keyframes foregroundCircle
	0%
		transform: scale(0.3) rotate(0deg)
	12.5%
		transform: scale(0.3) rotate(180deg)
	25%, 50%
		opacity: 1
	50%
		transform: scale(1) rotate(720deg)
	100%
		transform: scale(0.3) rotate(1800deg)
		opacity: 0.5

@keyframes backgroundCircle
	12.5%
		transform: scale(0.3)
	90%, 100%
		transform: scale(2)
		opacity: 0

.loader-2
	perspective: 500px
	transform-style: preserve-3d
	transform: rotate3d(2, 1, -1, 90deg)
	&::before, &::after
		border-radius: 50%
		width: 16px
		height: 16px
		top: calc(50% - 8px)
		background: #fff
		animation:
			duration: 3s
			timing-function: linear
			iteration-count: infinite
	&::before
		left: 0
		opacity: 0.7
		border-top-right-radius: 0
		transform-origin: right top
		animation-name: flapL
	&::after
		left: 50%
		opacity: 0.5
		border-top-left-radius: 0
		transform-origin: left top
		animation-name: flapR

@keyframes flapL
	25%, 50%
		transform: rotateY(-45deg)
	12.5%, 37.5%, 65%
		transform: rotateY(45deg)
	0%, 100%
		transform: rotateY(-30deg)

@keyframes flapR
	25%, 50%
		transform: rotateY(45deg)
	12.5%, 37.5%, 65%
		transform: rotateY(-45deg)
	0%, 100%
		transform: rotateY(30deg)

.loader-3
	&::before, &::after
		border-radius: 50%
		animation:
			duration: 1s
			timing-function: ease-in-out
			iteration-count: infinite
	&::before
		width: 16px
		height: 16px
		top: calc(50% - 8px) 
		left: calc(50% - 8px)
		border-bottom-right-radius: 0
		box-shadow: 0 0 0 2px #fff
		background: radial-gradient(transparent 0, transparent 3px, #fff 3px)
		transform: rotate(45deg)
		animation-name: mapPin
	&::after
		width: 4px
		height: 2px
		opacity: 0.8
		top: 100%
		left: calc(50% - 2px)
		background: #fff
		animation-name: mapPinShadow
	
@keyframes mapPin
	50%
		transform: rotate(45deg) translate(-50%, -50%)

@keyframes mapPinShadow
	50%
		transform: scaleX(3)
		opacity: 0.2
		
.loader-4
	&::before, &::after
		border-radius: 50%
		width: 8px
		height: 8px
		background: #fff
		top: calc(50% - 4px)
		animation:
			duration: 1s
			timing-function: linear
			iteration-count: infinite
	&::before
		left: 0
		animation-name: firstDot
	&::after
		right: 0
		opacity: 0.8
		animation-name: secondDot
	
@keyframes firstDot
	0%, 50%
		transform-origin: 15px center
	50%
		transform: rotateZ(180deg)
	51%, 100%
		transform-origin: center
	51%
		transform: rotateZ(180deg) translateX(-22px)
	100%
		transform: rotateZ(180deg) translateX(0)

@keyframes secondDot
	0%, 50%
		transform: rotateZ(-180deg)
	51%, 100%
		transform-origin: -8px center

.loader-5
	&::before, &::after
		border-radius: 50%
		background: #fff
		width: 16px
		height: 16px
		top: calc(50% - 8px)
		left: calc(50% - 8px)
		animation:
			duration: 2s
			timing-function: ease-in-out
			iteration-count: infinite
	&::before
		opacity: 0.7
		animation-name: upperDot
	&::after
		opacity: 0.5
		animation-name: lowerDot
	
@keyframes upperDot
	25%
		transform: translateY(-50%)
	47.5%, 52.5%
		transform: translateY(0)
	75%
		transform: translateY(50%)

@keyframes lowerDot
	25%
		transform: translateY(50%)
	47.5%, 52.5%
		transform: translateY(0)
	75%
		transform: translateY(-50%)

.loader-6
	border-radius: 50%
	width: 4px
	height: 4px
	background: #fff
	animation-name: pacmanDot
	transform: translateX(14px)
	&::before, &::after
		border-radius: 50%
		border: 14px solid #fff
		border-right-color: transparent
		top: -12px
		left: -24px
	&, &::before, &::after
		animation:
			duration: .5s
			timing-function: linear
			iteration-count: infinite
	&::before
		animation-name: upperJaw
	&::after
		animation-name: lowerJaw
	
@keyframes pacmanDot
	0%, 50%
		background: #fff
	51%, 100%
		background: none
	0%, 100%
		transform: translateX(19px)
	50%
		transform: translateX(14px)

@keyframes upperJaw
	50%
		transform: rotate(50deg) translate(2px, -2px)

@keyframes lowerJaw
	50%
		transform: rotate(-50deg) translate(2px, 2px)

.loader-7
	border: 1px solid #fff
	height: 14px
	width: 32px
	&::before
		width: 4px
		height: 10px
		background: #fff
		left: 1px
		top: calc(50% - 5px)
		animation: blockBar 2s infinite
	
@keyframes blockBar
	0%, 80%
		opacity: 1
	0%, 20%
		box-shadow: 8px 0 0 0 rgba(255, 255, 255, 0), 16px 0 0 0 rgba(255, 255, 255, 0), 24px 0 0 0 rgba(255, 255, 255, 0)
	21%, 40%
		box-shadow: 8px 0 0 0 rgba(255, 255, 255, 1), 16px 0 0 0 rgba(255, 255, 255, 0), 24px 0 0 0 rgba(255, 255, 255, 0)
	41%, 60%
		box-shadow: 8px 0 0 0 rgba(255, 255, 255, 1), 16px 0 0 0 rgba(255, 255, 255, 1), 24px 0 0 0 rgba(255, 255, 255, 0)
	61%, 80%
		box-shadow: 8px 0 0 0 rgba(255, 255, 255, 1), 16px 0 0 0 rgba(255, 255, 255, 1), 24px 0 0 0 rgba(255, 255, 255, 1)
	81%, 100%
		opacity: 0

.loader-8
	&::before, &::after
		border-radius: 50%
		width: 10px
		height: 10px
		top: calc(50% - 5px)
		left: calc(50% - 5px)
		animation:
			duration: 3s
			timing-function: linear
			iteration-count: infinite
	&::before
		background: #fff
		animation-name: droplets
	&::after
		border: 1px solid #fff
		opacity: 0
		animation-name: ripples
	
@keyframes droplets
	0%, 15%
		opacity: 1
	15%
		transform: scale(.5)
	60%
		transform: scale(4)
	60%, 90%
		opacity: 0
	90%
		transform: scale(3)
	95%, 100%
		opacity: 1
	100%
		transform: scale(1)

@keyframes ripples
	0%, 30%
		opacity: 0
		transform: scale(1)
	60%
		opacity: .3
	90%
		transform: scale(3)
	100%
		opacity: 0
		
		
.loader-9
	border: 1px solid rgba(255, 255, 255, 0.3)
	border-radius: 50%
	animation: counterClockwise 4s linear infinite
	&::before, &::after
		border-radius: 50%
	&::before
		width: 8px
		height: 8px
		background: #fff
		animation: clockwise 4s linear infinite
	&::after
		width: 4px
		height: 4px
		top: 8px
		left: 8px
		background: #fff
		transform-origin: -4px -4px
		animation: counterClockwise 1s linear infinite
	
@keyframes clockwise
	to
		transform: rotate(1turn)
	
@keyframes counterClockwise
	to
		transform: rotate(-1turn)
View Compiled

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.