第一种:

template

<div class="per-mobile-step"          v-for="(item,index) in steps"          :key="item.value"          @click="changeStep(item,index)"          :class="[            'per-mobile-step-'+index,            item.value==currentcomponent?'active':'',            index < currentcomponentindex?'active':''          ]">            <div class="title-dot">              <i :class="[                  item.value==currentcomponent?'active':'',                  index < currentcomponentindex?'actived':''                ]"></i>              <div class="line"                 :class="[                  index < currentcomponentindex?'active':''                ]"                 v-if="index!==3"></div>            </div>            <div class="title-text"            :class="[              'title-text-'+index,              item.value==currentcomponent?'active':'',              index < currentcomponentindex?'active':''            ]">{{item.label}}</div>          </div>

下面的

index < currentcomponentindex?'active':''

为了记录以后步骤前的已实现的步骤,actived为已实现,active为以后展现步骤


js

data(){    return{      currentcomponent:"ac1",      currentcomponentindex:0,      steps:[        {          label:"身份验证",          value:"ac1"        },        {          label:"手机号绑定",          value:"ac2"        },        {          label:"设置明码",          value:"ac3"        },        {          label:"实现",          value:"ac4"        },      ]    }  },

scss

// mobile  .per-mobile-step{    flex: 3;    font-size: 0.8rem;    line-height: 2;    color: #e2e2e2;    &.per-mobile-step-3{      flex: 1;//最初一步没有线条,做了flex比例缩减    }    .title-dot{      display: flex;      align-items: center;      >i{        height: 10px;        width: 10px;        background: #e6e6e6;        display: block;        border-radius: 50%;        &.active{          background: #f39800;          box-shadow: 0 0 0 3px #887963;        }        &.actived{          background: #f39800;          box-shadow: 0 0 0 3px #f39800;        }      }      .line{        flex: 1;        height: 1px;        background: #e6e6e6;        &.active{          background: #f39800;        }      }    }// 为了文字居中,包裹层向左边挪动20px// 字居中用relative做了偏移,有更好的办法代码请甩给我~    .title-text{      position: relative;      margin-top: 5px;      &.active{          color: #edc462;        }    }    .title-text-0{      left: -20px;    }    .title-text-1{      left: -23px;    }    .title-text-2{      left: -20px;    }    .title-text-3{      left: -10px;    }      }


第二种:

template

<div class="per-step"          v-for="(item,index) in steps"          :key="item.value"          @click="changeStep(item,index)"          :class="[            index!==0?'before-trangle':'',            index!==3?'after-trangle':'',            'per-step-'+index,            item.value==currentcomponent?'active':'',            index < currentcomponentindex?'active':''          ]">            <span>{{item.label}}</span>          </div>

scss

.per-step{    flex: 1;    text-align: center;    background: rgba(0,0,0,.5);    padding: 10px 0;    margin: 0 20px;    color: #fff;    position: relative;    height: 40px;    cursor: pointer;    &.active{      background: rgba(0,84,165,.5);    }    &.before-trangle{      margin-left: 40px;      &::before{        content: " ";        width: 0px;        height: 0px;        position: absolute;        top: 0;        left: -40px;        border: 20px solid rgba(0,0,0,.5);        border-left-color: transparent;      }      &.active{        &::before{          border: 20px solid rgba(0,84,165,.5);          border-left-color: transparent;        }      }    }    &.after-trangle{      &::after{        content: " ";        width: 0px;        height: 0px;        position: absolute;        top: 0;        right: -40px;        border: 20px solid transparent;        border-left-color: rgba(0,0,0,.5);      }      &.active{        &::after{          border: 20px solid transparent;          border-left-color: rgba(0,84,165,.5);        }      }    }    &.per-step-0{      margin-left: 0;    }    &.per-step-3{      margin-right: 0;    }  }