简体   繁体   English

如何在 CSS 中实现响应式丝带形状?

[英]How to achieve a responsive ribbon shape in CSS?

在此处输入图片说明

Trying to achieve this with css.试图用 css 来实现这一点。 I've achieved in doing this but this breaks if my label (CAREER) is longer the size of the div .我已经做到了这一点,但是如果我的标签 (CAREER) 长于div的大小,这就会中断。 If its longer then the content wraps and the height of the div increases.如果它更长,则内容会换行并且div的高度会增加。 But the left ribbon cut does not do that responsively.但是左侧的剪彩并没有做出响应。 Can someone suggest a better approach?有人可以提出更好的方法吗?

 .custom-tag-container { border: 1px solid; margin: auto; display: flex; align-items: stretch; border-color: green green green transparent; padding: 4px !important; } .custom-tag-container>p { color: green; font-weight: bold; flex: 1; margin: auto; } #triangle-left { height: 25px; width: 25px; background: transparent; transform: rotateZ(45deg) translateX(-12.5px) translateY(12.5px); border: 1px solid; border-color: green green transparent transparent; }
 <div class="custom-tag-container"> <div id="triangle-left" /> <p>Hello Worldsm</p> </div>

JS Fiddle JS小提琴

Here is an idea that rely on skew transformation where it will be responsive and you will have transparency:这是一个依赖于倾斜转换的想法,它将具有响应性并且您将具有透明度:

 .box { height: 50px; border: 2px solid green; border-left: 0; border-radius:0 5px 5px 0; position:relative; margin:5px; } .box:before, .box:after{ content:""; position:absolute; left:0; height:50%; width:3px; background:green; } .box:before { top:0; transform:skew(45deg); transform-origin:top; } .box:after { bottom:0; transform:skew(-45deg); transform-origin:bottom; }
 <div class="box"></div> <div class="box" style="height:80px"></div>

功能区边缘 CSS

If you want to keep the same width for the arrow, you can consider a different idea using background:如果要保持箭头的宽度相同,可以考虑使用背景的不同想法:

 .box { height: 50px; border: 2px solid green; border-left: 0; border-radius:0 5px 5px 0; position:relative; margin:5px; overflow:hidden; } .box:before, .box:after{ content:""; position:absolute; left:0; top:0; height:50%; width:30px; background: linear-gradient(to top right, transparent calc(50% - 4px),green,transparent 50%) bottom/100% calc(100% + 4px); } .box:after { transform:scaleY(-1); transform-origin:bottom; }
 <div class="box"></div> <div class="box" style="height:80px"></div>

and with SVG too还有 SVG

 .box { height: 50px; border: 2px solid green; border-left: 0; border-radius:0 5px 5px 0; position:relative; margin:5px; } .box:before, .box:after{ content:""; position:absolute; left:0; top:0; height:50%; width:30px; background:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 15 15" preserveAspectRatio="none"><line x1="0" y1="-1" x2="15" y2="16" stroke="green" /></svg>') 0 0/100% 100%; } .box:after { transform:scaleY(-1); transform-origin:bottom; }
 <div class="box"></div> <div class="box" style="height:80px"></div>

在此处输入图片说明

You can also optimize the code and do it without pseudo element:您还可以优化代码并在没有伪元素的情况下进行:

 .box { height: 50px; border: 2px solid green; border-left: 0; border-radius:0 5px 5px 0; margin:5px; background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 15 15" preserveAspectRatio="none"><line x1="0" y1="-1" x2="15" y2="16" stroke="green" /></svg>') top left/30px 50%, url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 15 15" preserveAspectRatio="none"><line x1="0" y1="16" x2="15" y2="-1" stroke="green" /></svg>') bottom left/30px 50%; background-repeat:no-repeat; }
 <div class="box"></div> <div class="box" style="height:80px"></div>

The same SVG can be used to obtain the first result where the arrow width is also dynamic.相同的 SVG 可用于获得第一个结果,其中箭头宽度也是动态的。 The trick is to only define the height and preserve the ratio:诀窍是只定义高度并保留比例:

 .box { height: 50px; border: 2px solid green; border-left: 0; border-radius:0 5px 5px 0; margin:5px; background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 15 15"><line x1="0" y1="-1" x2="15" y2="16" stroke="green" /></svg>') top left/auto 50%, url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 15 15"><line x1="0" y1="16" x2="15" y2="-1" stroke="green" /></svg>') bottom left/auto 50%; background-repeat:no-repeat; }
 <div class="box"></div> <div class="box" style="height:80px"></div>


You can easily add a coloration inside too.您也可以轻松地在里面添加颜色。

With skew transformation:使用偏斜变换:

 .box { height: 50px; border: 2px solid green; border-left: 0; border-radius:0 5px 5px 0; position:relative; overflow:hidden; z-index:0; margin:5px; } .box:before, .box:after{ content:""; position:absolute; z-index:-1; left:0; right:0; height:50%; border-left:3px solid green; background:yellow; } .box:before { top:0; transform:skew(45deg); transform-origin:top; } .box:after { bottom:0; transform:skew(-45deg); transform-origin:bottom; }
 <div class="box"></div> <div class="box" style="height:80px"></div>

With the SVG background带有 SVG 背景

 .box { height: 50px; padding-left:30px; border: 2px solid green; border-left: 0; border-radius:0 5px 5px 0; margin:5px; background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 15 15" preserveAspectRatio="none"><polygon points="16,17 16,-2 0,-1 " fill="yellow" stroke="green" /></svg>') top left/30px 50%, url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 15 15" preserveAspectRatio="none"><polygon points="16,16 16,-2 0,16 " fill="yellow" stroke="green" /></svg>') bottom left/30px 50%, yellow content-box; background-repeat:no-repeat; }
 <div class="box"></div> <div class="box" style="height:80px"></div>

If you have white-on-white background, then you can use two css-triangles that one covers other and creates edge for ribbon.如果您有白色背景,那么您可以使用两个css 三角形,一个覆盖另一个并为功能区创建边缘。 If you need some transparency, then you should rely on clip-path (check if support is proper for your users) OR some SVG elements.如果您需要一些透明度,那么您应该依赖clip-path (检查支持是否适合您的用户)一些 SVG 元素。

 * { box-sizing: border-box; } .ribbon { width: 100%; height: 100px; border: 2px solid blue; position: relative; padding: 0 120px; line-height: 100px; text-align: center; font-size: 30px; } .ribbon:before, .ribbon:after { content: ''; width: 0; height: 0; border-top: 50px solid transparent; border-left: 100px solid green; border-bottom: 50px solid transparent; position: absolute; top: 0; left: 0; } .ribbon:after { border-left-color: white; left: -3px; }
 <div class="ribbon">CARRIER</div>


For less-hacky approach use simple background image.对于不太笨拙的方法,请使用简单的背景图像。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM