css实现tag

新的需求要求实现一个可适应的tag,如下图所示:

这里写图片描述
一开始实现的时候,想法过于简单,把标签整个切成一个背景图,结果发现当文字的长度不固定的时候,将会把图形拉扯变形,十分难看,为了解决这个问题,在同事的点拨下,决定把背景图切成两部分,即:

这里写图片描述 这里写图片描述

————–切图容易拼凑难,且切且珍惜—————————

当我切图完毕打算拼在一起的时候,发现问题来了
无论是(第一张图片用img展示,第二张图作为span的背景图),还是(两张图均以span的背景图展示),都有可能会出现两条线对不齐的情况,也就是第一张图和第二张图不能完美的拼凑成一条线,会有像素级的错位,针对这个问题也进行了很多尝试,然而并没有解决问题。

————–方案一:background插入两个图片—————————

后来想到background里面可不可以放两个图片,然后尝试了一下,发现可以。background: url(“one.png”),url(“two.png”);
background-position: 0% 100%,0.625rem 100%; //(x1 y1,x2 y2)
background-size: 0.76rem 100%,83% 100%; //(w1 h1,w2 h2)

不足:当tag里面的内容过长,将会导致文字溢出背景图片,不能根据文字长短自适应

————–方案二:运用before ,after解决————————–

今天看到一篇文章是用css来写一个tag
我尝试努力实现一个产品心中完美的tag,不过还是没有实现,上个半成品

这里写图片描述

能看出来第一个基本实现了效果图,但是边缘有部分空白,没有完全连接
一开始实现的效果第第二个图,采用before实现前面的实心梯形,after实现后面的空心圆点,后来在里面又添加了一个span,变成
博学多才
里面的span添加before伪类,样式类似于外部的实心梯形,颜色为白色,遮住蓝色实心梯形的多余部分。

  <style type="text/css">
        .tag-li{
           margin-left: 1rem;
           position: relative;
           padding-left: 1rem;
           height: 1.5rem;
           /*border-top: 1px solid blue;
           border-bottom: 1px solid blue;*/
           border: 1px solid blue;
           border-left:none;
           display: inline-block;
           border: 1px solid #1daffa;
           border-left: none;
           box-sizing:border-box;
           border-top-right-radius: 0.2rem;
           border-bottom-right-radius: 0.2rem;
           padding-right: .5rem;
           line-height: 1.5rem;
           color:#1daffa;
       }  
       .tag-li:before{
           /*content: " ";
           background-image: url("http://cdn2.picooc.com/web/res/fatburn/image/studentList/report-icon1a.png");
           background-size: cover;
           left: -.8rem;*/
           content: " ";
           position: absolute;
           top: -1px;
           left: -1.6rem;
           width: .85rem;
           height: 1.5rem;
           height: .75rem;
           display: inline-block;
           border: 1px solid transparent;
           border-right: .8rem solid #1daffa;
           border-top: .4rem solid transparent;
           border-bottom: .4rem solid transparent;

       }
       .tag-li-icon:before{
           content: " ";
           position: absolute;
           top: -1px;
           left: -1.5rem;
           width: .85rem;
           height: 1.5rem;
           height: .75rem;
           display: inline-block;
           border: 1px solid transparent;
           border-right: .7rem solid #fff;
           border-top: .4rem solid transparent;
           border-bottom: .4rem solid transparent;
       }
       .tag-li:after{
           content: " ";
           width: .2rem;
           height: .2rem;
           border-radius: 50%;
           position: absolute;
           top: .6rem;
           left: 0rem;
           border: 1px solid #1daffa;
       }
       </style>        
  <body>
       <span class="tag-li"><span class="tag-li-icon"></span>博学多才</span>
       <span class="tag-li">博学多才</span>
  </body>

————–方案三:运用before ,background解决————————–

虽然上一个版本不是最完美的解决方案,但是,却给我提供了思路,既然可以用before+after
伪类实现,为什么不能用before+background(方案一和方案二的结合)代码如下:

.tag-li, .tag-li1{
            margin-left: 1rem;
            position: relative;
            padding-left: 1rem;
            height: 1.5rem;
            border: 1px solid blue;
            border-left:none;
            display: inline-block;
            border: 1px solid #1daffa;
            border-left: none;
            box-sizing:border-box;
            border-top-right-radius: 0.2rem;
            border-bottom-right-radius: 0.2rem;
            padding-right: .5rem;
            line-height: 1.5rem;
            color:#1daffa;
        }  
        .tag-li1:before{
            content: " ";
            width: .85rem;
            height: 1.5rem;
            background-image: url("one.png");
            background-size: cover;
            position: absolute;
            top: -1px;
            left: -.8rem;
        }
<body>
    <span class="tag-li1">博学多才</span>
</body>

————–纸上得来终觉浅,绝知此事要躬行————————–

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值