uniapp APP 初始横屏样式错误,求大佬忙指点一下,十分感谢?

新手上路,请多包涵

中标题 uniapp中做了一个pad项目,设置了初始横屏,样式错乱,必须竖屏后再切回横屏才正常,求大佬们帮忙解答一下,十分感谢,具体就是样式高度没有占满,宽度和实际也有差别

<template>
  <view class="default-layout" :class="currentDevice">
    <view class="default-layout__tab">
      <view class="circle-breath" :class="formatConnect"></view>

      <view class="tab--list">
        <view
          class="tab--item"
          :class="{ active: item.value === currentTab }"
          v-for="item in tabSetting"
          :key="item.value"
          @click="handleJumpPage(item)">
          <image :src="getTabIcon(item)" mode=""></image>
        </view>
      </view>

      <view class="language--btn" @click="handleLanguageChange()">
        <image src="/src/static/status/language-C.png" mode=""></image>
      </view>
    </view>
    <view class="default-layout__content">
      <slot>
        <!-- <view class="default-message">请选择一个选项以查看详细内容</view> -->
      </slot>
    </view>
  </view>
</template>
<style lang="scss" scoped>
* {
  box-sizing: border-box;
  font-family: PingFang SC, PingFang SC;
}
.default-layout {
  width: 100%;
  height: 100vh;
  display: flex;
  overflow: hidden;
  align-items: flex-start;

  &.mobile {
    .tab--list {
      padding: 22rpx 0rpx !important;
      justify-content: center;
    }
    .tab--item {
      margin: 0rpx !important;
      flex: 1;
      display: flex;
      align-items: center;
    }
  }

  &__tab {
    width: 34rpx;
    height: 100%;
    flex-shrink: 0;
    position: relative;

    .tab--list {
      top: 0;
      left: 0;
      z-index: 9;
      position: absolute;
      width: 46rpx;
      height: 100%;
      display: flex;
      overflow: hidden;
      align-items: center;
      background-color: #fff;
      flex-direction: column;
      justify-content: center;
      border-radius: 0rpx 12rpx 12rpx 0rpx;
      box-shadow: 0rpx 2rpx 4rpx 1rpx rgba(6, 39, 170, 0.1);
    }

    .tab--item {
      margin-bottom: 56rpx;
    }
    .tab--item:last-child {
      margin-bottom: 0rpx;
    }

    img,
    image {
      width: 18rpx;
      height: 18rpx;
    }

    .language--btn {
      img,
      image {
        width: 22rpx;
        height: 22rpx;
      }
      z-index: 9;
      position: absolute;
      bottom: 4rpx;
      left: 11rpx;
    }

    .circle-breath {
      width: 12rpx;
      height: 12rpx;
      border-radius: 50%;
      z-index: 10;
      position: absolute;
      top: 12rpx;
      left: 16rpx;
    }
    @keyframes donghuaSuccess {
      0% {
        transform: scale(0.6);
        box-shadow: 0 0 0 0 #69d9b0;
      }
      60% {
        transform: scale(1);
        box-shadow: 0 0 0 10rpx rgba(183, 3, 39, 0%);
      }
      100% {
        transform: scale(0.6);
        box-shadow: 0 0 0 0 rgba(183, 3, 39, 0%);
      }
    }

    @keyframes donghuaError {
      0% {
        transform: scale(0.6);
        /* 注意rgba中的a的设置 */
        box-shadow: 0 0 0 0 #b70327;
      }

      60% {
        transform: scale(1);
        box-shadow: 0 0 0 10rpx rgba(183, 3, 39, 0%);
      }

      100% {
        transform: scale(0.6);
        box-shadow: 0 0 0 0 gba(183, 3, 39, 0%);
      }
    }
    @keyframes donghuaWarning {
      0% {
        transform: scale(0.6);
        /* 注意rgba中的a的设置 */
        box-shadow: 0 0 0 0 #ffa45c;
      }

      60% {
        transform: scale(1);
        box-shadow: 0 0 0 10rpx rgba(183, 3, 39, 0%);
      }

      100% {
        transform: scale(0.6);
        box-shadow: 0 0 0 0 gba(183, 3, 39, 0%);
      }
    }
    .circle-breath.success {
      background: #69d9b0;
      box-shadow: 0 0 0 0 #69d9b0;
      animation: donghuaSuccess 2s infinite;
    }
    .circle-breath.error {
      background: #b70327;
      box-shadow: 0 0 0 0 #b70327;
      animation: donghuaError 2s infinite;
    }
    .circle-breath.warning {
      background: #ffa45c;
      box-shadow: 0 0 0 0 #ffa45c;
      animation: donghuaWarning 2s infinite;
    }
  }

  &__content {
    flex: 1;
    height: 100%;
    overflow: hidden;
    background-color: #f1f7f9;

    :deep(.default-container) {
      width: 100%;
      height: 100%;

      > view {
        padding-left: 12rpx;
      }
    }
  }
}
</style>

有在APP.vue中写竖屏转横屏但是设计不想要,也监听过页面高度宽度设置动态,也没有很大作用

阅读 837
avatarAI BotBETA

回答

这个问题可能是由于uniapp在初始横屏状态下未能正确计算或应用样式导致的。以下是一些可能的解决方案:

  1. 确保CSS单位正确

    • 在uniapp中,rpx(responsive pixel)是用于适配不同屏幕大小的单位。确保你的布局中使用rpx单位,以确保在不同设备上能够正确缩放。
    • 检查是否有使用固定像素(如px),这可能导致在不同分辨率的设备上布局错乱。
  2. 监听屏幕方向变化

    • 虽然在APP.vue中写竖屏转横屏的设计被去掉了,但你可以尝试监听屏幕方向的变化,并在方向变化时重新计算或应用样式。
    • 使用window.addEventListener('resize', function() {})或uniapp提供的onResize方法来监听窗口大小变化,并在回调函数中调整布局。
  3. 强制页面重新渲染

    • 在某些情况下,可能需要强制页面重新渲染以应用新的样式。这可以通过改变某个数据属性(如添加一个时间戳到组件的key属性)来触发。
  4. 检查flex布局

    • 你的布局中使用了flex属性。确保flex相关的属性(如flex-direction, align-items, justify-content等)在横屏和竖屏下都能正确工作。
    • 特别是height: 100vh;在横屏时可能不会自动调整为横屏的高度,你可以尝试使用height: 100%;或根据窗口大小动态计算高度。
  5. 使用CSS媒体查询

    • 使用CSS媒体查询来针对不同的屏幕方向应用不同的样式。例如,你可以为横屏和竖屏设置不同的样式规则。
  6. 调试和检查

    • 使用浏览器的开发者工具或uniapp的调试工具来检查元素和样式,看看在横屏时哪些样式没有被正确应用或计算。
    • 检查是否有其他CSS规则覆盖了你的样式,或者是否有JavaScript代码在运行时修改了样式。

如果以上方法都不能解决问题,你可能需要更详细地检查你的代码和布局逻辑,或者考虑是否有必要对uniapp的某些配置进行调整。

1 个回答
新手上路,请多包涵

可以把屏幕锁定方向 plus.screen.lockOrientation('portrait-primary');

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏