Skip to main content
Темплейты для Drupal

Подсветка черно-белого изображения в цветное при наведении

Чернобелые изображения могут быть очень кстати в фотогалереях, портфолио и даже для витрины интернет-магазина. Но не в статичном виде, а с симпатичным jquery-эффектом подсветки чернобелого изображения в цвет. Получается замечательно.

Чтобы использовать этот эффект в друпале, надо всего-навсего создать в папке темы файл, скажем, hover.js с таким содержимым.

// On window load. This waits until images have loaded which is essential
        $(window).load(function(){
               
                // Fade in images so there isn't a color "pop" document load and then on window load
                $(".item img").fadeIn(500);
               
                // clone image
                $('.item img').each(function(){
                        var el = $(this);
                        el.css({"position":"absolute"}).wrap("<div class='img_wrapper' style='display: inline-block'>").clone().addClass('img_grayscale').css({"position":"absolute","z-index":"998","opacity":"0"}).insertBefore(el).queue(function(){
                                var el = $(this);
                                el.parent().css({"width":this.width,"height":this.height});
                                el.dequeue();
                        });
                        this.src = grayscale(this.src);
                });
               
                // Fade image
                $('.item img').mouseover(function(){
                        $(this).parent().find('img:first').stop().animate({opacity:1}, 1000);
                })
                $('.img_grayscale').mouseout(function(){
                        $(this).stop().animate({opacity:0}, 1000);
                });            
        });
       
        // Grayscale w canvas method
        function grayscale(src){
                var canvas = document.createElement('canvas');
                var ctx = canvas.getContext('2d');
                var imgObj = new Image();
                imgObj.src = src;
                canvas.width = imgObj.width;
                canvas.height = imgObj.height;
                ctx.drawImage(imgObj, 0, 0);
                var imgPixels = ctx.getImageData(0, 0, canvas.width, canvas.height);
                for(var y = 0; y < imgPixels.height; y++){
                        for(var x = 0; x < imgPixels.width; x++){
                                var i = (y * 4) * imgPixels.width + x * 4;
                                var avg = (imgPixels.data[i] + imgPixels.data[i + 1] + imgPixels.data[i + 2]) / 3;
                                imgPixels.data[i] = avg;
                                imgPixels.data[i + 1] = avg;
                                imgPixels.data[i + 2] = avg;
                        }
                }
                ctx.putImageData(imgPixels, 0, 0, 0, 0, imgPixels.width, imgPixels.height);
                return canvas.toDataURL();
    }

Подключаем наш js в файле темы (YOUR_THEME.info):

scripts[] = hover.js

Как использовать?

1. Подключить jquery.min.js

2. Указать в hover.js для каких классов с изображениями применять эффект (например, .item img, .gallery img, и т.д.)

3. По желанию изменить скорость эффекта.

.item img - значит, что для всех элементов <img> находящиеся внутри элементов с классом item, будет выполняться скрипт. Сюда можно подставить свои классы.
1000 - скорость эффекта.

И не забывайте сбрасывать кеш :)

4

Comments

Александр's picture
Александр

Как сделать наоборот, чтобы грузились цветные, а при наведении черно белые?

Мария Шерскова's picture
Мария Шерскова

Александр, нужно поменять местами параметры для mouseover и mouseout в hover.js

Андрей's picture
Андрей

Отличный способ, пробовал библиотекой gracecale, но там странно работало в хроме и опере, а тут все ок, спасибо.

Макс's picture
Макс

не работает ето щастье в хроме Версія 44.0.2403.107 m и опере 30.0.1835.125