You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
1.7 KiB
99 lines
1.7 KiB
<template>
|
|
<!-- #ifndef H5 -->
|
|
<view class="lazy-image">
|
|
<image :class="['real-image', cname]" @load="onLoaded" :src="realSrc" mode="aspectFill"></image>
|
|
<view :class="[loaded ? 'loaded' : '', cname]" :style="{ background: placeholdColor }">
|
|
<image class="placehold-image" :src="placeholdSrc" mode="aspectFill"></image>
|
|
</view>
|
|
</view>
|
|
<!-- #endif -->
|
|
<!-- #ifdef H5 -->
|
|
<view :class="['lazy-img', cname]">
|
|
<image :src="realSrc" mode="aspectFill" @load="onLoaded"></image>
|
|
<view :class="[loaded ? 'loaded' : '', 'lazy-mask']" :style="{ background: placeholdColor }"></view>
|
|
</view>
|
|
<!-- #endif -->
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
props:{
|
|
cname: String,
|
|
realSrc:{
|
|
type:String,
|
|
default:""
|
|
},
|
|
placeholdColor:{
|
|
type:String,
|
|
default:"#eee"
|
|
},
|
|
placeholdSrc:{
|
|
type:String,
|
|
default:""
|
|
}
|
|
},
|
|
data(){
|
|
return {
|
|
loaded: false
|
|
}
|
|
},
|
|
methods:{
|
|
onLoaded(){
|
|
this.loaded = true
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
.lazy-image{
|
|
height: 100%;
|
|
width: 100%;
|
|
flex: 1;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
position: relative;
|
|
.real-image{
|
|
width: 100%;
|
|
}
|
|
view{
|
|
position: absolute;
|
|
z-index: 2;
|
|
top: 0;
|
|
left: 0;
|
|
height: 100%;
|
|
width: 100%;
|
|
flex: 1;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
transition: opacity .1s linear;
|
|
.placehold-image{
|
|
width: 100%;
|
|
}
|
|
}
|
|
.loaded{
|
|
opacity: 0;
|
|
}
|
|
}
|
|
|
|
.lazy-img {
|
|
position: relative;
|
|
overflow: hidden;
|
|
image {
|
|
@include size(100%);
|
|
}
|
|
.lazy-mask {
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
z-index: 2;
|
|
@include size(100%);
|
|
transition: opacity .1s linear;
|
|
&.loaded {
|
|
opacity: 0;
|
|
}
|
|
}
|
|
}
|
|
</style>
|