From d3e30ca38fe4b749d728bff525322c9e356b3844 Mon Sep 17 00:00:00 2001 From: winkidney Date: Fri, 29 Nov 2019 18:09:12 +0800 Subject: [PATCH] Feature: Add pin-image show transition on opacity --- pinry-spa/src/components/Pins.vue | 43 ++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/pinry-spa/src/components/Pins.vue b/pinry-spa/src/components/Pins.vue index ecc4125..04ef7ce 100644 --- a/pinry-spa/src/components/Pins.vue +++ b/pinry-spa/src/components/Pins.vue @@ -10,17 +10,22 @@ gutter=".gutter-sizer" > @@ -79,6 +85,7 @@ function createImageItem(pin) { width: `${pin.image.thumbnail.width}px`, height: `${pin.image.thumbnail.height}px`, }; + image.class = {}; return image; } @@ -91,6 +98,7 @@ export default { data() { return { blocks: [], + blocksMap: {}, status: { loading: false, hasNext: true, @@ -110,6 +118,11 @@ export default { }, }, methods: { + onPinImageLoaded(itemId) { + this.blocksMap[itemId].class = { + 'image-loaded': true, + }; + }, registerScrollEvent() { const self = this; scroll.bindScroll2Bottom( @@ -125,8 +138,9 @@ export default { const blocks = []; results.forEach( (pin) => { + const item = createImageItem(pin); blocks.push( - createImageItem(pin), + item, ); }, ); @@ -175,6 +189,9 @@ export default { (resp) => { const { results, next } = resp.data; let newBlocks = this.buildBlocks(results); + newBlocks.forEach( + (item) => { this.blocksMap[item.id] = item; }, + ); newBlocks = this.blocks.concat(newBlocks); this.blocks = newBlocks; this.status.offset = newBlocks.length; @@ -202,6 +219,16 @@ export default { .gutter-sizer { width: 15px; } + +/* pin-image transition */ +.pin-masonry.image-loaded{ + opacity: 1; + transition: opacity .3s; +} +.pin-masonry { + opacity: 0; +} + /* card */ $pin-footer-position-fix: -6px; $avatar-width: 30px; @@ -222,12 +249,20 @@ $avatar-height: 30px; font-weight: normal; } +@mixin loader { + background: url('../assets/loader.gif'); + background-position: center center; + background-repeat: no-repeat; +} + .pin-card{ .pin-preview-image { cursor: zoom-in; } > img { + background-color: white; border-radius: 3px 3px 0 0; + @include loader; } .avatar { height: $avatar-height;