当前位置:   article > 正文

uni-app:踩坑路---scroll-view内使用fixed定位,无效的问题

uni-app:踩坑路---scroll-view内使用fixed定位,无效的问题
前言:

        emmm,说起来这个问题整得还挺好笑的,本人在公司内,奋笔疾书写代码,愉快的提交测试的时候,测试跟我说,在苹果手机上你这个样式有bug,我倒是要看看,是什么bug。

安卓vs苹果

ok,我相信已经看出了差异了,安卓的遮罩层正常显示,而苹果的遮罩层只在我的绿色框内,被截断了,我赶忙看代码:

CustomItem.vue:自定义组件

蓝色的正方形,外加上一个遮罩层,点击蓝色方块的时候,显示遮罩层,遮罩层内写我的要展示的一些内容。

  1. <template>
  2. <view class="">
  3. <view class="item" @click="visible = true"></view>
  4. <view class="mask" v-if="visible" @click="visible = false"></view>
  5. </view>
  6. </template>
  7. <script>
  8. export default {
  9. name: 'CustomItem',
  10. data() {
  11. return {
  12. visible: false
  13. };
  14. }
  15. };
  16. </script>
  17. <style lang="scss" scoped>
  18. .item {
  19. width: 100rpx;
  20. height: 100rpx;
  21. background-color: #00aaff;
  22. }
  23. .mask {
  24. position: fixed;
  25. top: 0;
  26. left: 0;
  27. right: 0;
  28. bottom: 0;
  29. background-color: rgba(#000, 0.5);
  30. }
  31. </style>

 父组件:引用CustomItem组件;

  1. <template>
  2. <view class="index">
  3. <scroll-view scroll-x class="scroll">
  4. <view class="list">
  5. <custom-item class="item" v-for="i in 10" :key="i"></custom-item>
  6. </view>
  7. </scroll-view>
  8. </view>
  9. </template>
  10. <script>
  11. import CustomItem from '@/components/CustomItem/index.vue';
  12. export default {
  13. components: {
  14. CustomItem
  15. }
  16. };
  17. </script>
  18. <style lang="scss" scoped>
  19. .index {
  20. width: 100vw;
  21. height: 100vh;
  22. display: flex;
  23. align-items: center;
  24. justify-content: center;
  25. }
  26. .scroll {
  27. width: 400rpx;
  28. height: 150rpx;
  29. background-color: #aaaa7f;
  30. }
  31. .list {
  32. padding: 20rpx;
  33. display: flex;
  34. align-items: center;
  35. .item {
  36. margin-right: 20rpx;
  37. }
  38. }
  39. </style>

如此:就造成了上面的结果,在ios上显示不正常;于是我立马进入百度啦,问心一言啦,通义千问啦,最后哈,在社区找到了这么一个帖子;帖子看这里

emmm,寻求解决办法:

1.弃用scroll-view,改用view,使用css滚动;

  1. <view class="list">
  2. <custom-item class="item" v-for="i in 10" :key="i"></custom-item>
  3. </view>
  4. <style lang="scss" scoped>
  5. .list {
  6. width: 400rpx;
  7. height: 150rpx;
  8. background-color: #aaaa7f;
  9. padding: 20rpx;
  10. overflow-x: scroll;
  11. display: flex;
  12. align-items: center;
  13. .item {
  14. margin-right: 20rpx;
  15. }
  16. }
  17. </style>

2.如非必要,可以更改接口,其实上面的自定义组件CustomItem看着好像没有什么问题,是机型系统差异导致的,但是我们也并不能将全部原因归结于系统。 

当我们把它合起来看的话,就会发现在结构上似乎有一些问题了,遮罩层这一块的元素就需要循环10次,如果列表很长的话,那不就妥妥增加了很多的dom,浪费性能不说,结构设计也看着很怪, 所以有时候我们在封装组件的时候,不妨也这样考虑一下,可能这么写真的不太合适,最好的方案就是再划分下结构,只需要记得mask内的元素在放在scroll-view的外层即可!

  1. <scroll-view scroll-x class="scroll">
  2. <view class="list">
  3. <view class="" v-for="i in 10" :key="i">
  4. <view class="item" @click="visible = true"></view>
  5. <view class="mask" v-if="visible" @click="visible = false"></view>
  6. </view>
  7. </view>
  8. </scroll-view>

 告辞!

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/861073
推荐阅读
  

闽ICP备14008679号