Skeleton
Skeleton screens are a popular technique for providing a better user experience by showing a rough layout of content before real content is loaded. In miniprogram, developers can configurate skeleton for their pages to improve user experience.
Start from SDK library version 4.11.0 and IDE version 2.32.0
Usage
1. Create a skeleton
folder in project root, with a config.json
file
skeleton
|--- page
| |--- index.html // skeleton file
|--- config.json // page and skeleton mapping
2. Fill skeleton file by HTML and CSS code
Hint We only keep a few tags and attributes in HTML, others will be ignored
Supported Tags
- div
- style
- p
Supported Attrs
- id
- class
- style
<div id="bn-skeleton">
<style>
html,
body,
p,
#bn-skeleton {
margin: 0;
padding: 0;
}
#bn-skeleton,
p {
position: absolute;
}
#bn-skeleton {
width: 100%;
height: 100vh;
overflow: hidden;
}
</style>
<style>
@keyframes blink {
0% {
opacity: .4;
}
50% {
opacity: 1;
}
100% {
opacity: .4;
}
}
.blink {
animation-duration: 2s;
animation-name: blink;
animation-iteration-count: infinite;
}
</style>
<p class="blink"
style="z-index: 0;border-radius: 0% / 0%;background: rgb(255, 255, 255);width: 100%;padding-bottom: 16.41%;margin-top: 0%;">
</p>
<p class="blink"
style="z-index: 3;border-radius: 50%;background: rgb(239, 239, 239);width: 6.154%;padding-bottom: 6.154%;left: 91.795%;margin-top: 5.128%;">
</p>
<p class="blink"
style="z-index: 4;border-radius: 50%;background: rgb(239, 239, 239);width: 16.41%;padding-bottom: 6.154%;left: 4.103%;margin-top: 5.128%;">
</p>
<p class="blink"
style="z-index: 5;border-radius: 50%;background: rgb(239, 239, 239);width: 5.128%;padding-bottom: 5.128%;left: 90.769%;margin-top: 22.051%;">
</p>
<p class="blink"
style="z-index: 6;background: #EEEEEE;width: 24.615%;padding-bottom: 6.154%;left: 4.103%;margin-top: 21.538%;">
</p>
<p class="blink"
style="z-index: 7;border-radius: 4.103% / 3.125%;background: rgb(255, 255, 255);width: 100%;padding-bottom: 131.282%;margin-top: 36.923%;">
</p>
<p class="blink"
style="z-index: 10;border-radius: 0% / 0%;background: rgb(255, 255, 255);width: 91.795%;padding-bottom: 104.615%;left: 4.103%;margin-top: 53.333%;">
</p>
<p class="blink"
style="z-index: 11;border-radius: 53.763% / 208.333%;background: rgb(245, 245, 245);width: 23.846%;padding-bottom: 6.154%;left: 72.051%;margin-top: 53.333%;">
</p>
<p class="blink"
style="z-index: 14;border-radius: 1.117% / 4%;background: rgb(245, 245, 245);width: 91.795%;padding-bottom: 25.641%;left: 4.103%;margin-top: 65.641%;">
</p>
<p class="blink"
style="z-index: 15;background: #EEEEEE;width: 22.708%;padding-bottom: 3.077%;left: 69.087%;margin-top: 70.256%;">
</p>
<p class="blink"
style="z-index: 16;border-radius: 50.165% / 138.889%;background: rgb(255, 255, 255);width: 25.557%;padding-bottom: 9.231%;left: 66.238%;margin-top: 77.949%;">
</p>
<p class="blink"
style="z-index: 21;border-radius: 50%;background: rgb(245, 245, 245);width: 10.256%;padding-bottom: 10.256%;left: 44.872%;margin-top: 97.436%;">
</p>
<p class="blink"
style="z-index: 23;border-radius: 1.117% / 4%;background: rgb(245, 245, 245);width: 91.795%;padding-bottom: 25.641%;left: 4.103%;margin-top: 113.846%;">
</p>
<p class="blink"
style="z-index: 24;background: #EEEEEE;width: 24.463%;padding-bottom: 3.077%;left: 67.332%;margin-top: 118.462%;">
</p>
<p class="blink"
style="z-index: 25;border-radius: 47.897% / 138.889%;background: rgb(255, 255, 255);width: 26.767%;padding-bottom: 9.231%;left: 65.028%;margin-top: 126.154%;">
</p>
<p class="blink"
style="z-index: 30;border-radius: 1.117% / 8.333%;background: rgb(239, 239, 239);width: 91.795%;padding-bottom: 12.308%;left: 4.103%;margin-top: 145.641%;">
</p>
<p class="blink"
style="z-index: 31;border-radius: 0% / 0%;background: rgb(255, 255, 255);width: 100%;padding-bottom: 50.256%;margin-top: 168.205%;">
</p>
<p class="blink"
style="z-index: 32;background: #EEEEEE;width: 81.769%;padding-bottom: 3.59%;left: 12.308%;margin-top: 183.333%;">
</p>
<p class="blink"
style="z-index: 33;border-radius: 50%;background: rgb(146, 154, 165);width: 4.103%;padding-bottom: 4.103%;left: 4.103%;margin-top: 183.59%;">
</p>
<p class="blink"
style="z-index: 34;border-radius: 50%;background: rgb(239, 239, 239);width: 3.077%;padding-bottom: 3.077%;left: 4.615%;margin-top: 184.103%;">
</p>
<p class="blink"
style="z-index: 35;background: #EEEEEE;width: 81.769%;padding-bottom: 3.59%;left: 12.308%;margin-top: 196.667%;">
</p>
<p class="blink"
style="z-index: 36;border-radius: 50%;background: rgb(146, 154, 165);width: 4.103%;padding-bottom: 4.103%;left: 4.103%;margin-top: 196.923%;">
</p>
<p class="blink"
style="z-index: 37;border-radius: 50%;background: rgb(239, 239, 239);width: 3.077%;padding-bottom: 3.077%;left: 4.615%;margin-top: 197.436%;">
</p>
<p class="blink"
style="z-index: 38;background: #EEEEEE;width: 81.769%;padding-bottom: 3.59%;left: 12.308%;margin-top: 210%;"></p>
<p class="blink"
style="z-index: 39;border-radius: 50%;background: rgb(146, 154, 165);width: 4.103%;padding-bottom: 4.103%;left: 4.103%;margin-top: 210.256%;">
</p>
<p class="blink"
style="z-index: 40;border-radius: 50%;background: rgb(239, 239, 239);width: 3.077%;padding-bottom: 3.077%;left: 4.615%;margin-top: 210.769%;">
</p>
</div>
3. Add mapping of pages and skeletons in config.json
{
"pages/index/index": "skeleton/page/index",
"pages/list/list": "skeleton/page/index"
}
4. After page ready, using this.removeSkeleton()
remove skeleton
{
onLoad() {
// request data
getData().then((pageData) => {
this.setData({
pageData
}, () => {
this.removeSkeleton && this.removeSkeleton();
});
});
}
}
You can find removeSkeleton on page instance too
const pages = globalThis.getCurrentPages()
const current = pages[pages.length - 1]
current.removeSkeleton && current.removeSkeleton()