效果图:
 

 
弹框组件代码:
 
<template>
  <el-dialog
    :visible.sync="dialogVisible"
    :append-to-body="true"
    :close-on-click-modal="false"
    :close-on-press-escape="false"
    title
    width="8.2rem"
    custom-class="assistance-dialog"
    center
  >
    <div class="assistance-cont flex-top-start">
      <div class="assistance-code-box">左边</div>
      <div class="assistance-steps flex-column-between">
        <div class="assistance-steps-box">
          <div class="assistance-steps-title">助力步骤</div>
          <div class="assistance-steps-cont">
            <div class="assistance-steps-line"></div>
            <div class="assistance-steps-item-cont">
              <div
                class="assistance-steps-item flex-start"
                v-for="(item, index) in stepsCont"
                :key="index"
              >
                <div class="assistance-steps-item-idx">{{ index + 1 }}</div>
                <div class="assistance-steps-item-name">{{ item }}</div>
              </div>
            </div>
          </div>
        </div>
        <div class="flex-end">
          <el-button type="primary">保存海报</el-button>
        </div>
      </div>
    </div>
  </el-dialog>
</template>
<script>
export default {
  name: "assistance-dialog",
  props: {
    value: {
      type: Boolean,
      default: false,
    },
  },
  components: {},
  data() {
    return {
      stepsCont: [
        "保存海报",
        "发送海报给好友",
        "好友扫码登录小程序",
        "助力成功",
      ],
    };
  },
  computed: {
    dialogVisible: {
      get() {
        return this.value;
      },
      set(val) {
        this.$emit("input", val);
      },
    },
  },
  watch: {},
  methods: {},
  created() {},
  mounted() {},
  beforeCreate() {},
  beforeMount() {},
  beforeUpdate() {},
  updated() {},
  beforeDestroy() {},
  destroyed() {},
  activated() {},
};
</script>
<style lang='scss' scoped>
.assistance-dialog {
  .assistance-code-box {
    width: 3.45rem;
    height: 5.07rem;
    background: #f4f6f9;
    border-radius: 0.08rem;
    margin-right: 0.32rem;
  }
  .assistance-steps {
    height: 5.07rem;
    flex: 1;
  }
  .assistance-steps-box {
    width: 100%;
    .assistance-steps-title {
      font-size: 0.21rem;
      font-family: PingFangSC-Medium, PingFang SC;
      font-weight: 500;
      color: #242e42;
      line-height: 0.29rem;
      margin-bottom: 0.24rem;
    }
    .assistance-steps-cont {
      width: 100%;
      position: relative;
    }
    .assistance-steps-line {
      position: absolute;
      width: 0.32rem;
      height: 3.32rem;
      border-left: 1px dashed rgba(0, 101, 255, 1);
      top: 0.3rem;
      left: 0.16rem;
      z-index: 1;
    }
    .assistance-steps-item-cont {
      width: 100%;
      height: 4rem;
      position: absolute;
      z-index: 2;
    }
    .assistance-steps-item:not(:last-child) {
      margin-bottom: 0.8rem;
    }
    .assistance-steps-item-idx {
      width: 0.32rem;
      height: 0.32rem;
      line-height: 0.32rem;
      text-align: center;
      background: #0065ff;
      border-radius: 0.08rem;
      font-size: 0.18rem;
      font-family: PingFangSC-Medium, PingFang SC;
      font-weight: 500;
      color: #ffffff;
      margin-right: 0.16rem;
    }
    .assistance-steps-item-name {
      font-size: 0.18rem;
      font-family: PingFangSC-Medium, PingFang SC;
      font-weight: 500;
      color: #242e42;
      line-height: 0.25rem;
    }
  }
}
</style>
 
页面引用:
 
<template>
  <div id="index">
    
    <!-- 助力 -->
    <assistance-dialog v-model="showAssistance"></assistance-dialog>
  </div>
</template>
<script>
export default {
  name: "index",
  layout: "default",
  components: {
    
    "assistance-dialog": () =>
      import("@/components/coupon/assistance-dialog.vue"), //助力
  },
  data() {
    return {
    
      showAssistance: true, //助力
    };
  },
  mounted() {
  
  },
  methods: {
   
  },
};
</script>