根据 轮播图背景色 自动填充剩余背景色的 走马灯

栏目: 编程工具 · 发布时间: 6年前

内容简介:今天产品经理过来说,需要在首页加上一个类似一个天猫的轮播图。 天猫的轮播图是 图片定宽定高, 当不同分辨率屏幕时候 会根据图片的背景色填充容器左右空隙。 比如 1800px屏:3000px屏:第一反应:不管是js还是css 都没有办法获取图片色值的, 那必须服务端给我了。要么 后台cms在上次图片的时候,指定好背景色, 要么服务端调用图片api获取背景色然后给我。

今天产品经理过来说,需要在首页加上一个类似一个天猫的轮播图。 天猫的轮播图是 图片定宽定高, 当不同分辨率屏幕时候 会根据图片的背景色填充容器左右空隙。 比如 1800px屏:

根据 轮播图背景色 自动填充剩余背景色的 走马灯

3000px屏:

根据 轮播图背景色 自动填充剩余背景色的 走马灯

第一反应:不管是js还是css 都没有办法获取图片色值的, 那必须服务端给我了。要么 后台cms在上次图片的时候,指定好背景色, 要么服务端调用图片api获取背景色然后给我。

天猫应该是这么做的。

AutoImg

纯前端的话, 有么有办法获取色值呢? 突然想到,之前做WebGL贴纹理的时候, 在片元着色器里是可以获取到图片每一个像素点的色值的。 用WebGL肯定是太大了, canvas可以吗? 查询了一下是可以的,有方法的getImageData。 那么至少说明了纯前端的做饭是可行的。 我们先实现一个组件AutoImg,AutoImg中的img 定高定宽, 容器的背景色用img的背景色填充。

export default class AutoImg extends Component {
    static propTypes = {
        height: PropTypes.number.isRequired,
        width: PropTypes.number.isRequired,
        source: PropTypes.number.isRequired,
    }

    componentDidMount() {
        this.setImg(this.props.source)
    }

    componentWillReceiveProps(nextProps) {
        if (nextProps.source !== this.props.source) {
            this.setImg(nextProps.source)
        }
    }

    setImg(source) {
        const { width, height } = this.props

        const ima = new Image()
        ima.src = source
        ima.crossOrigin = '' // 处理跨域图片
        ima.onload = () => {
            const ctx = this.canva.getContext('2d')
            ctx.drawImage(ima, 0, 0, width, height)

            const [r, g, b, a] = ctx.getImageData(0,0,1,1).data; // 获取背景色
            this.inner.style.background = `rgba(${r}, ${g}, ${b}, ${a})`
        }
    }

    render() {
        const { width, height } = this.props
        return (
            <div ref={inner => this.inner = inner}>
                <canvas
                    style={{
                        display: 'block',
                        margin: '0 auto'
                    }}
                    width={`${width}px`}
                    height={`${height}px`}
                    ref={canva => this.canva = canva}
                >

                </canvas>
            </div>
        )
    }
}

这里 考虑到getImageData 参数是整形, 所有要求width, height必须是number类型,1000代表1000px

github npm: npm install rc-autoimg --save

轮播

轮播我们就不造轮子了,直接使用 nuka-carousel

import Carousel from 'nuka-carousel'

default class Banner extends Component {
    render() {
       const bannerImgList = [
        'https://img.alicdn.com/tps/i4/TB1yqAhcpmWBuNjSspdSuvugXXa.jpg',
        'https://img.alicdn.com/tps/i4/TB1XVCsaTdYBeNkSmLySutfnVXa.jpg',
        'https://img.alicdn.com/simba/img/TB1ror0cf5TBuNjSspcSuvnGFXa.jpg',
        'https://img.alicdn.com/tfs/TB1ed2lggmTBuNjy1XbXXaMrVXa-1130-500.jpg_q100.jpg_.webp',
    ]
       
       
        return (
            <div className={styles.banner}>
                <Carousel
                    autoplay={true}
                >
                    {
                        bannerImgList.map(source => (
                            <div key={source}>
                                <AutoImg
                                    width={1200}
                                    height={340}
                                    source={source}
                                />
                            </div>
                        ))
                    }
                </Carousel>
            </div>
        )
    }
}

2500px 效果:

根据 轮播图背景色 自动填充剩余背景色的 走马灯

以上所述就是小编给大家介绍的《根据 轮播图背景色 自动填充剩余背景色的 走马灯》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Beginning Apache Struts

Beginning Apache Struts

Arnold Doray / Apress / 2006-02-20 / USD 44.99

Beginning Apache Struts will provide you a working knowledge of Apache Struts 1.2. This book is ideal for you Java programmers who have some JSP familiarity, but little or no prior experience with Ser......一起来看看 《Beginning Apache Struts》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

html转js在线工具
html转js在线工具

html转js在线工具