【问题标题】:Responsive triangle with border to container's height and width [duplicate]带有边框的响应三角形到容器的高度和宽度[重复]
【发布时间】:2015-02-17 01:22:00
【问题描述】:

问题

我需要创建一个包含三角形轮廓的容器框,该三角形轮廓响应容器的大小,这是一个图像示例,因为它要简单得多:

要求

  • 三角形应该调整到它的容器的高度和宽度,它不需要保持它的纵横比,这意味着三角形的底和点应该像附图中那样接触容器的边。
  • 三角形应有清晰且不模糊的 1 像素边框
  • 三角形应该有背景#fff
  • 框应该有一个 2 像素的边框
  • 框应该有背景#fff


问题

我已经尝试过一些基本的东西,在子 div 周围有边框,但是用相对宽度和高度动态定位它被证明是一个问题。

因为只是得到一个三角形的轮廓而不是一个全彩色的三角形。这意味着使用边框创建三角形变得更加复杂,除非有人可以弄清楚如何将一个放在另一个之上以提供具有图像中 1px 边框效果的白色背景?

一个例子

jsFiddle demo

.pane{
    border:1px solid #000;
    height:500px;
    margin:auto;
    margin-top:150px;
    position:relative;
    width:400px;
}

.triangle{
    width: 0; 
    height: 0; 
    border-top: 250px solid transparent;
    border-bottom: 250px solid transparent;
    border-left: 250px solid #ff0000;
}


<div class="pane">
    <div class="triangle">
    </div>
</div>


示例 2

jsFiddle Demo

这个例子创建了响应式三角形,但是它们需要被翻转并且有更宽的部分绝对定位left:0; right:0; top:0;

【问题讨论】:

标签: javascript jquery css responsive-design css-shapes


【解决方案1】:

See here

  • 这使用了一种很棒的技术,使用渐变来创建形状。

  • 你可能想摆弄它看看:

body, html {height: 100%}
#triangleWrapper {
    width: 100px;
    height:200px;
    border:1px solid black;

}

.segmentTriangle {
    width: 100%;
    height: 100%;
    left: 0px;
    top: 0px;
    background: linear-gradient(to right bottom, black 50%, transparent 50%)
}
    <div style="float: left;" id="triangleWrapper">
        <div style="height: 100%;" class="segmentTriangle"></div>
    </div>
    
</div>

updated fiddle


只有轮廓


通过使用渐变的力量,您可以创建纯粹的轮廓,如下所示:

body,
html {
  height: 100%;
}
#triangleWrapper {
  width: 500px;
  height: 200px;
  border: 2px solid black;
  overflow: hidden;
}
.segmentTriangle {
  width: 200%;
  height: 100%;
  margin-left: -100%;
  background: linear-gradient(to left top, transparent 49%, black 50%, transparent 50%), linear-gradient(to left bottom, transparent 49%, black 50%, transparent 50%);
}
<div id="triangleWrapper">
  <div class="segmentTriangle"></div>
</div>

更新


Right Triangle

Up Triangle

Down Triangle

Left Triangle


注意 为确保“边框”不被切断,您可以在父容器上设置overflow:hidden;

【讨论】:

  • 差不多了,只需要一个等腰而不是直角三角形?
  • @JamesDonnelly:见“新的更新答案”
  • 即使线条模糊,这个解决方案也可以工作,因为三角形的大小取决于容器的大小,无论使用什么单位:jsfiddle.net/webtiki/v1cczusd
【解决方案2】:

根据您用于容器的单位,如果它的大小取决于视口,您可以使用vw/vh units 实现此行为:

DEMO

div{width:0;outline:1px solid red;}
.r{
    border-top:15vh solid transparent;
    border-bottom:15vh solid transparent;
    border-left:50vw solid teal;
}
.t{
    border-left:15vw solid transparent;
    border-right:15vw solid transparent;
    border-bottom: 50vh solid gold;
}
<div class="r"></div>
<div class="t"></div>

如果你只想要三角形的轮廓并且你有一个简单的背景,你可以使用这种方法:

重点是在第一个三角形上放置一个与背景颜色相同的三角形:

DEMO

div {
  position: relative;
  overflow: hidden;
  outline: 1px solid red;
}
.r {
  width: 50vw;
  height: 30vh;
  border-left: 2px solid teal;
}
.t {
  height: 50vh;
  width: 30vw;
  border-bottom: 2px solid gold;
}
.r:after,
.r:before,
.t:after,
.t:before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
}
.r:before,
.r:after {
  border-top: 15vh solid transparent;
  border-bottom: 15vh solid transparent;
  border-left: 50vw solid teal;
}
.r:after {
  border-left-color: #fff;
  left: -1vw;
}
.t:before,
.t:after {
  border-left: 15vw solid transparent;
  border-right: 15vw solid transparent;
  border-bottom: 50vh solid gold;
}
.t:after {
  border-bottom-color: #fff;
  bottom: -1vh;
}
<div class="r"></div>
<div class="t"></div>

【讨论】:

  • vhvw 单位等于窗口的大小,而不是特定容器的大小。
  • @JamesDonnelly 你是对的,在答案中添加了if 声明。
  • 还有只获取图片中的三角形轮廓/边框的问题呢?
  • @Silver89 你有纯色背景吗?
  • 容器会有一个border:1px solid #000;,三角形也会有一个background:#fff;
【解决方案3】:

This article 似乎为纯 CSS 的响应式三角形提供了一个不错的解决方案

DEMO

.triangle-up {
  width: 25%;
  height: 0;
  padding-left: 25%;
  padding-bottom: 25%;
  overflow: hidden;
  border: 1px solid brown;
  margin: 20px;
}
.triangle-up div {
  width: 0;
  height: 0;
  margin-left: -500px;
  border-left: 500px solid transparent;
  border-right: 500px solid transparent;
  border-bottom: 500px solid #4679BD;
}
.triangle-right {
  width: 0;
  height: 0;
  padding-top: 25%;
  padding-bottom: 25%;
  padding-left: 25%;
  overflow: hidden;
  border: 1px solid green;
  margin: 20px;
}
.triangle-right div {
  width: 0;
  height: 0;
  margin-top: -500px;
  margin-left: -500px;
  border-top: 500px solid transparent;
  border-bottom: 500px solid transparent;
  border-left: 500px solid tomato;
}
<div class="triangle-up">
  <div></div>
</div>

<div class="triangle-right">
  <div></div>
</div>

【讨论】:

  • 如果只是三角形的轮廓,那就是这个!
  • 我需要三角形有白色背景和 1px 边框,实心三角形不允许这样做?
  • 三角形只要是容器大小不变形
  • @web-tiki - OP 说:“基本上三角形应该调整大小而不会扭曲......”所以我认为三角形确实需要保持它们的纵横比
  • @JamesDonnelly:OP 的要求似乎与我们想象的有所不同。这几乎是“自动缩放三角形,但它必须是三角形的轮廓,三角形应该填满容器,但不能扭曲”。听起来像是相互矛盾的要求,(无论如何对我来说)。
【解决方案4】:

如果您可以使用 SVG,那么此解决方案可以为您工作。

您可以使用 SVG 创建根据其父级更改的箭头。您可以在http://css-tricks.com/ 看到工作箭头(您正在使用的不同箭头)。当您向下滚动查看第二篇文章链接时,您可以看到箭头。如果您将更改箭头父锚标记的宽度和高度并将其块属性设置为块。您将看到箭头根据其父级而变化。您可以在任何浏览器中使用 Inspect bar 来查看结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 2014-02-21
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 2014-10-11
    相关资源
    最近更新 更多