| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 | <template>  <navbar    :alway="isAlway"    :back="false"    bg=""    :placeholder="isPlaceholder"    :bgStyles="bgStyles"    :opacity="isOpacity"    :sticky="sticky"  >    <template #item>      <view class="nav-box">        <view class="nav-icon" v-if="showLeftButton">          <view class="icon-box ss-flex" :class="{ 'inner-icon-box': data.mode == 'inner' }">            <view class="icon-button icon-button-left ss-flex ss-row-center" @tap="onClickLeft">              <text class="sicon-back" v-if="hasHistory" />              <text class="sicon-home" v-else />            </view>            <view class="line"></view>            <view class="icon-button icon-button-right ss-flex ss-row-center" @tap="onClickRight">              <text class="sicon-more" />            </view>          </view>        </view>        <view          class="nav-item"          v-for="(item, index) in navList"          :key="index"          :style="[parseImgStyle(item)]"          :class="[{ 'ss-flex ss-col-center ss-row-center': item.type !== 'search' }]"        >          <navbar-item :data="item" :width="parseImgStyle(item).width" />        </view>      </view>    </template>  </navbar></template><script setup>  /**   *  装修组件 - 自定义标题栏   *   *   * @property {Number | String}  alwaysShow = [0,1]			    - 是否常驻   * @property {Number | String}  mode = [inner]			    	- 是否沉浸式   * @property {String | Number} type 		 					- 标题背景模式   * @property {String} color 		 							- 页面背景色   * @property {String} src 		 								- 页面背景图片   */  import { computed, unref } from 'vue';  import sheep from '@/sheep';  import Navbar from './components/navbar.vue';  import NavbarItem from './components/navbar-item.vue';  import { showMenuTools } from '@/sheep/hooks/useModal';  const props = defineProps({    data: {      type: Object,      default: () => ({}),    },    showLeftButton: {      type: Boolean,      default: false,    },  });  const hasHistory = sheep.$router.hasHistory();  const sticky = computed(() => {    if (props.data.mode == 'inner') {      if (props.data.alway) {        return false;      }    }    if (props.data.mode == 'normal') {      return false;    }  });  const navList = computed(() => {    if (!props.data.list) return [];    // #ifdef MP    return props.data.list.mp;    // #endif    return props.data.list.app;  });  // 单元格大小  const windowWidth = sheep.$platform.device.windowWidth;  const cell = computed(() => {    if (unref(navList).length) {      let cell = (windowWidth - 90) / 8;      // #ifdef MP      cell = (windowWidth - 80 - unref(sheep.$platform.capsule).width) / 6;      // #endif      return cell;    }  });  // 解析位置  const parseImgStyle = (item) => {    let obj = {      width: item.width * cell.value + (item.width - 1) * 10 + 'px',      left: item.left * cell.value + (item.left + 1) * 10 + 'px',      'border-radius': item.borderRadius + 'px',    };    return obj;  };  const isAlway = computed(() =>    props.data.mode === 'inner' ? Boolean(props.data.alwaysShow) : true,  );  const isOpacity = computed(() =>    props.data.mode === 'normal'      ? false      : props.showLeftButton      ? false      : props.data.mode === 'inner',  );  const isPlaceholder = computed(() => props.data.mode === 'normal');  const bgStyles = computed(() => {    if (props.data.type) {      return {        background:          props.data.type == 'color'            ? props.data.color            : `url(${sheep.$url.cdn(props.data.src)}) no-repeat top center / 100% 100%`,      };    }  });  function onClickLeft() {    if (hasHistory) {      sheep.$router.back();    } else {      sheep.$router.go('/pages/index/index');    }  }  function onClickRight() {    showMenuTools();  }</script><style lang="scss" scoped>  .nav-box {    width: 750rpx;    position: relative;    height: 100%;    .nav-item {      position: absolute;      top: 50%;      transform: translateY(-50%);    }    .nav-icon {      position: absolute;      top: 50%;      transform: translateY(-50%);      left: 20rpx;      .inner-icon-box {        border: 1px solid rgba(#fff, 0.4);        background: none !important;      }      .icon-box {        background: #ffffff;        box-shadow: 0px 0px 4rpx rgba(51, 51, 51, 0.08),          0px 4rpx 6rpx 2rpx rgba(102, 102, 102, 0.12);        border-radius: 30rpx;        width: 134rpx;        height: 56rpx;        margin-left: 8rpx;        .line {          width: 2rpx;          height: 24rpx;          background: #e5e5e7;        }        .sicon-back {          font-size: 32rpx;        }        .sicon-home {          font-size: 32rpx;        }        .sicon-more {          font-size: 32rpx;        }        .icon-button {          width: 67rpx;          height: 56rpx;          &-left:hover {            background: rgba(0, 0, 0, 0.16);            border-radius: 30rpx 0px 0px 30rpx;          }          &-right:hover {            background: rgba(0, 0, 0, 0.16);            border-radius: 0px 30rpx 30rpx 0px;          }        }      }    }  }</style>
 |