Я наткнулся на этот старый вопрос в поисках другой проблемы, но я думаю, что могу пролить свет на эту проблему, особенно если учесть «работает с -1 вместо -0,5».
Chrome и другие браузеры на основе WebKit обрабатывают округление единиц иначе, чем Firefox и IE. Хотя Firefox делает все возможное для визуализации и представления дробных размеров пикселей, а IE отображает округленные размеры, но продолжает сообщать точно то, что вы указали, WebKit округляет отображаемое значение И сообщает округленное значение, когда вы запрашиваете его обратно.
Допустим, размер начинается с 14px. Когда вы запускаете этот код:
// $size = 14
$size = $('#movie-info .vote').css('font-size').replace('px','');
// font-size: 13.5px
$('#movie-info .vote').css('font-size',($size-0.5)+'px');
Chrome завершает изменение размера, а размер шрифта по-прежнему составляет 14 пикселей. Таким образом, цикл никогда не остановится, потому что $size
никогда не уменьшается.
Простым решением было бы объявить $ size один раз вместо того, чтобы спрашивать Chrome, что это такое:
// Don't forget to declare with `var` to give $size local scope!
// Otherwise it is declared in global scope which could lead to
// weird bugs or lost performance.
var $size = $('#movie-info .vote').css('font-size').replace('px','');
while ($('#movie-info .vote').height() > 30) {
$size = $size - 0.5;
$('#movie-info .vote').css('font-size', $size + 'px');
}