边界半径不像预期的那样圆

border radius not round as expected

codepen

在上面的例子中,我尝试了开关盒样式,我也尝试了 em 值,当我根据他们的 parents 写字体大小 16px 时,根据 veiwport,字体大小会发生变化,而改变开关盒圈并不完美,对于特定的字体大小是合适的(例如:parent font-size 20px,22px)

这是代码

.parent {
  font-size: 16px;
  text-align: center;
  margin-top: 10px
}

.BP_swtchbox {
  display: inline-block;
  font-size: 1em
}

.BP_Swtch {
  cursor: pointer;
  background: #d7d9dd;
  border-radius: 0.313em;
  height: 0.625em;
  width: 1.500em;
  display: inline-block;
  position: relative;
  transition: .4s;
  -ms-transition: .4s;
  -moz-transition: .4s;
  -webkit-transition: .4s
}

.BP_swtchbox input {
  display: none
}

.BP_Swtbx_lb {
  background: #fff;
  border-radius: 50%;
  box-shadow: 0 1px 4px 0 #777;
  height: 0.875em;
  width: 0.875em;
  position: absolute;
  top: 0;
  left: 0;
  transition: .3s cubic-bezier(.4, 1.3, .65, 1.1);
  -ms-transition: .3s cubic-bezier(.4, 1.3, .65, 1.1);
  -moz-transition: .3s cubic-bezier(.4, 1.3, .65, 1.1);
  -webkit-transition: .3s cubic-bezier(.4, 1.3, .65, 1.1);
  bottom: 0;
  margin: auto
}

.BP_swtchbox input:checked+.BP_Swtch {
  box-shadow: 0 0 0 0.375em #58b14c inset
}

.BP_swtchbox input:checked+.BP_Swtch .BP_Swtbx_lb {
  left: calc(100% - 0.875em);
  left: -ms-calc(100% - 0.875em);
  left: -moz-calc(100% - 0.875em);
  left: -webkit-calc(100% - 0.875em)
}
<div class="parent">
  <label class="BP_swtchbox" for="BPSwitch">
    <input type="checkbox" id="BPSwitch" class="hide">
      <label class="BP_Swtch" for="BPSwitch">
        <span class="BP_Swtbx_lb"></span>
      </label>
  </label>
</div>

这是 parent class..... 开关图标

的字体大小为 20px 的屏幕截图

为此要做什么....

这很有趣。似乎当 .parent 有一个 20pxfont-size 时, .BP_Swtbx_lbwidthheight (它们都表示为 0.875em) 被计算为 17.5 像素。由于像素不能是小数,因此它们会四舍五入,但这里奇怪的是高度四舍五入为 17,而宽度四舍五入为 18。

.parentfont-size22px 时,它似乎完全相反,height 向上取整而 width 向下取整.在这种情况下,它们绝对应该明确地向下舍入,因为它被计算为 19.25 像素。

奇怪的形状似乎是由根据非舍入值而不是舍入值计算的曲线引起的。比较设置非四舍五入值时的形状和显式设置四舍五入值时的形状,前者略微呈矩形,后者完全呈椭圆形。所以渲染曲线和渲染尺寸之间存在不一致。

这似乎只是在 Chrome 中的情况。 Safari 和 Firefox 都不显示此行为。
现在,如何舍入小数像素取决于浏览器实现,但您认为它至少在内部是一致的。我愿意得出结论,这是一个浏览器错误,应该向 Google Chrome 开发团队报告。