使用css :after修饰符制作antd斜边框

使用css :after修饰符制作antd斜边框,第1张

最近我们优秀的产品有这样一个需求

希望做一个带斜边框样式的tab页签,使用方法和tab类似,只是样式是这样不规则的

我们首先想着的是用antd的tab组件

      
        
          
            
          
          
            
          
        
      

但是tab组件只能做成下面这个样子,即不好看,也不符合要求

而且,antd的tab组件是没有什么斜边框或者不规则图形的自定义属性的

这个时候就需要思考了,有下面几种解决方法:

1.直接用snap画一个矢量图形,然后把tab元素替换

2.和产品打一架,让他把设计稿改成普通的tab样式

3.自己开始造轮子,从0开始写一个带斜边框的tab组件

4.用原生css将tab的样式改成带斜边框

好的,那么的话首先我们不能手动绘制一个图形并绑定,因为这是一个组件,我们还得使用组件的功能;

其次我也打不过产品;

最后优秀的前端工程师肯定是避免造轮子的,而且这种纯样式问题我们肯定也不想造轮子

那么就需要用到原生css了,那么首先我们不能直接对这些已经封装好的组件用class类选择器,需要用到全局样式进行外部封装;其次我们不能直接用border进行修改;最后我们还需要让斜边框属于这个tab对象的一部分,否则会出现无法选择的情况。
 

所以,只能使用:after选择器,在选择到tab对象之后,直接在tab后面增加一个斜边框元素就行

说干就干,我们先把整体的样式和背景颜色改成需要的样子

      
        
          
            
          
          
            
          
        
      
.TabsContainer {
  position: relative;

  :global(.ant-tabs .ant-tabs-nav) {
    margin-bottom: 0;
    background-color: #F3F3F3;
  }

  :global(.ant-tabs .ant-tabs-nav .ant-tabs-nav-wrap .ant-tabs-tab) {
    margin-right: 20px;
    background: #E0EAF3;

    :global(.ant-tabs-tab-btn) {
      z-index: 20;
    }
  }

  :global(.ant-tabs .ant-tabs-nav .ant-tabs-nav-wrap .ant-tabs-tab.ant-tabs-tab-active) {
    background: #fff;
    z-index: 10;

    :global(.ant-tabs-tab-btn) {
      color: #0D7EDB;
    }
  }
}

(用到了大量的gobal来选择到tab,如果不知道antd的tab组件中都是什么属性名的话,可以直接读取打包后的html源码来获取)

其中需要区分的是ant-tabs-tab-active和普通的ant-tabs-tab,前者是当前选中的tab标签,后者是没有选中的标签,两者最大区别是字体颜色和背景色不同(我们制作的斜边框也会因此不同)

效果如下:

之后,我们得为我们的斜边框元素预留位置,位置大小大概就是斜边框的宽度(大概20px宽,之后可以调整)

(在和tab有关的样式中添加margin属性)

这样的话,我们才有20px的宽度去写我们的after

然后我们编写after属性

  //未激活的tab的after属性
:global(.ant-tabs .ant-tabs-nav .ant-tabs-nav-wrap .ant-tabs-tab) {
    margin-right: 20px;
    background: #E0EAF3;

    &:after {
      content: '';
      width: 30px;
      height: 102%;
      background: #E0EAF3;
      position: absolute;
      right: -20px;
      top: 0;
    }

    :global(.ant-tabs-tab-btn) {
      z-index: 20;
    }
  }
//激活的tab的after属性  最大不同是background颜色不同
:global(.ant-tabs .ant-tabs-nav .ant-tabs-nav-wrap .ant-tabs-tab.ant-tabs-tab-active) {
    background: #fff;
    z-index: 10;

    &:after {
      content: '';
      background: #fff;
      z-index: 10;
    }

    :global(.ant-tabs-tab-btn) {
      color: #0D7EDB;
    }
  }

( 因为是带有重叠的效果的,使用还得设置一下z-index,而且,after的宽度应该是要大于我们刚刚设定的20px)

 我们可以看到我们定义的after是好好显示了,而且背景色和本身的tab的背景色一致,最后我们只需要让这个方框偏转30度就可以了!

可以直接用css的transform属性,设置skew偏转就可以

(skew可以使元素偏转,使得高度不变,需要注意的是和旋转rotate区分)

在after中加transform属性

 

 

 最后效果:

而且自由切换tab的话也没有问题

全css代码:

.TabsContainer {
  position: relative;

  :global(.ant-tabs .ant-tabs-nav) {
    margin-bottom: 0;
    background-color: #F3F3F3;
  }

  :global(.ant-tabs .ant-tabs-nav .ant-tabs-nav-wrap .ant-tabs-tab) {
    margin-right: 20px;
    background: #E0EAF3;

    &:after {
      content: '';
      width: 30px;
      height: 102%;
      background: #E0EAF3;
      position: absolute;
      right: -20px;
      top: 0;
      transform: skew(30deg);
    }

    :global(.ant-tabs-tab-btn) {
      z-index: 20;
    }
  }

  :global(.ant-tabs .ant-tabs-nav .ant-tabs-nav-wrap .ant-tabs-tab.ant-tabs-tab-active) {
    background: #fff;
    z-index: 10;

    &:after {
      content: '';
      background: #fff;
      z-index: 10;
    }

    :global(.ant-tabs-tab-btn) {
      color: #0D7EDB;
    }
  }
}

.Breadcrumb {
  :global(.ant-breadcrumb-link) {
    color: rgba(0, 0, 0, 0.45);
  }

  :global(.ant-breadcrumb-separator) {
    color: rgba(0, 0, 0, 0.85);
  }
}

全html代码


        
          
            
          
          
            
          
        
      

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1320787.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-11
下一篇 2022-06-11

发表评论

登录后才能评论

评论列表(0条)

保存