侧面倾斜的形状(响应)


90

我正在尝试创建如下图所示的形状,仅在一侧(例如,底侧)有一个倾斜的边缘,而其他边缘保持笔直。

倾斜的CSS div

我尝试使用border方法(下面给出了代码),但是形状的尺寸是动态的,因此无法使用此方法。

.shape {
    position: relative;
    height: 100px;
    width: 200px;
    background: tomato;
}
.shape:after {
    position: absolute;
    content: '';
    height: 0px;
    width: 0px;
    left: 0px;
    bottom: -100px;
    border-width: 50px 100px;
    border-style: solid;
    border-color: tomato tomato transparent transparent;
}
<div class="shape">
    Some content
</div>


我也尝试过使用渐变作为背景(例如下面的代码),但是随着尺寸的变化,它变得混乱了。您可以将鼠标悬停在以下代码段的形状上,以了解我的意思。

如何创建具有倾斜侧面的形状,并且还能够支持动态尺寸

Answers:


126

有很多方法可以创建仅在一侧具有倾斜边缘的形状。

正如问题中已经提到的,以下方法不能支持动态大小:

  • 具有像素值的边界三角法border-width
  • 具有角度语法的线性渐变(例如45deg,30deg等)。

可以支持动态大小的方法如下所述。


方法1-SVG

浏览器兼容性

可以使用polygons或paths 来使用SVG产生形状。以下代码段使用polygon。所需的任何文本内容都可以放置在图形的顶部。

优点

  • SVG旨在产生可扩展的图形,并且可以很好地应对所有尺寸变化。
  • 可以以最小的编码开销实现边界和悬停效果。
  • 图像或渐变背景也可以提供给形状。

缺点

  • 浏览器支持可能是唯一的缺点,因为IE8不支持SVG,但是可以通过使用Raphael和VML之类的库来缓解这种情况。而且,对浏览器的支持绝不比其他选项差。

方法2-渐变背景

浏览器兼容性

线性渐变仍然可以用来生成形状,但不能像问题中提到的那样使用角度。我们必须使用to [side] [side]语法(感谢vals)而不是指定角度。指定侧面后,将根据容器的尺寸自动调整倾斜角度。

优点

  • 即使容器的尺寸是动态的,也可以实现并保持形状。
  • 悬停效果可以通过更改渐变颜色来添加。

缺点

  • 即使光标在形状之外但在容器内,也会触发悬停效果。
  • 添加边框将需要棘手的渐变操作。
  • 当宽度(或高度)很大时,渐变会产生锯齿状的角。
  • 图像背景不能用于形状。

方法3-偏斜变换

浏览器兼容性

在这种方法中,添加伪元素,使其倾斜并定位,使其看起来像其中一个边缘是倾斜的/倾斜的。如果顶部或底部边缘是倾斜的,则该倾斜应沿Y轴,否则旋转应沿X轴。本transform-origin应具备的相反侧倾斜侧。

优点

  • 即使有边框也可以实现形状。
  • 悬停效果将限于形状内。

缺点

  • 为了保持形状,尺寸需要成比例地增加,因为当元素倾斜时,其在Y轴上的偏移量会随着width增加而增加,反之亦然(尝试将其width增加到200pxsnippet中)。您可以在此处找到有关此信息的更多信息。

方法4-透视变换

浏览器兼容性

在这种方法中,主容器沿X轴或Y轴有一点透视地旋转。将适当的值设置为transform-origin只会在一侧产生倾斜的边缘。

如果顶部或底部倾斜,则旋转应沿Y轴,否则旋转应沿X轴。本transform-origin应具备的相反侧倾斜侧。

优点

  • 可以通过边框实现形状。
  • 尺寸不必成比例地增加即可保持形状。

缺点

  • 内容也会被旋转,因此必须反向旋转才能看起来正常。
  • 如果尺寸不是静态的,则定位文本将很乏味。

方法5-CSS剪切路径

浏览器兼容性

在这种方法中,使用多边形将主容器裁剪为所需的形状。多边形的点应根据需要倾斜边的一侧进行修改。

优点

  • 即使动态调整容器大小也可以保持形状。
  • 悬停效果将完全限制在形状的边界内。
  • 图像也可以用作形状的背景。

缺点

  • 当前浏览器支持非常差。
  • 可以通过以下方式添加边框:将绝对定位的元素放置在形状的顶部,并为其提供必要的剪辑,但是超出某个点时,它在动态调整大小时不太适合。

方法6-画布

浏览器兼容性

画布也可以用于通过绘制路径来生成形状。下面的代码片段有一个演示。所需的任何文本内容都可以位于形状的顶部。

优点

  • 即使容器的尺寸是动态的,也可以实现并保持形状。也可以添加边框。
  • 使用pointInpath方法可以将悬停效果限制在形状的边界内。
  • 图像或渐变背景也可以提供给形状。
  • 如果需要实时动画效果,因为它不需要DOM操作,因此是更好的选择。

缺点

  • 画布基于栅格,因此,缩放到超过点*时,倾斜的边缘将变得像素化或模糊。

*-调整视口大小时,避免像素化将需要重新绘制形状。有它的一个例子在这里,但是这是一个开销。


35

我尝试使用border方法,但是形状的尺寸是动态的,因此无法使用此方法。


方法7-视口单位 (边界Redux

浏览器兼容性

视口单位是CSS3中的一项重大创新。虽然通常可以使用百分比值对属性进行动态化,但不能对border-widths(也不能对font-sizes)进行设置。

取而代之的是,与视口尺寸相比,使用视口单位可以动态设置边框的宽度以及对象的大小。

注意:百分比值是指父对象,而不是视口(窗口的可见区域)。

要测试该方法,请启动以下代码段页”并在水平和垂直方向上调整其大小。

.shape {
    position: relative;
    height: 20vh;
    width: 40vw;
    background: tomato;
}
.shape:after {
    position: absolute;
    content: '';
    left: 0px;
    right: 0px;
    top: 20vh;
    border-width: 10vh 20vw;
    border-style: solid;
    border-color: tomato tomato rgba(0,0,0,0) rgba(0,0,0,0);
}
<div class="shape">Some content</div>

优点 -(1)一切都是动态的,浏览器覆盖面很广。

缺点 - (1)你应该注意你的操作系统如何处理滚动使用overflow: auto;


3
在最新版的chrome中似乎参差不齐。
Mr_Green

真正!我想浏览器引擎仍然需要一些时间来平滑呈现。当将此技术用于像素而不是视口单位时,Firefox也存在此问题,但是可以通过使用rgba(,,, 0)而不是透明的来修复。幸运的是,我们现在还有其他选择;)
Andrea Ligios 2015年

1

我的解决方案灵感来自本页上方Andrea Ligios提出的一种称为“ 方法7-视口单位”方法

height:10vw在调整导航窗口的宽度大小时,我也使用了“水平”单位表示高度(),以将给定的比例保持在梯形中。我们可以将此方法称为7b-视口宽度

此外,在我看来(例如,等),使用两个嵌套的divs而不是一个和:after选择器,可以更好地调整文本内容样式text-align

.dtrapz {
  position: relative;
  margin: 10px 40vw;
  width: 0;
  height: 10vw;
  border: none;
  border-right: 20vw solid #f22;
  border-bottom: 5vw solid transparent;
}

.dtcont {
  position: absolute;
  width: 20vw;
  height: 10vw;
  text-align: center;
  color: #fff;/* just aesthetic */
}
<div class="dtrapz">
  <div class="dtcont">Some content</div>
</div>


@Downvoter嗨!让我知道我的答案有什么问题,如果可以的话,我可以对其进行编辑或删除!我不是专家,但在我看来,这可以应用于很多页面,使用更长的文本内容,仅取决于宽度:)
MattAllegro
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.