function setFractionalRating(container, value) {
var floor = Math.floor(value),
ceil = Math.ceil(value),
star = container.children[floor],
slice = Array.prototype.slice,
children = slice.call(container.children),
visible = slice.call(children, 0, ceil),
hidden = slice.call(children, ceil),
size,
width,
portion;
visible.forEach(function(star) {
star.style.visibility = 'visible';
star.style.width = '';
});
hidden.forEach(function(star) {
star.style.visibility = 'hidden';
star.style.width = '';
});
size = star && star.getBoundingClientRect();
width = size && size.width;
portion = value - floor;
if (star && portion !== 0)
star.style.width = (width * portion) + 'px';
}
// Test:
var check = 1,
debug = document.querySelector('.debug');
debug.appendChild(document.createTextNode(''));
setInterval(function(rating) {
debug.firstChild.nodeValue = check.toFixed(1);
setFractionalRating(rating, check);
if ((check += 0.1) >= 5)
check = 0.1;
}, 200, document.querySelector('.rating'));
.rating > i {
display: inline-block;
overflow: hidden;
}
<link href="https://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet"/>
<div class="rating">
<i class="glyphicon glyphicon-star"></i>
<i class="glyphicon glyphicon-star"></i>
<i class="glyphicon glyphicon-star"></i>
<i class="glyphicon glyphicon-star"></i>
<i class="glyphicon glyphicon-star"></i>
</div>
<div class="debug">
</div>
</div>