我想使用css创建此形状

问题描述 投票:0回答:1

What I wantWhat I get 我想使用CSS来做这种形状而不是图像,但是我得到的是绿色形状,而我的背景却无法透明!

#arrowbox:before {
    right: 100%;
    top: 50%;
    border: solid transparent;
    content: " ";
    height: 0;
    width: 0;
    position: absolute;
    pointer-events: none;
    border-color: rgba(0, 128, 0, 0);
    border-right-color: #008000;
    border-width: 25px;
    margin-top: -25px;
}
css
1个回答
2
投票

您可以通过一些透视和旋转来做到这一点:

.box {
  margin:20px;
  padding:20px calc(50% - 100px); /* this will fix the max width to 2x100px */
  /* the horizontal lines (one on each side)*/
  background:
    linear-gradient(red,red) left,
    linear-gradient(red,red) right;
  background-size:calc(50% - 100px) 2px;
  background-repeat:no-repeat;
  /* */
  text-align:center;
  position:relative;
}
.box::before,
.box::after{
  content:"";
  position:absolute;
  top:-10px; /* lower than 0 to avoid the overlap due to rotation */
  /* same as the padding */
  left:calc(50% - 100px); 
  right:calc(50% - 100px);
  /* */
  bottom:50%;
  border:3px solid red;
  border-bottom:none;
  border-radius:15px 15px 0 0;
  /* adjust here to control the shape  */
  transform:var(--s,scaley(1)) perspective(40px) rotateX(25deg);
  /* */
  transform-origin:bottom;
}
.box::after {
  --s:scaley(-1);
}
<div class="box"> some text here</div>


<div class="box"> more and more <br> text here</div>

<div class="box"> even more <br> and more <br> text here</div>

具有歪斜变换的另一个想法:

.box {
  margin:20px;
  padding:20px calc(50% - 100px); /* this will fix the max width to 2x100px */
  /* the horizontal lines (one on each side)*/
  background:
    linear-gradient(red,red) left,
    linear-gradient(red,red) right;
  background-size:calc(50% - 100px) 2px;
  background-repeat:no-repeat;
  /* */
  text-align:center;
  position:relative;
}
.box::before,
.box::after,
.box span::before,
.box span::after{
  content:"";
  position:absolute;
  top:0;
  left:calc(50% - 100px); 
  right:50%;
  bottom:50%;
  border:2px solid red;
  border-bottom:none;
  border-right:none;
  border-radius:10px 0 0 0;
  transform:var(--s,scaleX(1)) skew(-35deg);
  transform-origin:right bottom;
}
.box::after {
  --s:scalex(-1);
}
.box span::before {
  --s:scaleY(-1);
}
.box span::after {
  --s:scale(-1);
}
<div class="box"><span></span> some text here</div>


<div class="box"><span></span> more and more <br> text here</div>

<div class="box"><span></span> even more <br> and more <br> text here</div>

CSS shape with border

© www.soinside.com 2019 - 2024. All rights reserved.