完美实现弧形tab

方案1: 伪元素+1个额外元素

伪元素+1个额外元素
        
      .tab1 {
        /* tab高度 */
        --height: 36px;
        /* 弧度半径 */
        --r: 20px;
        --bg: red;
        position: relative;
        width: 20em;
        max-width: 90vw;
        height: var(--height);
        margin: 20px 0;
        background: var(--bg);
        display: grid;
        place-content: center;
        font-size: 14px;
        font-weight: bold;
        color: #fff;
        white-space: nowrap;
        border-radius: var(--r) var(--r) 0 0;
  
        &::before,
        &::after {
          content: '';
          position: absolute;
          bottom: 0;
          z-index: 1;
          width: var(--r);
          aspect-ratio: 1;
          background: var(--system-c2);
        }
  
        &::before {
          left: calc(0px - var(--r));
          border-radius: 0 0 var(--r) 0;
        }
  
        &::after {
          right: calc(0px - var(--r));
          border-radius: 0 0 0 var(--r);
        }
      }
  
      .tab1>p {
        position: absolute;
        left: calc(0px - var(--r));
        bottom: 0;
        width: calc(100% + 2 * var(--r));
        height: 50%;
        background: linear-gradient(to right, var(--bg) 0, var(--bg) var(--r), #0000 var(--r), #0000 100%) 0 0/calc(100% - var(--r)) 100% repeat-x;
      }
        
      

方案2: 伪元素 + 径向渐变

伪元素 + 径向渐变
        
      .tab2 {
        /* tab高度 */
        --height: 36px;
        /* 弧度半径 */
        --r: 20px;
        --bg: red;
        position: relative;
        width: 20em;
        max-width: 90vw;
        height: var(--height);
        margin: 20px 0;
        background: var(--bg);
        display: grid;
        place-content: center;
        font-size: 14px;
        font-weight: bold;
        color: #fff;
        white-space: nowrap;
        border-radius: var(--r) var(--r) 0 0;
  
        &::before,
        &::after {
          content: '';
          position: absolute;
          bottom: 0;
          z-index: 1;
          width: var(--r);
          aspect-ratio: 1;
        }
  
        &::before {
          left: calc(0px - var(--r));
          background: radial-gradient(var(--r) at 0 0, transparent 100%, red 100%) 100% 100%/100% 100% no-repeat;
        }
  
        &::after {
          right: calc(0px - var(--r));
          background: radial-gradient(var(--r) at var(--r) 0, transparent 100%, red 100%) 0 100%/100% 100% no-repeat;
        }
      }
        
      

方案3: 不用伪元素,单标签实现(mask)

标题
只有左边弧度
只有右边弧度
        
    .tab3 {
      /* tab高度 */
      --height: 36px;
      /* 弧度半径 */
      --r: 14px;
      /* tab 背景 */
      --bg: linear-gradient(to right, red, blue) border-box;
      /* 边框遮罩 */
      --mask: radial-gradient(var(--r) at var(--r) 0, #0000 100%, #000 100%) calc(-1*var(--r)) 100%/100% var(--r) repeat-x,
        linear-gradient(#000, #000) padding-box;
      width: fit-content;
      height: var(--height);
      padding-inline: var(--r);
      margin: 20px 0;
      background: var(--bg);
      display: grid;
      place-content: center;
      font-size: 16px;
      font-weight: bold;
      color: #fff;
      /* 靠border延伸出背景色,这里border设置透明也行,设置tab背景色也行,但是设置透明可以就不用后续调整了 */
      border-left: var(--r) solid #0000;
      border-right: var(--r) solid #0000;
      /* 给 border-radius 让padding-box上边具有弧度 */
      border-radius: calc(2*var(--r)) calc(2*var(--r)) 0 0/var(--r);
      mask: var(--mask);
      -webkit-mask: var(--mask);
    }

    .tab3.left {
      border-left-width: 0;
      border-top-left-radius: var(--r);
    }

    .tab3.right {
      border-right-width: 0;
      border-top-right-radius: var(--r);
    }