Div元素遵循CSS3的曲线路径

jho*_*ton 5 css css3 css-transforms css-shapes

所以基本的想法是在弯曲的桌子上1-9个座位,就像你通过第一人称视角看它们一样.我试图获得一些div元素,这些元素将在另一个div具有边界半径的元素的外部流动,使其成为半长圆形.我发现了一些示例,其中一个元素被动画化,以弧形流过容器,但我需要div/seat是静态的.我正在寻找可以引导我走上正确道路的任何想法或例子.

Har*_*rry 13

在椭圆上找到点并翻译:

如果您的椭圆形圆形类似于椭圆形,那么您可以使用数学公式在椭圆上找到点,然后将每个div元素转换为该特定点.

计算(x,y)椭圆上的点的数学公式(a * cos(t), b * sin(t)).在此公式中,a表示椭圆在x轴上b的半径,表示椭圆在y轴上的半径,并t表示以弧度表示的角度.以弧度表示的角度=以度为单位的角度*pi/180.

要使用此方法,我们执行以下操作:

  • div元素绝对放在椭圆的中心点.
  • 计算(x,y)每个角度的对应值并使用div将其转换为其位置transform: translateX(...) translateY(...).角度为22.5度,因为总共有9个元件放置在180度内.

.container {
  position: relative;
  height: 400px;
  width: 600px;
  padding: 12.5px;
  border: 1px solid;
  border-radius: 50%;
}
div > div {
  position: absolute;
  top: 0px;
  left: 0px;
  height: 50%;
  width: 50%;
  transform-origin: bottom right;
}
div > div:after {
  position: absolute;
  content: '';
  bottom: 0px;
  right: 0px;
  height: 25px;
  width: 25px;
  background: black;
  border-radius: 50%;
  transform: translateX(50%) translateY(50%);
}
div > div:after {
  background: red;
}
div > div:nth-child(n+4):after {
  background: orange;
}
div > div:nth-child(n+7):after {
  background: green;
}
div > div:nth-child(1) {
  transform: translateX(-300px) translateY(0px);
}
div > div:nth-child(2) {
  transform: translateX(-277.17px) translateY(-76.5px);
}
div > div:nth-child(3) {
  transform: translateX(-212.13px) translateY(-141.42px);
}
div > div:nth-child(4) {
  transform: translateX(-114.80px) translateY(-184.77px);
}
div > div:nth-child(5) {
  transform: translateX(0px) translateY(-200px);
}
div > div:nth-child(6) {
  transform: translateX(114.80px) translateY(-184.77px);
}
div > div:nth-child(7) {
  transform: translateX(212.13px) translateY(-141.42px);
}
div > div:nth-child(8) {
  transform: translateX(277.17px) translateY(-76.5px);
}
div > div:nth-child(9) {
  transform: translateX(300px) translateY(0px);
}
Run Code Online (Sandbox Code Playgroud)
<div class="container">
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
</div>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

注意:坐标是近似值,因此它们可能无法正确对齐100%.


使用旋转和缩放变换:(原创意)

下面的代码片段提供了关于如何沿圆圈定位元素的非常粗略的想法.它绝不是一个完整的输出,但您可以根据自己的需要进行调整.

组件非常简单:

  • 一个容器元件是圆形并且用作座位所针对的参考元件.
  • div每个座位有9个独立元素.他们都有50%width的容器和50%height.
  • :after附加到子div元素的伪元素()生成圆形/点像座位,它们绝对位于容器的底部.
  • 每个子div元素都按180/(n-1)度旋转,因为我们需要将它们定位在半圆周围.

.container {
  position: relative;
  height: 200px;
  width: 200px;
  border: 1px solid;
  border-radius: 50%;
}
div > div {
  position: absolute;
  top: 0px;
  left: 0px;
  height: 50%;
  width: 50%;
  transform-origin: bottom right;
}
div > div:after {
  position: absolute;
  content: '';
  bottom: 0px;
  left: 0px;
  height: 25px;
  width: 25px;
  background: black;
  border-radius: 50%;
  transform: translateY(50%);
}
div > div:nth-child(1) {
  transform: rotate(0deg);
}
div > div:nth-child(2) {
  transform: rotate(22.5deg);
}
div > div:nth-child(3) {
  transform: rotate(45deg);
}
div > div:nth-child(4) {
  transform: rotate(67.5deg);
}
div > div:nth-child(5) {
  transform: rotate(90deg);
}
div > div:nth-child(6) {
  transform: rotate(112.5deg);
}
div > div:nth-child(7) {
  transform: rotate(135deg);
}
div > div:nth-child(8) {
  transform: rotate(157.5deg);
}
div > div:nth-child(9) {
  transform: rotate(180deg);
}
div > div:after {
  background: red;
}
div > div:nth-child(n+4):after {
  background: orange;
}
div > div:nth-child(n+7):after {
  background: green;
}

/* Just for demo */

.container{
  transition: all 1s;
}  
.container:hover {
  height: 400px;
  width: 400px;
  transition: all 1s;
}
Run Code Online (Sandbox Code Playgroud)
<div class="container">
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
</div>
Run Code Online (Sandbox Code Playgroud)

有一种简单的方法可以将上面的内容转换为椭圆形,并且可以在X轴上缩放容器.需要注意的一点是,孩子们也会被缩放,因此需要进行逆向变换.

.container {
  position: relative;
  height: 200px;
  width: 200px;
  border: 1px solid;
  border-radius: 50%;
  transform: scaleX(1.25);
  transform-origin: left;
}
div > div {
  position: absolute;
  top: 0px;
  left: 0px;
  height: 50%;
  width: 50%;
  transform-origin: bottom right;
}
div > div:after {
  position: absolute;
  content: '';
  bottom: 0px;
  left: 0px;
  height: 25px;
  width: 25px;
  background: black;
  border-radius: 50%;
  transform: translateY(50%);
}
div > div:nth-child(1) {
  transform: rotate(0deg);
}
div > div:nth-child(2) {
  transform: rotate(22.5deg);
}
div > div:nth-child(3) {
  transform: rotate(45deg);
}
div > div:nth-child(4) {
  transform: rotate(67.5deg);
}
div > div:nth-child(5) {
  transform: rotate(90deg);
}
div > div:nth-child(6) {
  transform: rotate(112.5deg);
}
div > div:nth-child(7) {
  transform: rotate(135deg);
}
div > div:nth-child(8) {
  transform: rotate(157.5deg);
}
div > div:nth-child(9) {
  transform: rotate(180deg);
}
div > div:after {
  background: red;
}
div > div:nth-child(n+4):after {
  background: orange;
}
div > div:nth-child(n+7):after {
  background: green;
}

/* Just for demo */

.container {
  transition: all 1s;
}
.container:hover {
  height: 400px;
  width: 400px;
  transform: scaleX(1.25);
  transform-origin: left;
}
Run Code Online (Sandbox Code Playgroud)
<div class="container">
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
</div>
Run Code Online (Sandbox Code Playgroud)

第一种方法是完美和推荐的方法,因为它不会对div元素造成任何扭曲.第二个是粗略的想法,它避免了复杂的三角计算.

  • 神圣的数学令人惊叹!!!你在这件事上全力以赴。谢谢你的详细回答。我一直想知道为什么这么多数学是计算机科学课程的一部分,现在我知道了。我会尝试使用第一个答案。再次感谢你的帮助。 (2认同)