Giacomo Balli profile picture
Giacomo Balli
The Mobile Guy

For founders and teams whose growth depends on mobile.
Clear judgment when AI, vendors, and product choices muddy the roadmap.

Find the Right Move LinkedIn

Add Adaptive color background

This code sample will allow you to add a smooth background gradient that takes into account the image itself when it does not fill the entire element.

function addAdaptiveBgColor(el) {
    var imgs = el.querySelectorAll('li');
    for (var i = 0; i < imgs.length; i++) {
        getImgColors(imgs[i]);
    }
}

function getImgColors(imgEl1) {
    var blockSize = 5, // only visit every 5 pixels
        defaultRGB = {
            r: 0,
            g: 0,
            b: 0
        }, // for non-supporting envs
        canvas = document.createElement('canvas'),
        context = canvas.getContext && canvas.getContext('2d'),
        data, width, height,
        i = -4,
        length,
        rgbTop = {
            r: 0,
            g: 0,
            b: 0
        },
        rgbBottom = {
            r: 0,
            g: 0,
            b: 0
        },
        count = 0;
    if (!context) {
        return;
    }
    var imgEl = new Image();
    var theSrc = imgEl1.style.backgroundImage.replace('url(', '').replace(')', '');
    imgEl.src = theSrc;
    imgEl.onload = function () {
        height = canvas.height = imgEl.naturalHeight || imgEl.offsetHeight || imgEl.height;
        width = canvas.width = imgEl.naturalWidth || imgEl.offsetWidth || imgEl.width;
        context.drawImage(imgEl, 0, 0);
        topPixels = context.getImageData(0, 0, width, 3);
        bottomPixels = context.getImageData(0, height - 3, width, 3);
        length = 3 * width;
        while ((i += blockSize * 4) < length) {
            ++count;
            rgbTop.r += topPixels.data[i];
            rgbTop.g += topPixels.data[i + 1];
            rgbTop.b += topPixels.data[i + 2];
            rgbBottom.r += bottomPixels.data[i];
            rgbBottom.g += bottomPixels.data[i + 1];
            rgbBottom.b += bottomPixels.data[i + 2];
        }

        // ~~ used to floor values
        rgbTop.r = ~~(rgbTop.r / count);
        rgbTop.g = ~~(rgbTop.g / count);
        rgbTop.b = ~~(rgbTop.b / count);
        rgbBottom.r = ~~(rgbBottom.r / count);
        rgbBottom.g = ~~(rgbBottom.g / count);
        rgbBottom.b = ~~(rgbBottom.b / count);
        imgEl1.style.webkitTransition = 'all 1s';
        imgEl1.style.backgroundSize = 'contain';
        imgEl1.style.backgroundPosition = '50% 50%';
        imgEl1.style.backgroundImage += ', linear-gradient(rgb(' + rgbTop.r + ',' + rgbTop.g + ',' + rgbTop.b + '),rgb(' + rgbBottom.r + ',' + rgbBottom.g + ',' + rgbBottom.b + '))';
    };
}

Directions:
- create your HTML with image as background then call addAdaptiveBgColor(el)

Note:
This snippet is based on a slider that uses the ul li technique.
This snippet focuses on iOS development. Make sure to verify/adapt any vendor prefixes. Back to main listing.

Published: Sun, Jan 10 2016 @ 18:51:30
Back to Blog