自定义vant ui steps组件效果实现

记录个问题,当作笔记吧:因为vue项目的移动端vant ui 的step组件跟ui设计图有差别,研究了半天还是没法使用step组件,只能手动设置一个

 

先上效果图和代码:

(1)HTML部分

<div class="rxlc-step">
  <div class="rxlc-content">
    <div class="content-list" v-for="(item, index) in rxlc_content" :key="index">
      <div class="content-list-lt">
        <div class="list-icon-title">
          <div class="lt-icon">
            <div class="lt-icon-box"></div>
          </div>
          <div class="lt-text">{{item.title}}</div>
        </div>
        <div class="white-line"></div>
      </div>
      <div class="content-list-rt">
        <div class="list-rt-content">{{item.text}}</div>
        <div class="cat-line"></div>
      </div>
    </div>
  </div>
</div>

(2)CSS部分

.rxlc-step {
    width: 100%;
    padding: 16px 18px 20px 17px;
    box-sizing: border-box;
    .rxlc-content {
      width: 100%;
      box-shadow: 0px 1px 3px 0px rgba(0, 0, 0, 0.15);
      border-radius: 10px;
      position: relative;
      .content-list {
        width: 100%;
        display: table;
        .content-list-lt {
          display: table-cell;
          background: #3db8ba;
          padding-left: 10px;
          position: relative;
          color: #ffffff;
          font-family: Noto Sans S Chinese Medium;
          font-size: 16px;
          .list-icon-title {
            display: table;
            .lt-icon {
              display: table-cell;
              .lt-icon-box {
                width: 5px;
                height: 5px;
                border-radius: 3px;
                background: #ffffff;
                margin-right: 7px;
                z-index: 999;
              }
            }
            .lt-text {
              display: table-cell;
              padding-right: 10px;
              font-weight: 550;
              font-size: 16px;
              line-height: 18px;
            }
          }
          .white-line {
            width: 1px;
            height: 100%;
            position: absolute;
            top: 34px;
            left: 12px;
            background: #ffffff;
            opacity: 0.2;
            z-index: 888;
          }
        }
        .content-list-rt {
          width: 70%;
          display: table-cell;
          .list-rt-content {
            padding: 22px 14px 0px 14px;
            color: #333333;
            font-size: 14.5px;
            line-height: 18px;
          }
          .cat-line {
            margin-left: 24px;
            margin-top: 20px;
            border-bottom: 1px solid #efefef;
          }
        }
        &:first-child {
          .content-list-lt {
            border-radius: 10px 0 0 0;
          }
        }
        &:last-child {
          .content-list-lt {
            border-radius: 0 0 0 10px;
            .white-line {
              width: 0px;
            }
          }
          .content-list-rt {
            .cat-line {
              margin-left: 10px;
              margin-top: 20px;
              border-bottom: none;
            }
          }
        }
      }
    }
  }

(3)JS部分

rxlc_content: [
        {
          title: '注册',
          text: '家长手机号注册账号'
        },
        {
          title: '新生信息采集',
          text: '报名信息采集,包括新生基础信息、监护人信息和个人相关图片资料上传;提交资料进入审核阶段'
        },
        {
          title: '网上审核',
          text: '网上报名资料提交至区教育局或下属单位进行审核确认'
        },
        {
          title: '现场审核',
          text: '网上报名资料审核通过,根据现场审核要求携带资料到指定地点审核确认'
        },
        {
          title: '录取',
          text: '新生现场审核通过,报读 学校发布录取通知。'
        }
      ]

 

  说一下原理吧,其实我刚开始的时候想的是先给每一行的div(类名content-list)设置用display:table布局,先将标题和内容放在两个display:table-cell的子div(类名content-list-lt和content-list-rt)中,然后用绝对定位将白线定位到白色圆形的中心位置,后面发现白线位置好控制,但是会出现一个问题,就是因为每一行的高度是由内容的长度撑开的,白线的总长度就很难控制了,没办法,只能请教鹏哥了,他叫我参照下vant 的steps的样式,打开F12查看了下,发现了些好玩的东西,如下:

 

 

  

  通过上面的两张图可以看到,vant的steps组件的线条也是利用绝对定位来实现的,只是它的定位是相对于每个类名为vant-step的div(每一行内容所在的div),且它的高度为每一行内容的高度,即height:100%设置,这样各行的白色线条就连成一条竖直的线,那么步骤条的长度问题也得到解决。

  需要注意的是我们最后一行的内容的白色线条是不需要展示出来的,因为实际我们要的线条段数为内容行数减1,所以最后一个div的线条的高度必须隐藏掉,所以给最后一个div的线条设置了width:0,其实设置height:0也是可以的。

  这样我们将之前的代码改动一下,把白色线条放在每一行的div(类名content-list)下的左边子div(即类名content-list-lt)中,让线条相对这个类名为content-list-lt的div进行绝对定位,就能实现steps组件效果了

 

posted @ 2019-04-08 17:53  secretAngel  阅读(8857)  评论(0编辑  收藏  举报