Pen Settings

HTML

CSS

CSS Base

Vendor Prefixing

Add External Stylesheets/Pens

Any URLs added here will be added as <link>s in order, and before the CSS in the editor. You can use the CSS from another Pen by using its URL and the proper URL extension.

+ add another resource

JavaScript

Babel includes JSX processing.

Add External Scripts/Pens

Any URL's added here will be added as <script>s in order, and run before the JavaScript in the editor. You can use the URL of any other Pen and it will include the JavaScript from that Pen.

+ add another resource

Packages

Add Packages

Search for and use JavaScript packages from npm here. By selecting a package, an import statement will be added to the top of the JavaScript editor for this package.

Behavior

Auto Save

If active, Pens will autosave every 30 seconds after being saved once.

Auto-Updating Preview

If enabled, the preview panel updates automatically as you code. If disabled, use the "Run" button to update.

Format on Save

If enabled, your code will be formatted when you actively save your Pen. Note: your code becomes un-folded during formatting.

Editor Settings

Code Indentation

Want to change your Syntax Highlighting theme, Fonts and more?

Visit your global Editor Settings.

HTML

              
                <div class="scene">
	<div class="texture"></div>
	<div class="texture"></div>
	<div class="texture"></div>
	<div class="texture"></div>
	<div class="texture"></div>
	<div class="character"></div>
</div>

<div id="debug">
	<form>
		<input type="checkbox" id="debug-toggle">
		<label for="debug-toggle">Debug</label>
	</form>

	<ul>
		<li data-id="--scroll-block-position"></li>
		<li data-id="--scroll-block-position-delayed"></li>
		<li data-id="--scroll-block-velocity"></li>
		<li data-id="--scroll-block-direction"></li>
		<li data-id="--scroll-block-speed"></li>
	</ul>

	<ul>
		<li data-id="--scroll-inline-position"></li>
		<li data-id="--scroll-inline-position-delayed"></li>
		<li data-id="--scroll-inline-velocity"></li>
		<li data-id="--scroll-inline-direction"></li>
		<li data-id="--scroll-inline-speed"></li>
	</ul>
</div>
              
            
!

CSS

              
                /*
	Directional control concept from https://www.bram.us/2023/10/23/css-scroll-detection/#the-concept
	Multi axis demo without the frills https://codepen.io/jbasoo/pen/NWoNvLx
	Graphical assets from https://cupnooble.itch.io/sprout-lands-asset-pack and https://axulart.itch.io/small-8-direction-characters
*/

/* Block */
@property --scroll-block-position {
	syntax: "<number>";
	inherits: true;
	initial-value: 0;
}

@property --scroll-block-position-delayed {
	syntax: "<number>";
	inherits: true;
	initial-value: 0;
}

@property --scroll-block-direction {
	syntax: "<number>";
	inherits: true;
	initial-value: 0;
}

@keyframes adjust-block-pos {
	to {
		--scroll-block-position: 1;
		--scroll-block-position-delayed: 1;
	}
}

/* Inline */
@property --scroll-inline-position {
	syntax: "<number>";
	inherits: true;
	initial-value: 0;
}

@property --scroll-inline-position-delayed {
	syntax: "<number>";
	inherits: true;
	initial-value: 0;
}

@property --scroll-inline-direction {
	syntax: "<number>";
	inherits: true;
	initial-value: 0;
}

@keyframes adjust-inline-pos {
	to {
		--scroll-inline-position: 1;
		--scroll-inline-position-delayed: 1;
	}
}

:root {
	animation: adjust-block-pos linear, adjust-inline-pos linear;
	animation-timeline: scroll(nearest block), scroll(nearest inline);
}

body {
  /* Block */
	transition: --scroll-block-position-delayed .1s linear, --scroll-inline-position-delayed .06s linear;
	--scroll-block-velocity: calc(var(--scroll-block-position) - var(--scroll-block-position-delayed));
	--scroll-block-speed: max(var(--scroll-block-velocity), -1 * var(--scroll-block-velocity)); /* abs(var(--scroll-block-velocity)); */
	--scroll-block-direction: calc(var(--scroll-block-velocity) / var(--scroll-block-speed)); /* sign(var(--scroll-block-velocity)); */

	--when-block-scrolling: abs(var(--scroll-block-direction));
	--when-not-block-scrolling: abs(var(--when-scrolling) - 1);

	--when-scrolling-up: min(abs(var(--scroll-block-direction) - abs(var(--scroll-block-direction))),	1);
	--when-scrolling-down: min(var(--scroll-block-direction) + abs(var(--scroll-block-direction)), 1);

	--when-scrolling-up-or-when-not-block-scrolling: clamp(0, abs(var(--scroll-block-direction) - 1), 1);
	--when-scrolling-down-or-when-not-block-scrolling: clamp(0, var(--scroll-block-direction) + 1, 1);
	
	--scroll-inline-velocity: calc(var(--scroll-inline-position) - var(--scroll-inline-position-delayed));
  --scroll-inline-speed: max(var(--scroll-inline-velocity), -1 * var(--scroll-inline-velocity)); /* abs(var(--scroll-inline-velocity)); */
  --scroll-inline-direction: calc(var(--scroll-inline-velocity) / var(--scroll-inline-speed)); /* sign(var(--scroll-inline-velocity)); */

  --when-inline-scrolling: abs(var(--scroll-inline-direction));
  --when-not-inline-scrolling: abs(var(--when-scrolling) - 1);

  --when-scrolling-left: min(abs(var(--scroll-inline-direction) - abs(var(--scroll-inline-direction))),	1);
  --when-scrolling-right: min(var(--scroll-inline-direction) + abs(var(--scroll-inline-direction)), 1);

  --when-scrolling-left-or-when-not-inline-scrolling: clamp(0, abs(var(--scroll-inline-direction) - 1), 1);
  --when-scrolling-right-or-when-not-inline-scrolling: clamp(0, var(--scroll-inline-direction) + 1, 1);
}

#debug {
  counter-reset:
    /* Block */
    scroll-block-position calc(var(--scroll-block-position) * 100)
    scroll-block-position-delayed calc(var(--scroll-block-position-delayed) * 100)
    scroll-block-velocity calc(var(--scroll-block-velocity) * 100)
    scroll-block-direction var(--scroll-block-direction)
    scroll-block-speed calc(var(--scroll-block-speed) * 100)
    
    /* Inline */
    scroll-inline-position calc(var(--scroll-inline-position) * 100)
    scroll-inline-position-delayed calc(var(--scroll-inline-position-delayed) * 100)
    scroll-inline-velocity calc(var(--scroll-inline-velocity) * 100)
    scroll-inline-direction var(--scroll-inline-direction)
    scroll-inline-speed calc(var(--scroll-inline-speed) * 100)
  ;
  
  /* Block */
  [data-id="--scroll-block-position"]::after {
    content: "--scroll-block-position: " counter(scroll-block-position);
  }
  [data-id="--scroll-block-position-delayed"]::after {
    content: "--scroll-block-position-delayed: " counter(scroll-block-position-delayed);
  }
  [data-id="--scroll-block-velocity"]::after {
    content: "--scroll-block-velocity: " counter(scroll-block-velocity);
  }
  [data-id="--scroll-block-direction"]::after {
    content: "--scroll-block-direction: " counter(scroll-block-direction);
  }
  [data-id="--scroll-block-speed"]::after {
    content: "--scroll-block-speed: " counter(scroll-block-speed);
  }
  
  /* Inline */
  [data-id="--scroll-inline-position"]::after {
    content: "--scroll-inline-position: " counter(scroll-inline-position);
  }
  [data-id="--scroll-inline-position-delayed"]::after {
    content: "--scroll-inline-position-delayed: " counter(scroll-inline-position-delayed);
  }
  [data-id="--scroll-inline-velocity"]::after {
    content: "--scroll-inline-velocity: " counter(scroll-inline-velocity);
  }
  [data-id="--scroll-inline-direction"]::after {
    content: "--scroll-inline-direction: " counter(scroll-inline-direction);
  }
  [data-id="--scroll-inline-speed"]::after {
    content: "--scroll-inline-speed: " counter(scroll-inline-speed);
  }
  
	/* Presentational */
  position: fixed;
  top: 0;
	left: 0;
  display: grid;
	gap: 1rem;
  justify-content: center;
	padding: 2rem;
  align-items: center;
  
	& ul {
		margin: 0;
		padding: 0;
		list-style: none;
		display: none;
	  font-family: monospace;
	}
	
	& form {
		font-family: cursive;
	}
	
	&:has([type="checkbox"]:checked) ul {
		display: initial;
	}
}

/* Cute graphical stuff */
*, *:before, *:after {
	box-sizing: border-box;
}

html {
	block-size: 100%;
}

body {
	min-block-size: 100%;
	margin: 0;
	
	&:before {
		content: "";
		position: fixed;
		z-index: 2;
		inset: 0;
		pointer-events: none;
		border: 18px solid #78A158;
	}
	
	&:after {
		content: "";
		position: fixed;
		z-index: 2;
		inset: 0;
		pointer-events: none;
		border-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIQAAACECAYAAABRRIOnAAAEpmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTMyIgogICB0aWZmOkltYWdlV2lkdGg9IjEzMiIKICAgdGlmZjpSZXNvbHV0aW9uVW5pdD0iMiIKICAgdGlmZjpYUmVzb2x1dGlvbj0iNzIvMSIKICAgdGlmZjpZUmVzb2x1dGlvbj0iNzIvMSIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEzMiIKICAgZXhpZjpQaXhlbFlEaW1lbnNpb249IjEzMiIKICAgZXhpZjpDb2xvclNwYWNlPSIxIgogICBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIgogICBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiCiAgIHhtcDpNb2RpZnlEYXRlPSIyMDIz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');
		border-image-slice: 18;
		border-image-width: 18px;
		border-image-repeat: round;
	}
}

.scene {
	display: none;
	block-size: 400dvh;
  inline-size: 400dvw;
	background-color: #C0D470;
	background-position: center;
	display: grid;
	position: relative;
	
	.texture {
		background-position: center;
		grid-area: 1 / 1 / -1 / -1;
	}
	
	.texture:nth-child(1) {
    background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><image width="18" height="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAICAIAAACkr0LiAAABgGlDQ1BzUkdCIElFQzYxOTY2LTIuMQAAKJF1kc8rRFEUxz8GESNTLCykl4bV0KAmNspIqEkaoww2b575oebH672ZNNkqW0WJjV8L/gK2ylopIiVb1sSG6TlvRs0kc27nns/93ntO954LjlBSS5l1Xkils0Zw0q8shBeVhhea6MJFJz5VM/Wx2dkAVe3znho73vbZtaqf+9eaV6KmBjWNwqOabmSFp4QDa1nd5h3hdi2hrgifCXsMuaDwna1HSvxqc7zE3zYboeA4OFzCSryCIxWsJYyUsLwcdyqZ037vY7/EGU3Pz0nsFu/EJMgkfhSmmWAcHwOMyOyjj0H6ZUWVfG8xf4aM5Goy6+QxWCVOgiweUXNSPSoxJnpURpK83f+/fTVjQ4Ol6k4/1D9b1nsPNGxDYcuyvo4sq3AMtU9wmS7nZw5h+EP0rbLmPoDWDTi/KmuRXbjYhI5HXTXUolQr7ojF4O0UWsLQdgNNS6We/e5z8gChdfmqa9jbh14537r8A6nHaATSt2iMAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAP0lEQVQImWM8cKWAARt48u4zEy4JGSFe7HIQwPTk3WdMURkhXgYGBiYZIV6s0gwMDFjMhCtlgpuA7Aqc+uAAAP73E9nNqdK6AAAAAElFTkSuQmCC" /></svg>');
	}
	
	.texture:nth-child(2) {
    background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="25" height="25"><image width="6" height="4" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAIAAAASFvFNAAABgGlDQ1BzUkdCIElFQzYxOTY2LTIuMQAAKJF1kc8rRFEUxz8GESNTLCykl4bV0KAmNspIqEkaoww2b575oebH672ZNNkqW0WJjV8L/gK2ylopIiVb1sSG6TlvRs0kc27nns/93ntO954LjlBSS5l1Xkils0Zw0q8shBeVhhea6MJFJz5VM/Wx2dkAVe3znho73vbZtaqf+9eaV6KmBjWNwqOabmSFp4QDa1nd5h3hdi2hrgifCXsMuaDwna1HSvxqc7zE3zYboeA4OFzCSryCIxWsJYyUsLwcdyqZ037vY7/EGU3Pz0nsFu/EJMgkfhSmmWAcHwOMyOyjj0H6ZUWVfG8xf4aM5Goy6+QxWCVOgiweUXNSPSoxJnpURpK83f+/fTVjQ4Ol6k4/1D9b1nsPNGxDYcuyvo4sq3AMtU9wmS7nZw5h+EP0rbLmPoDWDTi/KmuRXbjYhI5HXTXUolQr7ojF4O0UWsLQdgNNS6We/e5z8gChdfmqa9jbh14537r8A6nHaATSt2iMAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGElEQVQImWNccihZRoj3ybvPTBBKRogXAFWGCAjC9NluAAAAAElFTkSuQmCC" /></svg>');
	}
	
	.texture:nth-child(3) {
    background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="27" height="27"><image width="6" height="4" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAIAAAASFvFNAAABgGlDQ1BzUkdCIElFQzYxOTY2LTIuMQAAKJF1kc8rRFEUxz8GESNTLCykl4bV0KAmNspIqEkaoww2b575oebH672ZNNkqW0WJjV8L/gK2ylopIiVb1sSG6TlvRs0kc27nns/93ntO954LjlBSS5l1Xkils0Zw0q8shBeVhhea6MJFJz5VM/Wx2dkAVe3znho73vbZtaqf+9eaV6KmBjWNwqOabmSFp4QDa1nd5h3hdi2hrgifCXsMuaDwna1HSvxqc7zE3zYboeA4OFzCSryCIxWsJYyUsLwcdyqZ037vY7/EGU3Pz0nsFu/EJMgkfhSmmWAcHwOMyOyjj0H6ZUWVfG8xf4aM5Goy6+QxWCVOgiweUXNSPSoxJnpURpK83f+/fTVjQ4Ol6k4/1D9b1nsPNGxDYcuyvo4sq3AMtU9wmS7nZw5h+EP0rbLmPoDWDTi/KmuRXbjYhI5HXTXUolQr7ojF4O0UWsLQdgNNS6We/e5z8gChdfmqa9jbh14537r8A6nHaATSt2iMAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGElEQVQImWN88W7VjWfHNKSsmCDUjWfHAHSsCwiHjz0mAAAAAElFTkSuQmCC" /></svg>');
	}
		
	.texture:nth-child(4) {
    background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="77" height="77"><image width="18" height="16" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAICAIAAACkr0LiAAABgGlDQ1BzUkdCIElFQzYxOTY2LTIuMQAAKJF1kc8rRFEUxz8GESNTLCykl4bV0KAmNspIqEkaoww2b575oebH672ZNNkqW0WJjV8L/gK2ylopIiVb1sSG6TlvRs0kc27nns/93ntO954LjlBSS5l1Xkils0Zw0q8shBeVhhea6MJFJz5VM/Wx2dkAVe3znho73vbZtaqf+9eaV6KmBjWNwqOabmSFp4QDa1nd5h3hdi2hrgifCXsMuaDwna1HSvxqc7zE3zYboeA4OFzCSryCIxWsJYyUsLwcdyqZ037vY7/EGU3Pz0nsFu/EJMgkfhSmmWAcHwOMyOyjj0H6ZUWVfG8xf4aM5Goy6+QxWCVOgiweUXNSPSoxJnpURpK83f+/fTVjQ4Ol6k4/1D9b1nsPNGxDYcuyvo4sq3AMtU9wmS7nZw5h+EP0rbLmPoDWDTi/KmuRXbjYhI5HXTXUolQr7ojF4O0UWsLQdgNNS6We/e5z8gChdfmqa9jbh14537r8A6nHaATSt2iMAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAP0lEQVQImWM8cKWAAQY0pKxuPDsG5zLhkmBgYGDSkLJiwAGYbjw7hksaYSaygRDVTFjUMzBADGNC04HdTEwAAKYiFBQKFhL5AAAAAElFTkSuQmCC" /></svg>');
	}
		
	.texture:nth-child(5) {
    background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="89" height="89"><image width="20" height="20" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAABgGlDQ1BzUkdCIElFQzYxOTY2LTIuMQAAKJF1kc8rRFEUxz8GESNTLCykl4bV0KAmNspIqEkaoww2b575oebH672ZNNkqW0WJjV8L/gK2ylopIiVb1sSG6TlvRs0kc27nns/93ntO954LjlBSS5l1Xkils0Zw0q8shBeVhhea6MJFJz5VM/Wx2dkAVe3znho73vbZtaqf+9eaV6KmBjWNwqOabmSFp4QDa1nd5h3hdi2hrgifCXsMuaDwna1HSvxqc7zE3zYboeA4OFzCSryCIxWsJYyUsLwcdyqZ037vY7/EGU3Pz0nsFu/EJMgkfhSmmWAcHwOMyOyjj0H6ZUWVfG8xf4aM5Goy6+QxWCVOgiweUXNSPSoxJnpURpK83f+/fTVjQ4Ol6k4/1D9b1nsPNGxDYcuyvo4sq3AMtU9wmS7nZw5h+EP0rbLmPoDWDTi/KmuRXbjYhI5HXTXUolQr7ojF4O0UWsLQdgNNS6We/e5z8gChdfmqa9jbh14537r8A6nHaATSt2iMAAAACXBIWXMAAAsTAAALEwEAmpwYAAAATElEQVQYlWM8cKVAi5eDgYHh2ucfDBiACSLHwMAAZ6BIwzUh69bi5YCoZsE0Ftk8JkwDkc1jwZRGVoFFN4rTMJ2DRRqX95gwnYMsDQBZAh2aN8SpLQAAAABJRU5ErkJggg==" /></svg>');
	}
}

.character {
	position: fixed;
  inset: 0;
	display: grid;
	place-items: center;
	transition: initial;
	
	&:before {
		content: "";
		inline-size: 56px;
		block-size: 64px;
		display: block;
		place-items: center;
		background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOAAAAEACAYAAACqHnrXAAAFV2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMjU2IgogICB0aWZmOkltYWdlV2lkdGg9IjIyNCIKICAgdGlmZjpSZXNvbHV0aW9uVW5pdD0iMiIKICAgdGlmZjpYUmVzb2x1dGlvbj0iNzIvMSIKICAgdGlmZjpZUmVzb2x1dGlvbj0iNzIvMSIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjIyNCIKICAgZXhpZjpQaXhlbFlEaW1lbnNpb249IjI1NiIKICAgZXhpZjpDb2xvclNwYWNlPSIxIgogICBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIgogICBwaG90b3Nob3A6SUNDUHJv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');
		background-repeat: no-repeat;
		animation-duration: .2s;
		animation-timing-function: steps(3);
		animation-iteration-count: infinite;
	}
}


@keyframes to-bottom {
	from { background-position: 0px 0px; }
  to { background-position: -168px 0px; }
}

@keyframes to-top {
	from { background-position: 0px -64px; }
  to { background-position: -168px -64px; }
}

@keyframes to-left {
	from { background-position: 0px -128px; }
  to { background-position: -168px -128px; }
}

@keyframes to-right {
	from { background-position: 0px -192px; }
  to { background-position: -168px -192px; }
}

/* To bottom */
@container style(--scroll-block-direction: 1) {
  .character:before {
		animation-name: to-bottom;
  }
}

/* To top */
@container style(--scroll-block-direction: -1) {
  .character:before {
		animation-name: to-top;
  }
}

/* To right */
@container style(--scroll-inline-direction: 1) {
  .character:before {
		animation-name: to-right;
  }
}

/* To left */
@container style(--scroll-inline-direction: -1) {
  .character:before {
		animation-name: to-left;
  }
}

/* Idle */
@container style(--scroll-block-direction: 0) and style(--scroll-inline-direction: 0){
  .character:before {
    background-position: 0px 0px;
  }
}
              
            
!

JS

              
                
              
            
!
999px

Console