On gists
                Simple rating (odometer)
                    
                        
                    
                        JavaScript
                      
                        CSS
                      
                        CSS trick
                      
                    
                    
                    example.html
                        Raw
                        #
                    
                        	<section>
	<button id="minus">-</button>
	<div>
		<span style="--state: -10">- 9-8 -7 -6 -5 -4 -3 -2 -1 0 +1 +2 +3 +4 +5 +6 +7 +8 +9</span>
	</div>
	<button id="plus">+</button>
		</section>
                    
                    example.css
                        Raw
                        #
                    
                        
body {
	font-size: 30px;
}
section {
	display: inline-flex;
	gap: 5px;
}
div {
	width: 1em;
	height: 1em;
	border: 1px solid red;
	line-height: 1em;
	text-align: center;
display: inline-block;
	overflow: hidden;
}
span {
	--finalState: calc(var(--state) * 1em);
	background: gold;
	transform: translateY(var(--finalState));
	display: block;
	transition: transform 500ms;
	
}
                    
                    
                        const span = document.querySelector('span');
const like = (e) => {
	const style = getComputedStyle(span);
	const state = style.getPropertyValue('--state');
	let stateNumber = parseInt(state) - 1 
	
	span.style.setProperty('--state', stateNumber)
}
const dislike = (e) => {
	const style = getComputedStyle(span);
	const state = style.getPropertyValue('--state');
	let stateNumber = parseInt(state) + 1 
	span.style.setProperty('--state', stateNumber)
}
document.getElementById('plus').addEventListener('click', like)
document.getElementById('minus').addEventListener('click', dislike)