如何创建一个CSS缩放到父div高度的三角形?

时间:2015-06-10 10:05:14

标签: html css css3 css-shapes

我目前正在创建一个内容块,其高度可根据内容进行缩放。块需要在一端有一个箭头,可以缩放到块的高度。

如果可能的话,我会非常喜欢纯CSS解决方案。我目前正在使用边框三角形方法:https://css-tricks.com/snippets/css/css-triangle/

这可以正常工作,如下面的小提琴所示,但如果你增加div的高度,那么它不会将三角形重新缩放到新的高度。

https://jsfiddle.net/xq5wwf3h/10/

<div id="triangle-container">
    Some interesting content goes in here!
</div>

body * {
    box-sizing: border-box;
}

#triangle-container {
    position: relative;
    height: 100px;
    width: 100%;
    background: grey;
    margin-left:50px;
    color: #fff;
    padding: 15px;
}

#triangle-container:before {
    content: '';
    position: absolute;
    left: -50px;
    top: 0;
    width: 0;
    height: 0;
    border-style: solid;
    border-width: 50px 50px 50px 0;
    border-color: transparent #007bff transparent transparent;
}

3 个答案:

答案 0 :(得分:2)

CSS

这是由于边框必须适合任何三角形高度。只需更改.triangle-left中的宽度,您就会看到响应速度。

它只会调整到最高500px,但这应该足够了。

.contain {
  width: 100%;
}

/*Left pointing*/
.triangle-left {
    width: 5%;
    height: 0;
    padding-top: 5%;
    padding-bottom: 5%;
    overflow: hidden;
}
.triangle-left:after {
    content: "";
    display: block;
    width: 0;
    height: 0;
    margin-top:-500px;
    
    border-top: 500px solid transparent;
    border-bottom: 500px solid transparent;
    border-right: 500px solid #4679BD;
}
<div class="contain">
  <div class="triangle-left"></div>
</div>
  

SVG

SVG版本只需要定位。

.contain {
  height: 30px;
}
<div class="contain">
  <svg width="100%" height="100%" viewBox="0 0 500 500">
    <polygon points="0,250 500,0 500,500" style="fill:red;stroke:black;stroke-width:2" />
  </svg>
</div>

答案 1 :(得分:2)

我找到了一个解决方案(尽管在IE中不支持)因此根据情况可能不是最佳方式。

该解决方案使用背景剪辑属性:

https://jsfiddle.net/xq5wwf3h/32/

body * {
    box-sizing: border-box;
}

#triangle-container {
    position: relative;
    height: 100px;
    width: 100%;
    background: grey;
    margin-left:50px;
    color: #fff;
    padding: 15px;
}

#triangle-container:before {
    content: '';
    position: absolute;
    display: block;
    left: -25px;
    top: 0;
    bottom: 0;
    width: 25px;
    height: 100%;
    background: #007bff;
    -webkit-clip-path: polygon(100% 0, 100% 100%, 0 50%);
    clip-path: polygon(100% 0, 100% 100%, 0 50%);
}

答案 2 :(得分:0)

这是我使用jQuery的方法。它可以工作,但你必须使用一个小脚本:/

https://jsfiddle.net/64w58wL4/

<强> HTML

<div id="triangle-container">
    <div id="triangle"></div>
    Some interesting content goes in here!
</div>

<强> CSS

body * {
    box-sizing: border-box;
}

#triangle-container {
    position: relative;
    min-height: 100px;
    width: 100%;
    background: grey;
    margin-left:50px;
    color: #fff;
    padding: 15px;
}

#triangle {
    position: absolute;
    left: -50px;
    top: 0;
    width: 0;
    height: 0;
    border-style: solid;
    border-width: 50px 50px 50px 0;
    border-color: transparent #007bff transparent transparent;
}

jQuery脚本

$(document).ready(function(){
    var triengleHeight = $('#triangle-container').outerHeight()
    $('#triangle').css('border-width', triengleHeight/2 + 'px 50px ' + triengleHeight/2 + 'px 0')
})