使用百分比时 Chrome 中的变换位置不正确
Incorrect transform position in Chrome when using percent
在具有浮动宽度(例如 800.63 像素)的容器上使用百分比值变换时 Chrome 总是错误地四舍五入像素位置。
这通常发生在 em/rem 宽度与百分比结合的情况下(参见下面的示例):
HTML:
<div class="container">
<div class="wrap">
<div class="slider">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
</div>
</div>
SCSS:
.container {
width: 38rem;
}
.wrap {
width: 33%;
overflow: hidden;
}
.slider {
white-space: nowrap;
font-size: 0;
transform: translate3d(-1000%,0,0);
}
.item {
display: inline-block;
height: 8rem;
width: 100%;
background: limegreen;
&:nth-child(even) {
background: orangered;
}
}
结果是下一张幻灯片的某些部分始终可见。看起来 Chrome 首先将项目宽度四舍五入,然后将其乘以百分比值。
是否有任何已知的解决方法?如果我在 JS 中进行数学运算并在转换中使用 px 值,那么一切(几乎)都是完美的,但它不应该 "just work" 也带有百分比吗?
请参阅 fiddle 工作示例:https://jsfiddle.net/Lumh07te/37/
更改设置尺寸的方式。
不要将宽度为 100% 且需要最大变换为 1000% 的滑块设置为宽度为 1000% 并需要最大变换为 100%。
并且项目宽度现在是 10% 而不是 100%
在您的原始代码中,wrap 的宽度不是整数,但在布局中强制呈现为以像素为单位的整数值。然后,转换此值的 1000% 会将舍入误差乘以 10。如果将宽度设置为 1000%,则舍入到像素是按此大小完成的,然后乘以小于 1 的值(0.5、0.6 , 0.7.. ) 或最大 1
.container {
width: 38rem;
}
.wrap {
width: 33%;
overflow: hidden;
}
.slider {
width: 1300%;
white-space: nowrap;
font-size: 0;
transform: translateX(calc(-500% / 13));
transition: transform 0.4s;
}
.test {
height: 50px;
}
.test:hover ~ .wrap .slider {
transform: translateX(calc(-800% / 13));
}
.item {
display: inline-block;
height: 8rem;
width: calc(100% / 13);
background: limegreen;
font-size: 30px;
}
.item:nth-child(even) {
background: orangered;
}
<div class="container">
<div class="test">test</div>
<div class="wrap">
<div class="slider">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
<div class="item">11</div>
<div class="item">12</div>
<div class="item">13</div>
</div>
</div>
</div>
在具有浮动宽度(例如 800.63 像素)的容器上使用百分比值变换时 Chrome 总是错误地四舍五入像素位置。 这通常发生在 em/rem 宽度与百分比结合的情况下(参见下面的示例):
HTML:
<div class="container">
<div class="wrap">
<div class="slider">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
</div>
</div>
SCSS:
.container {
width: 38rem;
}
.wrap {
width: 33%;
overflow: hidden;
}
.slider {
white-space: nowrap;
font-size: 0;
transform: translate3d(-1000%,0,0);
}
.item {
display: inline-block;
height: 8rem;
width: 100%;
background: limegreen;
&:nth-child(even) {
background: orangered;
}
}
结果是下一张幻灯片的某些部分始终可见。看起来 Chrome 首先将项目宽度四舍五入,然后将其乘以百分比值。
是否有任何已知的解决方法?如果我在 JS 中进行数学运算并在转换中使用 px 值,那么一切(几乎)都是完美的,但它不应该 "just work" 也带有百分比吗?
请参阅 fiddle 工作示例:https://jsfiddle.net/Lumh07te/37/
更改设置尺寸的方式。
不要将宽度为 100% 且需要最大变换为 1000% 的滑块设置为宽度为 1000% 并需要最大变换为 100%。
并且项目宽度现在是 10% 而不是 100%
在您的原始代码中,wrap 的宽度不是整数,但在布局中强制呈现为以像素为单位的整数值。然后,转换此值的 1000% 会将舍入误差乘以 10。如果将宽度设置为 1000%,则舍入到像素是按此大小完成的,然后乘以小于 1 的值(0.5、0.6 , 0.7.. ) 或最大 1
.container {
width: 38rem;
}
.wrap {
width: 33%;
overflow: hidden;
}
.slider {
width: 1300%;
white-space: nowrap;
font-size: 0;
transform: translateX(calc(-500% / 13));
transition: transform 0.4s;
}
.test {
height: 50px;
}
.test:hover ~ .wrap .slider {
transform: translateX(calc(-800% / 13));
}
.item {
display: inline-block;
height: 8rem;
width: calc(100% / 13);
background: limegreen;
font-size: 30px;
}
.item:nth-child(even) {
background: orangered;
}
<div class="container">
<div class="test">test</div>
<div class="wrap">
<div class="slider">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
<div class="item">11</div>
<div class="item">12</div>
<div class="item">13</div>
</div>
</div>
</div>