html - 为什么div和旋转的div(三 Angular 形)之间有间隙

标签 html css rotation rectangles

我正尝试在我的移动应用程序中使用 HTML/CSS 制作此形状: https://embed.plnkr.co/9k8jbJyzUiSMSoSHlOti/

.boundary {
  width: 100.13723%;
  padding-bottom: 5.24078%;
  position: relative;
  overflow: hidden;
  background-color: white;
}

.boundary:before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  transform-origin: top left;
  transform: rotate(3deg);
  background-color: green;
}

.inner {
  height: 100%;
  width: 100%;
  background-color: green;
}
<div class="boundary"></div>
<div class="inner">
  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis auteirure dolor
  in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>

在我的浏览器中,当我检查元素并更改缩放比例(至 75%)时,2 <div> 之间存在间隙.当我在我的设备中部署我的应用程序时,我可以看到同样的差距。

这是怎么回事?

result : make triangle with rectangle transformation (rotate)

这是我制作形状的方式:

  • 我创建了第一个 div 来做斜线。我做了一个响应式三 Angular 形(我从这个 Question 中挑选了一些信息)

    1) 在我的 div 中,我插入了第一个伪元素并给它父级的 100% 宽度和高度。我应用旋转:我在左上角定义了一个变换原点,并使用 transform: rotate(3deg) 将伪元素顺时针旋转 3 度。

    2) 我必须调整宽度和高度:我使用百分比和 padding-bottom保持纵横比(more information here)所以:

[rectangle height] : padding-bottom = tan(3deg) * 100% = 100.13723% (100% is the screen width)<br/>[hypotenuse of triangle = new rectangle width] : width = tan(3deg) * 100% / sin(3deg) = 5.24078%.

3) 为了隐藏伪元素不需要的部分(所有溢出 <div> 的红色边框)我设置了 overflow: hidden在容器上。

  • 我再做一次<div>先斜后<div> .这<div>很简单,无需特殊变换,包含Lorem ipsum

最佳答案

这通常发生在转换元素时,因为浏览器开始对元素的边缘进行抗锯齿处理。

Antialiasing is something of an unsung hero in web graphics; it’s the reason we have clear text and smooth vector shapes on our screens.

虽然缩小/缩小浏览器不会正确地重新缩放元素,例如如果将 1px 高度的元素缩小到 0.75%,浏览器应将元素重绘为 0.75px 但浏览器无法绘制 0.75px ,它要么创建 1,要么尝试通过像素模糊或 50% 不透明度使边缘平滑。


enter image description here

在上图中,您可以看到正在绘制相同的三 Angular 形,但在左侧它启用了抗锯齿,而在右侧它被禁用。如您所见,启用抗锯齿后,当三 Angular 形仅穿过部分像素时,像素为灰色阴影。然而,当禁用时,像素将填充为纯黑色或纯白色,并且形状看起来呈锯齿状。


使用 backface-visibility: hidden;或在缩放/转换时具有负边距的重叠元素是避免此问题的更好选择。

不使用 backface-visibility: hidden;

的演示

html,
body {
  transform: scale(.8);
}

.boundary {
  width: 100.13723%;
  padding-bottom: 5.24078%;
  position: relative;
  overflow: hidden;
  background-color: white;
}

.boundary:before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  transform-origin: top left;
  transform: rotate(3deg);
  background-color: green;
}

.inner {
  height: 100%;
  width: 100%;
  background-color: green;
}
<div class="boundary"></div>
<div class="inner">
  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
  in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>


演示使用 backface-visibility: hidden;

html,
body {
  transform: scale(.8);
}

.boundary {
  width: 100.13723%;
  padding-bottom: 5.24078%;
  position: relative;
  overflow: hidden;
  background-color: white;
}

.boundary:before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  transform-origin: top left;
  transform: rotate(3deg);
  background-color: green;
}

.inner {
  height: 100%;
  width: 100%;
  background-color: green;
  backface-visibility: hidden;
  -webkit-backface-visibility: hidden;
}
<div class="boundary"></div>
<div class="inner">
  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
  in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>


演示由 OP in comment 提供通过使用 backface-visibility: hidden; 和带有 negative margin

的重叠元素来解决

html,
body {
  transform: scale(.75);
}

.inner {
  height: 100%;
  width: 100%;
  background-color: green;
  backface-visibility: hidden;
  -webkit-backface-visibility: hidden;
}

.inner-2 {
  background-color: red;
  backface-visibility: hidden;
  -webkit-backface-visibility: hidden;
}

.inner-3 {
  background-color: blue;
  backface-visibility: hidden;
  -webkit-backface-visibility: hidden;
}

.boundary {
  width: 100.13723%;
  padding-bottom: 5.24078%;
  position: relative;
  overflow: hidden;
  background-color: white;
  margin-top: -2px;
}

.boundary:before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  transform-origin: top left;
  transform: rotate(3deg);
  background-color: green;
  backface-visibility: hidden;
}

.boundary-2 {
  background-color: green;
}

.boundary-2:before {
  transform-origin: top right;
  transform: rotate(-3deg);
  background-color: red;
}

.boundary-3 {
  background-color: red;
}

.boundary-3:before {
  transform-origin: top left;
  transform: rotate(3deg);
  background-color: blue;
}
<div class="boundary"></div>
<div class="inner">
  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
  in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>

<div class="boundary boundary-2"></div>
<div class="inner inner-2">
  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
  in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>

<div class="boundary boundary-3"></div>
<div class="inner inner-3">
  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
  in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>

PS:不要忘记使用 viewport meta 标签来提高响应能力。

来源 Antialiasing-101

关于html - 为什么div和旋转的div(三 Angular 形)之间有间隙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45054056/

相关文章:

html - Bootstrap 4 对齐品牌和链接

javascript - 获取事件幻灯片并突出显示计数器中的相应数字

html - 如何使用反增量在打印的网页上显示页码?

html - 改变 HTML 标签或文本控件中的字符串

html - 导航栏中的水平对齐

jquery - 在嵌套 DIV 的情况下将图像设置在 DIV 的中间

jquery - 如何从多个子菜单项将外部 div 加载到 master.html div

jquery - CSS3 在动画元素上旋转导致点击事件不调用

c# - 在 Unity 中设置 transform.up 时会发生什么

javascript - Canvas 旋转无法正常工作