我正在开发一个响应式Web应用程序,需要创建两个独立的内容区域,如下所示,
到目前为止,我试过了,
border-right: 30px solid transparent;
border-bottom: 30px solid #4c4c4c;
height: 100%;
width: 100%;
position: fixed;
但遗憾的是,无法创建三角形。
除了使用border属性之外,还有其他方法可以使用CSS创建一个三角形,并且可以将内容完全包装在div中吗?
非常感谢任何帮助。
答案 0 :(得分:4)
我相信你正在寻找带边框和中间透明切口的三角形(现有的答案似乎都没有解决),所以这是一个例子。它绝对有可能实现,但需要大量的黑客攻击。
使用CSS转换:
以下代码段使用伪元素和变换来生成三角形效果。输出是响应性的,但是倾斜变换的使用意味着如果容器的形状变成矩形,那么倾斜角度将需要修改并且更多地调整定位属性等。
.container {
position: relative;
overflow: hidden;
height: 200px;
width: 200px;
}
.div-1,
.div-2 {
position: absolute;
top: 0px;
left: 0px;
height: 100%;
width: 100%;
overflow: hidden;
}
.div-1 {
top: calc(-100% - 5px);
transform: skewY(45deg);
transform-origin: left top;
border-bottom: 2px solid;
}
.div-1:after {
position: absolute;
content: '';
height: calc(100% - 2px);
width: calc(100% - 2px);
top: calc(100% + 7px);
left: 0px;
transform: skewY(-45deg);
transform-origin: left top;
border: 1px solid;
}
.div-2 {
top: 5px;
transform: skewY(45deg);
transform-origin: left bottom;
border-top: 1px solid;
}
.div-2:after {
position: absolute;
content: '';
height: calc(100% - 7px);
width: calc(100% - 7px);
top: 0px;
left: 0px;
transform: skewY(-45deg);
transform-origin: left bottom;
border: 1px solid;
}
* {
box-sizing: border-box;
}
/* just for demo */
.container{
transition: all 1s;
}
.container:hover{
width: 400px;
height: 400px;
}
body{
background: radial-gradient(circle at center, aliceblue, mediumslateblue);
min-height: 100vh;
}

<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<div class='container'>
<div class='div-1'></div>
<div class='div-2'></div>
</div>
&#13;
使用渐变:
另一种方法是使用几个线性渐变作为背景图像,如下面的代码片段所示。但是这里也有很多缺点。 (1)目前梯度的浏览器支持很差。 (2)角度梯度往往会产生需要平滑的锯齿状线条。 (3)您在相关图像中特别提到了2个div元素,我认为您需要内容,在这种情况下需要额外的工作。
.container {
position: relative;
overflow: hidden;
height: 200px;
width: 300px;
background: linear-gradient(to top right, transparent calc(50% + 2px), black calc(50% + 2px), black calc(50% + 4px), transparent calc(50% + 4px)), linear-gradient(to bottom left, transparent calc(50% + 2px), black calc(50% + 2px), black calc(50% + 4px), transparent calc(50% + 4px)) ;
}
.container:before{
position: absolute;
content: '';
height: calc(100% - 6px);
width: calc(100% - 6px);
left: 4px;
border-top: 2px solid black;
border-right: 2px solid black;
}
.container:after{
position: absolute;
content: '';
height: calc(100% - 6px);
width: calc(100% - 6px);
top: 4px;
border-left: 2px solid black;
border-bottom: 2px solid black;
}
/* just for demo */
.container{
transition: all 1s;
}
.container:hover{
width: 700px;
height: 400px;
}
body{
background: radial-gradient(circle at center, aliceblue, mediumslateblue);
min-height: 100vh;
}
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<div class='container'>
</div>
&#13;
使用SVG:
所有这些都引出了我的建议,即使用SVG 来创建这样的形状。它们很容易使用path
元素创建,易于维护并且本质上具有响应性。
.container {
position: relative;
height: 300px;
width: 200px;
}
svg {
position: absolute;
top: 0px;
left: 0px;
height: 100%;
width: 100%;
}
svg path {
fill: transparent;
stroke: black;
}
/* just for demo */
.container {
transition: all 1s;
}
.container:hover {
height: 400px;
width: 700px;
}
body {
background: radial-gradient(circle at center, aliceblue, mediumslateblue);
min-height: 100vh;
}
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<div class='container'>
<svg viewBox='0 0 100 100' preserveAspectRatio='none'>
<path d='M4,2 L98,2 98,96 4,2z M2,4 L2,98 96,98 2,4z' vector-effect='non-scaling-stroke' />
</svg>
</div>
&#13;
注意:使用上述任何方法(或其他答案中给出的方法),您无法使内容保持在这些三角形的边界内。除非CSS Shapes模块的
shape-inside
属性完全实现,否则文本可以放在它们上,但文本不能包含在这些边界内。
答案 1 :(得分:3)
只是不要给宽度和高度做三角形。
.triangle1 {
border-right: 30px solid transparent;
border-bottom: 30px solid #4c4c4c;
position: fixed;
}
<强> Working Fiddle 强>
根据你的图像,我创建了两个反向三角形。
.triangle1 {
border-right: 100px solid transparent;
border-bottom: 100px solid #4c4c4c;
position: fixed;
}
.triangle2 {
border-left: 100px solid transparent;
border-top: 100px solid #4c4c4c;
position: fixed;
margin-left: 3px;
}
<div class="triangle1">
</div>
<div class="triangle2">
</div>
修改强>
以下是在三角形内添加文字的一种方法。
在三角形内添加另一个文本div并设置它的位置。
<强> Fiddle 强>
答案 2 :(得分:1)
.triangle1 {
width: 0;
height: 0;
border-left: 0px solid transparent;
border-right: 200px solid transparent;
border-bottom: 150px solid black;
}
对于DIV元素1.对于第二个,只需制作一个正方形并在正方形的顶部渲染三角形。
答案 3 :(得分:1)
Html代码:
<div id="DIV-Element1"></div>
<div id="DIV-Element2"></div>
Css:
#DIV-Element1 { width: 0; height: 0; border-bottom: 100px solid black; border-right: 100px solid transparent; }
#DIV-Element2 { width: 0; height: 0; margin-left: 15px;border-top: 100px solid black; border-left: 100px solid transparent; }
您可以通过更改边框来调整三角形
我希望这会有效