Проблема, с которой вы здесь сталкиваетесь, не в слое CSS, а на более низком уровне - в движке рендеринга браузера и, в некоторой степени, в физическом оборудовании дисплея.
почему CSS округляет одно число с плавающей точкой до трех разных чисел?
Это неправильно - CSS ведет себя правильно и выдает точно такое же значение высоты для все три деления в каждом наборе. Вы можете убедиться в этом, проверив элементы в инструментах разработчика и посмотрев рассчитанное свойство высоты для каждого элемента div.
Однако это значение не в целых пикселях, а в долях пикселя. И вы столкнулись с проблемой classi c в компьютерной графике - как вы отображаете доли пикселя на дисплее с дискретными пикселями?
Краткий ответ - Вы не можете , отлично. Вот почему эти три дробных делителя высоты пикселей в конечном итоге отображаются на том, что выглядит как разной высоты, когда вы изменяете их размеры и даже перемещаете их на экране. Это движок рендеринга, который делает все возможное, чтобы они выглядели одинаково, с разными результатами.
Причина, по которой работает ваше решение «округления» в JS, заключается в том, что оно округляет эти высоты до целых значений пикселей! Когда значения пикселей округлены, все гораздо проще выровнять (в наивном случае, если нет дробного отступа пикселей, margin et c между делителями), и вы с меньшей вероятностью увидите различия.
Попробуй! Если вы удалите Math.round
или даже просто добавите 0.75
или что-то к округленному результату, вы увидите точно такую же проблему с вашим решением JS, даже если все вычисленные значения, очевидно, идентичны.
Опять же, проблема не в том, что значения отличаются, а в том, что они отображаются по-разному вашим браузером / оборудованием. Единственный универсально «безопасный» обходной путь состоит в том, чтобы гарантировать, что значения на самом деле являются круглыми пиксельными значениями.
Вводя к этому вопросу:
есть ли чистое CSS решение для безопасного используйте размеры области просмотра
С учетом вышесказанного, получение округленных значений пикселей, к сожалению, нет . С помощью CSS calc()
иным способом нельзя округлять результаты динамически.
В качестве общего предложения, если вам требуется точный рендеринг до тонких линий до пикселя и т. Д. c, отзывчивый CSS вероятно, это не тот инструмент, который вы хотите использовать. Вы, вероятно, хотите придерживаться статических c значений пикселей, но если вам действительно нужно, чтобы вещи были динамичными c и увеличивались и уменьшались при изменении размера области просмотра, тогда да, вероятно, вы захотите задействовать JS для большего управление рендерингом.