大力出奇迹——clip-path生成复杂面板轮廓

设计师设计的图纸往往特别漂亮,领导/客户看到设计图拍案叫好,说就这样做,但确实有很多效果让前端比较头秃,比如下面这两个面板轮廓效果↓


你说:这些效果简单啊,直接ui切图作为背景图!搞定!!!

然而你发现事情可能没有那么简单

有以下问题:

  1. 图切大了,加载会有一个一块一块加载的时间,图切小了,图又可能会比较模糊
  2. 这个面板可能会被很多地方使用,那么这些使用的地方有宽的有窄的有高的也有矮的,那么图片就会有拉伸的情况
  3. 可能不同的状态情况下,轮廓的颜色需要变换,有时候是蓝色的,有时候是红色的,有时候却是红橙黄绿青蓝紫的

... ...

上面说的这些情况都是直接使用图片作为背景难以解决的问题,你说使用svg,然而使用svg也是有拉伸问题(vector-effect可以解决边框拉伸的问题,但这些复杂的图形未必都是使用stroke来实现的,一部分是使用fill来实现的)

所以我这里有个思路:使用css3的clip-path来实现这些轮廓效果

我们知道clip-path是用来裁剪一个图形的,比如下图的这个梯形示例:

代码如下:

<style>
  .container{
    height:100px;
    width:100px;
    background:lightblue;
    clip-path: polygon(20% 0%, 80% 0%, 100% 100%, 0% 100%);
  }
</style>
<div class="container"></div>

就是裁剪出一个形状范围,但是若需要裁剪出边框,该怎么办呢?

下面是裁剪演示

以上直接使用clip-path将一个图形进行裁剪,将图形填充上颜色后模拟边框

文章一开始的两个轮廓效果是有内阴影效果的,这怎么办呢?

倘若直接使用box-shadow这个属性是不行的,因为box-shadow实现的阴影效果也会被裁剪掉,

其实同样的跟模拟上面的边框一样,也是使用clip-path裁剪图形来模拟阴影效果,但模拟出来的阴影效果没有光晕效果,也就是没有从深到浅的效果,其实也好办,多写几个图形,比如10个图形,10个图形的宽度依次变宽,设置上半透明,一叠加效果就出来了,如下

实际开发中设计师给出的图形可能会比较复杂,所以代码量可能比较庞大,下面是实现文章一开始稍微简单一些的效果的代码:

.mapboxgl-popup-content{
  width:100px;
  height:100px;
  position: relative;
  pointer-events: none;
  background: rgba(81,150,230,0.1);
  --topgap:15px;
  --bottomgap:10px;
  --topleft1X:var(--topgap);
  --topleft1Y:0px;
  --topleft2X:0px;
  --topleft2Y:var(--topgap);
  --toprightX:100%;
  --toprightY:0px;
  --bottomright1X:100%;
  --bottomright1Y:calc(100% - var(--bottomgap));
  --bottomright2X:calc(100% - var(--bottomgap));
  --bottomright2Y:100%;
  --bottomleftX:0px;
  --bottomleftY:100%;
  --gap:2px;
  --topleft2XGap:calc(var(--topleft2X) + var(--gap));
  --topleft2YGap:var(--topleft2Y);
  --bottomleftXGap:calc(var(--bottomleftX) + var(--gap));
  --bottomleftYGap:calc(var(--bottomleftY) - var(--gap));
  --bottomright2XGap:var(--bottomright2X);
  --bottomright2YGap:calc(var(--bottomright2Y) - var(--gap));
  --bottomright1XGap:calc(var(--bottomright1X) - var(--gap));
  --bottomright1YGap:var(--bottomright1Y);
  --toprightXGap:calc(var(--toprightX) - var(--gap));
  --toprightYGap:calc(var(--toprightY) + var(--gap));
  --topleft1XGap:var(--topleft1X);
  --topleft1YGap:calc(var(--topleft1Y) + var(--gap));
  --shadow:7px;
  --topleft2XShadow:calc(var(--topleft2X) + var(--shadow));
  --topleft2YShadow:var(--topleft2Y);
  --bottomleftXShadow:calc(var(--bottomleftX) + var(--shadow));
  --bottomleftYShadow:calc(var(--bottomleftY) - var(--shadow));
  --bottomright2XShadow:var(--bottomright2X);
  --bottomright2YShadow:calc(var(--bottomright2Y) - var(--shadow));
  --bottomright1XShadow:calc(var(--bottomright1X) - var(--shadow));
  --bottomright1YShadow:var(--bottomright1Y);
  --toprightXShadow:calc(var(--toprightX) - var(--shadow));
  --toprightYShadow:calc(var(--toprightY) + var(--shadow));
  --topleft1XShadow:var(--topleft1X);
  --topleft1YShadow:calc(var(--topleft1Y) + var(--shadow));
  clip-path: polygon(
    var(--topleft1X) var(--topleft1Y),
    var(--toprightX) var(--toprightY),
    var(--bottomright1X) var(--bottomright1Y),
    var(--bottomright2X) var(--bottomright2Y),
    var(--bottomleftX) var(--bottomleftY),
    var(--topleft2X) var(--topleft2Y)
  );
}
.mapboxgl-popup-content::before,
.mapboxgl-popup-content::after{
  content:'';
  position: absolute;
  width: inherit;
  height: inherit;
}
.mapboxgl-popup-content::before{
  background: #3972b0;
  clip-path: polygon(
    var(--topleft1X) var(--topleft1Y),
    var(--toprightX) var(--toprightY),
    var(--bottomright1X) var(--bottomright1Y),
    var(--bottomright2X) var(--bottomright2Y),
    var(--bottomleftX) var(--bottomleftY),
    var(--topleft2X) var(--topleft2Y),
    var(--topleft2XGap) var(--topleft2YGap),
    var(--bottomleftXGap) var(--bottomleftYGap),
    var(--bottomright2XGap) var(--bottomright2YGap),
    var(--bottomright1XGap) var(--bottomright1YGap),
    var(--toprightXGap) var(--toprightYGap),
    var(--topleft1XGap) var(--topleft1YGap),
    var(--topleft2XGap) var(--topleft2YGap),
    var(--topleft2X) var(--topleft2Y)
  );
}
.mapboxgl-popup-content::after{
  background: rgba(81,150,230,0.1);
  clip-path: polygon(
    var(--topleft2XGap) var(--topleft2YGap),
    var(--bottomleftXGap) var(--bottomleftYGap),
    var(--bottomright2XGap) var(--bottomright2YGap),
    var(--bottomright1XGap) var(--bottomright1YGap),
    var(--toprightXGap) var(--toprightYGap),
    var(--topleft1XGap) var(--topleft1YGap),
    var(--topleft1XShadow) var(--topleft1YShadow),
    var(--toprightXShadow) var(--toprightYShadow),
    var(--bottomright1XShadow) var(--bottomright1YShadow),
    var(--bottomright2XShadow) var(--bottomright2YShadow),
    var(--bottomleftXShadow) var(--bottomleftYShadow),
    var(--topleft2XShadow) var(--topleft2YShadow),
    var(--topleft1XShadow) var(--topleft1YShadow),
    var(--topleft1XGap) var(--topleft1YGap)
  );
}


<div class="mapboxgl-popup-content"></div>

具体效果的实现一般代码量不小,可以考虑使用scss之类的减少代码量,但量大管饱,只能依靠---大力出奇迹

下面是文章开头比较复杂的轮廓效果的代码

body{
  color:#fff;
}
.base-panel{
  height: 300px;
  width: 500px;
  position: relative;
  
  --titleHeight:40px;


  --topleftX:0px;/* 左上角坐标x */
  --topleftY:10px;/* 左上角坐标y */
  --cornerGap:10px;/* 角落空隙 */
  --topLength:250px;/* 顶部长度 */
  --slopeWidth:10px;/* 斜坡宽度 */
  --topRightX:100%;/* 右上角坐标x */
  --topRightY:var(--topleftY);/* 右上角坐标y */
  --concaveLength:40%;/* 凹陷长度 */
  --bottomRightX:var(--topRightX);/* 右下角坐标x */
  --bottomRightY:100%;/* 右下角坐标y */
  --bottomLeftX:var(--topleftX);/* 左下角坐标x */
  --bottomLeftY:var(--bottomRightY);/* 左下角坐标y */


  --topleftCoord1X:calc(var(--topleftX) + var(--cornerGap));/* 左上角第一个的坐标x */
  --topleftCoord1Y:var(--topRightY); /* 左上角第一个的坐标y */
  --topleftCoord2X:var(--topleftX);/* 左上角第二个的坐标x */
  --topleftCoord2Y:calc(var(--topleftY) + var(--cornerGap));/* 左上角第二个的坐标y */
  --slopeCoord1X:calc( 50% - var(--topLength)/2 - var(--slopeWidth) );/* 顶部坡度第一个坐标x */
  --slopeCoord1Y:var(--topleftY);/* 顶部第一个坡度y */
  --slopeCoord2X:calc(var(--slopeCoord1X) + var(--slopeWidth)); /* 顶部坡度第二个坐标x */
  --slopeCoord2Y:0px;/* 顶部坡度第二个坐标y */
  --slopeCoord3X:calc(var(--slopeCoord2X) + var(--topLength));/* 顶部坡度第三个坐标x */
  --slopeCoord3Y:0px;/* 顶部坡度第三个坐标y */
  --slopeCoord4X:calc(var(--slopeCoord3X) + var(--slopeWidth));/* 顶部坡度第四个坐标x */
  --slopeCoord4Y:var(--topleftY);/* 顶部第四个坡度y */
  --toprightCoord1X:calc(var(--topRightX) - var(--cornerGap));/* 右上角第一个的坐标x */
  --toprightCoord1Y:var(--topRightY); /* 右上角第一个的坐标y */
  --toprightCoord2X:var(--topRightX);/* 右上角第二个的坐标x */
  --toprightCoord2Y:calc(var(--topRightY) + var(--cornerGap));/* 右上角第二个的坐标y */
  --concaveRight1X:var(--topRightX);/* 右侧凹陷第一个x */
  --concaveRight1Y:calc( 50% - var(--concaveLength)/2);/* 左侧凹陷第一个y */
  --concaveRight2X:var(--toprightCoord1X);/* 右侧凹陷第二个x */
  --concaveRight2Y:calc(var(--concaveRight1Y) + var(--slopeWidth));/* 左侧凹陷第二个y */
  --concaveRight3X:var(--concaveRight2X);/* 右侧凹陷第三个x */
  --concaveRight3Y:calc(var(--concaveRight2Y) + var(--concaveLength));/* 左侧凹陷第三个y */
  --concaveRight4X:var(--concaveRight1X);/* 右侧凹陷第四个x */
  --concaveRight4Y:calc(var(--concaveRight3Y) + var(--slopeWidth));/* 左侧凹陷第四个y */
  --bottomrightCoord1X:var(--bottomRightX);/* 右下角第一个的坐标x */
  --bottomrightCoord1Y:calc(var(--bottomRightY) - var(--cornerGap));/* 右下角第一个的坐标y */
  --bottomrightCoord2X:calc(var(--bottomRightX) - var(--cornerGap));/* 右下角第二个的坐标x */
  --bottomrightCoord2Y:var(--bottomRightY);/* 右下角第二个的坐标y */
  --concaveBottom4X:calc(50% - var(--concaveLength)/2 - var(--slopeWidth));/* 底部第四个的坐标x */
  --concaveBottom4Y:100%;/* 底部第四个的坐标y */
  --concaveBottom3X:calc(var(--concaveBottom4X) + var(--slopeWidth));/* 底部第三个的坐标x */
  --concaveBottom3Y:calc(var(--bottomLeftY) - var(--cornerGap));/* 底部第三个的坐标y */
  --concaveBottom2X:calc(var(--concaveBottom3X) + var(--concaveLength));/* 底部第二个的坐标x */
  --concaveBottom2Y:var(--concaveBottom3Y);/* 底部第二个的坐标y */
  --concaveBottom1X:calc(var(--concaveBottom2X) + var(--slopeWidth));/* 底部第一个的坐标x */
  --concaveBottom1Y:100%;/*  底部第一个的坐标y */
  --bottomleftCoord1X:calc(var(--bottomLeftX) + var(--cornerGap));/* 左下角第一个x */
  --bottomleftCoord1Y:100%;/* 左下角第一个y */
  --bottomleftCoord2X:var(--bottomLeftX);/* 左下角第二个x */
  --bottomleftCoord2Y:calc(var(--bottomLeftY) - var(--cornerGap));/* 左下角第二个y */
  --concaveLeft4X:0%;/* 左边第四个的坐标x */
  --concaveLeft4Y:calc(50% - var(--concaveLength)/2 - var(--slopeWidth));/* 左边第四个的坐标y */
  --concaveLeft3X:var(--cornerGap);/* 左边第三个的坐标x */
  --concaveLeft3Y:calc(var(--concaveLeft4Y) + var(--slopeWidth));/* 左边第三个的坐标y */
  --concaveLeft2X:var(--cornerGap);/* 左边第二个的坐标x */
  --concaveLeft2Y:calc(var(--concaveLeft3Y) + var(--concaveLength));/* 左边第二个的坐标x */
  --concaveLeft1X:0%;/* 左边第一个的坐标x */
  --concaveLeft1Y:calc(var(--concaveLeft2Y) + var(--slopeWidth));/* 左边第一个的坐标y */
  --gap:2px;
  --topleftCoord2XGap:calc(var(--topleftCoord2X) + var(--gap));
  --topleftCoord2YGap:var(--topleftCoord2Y);
  --concaveLeft4XGap:calc(var(--concaveLeft4X) + var(--gap));
  --concaveLeft4YGap:var(--concaveLeft4Y);
  --concaveLeft3XGap:calc(var(--concaveLeft3X) + var(--gap));
  --concaveLeft3YGap:var(--concaveLeft3Y);
  --concaveLeft2XGap:calc(var(--concaveLeft2X) + var(--gap));
  --concaveLeft2YGap:var(--concaveLeft2Y);
  --concaveLeft1XGap:calc(var(--concaveLeft1X) + var(--gap));
  --concaveLeft1YGap:var(--concaveLeft1Y);
  --bottomleftCoord2XGap:calc(var(--bottomleftCoord2X) + var(--gap));
  --bottomleftCoord2YGap:var(--bottomleftCoord2Y);
  --bottomleftCoord1XGap:var(--bottomleftCoord1X);
  --bottomleftCoord1YGap:calc(var(--bottomleftCoord1Y) - var(--gap));
  --concaveBottom4XGap:var(--concaveBottom4X);
  --concaveBottom4YGap:calc(var(--concaveBottom4Y) - var(--gap));
  --concaveBottom3XGap:var(--concaveBottom3X);
  --concaveBottom3YGap:calc(var(--concaveBottom3Y) - var(--gap));
  --concaveBottom2XGap:var(--concaveBottom2X);
  --concaveBottom2YGap:calc(var(--concaveBottom2Y) - var(--gap));
  --concaveBottom1XGap:var(--concaveBottom1X);
  --concaveBottom1YGap:calc(var(--concaveBottom1Y) - var(--gap));
  --bottomrightCoord2XGap:var(--bottomrightCoord2X);
  --bottomrightCoord2YGap:calc(var(--bottomrightCoord2Y) - var(--gap));
  --bottomrightCoord1XGap:calc(var(--bottomrightCoord1X) - var(--gap));
  --bottomrightCoord1YGap:var(--bottomrightCoord1Y);
  --concaveRight4XGap:calc(var(--concaveRight4X) - var(--gap));
  --concaveRight4YGap:var(--concaveRight4Y);
  --concaveRight3XGap:calc(var(--concaveRight3X) - var(--gap));
  --concaveRight3YGap:var(--concaveRight3Y);
  --concaveRight2XGap:calc(var(--concaveRight2X) - var(--gap));
  --concaveRight2YGap:var(--concaveRight2Y);
  --concaveRight1XGap:calc(var(--concaveRight1X) - var(--gap));
  --concaveRight1YGap:var(--concaveRight1Y);
  --toprightCoord2XGap:calc(var(--toprightCoord2X) - var(--gap));
  --toprightCoord2YGap:var(--toprightCoord2Y);
  --toprightCoord1XGap:var(--toprightCoord1X);
  --toprightCoord1YGap:calc(var(--toprightCoord1Y) + var(--gap));
  --slopeCoord4XGap:var(--slopeCoord4X);
  --slopeCoord4YGap:calc(var(--slopeCoord4Y) + var(--gap));
  --slopeCoord3XGap:var(--slopeCoord3X);
  --slopeCoord3YGap:calc(var(--slopeCoord3Y) + var(--gap));
  --slopeCoord2XGap:var(--slopeCoord2X);
  --slopeCoord2YGap:calc(var(--slopeCoord2Y) + var(--gap));
  --slopeCoord1XGap:var(--slopeCoord1X);
  --slopeCoord1YGap:calc(var(--slopeCoord1Y) + var(--gap));
  --topleftCoord1XGap:var(--topleftCoord1X);
  --topleftCoord1YGap:calc(var(--topleftCoord1Y) + var(--gap));

  --shadow:7px;

  --topleftCoord2XShadow:calc(var(--topleftCoord2X) + var(--shadow));
  --topleftCoord2YShadow:var(--topleftCoord2Y);
  --concaveLeft4XShadow:calc(var(--concaveLeft4X) + var(--shadow));
  --concaveLeft4YShadow:var(--concaveLeft4Y);
  --concaveLeft3XShadow:calc(var(--concaveLeft3X) + var(--shadow));
  --concaveLeft3YShadow:var(--concaveLeft3Y);
  --concaveLeft2XShadow:calc(var(--concaveLeft2X) + var(--shadow));
  --concaveLeft2YShadow:var(--concaveLeft2Y);
  --concaveLeft1XShadow:calc(var(--concaveLeft1X) + var(--shadow));
  --concaveLeft1YShadow:var(--concaveLeft1Y);
  --bottomleftCoord2XShadow:calc(var(--bottomleftCoord2X) + var(--shadow));
  --bottomleftCoord2YShadow:var(--bottomleftCoord2Y);
  --bottomleftCoord1XShadow:var(--bottomleftCoord1X);
  --bottomleftCoord1YShadow:calc(var(--bottomleftCoord1Y) - var(--shadow));
  --concaveBottom4XShadow:var(--concaveBottom4X);
  --concaveBottom4YShadow:calc(var(--concaveBottom4Y) - var(--shadow));
  --concaveBottom3XShadow:var(--concaveBottom3X);
  --concaveBottom3YShadow:calc(var(--concaveBottom3Y) - var(--shadow));
  --concaveBottom2XShadow:var(--concaveBottom2X);
  --concaveBottom2YShadow:calc(var(--concaveBottom2Y) - var(--shadow));
  --concaveBottom1XShadow:var(--concaveBottom1X);
  --concaveBottom1YShadow:calc(var(--concaveBottom1Y) - var(--shadow));
  --bottomrightCoord2XShadow:var(--bottomrightCoord2X);
  --bottomrightCoord2YShadow:calc(var(--bottomrightCoord2Y) - var(--shadow));
  --bottomrightCoord1XShadow:calc(var(--bottomrightCoord1X) - var(--shadow));
  --bottomrightCoord1YShadow:var(--bottomrightCoord1Y);
  --concaveRight4XShadow:calc(var(--concaveRight4X) - var(--shadow));
  --concaveRight4YShadow:var(--concaveRight4Y);
  --concaveRight3XShadow:calc(var(--concaveRight3X) - var(--shadow));
  --concaveRight3YShadow:var(--concaveRight3Y);
  --concaveRight2XShadow:calc(var(--concaveRight2X) - var(--shadow));
  --concaveRight2YShadow:var(--concaveRight2Y);
  --concaveRight1XShadow:calc(var(--concaveRight1X) - var(--shadow));
  --concaveRight1YShadow:var(--concaveRight1Y);
  --toprightCoord2XShadow:calc(var(--toprightCoord2X) - var(--shadow));
  --toprightCoord2YShadow:var(--toprightCoord2Y);
  --toprightCoord1XShadow:var(--toprightCoord1X);
  --toprightCoord1YShadow:calc(var(--toprightCoord1Y) + var(--shadow));
  --slopeCoord4XShadow:var(--slopeCoord4X);
  --slopeCoord4YShadow:calc(var(--slopeCoord4Y) + var(--shadow));
  --slopeCoord3XShadow:var(--slopeCoord3X);
  --slopeCoord3YShadow:calc(var(--slopeCoord3Y) + var(--shadow));
  --slopeCoord2XShadow:var(--slopeCoord2X);
  --slopeCoord2YShadow:calc(var(--slopeCoord2Y) + var(--shadow));
  --slopeCoord1XShadow:var(--slopeCoord1X);
  --slopeCoord1YShadow:calc(var(--slopeCoord1Y) + var(--shadow));
  --topleftCoord1XShadow:var(--topleftCoord1X);
  --topleftCoord1YShadow:calc(var(--topleftCoord1Y) + var(--shadow));

  --adorn:2px;
  --concaveRight1XAdorn:var(--concaveRight1X);
  --concaveRight1YAdorn:calc(var(--concaveRight1Y) + var(--adorn));
  --concaveRight2XAdorn:calc(var(--concaveRight2X) + var(--adorn));
  --concaveRight2YAdorn:var(--concaveRight2Y);
  --concaveRight3XAdorn:calc(var(--concaveRight3X) + var(--adorn));
  --concaveRight3YAdorn:var(--concaveRight3Y);
  --concaveRight4XAdorn:var(--concaveRight4X);
  --concaveRight4YAdorn:calc(var(--concaveRight4Y) - var(--adorn));

  --concaveBottom1XAdorn:calc(var(--concaveBottom1X) - var(--adorn));
  --concaveBottom1YAdorn:var(--concaveBottom1Y);
  --concaveBottom2XAdorn:var(--concaveBottom2X);
  --concaveBottom2YAdorn:calc(var(--concaveBottom2Y) + var(--adorn));
  --concaveBottom3XAdorn:var(--concaveBottom3X);
  --concaveBottom3YAdorn:calc(var(--concaveBottom3Y) + var(--adorn));
  --concaveBottom4XAdorn:calc(var(--concaveBottom4X) + var(--adorn));
  --concaveBottom4YAdorn:var(--concaveBottom4Y);

  --concaveLeft1XAdorn:var(--concaveLeft1X);
  --concaveLeft1YAdorn:calc(var(--concaveLeft1Y) - var(--adorn));
  --concaveLeft2XAdorn:calc(var(--concaveLeft2X) - var(--adorn));
  --concaveLeft2YAdorn:var(--concaveLeft2Y);
  --concaveLeft3XAdorn:calc(var(--concaveLeft3X) - var(--adorn));
  --concaveLeft3YAdorn:var(--concaveLeft3Y);
  --concaveLeft4XAdorn:var(--concaveLeft4X);
  --concaveLeft4YAdorn:calc(var(--concaveLeft4Y) + var(--adorn));
  
  --titleSlopeWidth:15px;/* 标题斜坡宽度 */
  --titleCoord1X:0;
  --titleCoord1Y:50%;
  --titleCoord2X:var(--titleSlopeWidth);
  --titleCoord2Y:0;
  --titleCoord3X:calc(100% - var(--titleSlopeWidth));
  --titleCoord3Y:0;
  --titleCoord4X:100%;
  --titleCoord4Y:50%;
  --titleCoord5X:var(--titleCoord3X);
  --titleCoord5Y:100%;
  --titleCoord6X:var(--titleCoord2X);
  --titleCoord6Y:100%;
}
.base-panel-border{
  position: absolute;
  top:calc(var(--titleHeight)/2);
  height: calc(100% - var(--titleHeight)/2);
  width: 100%;
  pointer-events: none;
}
.base-panel-border-outline,.base-panel-border-adorn{
  position: absolute;
  height: 100%;
  width: 100%;
}
.base-panel-border-outline{
  background:rgba(13,37,76,0.1);
  clip-path: polygon(
    var(--topleftCoord1X) var(--topleftCoord1Y),
    var(--slopeCoord1X) var(--slopeCoord1Y),
    var(--slopeCoord2X) var(--slopeCoord2Y),
    var(--slopeCoord3X) var(--slopeCoord3Y),
    var(--slopeCoord4X) var(--slopeCoord4Y),
    var(--toprightCoord1X) var(--toprightCoord1Y),
    var(--toprightCoord2X) var(--toprightCoord2Y),
    var(--concaveRight1X) var(--concaveRight1Y),
    var(--concaveRight2X) var(--concaveRight2Y),
    var(--concaveRight3X) var(--concaveRight3Y),
    var(--concaveRight4X) var(--concaveRight4Y),
    var(--bottomrightCoord1X) var(--bottomrightCoord1Y),
    var(--bottomrightCoord2X) var(--bottomrightCoord2Y),
    var(--concaveBottom1X) var(--concaveBottom1Y),
    var(--concaveBottom2X) var(--concaveBottom2Y),
    var(--concaveBottom3X) var(--concaveBottom3Y),
    var(--concaveBottom4X) var(--concaveBottom4Y),
    var(--bottomleftCoord1X) var(--bottomleftCoord1Y),
    var(--bottomleftCoord2X) var(--bottomleftCoord2Y),
    var(--concaveLeft1X) var(--concaveLeft1Y),
    var(--concaveLeft2X) var(--concaveLeft2Y),
    var(--concaveLeft3X) var(--concaveLeft3Y),
    var(--concaveLeft4X) var(--concaveLeft4Y),
    var(--topleftCoord2X) var(--topleftCoord2Y)
  );
}
.base-panel-border-outline::before,
.base-panel-border-outline::after{
  content:'';
  height: inherit;
  width: inherit;
  position: absolute;
}
.base-panel-border-outline::before{
  background: #3972b0;
  clip-path: polygon(
    var(--topleftCoord1X) var(--topleftCoord1Y),
    var(--slopeCoord1X) var(--slopeCoord1Y),
    var(--slopeCoord2X) var(--slopeCoord2Y),
    var(--slopeCoord3X) var(--slopeCoord3Y),
    var(--slopeCoord4X) var(--slopeCoord4Y),
    var(--toprightCoord1X) var(--toprightCoord1Y),
    var(--toprightCoord2X) var(--toprightCoord2Y),
    var(--concaveRight1X) var(--concaveRight1Y),
    var(--concaveRight2X) var(--concaveRight2Y),
    var(--concaveRight3X) var(--concaveRight3Y),
    var(--concaveRight4X) var(--concaveRight4Y),
    var(--bottomrightCoord1X) var(--bottomrightCoord1Y),
    var(--bottomrightCoord2X) var(--bottomrightCoord2Y),
    var(--concaveBottom1X) var(--concaveBottom1Y),
    var(--concaveBottom2X) var(--concaveBottom2Y),
    var(--concaveBottom3X) var(--concaveBottom3Y),
    var(--concaveBottom4X) var(--concaveBottom4Y),
    var(--bottomleftCoord1X) var(--bottomleftCoord1Y),
    var(--bottomleftCoord2X) var(--bottomleftCoord2Y),
    var(--concaveLeft1X) var(--concaveLeft1Y),
    var(--concaveLeft2X) var(--concaveLeft2Y),
    var(--concaveLeft3X) var(--concaveLeft3Y),
    var(--concaveLeft4X) var(--concaveLeft4Y),
    var(--topleftCoord2X) var(--topleftCoord2Y),
    var(--topleftCoord2XGap) var(--topleftCoord2YGap),
    var(--concaveLeft4XGap) var(--concaveLeft4YGap),
    var(--concaveLeft3XGap) var(--concaveLeft3YGap),
    var(--concaveLeft2XGap) var(--concaveLeft2YGap),
    var(--concaveLeft1XGap) var(--concaveLeft1YGap),
    var(--bottomleftCoord2XGap) var(--bottomleftCoord2YGap),
    var(--bottomleftCoord1XGap) var(--bottomleftCoord1YGap),
    var(--concaveBottom4XGap) var(--concaveBottom4YGap),
    var(--concaveBottom3XGap) var(--concaveBottom3YGap),
    var(--concaveBottom2XGap) var(--concaveBottom2YGap),
    var(--concaveBottom1XGap) var(--concaveBottom1YGap),
    var(--bottomrightCoord2XGap) var(--bottomrightCoord2YGap),
    var(--bottomrightCoord1XGap) var(--bottomrightCoord1YGap),
    var(--concaveRight4XGap) var(--concaveRight4YGap),
    var(--concaveRight3XGap) var(--concaveRight3YGap),
    var(--concaveRight2XGap) var(--concaveRight2YGap),
    var(--concaveRight1XGap) var(--concaveRight1YGap),
    var(--toprightCoord2XGap) var(--toprightCoord2YGap),
    var(--toprightCoord1XGap) var(--toprightCoord1YGap),
    var(--slopeCoord4XGap) var(--slopeCoord4YGap),
    var(--slopeCoord3XGap) var(--slopeCoord3YGap),
    var(--slopeCoord2XGap) var(--slopeCoord2YGap),
    var(--slopeCoord1XGap) var(--slopeCoord1YGap),
    var(--topleftCoord1XGap) var(--topleftCoord1YGap),
    var(--topleftCoord2XGap) var(--topleftCoord2YGap),
    var(--topleftCoord2X) var(--topleftCoord2Y)
  );
}

.base-panel-border-outline::after{
  background: rgba(81,150,230,0.1);
  clip-path: polygon(
    var(--topleftCoord2XGap) var(--topleftCoord2YGap),
    var(--concaveLeft4XGap) var(--concaveLeft4YGap),
    var(--concaveLeft3XGap) var(--concaveLeft3YGap),
    var(--concaveLeft2XGap) var(--concaveLeft2YGap),
    var(--concaveLeft1XGap) var(--concaveLeft1YGap),
    var(--bottomleftCoord2XGap) var(--bottomleftCoord2YGap),
    var(--bottomleftCoord1XGap) var(--bottomleftCoord1YGap),
    var(--concaveBottom4XGap) var(--concaveBottom4YGap),
    var(--concaveBottom3XGap) var(--concaveBottom3YGap),
    var(--concaveBottom2XGap) var(--concaveBottom2YGap),
    var(--concaveBottom1XGap) var(--concaveBottom1YGap),
    var(--bottomrightCoord2XGap) var(--bottomrightCoord2YGap),
    var(--bottomrightCoord1XGap) var(--bottomrightCoord1YGap),
    var(--concaveRight4XGap) var(--concaveRight4YGap),
    var(--concaveRight3XGap) var(--concaveRight3YGap),
    var(--concaveRight2XGap) var(--concaveRight2YGap),
    var(--concaveRight1XGap) var(--concaveRight1YGap),
    var(--toprightCoord2XGap) var(--toprightCoord2YGap),
    var(--toprightCoord1XGap) var(--toprightCoord1YGap),
    var(--slopeCoord4XGap) var(--slopeCoord4YGap),
    var(--slopeCoord3XGap) var(--slopeCoord3YGap),
    var(--slopeCoord2XGap) var(--slopeCoord2YGap),
    var(--slopeCoord1XGap) var(--slopeCoord1YGap),
    var(--topleftCoord1XGap) var(--topleftCoord1YGap),

    var(--topleftCoord1XShadow) var(--topleftCoord1YShadow),
    var(--slopeCoord1XShadow) var(--slopeCoord1YShadow),
    var(--slopeCoord2XShadow) var(--slopeCoord2YShadow),
    var(--slopeCoord3XShadow) var(--slopeCoord3YShadow),
    var(--slopeCoord4XShadow) var(--slopeCoord4YShadow),
    var(--toprightCoord1XShadow) var(--toprightCoord1YShadow),
    var(--toprightCoord2XShadow) var(--toprightCoord2YShadow),
    var(--concaveRight1XShadow) var(--concaveRight1YShadow),
    var(--concaveRight2XShadow) var(--concaveRight2YShadow),
    var(--concaveRight3XShadow) var(--concaveRight3YShadow),
    var(--concaveRight4XShadow) var(--concaveRight4YShadow),
    var(--bottomrightCoord1XShadow) var(--bottomrightCoord1YShadow),
    var(--bottomrightCoord2XShadow) var(--bottomrightCoord2YShadow),
    var(--concaveBottom1XShadow) var(--concaveBottom1YShadow),
    var(--concaveBottom2XShadow) var(--concaveBottom2YShadow),
    var(--concaveBottom3XShadow) var(--concaveBottom3YShadow),
    var(--concaveBottom4XShadow) var(--concaveBottom4YShadow),
    var(--bottomleftCoord1XShadow) var(--bottomleftCoord1YShadow),
    var(--bottomleftCoord2XShadow) var(--bottomleftCoord2YShadow),
    var(--concaveLeft1XShadow) var(--concaveLeft1YShadow),
    var(--concaveLeft2XShadow) var(--concaveLeft2YShadow),
    var(--concaveLeft3XShadow) var(--concaveLeft3YShadow),
    var(--concaveLeft4XShadow) var(--concaveLeft4YShadow),
    var(--topleftCoord2XShadow) var(--topleftCoord2YShadow),
    var(--topleftCoord1XShadow) var(--topleftCoord1YShadow),
    var(--topleftCoord1XGap) var(--topleftCoord1YGap)
  );
}
.base-panel-border-adorn{
  background: #3972b0;
}
.base-panel-border-adorn-right{
  clip-path: polygon(
    var(--concaveRight1XAdorn) var(--concaveRight1YAdorn),
    var(--concaveRight2XAdorn) var(--concaveRight2YAdorn),
    var(--concaveRight3XAdorn) var(--concaveRight3YAdorn),
    var(--concaveRight4XAdorn) var(--concaveRight4YAdorn)
  )
}
.base-panel-border-adorn-bottom{
  clip-path: polygon(
    var(--concaveBottom1XAdorn) var(--concaveBottom1YAdorn),
    var(--concaveBottom2XAdorn) var(--concaveBottom2YAdorn),
    var(--concaveBottom3XAdorn) var(--concaveBottom3YAdorn),
    var(--concaveBottom4XAdorn) var(--concaveBottom4YAdorn)
  )
}
.base-panel-border-adorn-left{
  clip-path: polygon(
    var(--concaveLeft1XAdorn) var(--concaveLeft1YAdorn),
    var(--concaveLeft2XAdorn) var(--concaveLeft2YAdorn),
    var(--concaveLeft3XAdorn) var(--concaveLeft3YAdorn),
    var(--concaveLeft4XAdorn) var(--concaveLeft4YAdorn)
  )
}
.base-panel-title{
  font-size: 18px;
  background:#0092b7;
  position: absolute;
  padding: 0 15px;
  left:50%;
  transform: translateX(-50%);
  height: var(--titleHeight);
  display:flex;
  align-items: center;

  clip-path: polygon(
    var(--titleCoord1X) var(--titleCoord1Y),
    var(--titleCoord2X) var(--titleCoord2Y),
    var(--titleCoord3X) var(--titleCoord3Y),
    var(--titleCoord4X) var(--titleCoord4Y),
    var(--titleCoord5X) var(--titleCoord5Y),
    var(--titleCoord6X) var(--titleCoord6Y)
  )
}
.base-panel-title-content{
  border-radius: 50px;
  background-image: radial-gradient(rgba(2,88,123,1), transparent);
  padding:4px 15px;
  font-weight: bold;
}
.base-panel-content{
  position: absolute;
  top:var(--titleHeight);
  left:var(--cornerGap);
  height: calc(100% - var(--titleHeight) - var(--cornerGap));
  width: calc(100% - var(--cornerGap)*2);
}


<div class="base-panel">
  <div class="base-panel-border">
    <div class="base-panel-border-outline"></div>
    <div class="base-panel-border-adorn base-panel-border-adorn-right"></div>
    <div class="base-panel-border-adorn base-panel-border-adorn-bottom"></div>
    <div class="base-panel-border-adorn base-panel-border-adorn-left"></div>
  </div>
  <div class="base-panel-title">
    <div class="base-panel-title-content">
      工单协同处置流程
    </div>
  </div>
  <div class="base-panel-content">

  </div>
</div>

编辑于 2022-05-30 15:39