- var text = "Drink more water!";
- var sides = 10;

.bottle
	.bottle__sides
		- sides = Math.ceil(sides/2) + 1;
		- while (sides--) {
			.bottle__side
				- for (var t = 0; t < text.length; ++t) {
					span=text[t]
				- }
		- }
View Compiled
$sides: 10;
$transforms:
	// z-pos (ch), angle (deg), y-scale
	(2      0 1) 
	(2      0 1) 
	(2.25 -30 1) 
	(2.75 -30 1.3) 
	(3.25 -30 1.5) 
	(3.5    0 1.75) 
	(3.5    0 1.75) 
	(3.5    0 1.75) 
	(3.3   15 1.5) 
	(3     15 1.4) 
	(2.8    0 1.3) 
	(2.8    0 1.3) 
	(3    -15 1.4) 
	(3.3  -15 1.5) 
	(3.5    0 1.75) 
	(3.5    0 1.75) 
	(3.25  15 1.5);

* {
	border: 0;
	box-sizing: border-box;
	margin: 0;
	padding: 0;
}
:root {
	font-size: calc(24px + (36 - 24)*(100vw - 320px)/(1280 - 320));
}
body {
	background: #0b46da;
	color: #ffffff;
	display: flex;
	font: bold 1em/1.5 "DM Mono", monospace;
	height: 100vh;
	text-transform: uppercase;
}
.bottle {
	margin: auto;
	perspective: 25em;
	position: relative;
	width: 11em;
	height: 11em;
	&__sides, &__side {
		position: absolute;
		top: 50%;
		left: 0;
		transform-style: preserve-3d;
	}
	&__sides {
		animation: spin 1s linear infinite;
		top: 0;
		width: 100%;
		height: 100%;
		transform: rotateZ(90deg) rotateX(-90deg);
	}
	&__side {
		display: flex;
		$visibleSides: ceil($sides/2) + 1;
		@for $s from 1 through $sides {
			&:nth-child(#{$s}) {
				$rotateX: 360deg/$sides * ($s - 1);
				transform: translateY(-50%) rotateX($rotateX);
			}
		}
		span {
			backface-visibility: hidden;
			-webkit-backface-visibility: hidden;
			display: inline-block;
			width: 1ch;
			@for $c from 1 through length($transforms) {
				&:nth-child(#{$c}) {
					transform:
						translateZ(0ch + nth(nth($transforms,$c),1)) 
						rotateY(0deg + nth(nth($transforms,$c),2)) 
						scaleY(nth(nth($transforms,$c),3));
				}
			}
		}
	}
}

@keyframes spin {
	from {
		transform: rotateZ(90deg) rotateX(-90deg);
	}
	to {
		transform: rotateZ(90deg) rotateX(-90deg + 360deg/$sides);
	}
}
View Compiled

External CSS

  1. https://fonts.googleapis.com/css2?family=DM+Mono:wght@400;500&amp;display=swap

External JavaScript

This Pen doesn't use any external JavaScript resources.