Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.08.2014, 20:44
Новичок на форуме
Отправить личное сообщение для Siend Ilu Посмотреть профиль Найти все сообщения от Siend Ilu
 
Регистрация: 26.08.2014
Сообщений: 1

Увеличение миниатюры по клику
К сожалению в заголовке темы не смог охватить всю глубину и суть проблемы.
Есть два рабочих скрипта.
Первый увеличивает картинку по нажатию. Алгоритм заключается в присвоении src картинки новому пустому img позиционированному по центру на переднем плане:
<img src="test.jpg" />

<table id="FixedBlack" style="position: fixed; top: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.50); display: none; opacity: 0; z-index:100000;">
    <tr>
        <td style="text-align: center;">
            <img src="" id="big_pic" style="position: relative; background: #fff; box-shadow: 0 0 10px white; border: 5px solid #fff; border-radius: 6px;" />
        </td>
    </tr>
</table>


<script type="text/javascript">
$(document).ready(function () {

    $(document).on("click", ".colorup", function () {
        if ($(this).attr("src") != "") {
            $("#big_pic").attr("src", $(this).attr("src"));
            $("#FixedBlack").show().fadeTo(200, 1);
            $("#big_pic").show().fadeTo(0.5, 1);
        }
    });

    $(document).on("click", "#FixedBlack", function () {
        $("#big_pic").hide();
        $("#FixedBlack").stop(true).fadeTo(200, 0, function () {
            $("#FixedBlack").hide();
        });
    });
});
</script>

Второй нужен для применения цветового фильтра к картинке. Алгоритм его заключается в создании обработанной копии картинки на месте самой картинки, и добавления прозрачности при наведении на копию. Таким образом получаем плавный переход между копией и оригиналом.
<img src="test.jpg" speed="200" class="colorup" inverse="true" effect="sepia" />

jQuery.fn.colorUp = function () {
    $(window).load(function () {
        $('.colorup').each(function () {
            var curImg = $(this).wrap('<span />');
            var newImg = curImg.clone().css({ "position": "absolute", "z-index": "98", "opacity": "0" }).insertBefore(curImg);
            newImg.attr("src", grayImage(this, curImg.attr("effect")));
            newImg.addClass('colorUpped').animate({ opacity: getInv(curImg) ? 1 : 0 }, getSpeed(curImg));
			
        });
        $('.colorUpped').mouseover(function () {
            $(this).stop().animate({ opacity: getInv($(this)) ? 0 : 1 }, getSpeed($(this)),"swing",function(){alert("all done");});
        })
        $('.colorUpped').mouseout(function () {
            $(this).stop().animate({ opacity: getInv($(this)) ? 1 : 0 }, getSpeed($(this)));
        });
		
		
		
    });
    function getSpeed(elem) {
        return (elem.attr("speed")) ? parseInt(elem.attr("speed")) : 1000;
    }
    function getInv(elem) {
        return (elem.attr("inverse") && (elem.attr("inverse") === "true")) ? true : false;
    }

    function grayImage(image, effect) {
        var myCnv = document.createElement("canvas");
        var myCtx = myCnv.getContext("2d");

        myCnv.width = image.width;
        myCnv.height = image.height;
        myCtx.drawImage(image, 0, 0);

        var imgData = myCtx.getImageData(0, 0, myCnv.width, myCnv.height);

        for (var y = 0; y < imgData.height; y++) {
            for (var x = 0; x < imgData.width; x++) {

                var pos = (y * 4) * imgData.width + (x * 4);

                switch (effect) {
                    case ("sepia"):
                        var mono = imgData.data[pos] * 0.32 + imgData.data[pos + 1] * 0.5 + imgData.data[pos + 2] * 0.18;
                        imgData.data[pos] = mono + 50;
                        imgData.data[pos + 1] = mono;
                        imgData.data[pos + 2] = mono - 50;
                        break;
                    case ("negative"):
                        imgData.data[pos] = 255 - imgData.data[pos];
                        imgData.data[pos + 1] = 255 - imgData.data[pos + 1];
                        imgData.data[pos + 2] = 255 - imgData.data[pos + 2];
                        break;
                    case ("light"):
                        imgData.data[pos] = imgData.data[pos] + 80;
                        imgData.data[pos + 1] = imgData.data[pos + 1] + 80;
                        imgData.data[pos + 2] = imgData.data[pos + 2] + 80;
                        break;
                    case ("dark"):
                        imgData.data[pos] = imgData.data[pos] - 80;
                        imgData.data[pos + 1] = imgData.data[pos + 1] - 80;
                        imgData.data[pos + 2] = imgData.data[pos + 2] - 80;
                        break;
                    case ("noise"):
                        var noise = (0.5 - Math.random()) * 160;
                        imgData.data[pos] = imgData.data[pos] + noise;
                        imgData.data[pos + 1] = imgData.data[pos + 1] + noise;
                        imgData.data[pos + 2] = imgData.data[pos + 2] + noise;
                        break;
                    default:
                        imgData.data[pos] = imgData.data[pos + 1] = imgData.data[pos + 2] = imgData.data[pos] * 0.32 + imgData.data[pos + 1] * 0.5 + imgData.data[pos + 2] * 0.18
                }
            }
        }
        myCtx.putImageData(imgData, 0, 0, 0, 0, imgData.width, imgData.height);
        return myCnv.toDataURL();
    }
};
$.fn.colorUp();


Как я уже сказал - каждый из скриптов великолепно работает по отдельности, но при попытки их объединить возникает закономерная проблема - нажимаем на изображение, а увеличивается не оригинал (как задумано), а копия оригинала обработанная в соответствующем цвете. Это закономерно - ведь на переднем плане по z-index находиться копия.

Думая что самый умный, я попробовал изменять z-index копии при наведении на нее мышки, добавив это в функции изменения прозрачности второго скрипта:
$('.colorUpped').mouseover(function () {
            $(this).stop().animate({ opacity: getInv($(this)) ? 0 : 1 }, getSpeed($(this)));
            $(this).css( "z-index:1;" );
        })
        $('.colorUpped').mouseout(function () {
            $(this).stop().animate({ opacity: getInv($(this)) ? 1 : 0 }, getSpeed($(this)));
            $(this).css( "z-index:98;" );
        })

И столкнулся с новой проблемой - как только z-index становиться равен 1 сразу же срабатывает функция .mouseout и z-index возвращает свое значение в 98.

В итоге я решил что наверное проще во втором скрипте сделать функцию увеличения картинки по клику используя следующий алгоритм:
сохраняю в отдельную переменную src оригинала и потом пытаюсь ее передать элементу "FixedBlack" из первого примера. Но не тут то было - это не работает. У меня есть подозрение что это из-за того, что скрипт я располагаю в самом начале в head и элемент просто еще не существует, но я это так и не проверил (идея появилась только сейчас пока писал это).

Собственно вопросы:
1) Может можно проще, а я просто перемудрил?
2) Как можно на чистом jquery увеличить картинку поставив её на передний план (может опять же можно проще?).
3) .mouseover .mouseout и .hover одинаково ли работают или возможно есть подводные камни?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
увеличение счетчика по клику dozer Events/DOM/Window 5 26.08.2014 13:02
Увеличение по клику singmen Общие вопросы Javascript 1 24.07.2014 03:46
Открытие/закрытие дива по клику ссылки и закрытие по клику вне слоя vertmann Общие вопросы Javascript 3 18.11.2013 14:36
Помогите сделать так чтоб по клику открывалось и по клику же закрывалось Maxsl_89 Элементы интерфейса 1 25.10.2013 16:11
увеличение картинки по клику highslide terveg Общие вопросы Javascript 1 16.11.2010 14:39