【问题标题】:CSS Diamond / Triangle shaped divider line / borderCSS菱形/三角形分隔线/边框
【发布时间】:2018-09-21 14:25:55
【问题描述】:

我正在尝试用纯 CSS 创建以下黄金分割线。

我正在尝试使用transform:scale; CSS 创建它到目前为止,我发现了以下内容:

.border_angle {
	border: 50vw solid transparent;
	width: 0;
	height: 0;
	border-bottom-color: transparent;
	border-left-color: transparent;
	border-top-color: transparent;

	transform: scaleY(0.105) translateY(-50%);
	-webkit-transform: scaleY(0.105) translateY(-50%);
	-o-transform: scaleY(0.105) translateY(-50%);
	-moz-transform: scaleY(0.105) translateY(-50%);
	-ms-transform: scaleY(0.105) translateY(-50%);
	
	position: absolute;
	transform-origin: top center;
	top: 0;
	left: 0;
	right: 0;
	z-index: 11;
}

.border_angle_gold_l {
	border-left-color: #BE955A;
}

.border_angle_gold-light_r {
	border-right-color: #CCA56B;
}
<div style="margin-top: 200px;" class="border_angle border_angle_gold_l border_angle_gold-light_r"></div>

基本上,我几乎拥有它,但我只需要反转三角形!我不知道如何...任何帮助将不胜感激。

【问题讨论】:

  • 为什么使用纯 CSS?
  • 只是我认为 CSS 将是实现这一目标的最简单的选择 - 我不想使用透明的 PNG 或使用 javascript 等使其过于复杂(如果 js 甚至是一个选项? !) - 我在其他地方看到过,他们就是这样做的
  • 如果您使用的是虚拟 div,它就不是纯 CSS。您可以设置标题部分底部或内容部分顶部的样式。或者,如果必须在专用的 html 元素上完成,您可以使用 hr 元素,因为这在语义上比无意义的空 div 更正确。

标签: html css css-transforms css-shapes


【解决方案1】:

只是为了完成其他好的答案:

伪元素/边框方法

您可以在边框的帮助下创建三角形并将其应用于分隔线的伪元素::before::after。这会减少你的代码,你只需要在你的标记中的一个元素,你不必使用转换:

.divider {
  position: relative;
  width: 500px;
}

.divider::before,
.divider::after {
  content: '';
  position: absolute;
  width: 0;
  height: 0;
  border-top: 20px solid transparent;
  border-bottom: 20px solid transparent;
}

.divider::before {
  border-right: 250px solid #bf9655;
  left: 0;
}

.divider::after {
  border-left: 250px solid #cda667;
  right: 0;
}
<div class="divider"></div>

SVG 方法

就像现在的SVG is widely supported,使用SVG来创建形状也是合理的。下面是一个简单的例子,将代码长度减少到最小 141B:

<svg viewbox="0 0 24 2">
  <polygon points="0,1 12,0 12,2" style="fill:#bf9655;" />
  <polygon points="12,0 24,1 12,2" style="fill:#cda667;" />
</svg>

【讨论】:

  • 我有点喜欢 SVG 方法,因为它没有锯齿状的边缘!但它是固定宽度,所以我猜我需要使用媒体查询并为每个窗口大小的 SVG 指定一组尺寸?而其他选项我可以设置最大宽度容器和 100% 宽度,它会自动调整大小。
  • 相应地更新了我的 sn-p。使用viewbox 属性,您现在可以应用您选择的每个宽度。
【解决方案2】:

我会用更少的代码和linear-gradient

.triangle {
  margin-top:100px;
  height:80px;
  background-image:
    linear-gradient(to bottom right, transparent 50%,#BE955A 51%),
    linear-gradient(to top right, transparent 50%,#BE955A 51%),
    linear-gradient(to bottom left, transparent 50%,#CCA56B 51%),
    linear-gradient(to top left, transparent 50%,#CCA56B 51%);
  background-position:0 0,0 100%,100% 0,100% 100%;
  background-size:50.3% 50%;
  background-repeat:no-repeat;
}
<div class="triangle">
</div>

这是使用剪辑路径的另一个想法:

.triangle {
  margin-top: 100px;
  height: 80px;
  background: linear-gradient(to left, #CCA56B 50%, #BE955A 0); 
  -webkit-clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
  clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
}
<div class="triangle">
</div>

【讨论】:

  • 这很有趣 - 谢谢!效果不错——唯一的问题是,如果我将这些选项保留在 51%,中间会重叠一点,但如果我将它们全部更改为 50%。三角形的顶部和底部呈锯齿状......
  • @ShaunTaylor 我顺便添加了另一个想法 ;) ...是的,因为渐变不是抗锯齿,这就是为什么我将值设置为大于 50%,我们应该和他们一起玩以获得需要的结果锯齿更少
  • 实际上,我不希望它拉伸太多,所以如果我将其设为固定宽度,它可以解决锯齿状边缘问题 :) 非常感谢!
【解决方案3】:

您可以尝试复制 div,然后添加 translateX 之类的:

.border_angle {
	border: 50vw solid transparent;
	width: 0;
	height: 0;
	border-bottom-color: transparent;
	border-left-color: transparent;
	border-top-color: transparent;
	
	position: absolute;
	transform-origin: top center;
	top: 0;
	left: 0;
	right: 0;
	z-index: 11;
}

.border_angle_gold_l {
	border-left-color: #BE955A;
}

.border_angle_gold-light_r {
	border-right-color: #CCA56B;
}

.first {
    transform: scaleY(0.105) translateY(-50%) translateX(50%);
	-webkit-transform: scaleY(0.105) translateY(-50%) translateX(50%);
	-o-transform: scaleY(0.105) translateY(-50%) translateX(50%);
	-moz-transform: scaleY(0.105) translateY(-50%) translateX(50%);
	-ms-transform: scaleY(0.105) translateY(-50%) translateX(50%);
}

.second {
    transform: scaleY(0.105) translateY(-50%) translateX(-50%);
	-webkit-transform: scaleY(0.105) translateY(-50%) translateX(-50%);
	-o-transform: scaleY(0.105) translateY(-50%) translateX(-50%);
	-moz-transform: scaleY(0.105) translateY(-50%) translateX(-50%);
	-ms-transform: scaleY(0.105) translateY(-50%) translateX(-50%);
}
<div style="margin-top: 200px;" class="border_angle border_angle_gold_l border_angle_gold-light_r first"></div>
<div style="margin-top: 200px;" class="border_angle border_angle_gold_l border_angle_gold-light_r second"></div>

【讨论】:

  • 感谢您,我喜欢这种方法,因为它不会使对角线边缘呈锯齿状!但是,它增加了 3?三角形而不是 2?
  • @ShaunTaylor 这很奇怪,我想因为我只在这里测试了容器的大小在那里有所不同,在这种情况下,你仍然可以尝试这样的事情,但使用这些值,所以你只能看到 2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
相关资源
最近更新 更多