【问题标题】:SkewX() math formula for full width (3 divs next to each other)全宽的 SkewX() 数学公式(彼此相邻的 3 个 div)
【发布时间】:2018-12-03 15:47:57
【问题描述】:

.parent {
  height: 500px;
  width: 500px;
  position: relative;
  background: black;
}

.test {
  transform: skewX(20deg);
  width: 33%;
  height: 100%;
  position: absolute;
}

.a {
  background: purple;
  left: 0;
}

.b {
  background: green;
  left: 33%;
}

.c {
  background: orange;
  left: 66%;
}
<div class="parent">
  <div class="test a"></div>
  <div class="test b"></div>
  <div class="test c"></div>
</div>

Jsfiddle:http://jsfiddle.net/jksqc1ux/7/

如您所见,由于倾斜,您仍然可以看到父级的背景。 所有 3 个 div 都相等,它会是什么公式才能填充 100% 的父级(所以你不能再在 sn-p 代码中看到黑色)?父维度可以有不同的值。

我正在寻找类似.a {left: calc(33% *0.4)} 或类似的东西?

【问题讨论】:

  • 也许是为了计算宽度??
  • @לבנימלכה 是的,但你仍然需要计算左侧。
  • 各部分的宽度可以大一些吗??
  • @לבנימלכה 将它们设置为 100% 宽度然后溢出隐藏在父级上会非常简单,但它应该适用于非常大的屏幕,比如街道屏幕。因此,在某些情况下,即使是 1000% 的宽度也可能不足以弥补偏斜。
  • 是你的意思吗:jsfiddle.net/jksqc1ux/13

标签: html css css-transforms skew


【解决方案1】:

首先,将transform-origin调整为bottom left使其更容易,您将获得下图所示的结果。

然后您需要将 width 和 left 属性都调整X 的数量,以覆盖整个区域。要计算X,您需要使用公式:tan(deg) = X / height (X = height * tan(deg)) 其中deg 是用于倾斜的度数,height 是父元素的高度。由于您有 3 个元素,因此需要在它们之间拆分此数量以始终保持相同的宽度。

我添加了一些不透明度,以便您可以看到所有元素都适合父容器的宽度:

.parent {
  height:500px;
  width:500px;
  margin:auto;
  position:relative;
  background:black;
}
.test {
  transform: skewX(20deg);
  --X:calc(0.364 * 500px); /*tan(20deg) ~ 0.364*/
  transform-origin:bottom left;
  width:calc(calc(100%/3) + calc(var(--X)/3));
  height:100%;
  position:absolute;
  opacity:0.8;
}
.a {
    background:purple;
    left:0;
}
.b {
  background:green;
  left:calc(calc(100%/3) + calc(var(--X)/3));

}
.c {
  background:orange;
  left:calc(calc(2*100%/3) + calc(2 * var(--X)/3));
}
<div class="parent">
  <div class="test a">

  </div>
  <div class="test b">

  </div>
  <div class="test c">

  </div>
</div>

用更少的代码获得类似效果的另一种方法是使用渐变:

.parent {
  height:500px;
  width:500px;
  margin:auto;
  position:relative;
  background:
  linear-gradient(70deg, purple 0,purple 33%, green 33%, green 66%,orange 66%,orange 100%);
}
<div class="parent">

</div>

【讨论】:

  • --X:calc(0.364 * 500px); 是什么?它是有效的 css 吗?
  • @ClaudiuCreanga 当然 ;) 这些是 CSS 变量,它们在您的情况下很有用[用更好的解释更新我的答案。
  • 谢谢。所以这里的 500px --X:calc(0.364 * 500px) 是高度,对于整个页面高度,我可以将其更改为 100vh。惊人的。不明白为什么要这么复杂。
  • @ClaudiuCreanga 它并不复杂,它是数学 :)
  • @ClaudiuCreanga 如果您愿意,我添加了另一种避免数学复杂性的方法;)
【解决方案2】:

根据谷歌,数学表示 44% 的宽度,https://www.google.com/search?q=(33%25+%2B+sin(20degrees)*33%25) 但如果将其应用于左右偏移,这些值会导致中心区域看起来更大。

Calc 不支持混合单位,因此需要预先计算。

.parent {
  height:500px;
  width:500px;
  position:relative;
  background:green;
  overflow:hidden;
}

.parent::before {
  content:'';
  background:purple;
  height:500px;
  width:44%; /* (33% + sin(20 degrees)*33%) = 44% */ 
  transform: skewX(20deg);
  position:absolute;
  left:-18%;
}
.parent::after {
  content:'';
  height:500px;
  width:44%;
  transform: skewX(20deg);
  position:absolute;
  background:orange;
  right:-18%;
}
<div class="parent">


</div>

【讨论】:

  • 也许当 safari 支持 clip-path: polygon 时,点可以通过变量中的单位值来计算?
【解决方案3】:

试试吧,它必须适合所有尺寸:(见小提琴:http://jsfiddle.net/jksqc1ux/85/

.parent {
  height:500px;
  width:500px;
  position:relative;
  background:black;
  overflow:hidden;
}
.test {
  transform: skewX(20deg);
  width:50%;
  height:100%;
  position:absolute;
}
.a {
    background:purple;
        right: 75%;
}
.b {
  background:green;
      right: 25%;

}
.c {
  background:orange;
      left: 75%;
}
<div class="parent">
  <div class="test a">

  </div>
  <div class="test b">

  </div>
  <div class="test c">

  </div>
</div>

【讨论】:

  • 谢谢,但您可以看到紫色比黄色小得多:jsfiddle.net/jksqc1ux/70 左上角 vs 右下角。所有 3 个 div 必须相等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多