From 6f90115d3bd0e16d7569e1106d38b109774197f1 Mon Sep 17 00:00:00 2001 From: muerwre Date: Sun, 25 Aug 2019 17:56:03 +0700 Subject: [PATCH] smouth image loading --- src/components/node/ImageSwitcher/index.tsx | 9 +-- src/components/node/ImageSwitcher/styles.scss | 6 ++ src/components/node/NodeImageBlock/index.tsx | 56 ++++++++++--------- .../node/NodeImageBlock/styles.scss | 5 ++ .../NodeImageBlockPlaceholder/styles.scss | 2 +- 5 files changed, 48 insertions(+), 30 deletions(-) diff --git a/src/components/node/ImageSwitcher/index.tsx b/src/components/node/ImageSwitcher/index.tsx index 92b20433..30bfe227 100644 --- a/src/components/node/ImageSwitcher/index.tsx +++ b/src/components/node/ImageSwitcher/index.tsx @@ -1,21 +1,22 @@ import React, { FC } from 'react'; import range from 'ramda/es/range'; -import * as styles from './styles.scss'; +import classNames from 'classnames'; -import classNames = require('classnames'); +import * as styles from './styles.scss'; interface IProps { total: number; current: number; + loaded?: Record; onChange: (current: number) => void; } -const ImageSwitcher: FC = ({ total, current, onChange }) => ( +const ImageSwitcher: FC = ({ total, current, onChange, loaded }) => (
{range(0, total).map(item => (
onChange(item)} /> diff --git a/src/components/node/ImageSwitcher/styles.scss b/src/components/node/ImageSwitcher/styles.scss index 998fe6b0..16932672 100644 --- a/src/components/node/ImageSwitcher/styles.scss +++ b/src/components/node/ImageSwitcher/styles.scss @@ -38,6 +38,8 @@ // background: white; border-radius: 8px; box-shadow: inset white 0 0 0 2px; + transform: scale(0.5); + transition: transform 0.5s; } &:global(.is_active) { @@ -45,5 +47,9 @@ background: white; } } + + &:global(.is_loaded)::after { + transform: scale(1); + } } } diff --git a/src/components/node/NodeImageBlock/index.tsx b/src/components/node/NodeImageBlock/index.tsx index 5a47a957..5ee0405f 100644 --- a/src/components/node/NodeImageBlock/index.tsx +++ b/src/components/node/NodeImageBlock/index.tsx @@ -14,7 +14,6 @@ import { INode } from '~/redux/types'; import classNames from 'classnames'; import { getImageSize } from '~/utils/dom'; import { UPLOAD_TYPES } from '~/redux/uploads/constants'; -import { readFileSync } from 'fs'; interface IProps { is_loading: boolean; @@ -23,7 +22,7 @@ interface IProps { const NodeImageBlock: FC = ({ node, is_loading }) => { const [current, setCurrent] = useState(0); - const [height, setHeight] = useState(0); + const [height, setHeight] = useState(320); const [loaded, setLoaded] = useState>({}); const refs = useRef>({}); @@ -40,7 +39,9 @@ const NodeImageBlock: FC = ({ node, is_loading }) => { ]); useEffect(() => { - if (!refs || !refs.current[current]) return; + console.log({ height }); + + if (!refs || !refs.current[current] || !loaded[current]) return setHeight(320); const el = refs.current[current]; @@ -51,31 +52,36 @@ const NodeImageBlock: FC = ({ node, is_loading }) => { return (
- {!is_loading && ( -
- +
+ -
- {images.map((file, index) => ( -
+ {(is_loading || !loaded[0] || !images.length) &&
} + + {images.map((file, index) => ( +
+ - -
- ))} -
+ onLoad={onImageLoad(index)} + /> +
+ ))}
- )} +
); }; diff --git a/src/components/node/NodeImageBlock/styles.scss b/src/components/node/NodeImageBlock/styles.scss index 1ecffff6..4b602c4a 100644 --- a/src/components/node/NodeImageBlock/styles.scss +++ b/src/components/node/NodeImageBlock/styles.scss @@ -36,3 +36,8 @@ opacity: 1; } } + +.placeholder { + background: red; + height: 320px; +} diff --git a/src/components/node/NodeImageBlockPlaceholder/styles.scss b/src/components/node/NodeImageBlockPlaceholder/styles.scss index 9efeba7e..d02bb460 100644 --- a/src/components/node/NodeImageBlockPlaceholder/styles.scss +++ b/src/components/node/NodeImageBlockPlaceholder/styles.scss @@ -1,5 +1,5 @@ .placeholder { - height: 33vw; + height: 320px; background: transparentize(black, 0.8); border: $radius $radius 0 0; @include outer_shadow();