小程序(uniapp)骨架屏应用

效果图

注意点:

1, 引入组建后, template 标签内加入
<skeleton selector="skeleton" bgcolor="#FFF" v-if="showSkeleton"></skeleton>

  • 其中 v-if="showSkeleton" 为显示骨架屏显示的参数。

2, data对象中设置showSkeleton: true // 默认一开始进入页面加载骨架屏内容。

  • 骨架屏渲染形状有两种:矩形 & 圆形
  • 在想显示骨架屏的区域的父级标签的 class 加入 skeleton 表示该class下的内容进行骨架屏元素加载
  • 需要渲染矩形,则在该元素上的class加入skeleton-rect
  • 需要渲染圆形,则在该元素上的class加入skeleton-radius

3, 渲染数据。

  • 渲染骨架屏的元素,需要先填充元素。使vue能够根据数据的长度进行渲染。
  • 列表类数据 字段值可为空。例如:
dataList: [
    {
        title: ‘‘,
        author: ‘‘,
        pubTime: ‘‘,
        avatar: ‘‘
    },
    {
        title: ‘‘,
        author: ‘‘,
        pubTime: ‘‘,
        avatar: ‘‘
    }
]
  • 此时会渲染两条数据内容

skeleton.vue

<template>
  <div>
    <div class="wrap"
         :style="{‘width‘:systemInfo.width+‘px‘,‘height‘:systemInfo.height+‘px‘, ‘background-color‘:bgcolor}">
      <div v-for="(item,index) in skeletonRectLists"
           :index=‘index‘
           :key=‘index‘
           class="chiaroscuro"
           :style="{‘width‘:item.width+‘px‘,‘height‘:item.height+‘px‘,‘background-color‘:‘rgba(233, 2, 233,1)‘,‘position‘:‘absolute‘,‘left‘:item.left+‘px‘,‘top‘:item.top+‘px‘}">
      </div>
      <div v-for="(item,index) in skeletonCircleLists"
           :index=‘index‘
           :key="‘info2-‘+index"
           class="chiaroscuro"
           :style="{‘width‘:item.width+‘px‘,‘height‘:item.height+‘px‘,‘background-color‘:‘rgba(233, , 233,1)‘,‘border-radius‘:item.width+‘px‘,‘position‘:‘absolute‘,‘left‘:item.left+‘px‘,‘top‘:item.top+‘px‘}">
      </div>
    </div>
  </div>
</template>

<script>
/* eslint-disable */
export default {
  props: {
    bgcolor: { type: String, value: ‘#FFF‘ },
    selector: { type: String, value: ‘skeleton‘ },
  },

  data() {
    return {
      systemInfo: {},
      skeletonRectLists: [],
      skeletonCircleLists: [],
    };
  },

  components: {},

  methods: {
    rectHandle: function() {
      const that = this;
      //绘制不带样式的节点
      uni
        .createSelectorQuery()
        .selectAll(`.${this.selector}-rect`)
        .boundingClientRect()
        .exec(function(res) {
          that.skeletonRectLists = res[0];
        });
    },

    radiusHandle: function() {
      const that = this;
      uni
        .createSelectorQuery()
        .selectAll(`.${this.selector}-radius`)
        .boundingClientRect()
        .exec(function(res) {
            console.log(res[0].length);
          that.skeletonCircleLists = res[0];
        });
    },
  },

  mounted: function() {
    //默认的首屏宽高,防止内容闪现
    const systemInfo = uni.getSystemInfoSync();
    (this.systemInfo = {
      width: systemInfo.windowWidth,
      height: systemInfo.windowHeight,
    });
    const that = this;
    //绘制背景
    uni
      .createSelectorQuery()
      .selectAll(`.${this.selector}`)
      .boundingClientRect()
      .exec(function(res) {
        that.systemInfo.height = res[0][0].height + res[0][0].top || 0;
      });

    //绘制矩形
    this.rectHandle();

    //绘制圆形
    this.radiusHandle();
  },
};
/* eslint-enable */
</script>

<style scoped>
.wrap {
  position: absolute;
  left: 0;
  top: 0;
  z-index: 9998;
  overflow: hidden;
}
.chiaroscuro {
  animation-duration: 1s;
  animation-fill-mode: forwards;
  animation-iteration-count: infinite;
  animation-name: placeHolderShimmer;
  animation-timing-function: linear;
  background: #f6f7f8;
  background: linear-gradient(to right, #eeeeee 8%, #dddddd 18%, #eeeeee 33%);
  background-size: 800px 104px;
  height: 40px;
  position: relative;
}
@keyframes placeHolderShimmer{
  0% {
    background-position: -468px 0
  }
  100% {
    background-position: 468px 0
  }
}
</style>

index.vue 页面

<template>
    <view class="content ">
        <skeleton selector="skeleton" bgcolor="#FFF" v-if="showSkeleton"></skeleton>
        <view class="skeleton">
            <image class="logo skeleton-rect" src="/static/logo.png"></image>
            <view class="text-area skeleton-radius">
                <text class="title">{{title}}</text>
            </view>
        </view>

    </view>
</template>

<script>
    import skeleton from ‘../index/skeleton‘
    export default {
        data() {
            return {
                showSkeleton:true,
                title: ‘Hello‘,

            }
        },
        components:{
            ‘skeleton‘:skeleton
        },
        created() {
            this.reloadData();
        },
        methods: {
             reloadData() {
                  setTimeout(() => {
                    this.showSkeleton = false
                  }, 2000)
                },
        }
    }
</script>

参考地址:https://www.cnblogs.com/miku561/p/10726085.html

原文地址:https://www.cnblogs.com/liangtao999/p/11964552.html

时间: 2024-10-29 20:21:49

小程序(uniapp)骨架屏应用的相关文章

微信小程序 uniapp has not been registered yet.报错 解决方案

重开编辑器就好了!!! 小bug uniapp也是 停止关闭小程序开发者工具 重新开 原文地址:https://www.cnblogs.com/tolingsoft/p/12556503.html

微信小程序设置横竖屏

情况:使用LayaBox发布的微信小游戏,我在微信开发者工具上面编译,发现我明明想要的是横屏的但是结果显示竖屏,我查看菜单栏,配置,最后找到设置的方法. 解决:在game.json中有一项属性设置:"deviceOrientation":"portrait",当前设置竖屏,将其设置为:"deviceOrientation":"landscape",为横屏. 原文地址:https://www.cnblogs.com/losoph

前端骨架屏方案小结

骨架屏 最近在项目不时有用到骨架屏的需求,所以抽时间对骨架屏的方案作了一下调研,骨架屏的实践已经有很多了,也有很多人对自己的方案作了介绍.在这里按照个人的理解做了一个汇总和分类,分享给大家. 关于骨架屏(简介) 骨架屏就是在页面数据尚未加载前先给用户展示出页面的大致结构,直到请求数据返回后再渲染页面,补充进需要显示的数据内容.常用于文章列表.动态列表页等相对比较规则的列表页面. 很多项目中都有应用:ex:饿了么h5版本,知乎,facebook等网站中都有应用. 借个图举例如下: 两类用途 简介中

1万字!彻底看懂微信小程序

Q:为什么说小程序如炮友? A:小程序刚发布不久就流行一个段子:APP如原配,一年不用几次:服务号如情人,一个月固定几次:订阅号如酒店小卡片,天天可以卖广告:小程序像炮友,用完就走. 资本如嫖客,各个平台和垂直类掠夺者已经瓜分掉了线上流量,那么未来争夺的流量战场必然在实体场景,很多巨头其实已经证明了线下流量庞大的潜力.在快递包裹上印上自己的二维码关注公众号形成二次寄出快递的粘性,PokemonGo让用户在实体地图上捕获小精灵. 未来的入口不限于二维码,而是一切的富媒体.二维码之于2D识别,复杂图

微信小程序开发-地图map组件上使用input组件

微信小程序开发-地图map组件上使用input组件 标签: 微信小程序 uni-app 原生组件层级关系 微信小程序在最高层级 在微信小程序中原生组件包括camera canvas input(仅在focus时表现为原生组件) live-player live-pusher map textarea video 在微信小程序开发中原生组件的层级是最高的,所以页面中的其他组件无论设置 z-index 为多少,都无法盖在原生组件上. 后插入的原生组件可以覆盖之前的原生组件. 原生组件还无法在 pic

小程序提升界面使用体验 丰富了内容展示组件

昨晚,微信小程序开放了更多页面内能力,主要是提升界面使用体验.丰富内容展示组件.完善系统硬件能力,这些能力的提升可以帮助开发者更好地优化使用体验,让用户爱上你的小程序.以下是相关能力的展示 01—提升界面使用体验 小程序可以灵活调整顶部标题栏的颜色,同自己的页面保持色彩统一.小程序可以获取页面布局,了解用户屏幕滑动情况,并使用页面滚动接口.例如看到一半的文章,开发者可以定位并记住浏览的位置.在用户下次打开小程序时,立即滚动到未读处,方便用户继续阅读.地图.视频和画布上,现在可以展示简单的图片及文

使用mpvue开发小程序教程(二)

在上篇文章中,我们介绍了使用mpvue开发小程序所需要的一些开发环境的搭建,并创建了第一个mpvue小程序代码骨架并将其运行起来.在本文中,我们来研究熟悉一下mpvue项目的主要目录和文件结构. 在Visual Studio Code里面打开项目文件夹,我们可以看到类似如下的文件结构: firstapp ├── package.json ├── project.config.json ├── static ├── src │ ├── components │ ├── pages │ ├── ut

微信小程序之项目的创建

之前就想学习一下微信小程序,只不过前段时间在学习Java中的一些线程的知识,拖了很久也没有实行这个目标,今天终于从网上找了一个完整的视频,来从头学习完整的开发流程,现在逐渐有一种想法,就是自己构建项目,开发项目完成的一整套流程,想弄的特别熟悉,没事的时候,有什么好的想法的时候,可以自己开发一个项目,从今天起,重视项目的构建,独立开发!这次是跟着视频讲解来做一下笔记! 一.构建项目 微信小程序的开发需要借助微信提供的生态,到微信公众平台上去申请账号,得到appId,做一些开发小程序的准备工作,具体

微信小程序实现(禁止页面滚动、长按复制)

1. 禁止页面滚动对于小程序某些一屏的页面,特别是全屏的swiper,并不希望页面在竖直方向上可以滚动. 实现方式:在需要禁止滚动页面的json中加入: "disableScroll": true 1 注意:只在页面配置中有效,无法再app.json中设置该项 参考:https://developers.weixin.qq.com/miniprogram/dev/framework/config.html#页面配置 2. 长按复制 <text class='copy_conten