【问题标题】:CSS opacity transition won't work for SafariCSS 不透明度过渡不适用于 Safari
【发布时间】:2020-11-17 04:49:56
【问题描述】:

我正在尝试实现某种惰性背景图像加载。我希望图像在加载后立即淡入。因此,我在加载时更改了保持 div 的不透明度。 它适用于 Chrome 或 Firefox,但不知何故不适用于 Safari。 使用 Safari,图像只会出现而没有任何过渡。怎么会这样?

import React, {Component} from 'react';

import './ImageHolder.css'

class LazyImage extends Component {

    state = {
        src: null,
    };

    componentDidUpdate(prevProps, prevState, snapshot) {

        if (prevProps.image !== this.props.image) {
            this.setState({src: null});
            this.loadImage();
        }
    }

    componentDidMount() {
        this.loadImage();
    }

    loadImage = () => {
        const src = this.props.image;

        const imageLoader = new Image();
        imageLoader.src = src;

        imageLoader.onload = () => {
            this.setState({src: src})
        };
    };

    classList = (classes) => {
        return Object
            .entries(classes)
            .filter(entry => entry[1])
            .map(entry => entry[0])
            .join(' ');
    };

    render() {
        const style = {
            backgroundImage: 'url(' + this.state.src + ')',
        };

        return(
            <div className="h-image-wrapper" style={{backgroundColor: this.props.bgColor}}>
                <div className={this.classList({
                    'h-image-holder': true,
                    'h-image-loaded': this.state.src,
                })} style={style} />
            </div>
        );
    }
}

export default LazyImage;
.h-image-holder {
    background-repeat: no-repeat;
    background-position: center;
    background-size: cover;
    will-change: opacity, transform;
    pointer-events: none;
    opacity: 0;
    width: 100%;
    height: 100%;
    transition: opacity .6s ease;
    -webkit-transition: opacity .6s ease;
}

.h-image-wrapper {
    position: relative;
    width: 100%;
    height: 100%;
    will-change: transform;
    pointer-events: none;
}

.h-image-loaded {
    opacity: 1;
}

【问题讨论】:

    标签: javascript html css reactjs


    【解决方案1】:

    也许这会有所帮助。 在Safari CSS Visual Effects Guide 上说你必须使用这个:

    -webkit-transition-property: opacity;
    

    你也可以改变它的持续时间:

    -webkit-transition-duration: 2s;"
    

    【讨论】:

    • 这救了我的命。谢谢!
    【解决方案2】:

    注意here

    注意:并非所有 CSS 属性都是可动画的。通常,任何接受数字、长度、百分比或颜色值的 CSS 属性都是可动画的。一些接受离散值的 CSS 属性也可以设置动画,但在更改时会显示值之间的跳转而不是平滑过渡,例如可见性属性。

    Safari CSS Reference

    【讨论】:

      猜你喜欢
      • 2020-07-31
      • 2014-07-27
      • 1970-01-01
      • 2021-07-26
      • 2020-05-29
      • 2020-11-22
      • 2018-08-01
      • 2017-06-27
      • 2016-12-08
      相关资源
      最近更新 更多