Решение для нескольких списков jQuery для сравнения и сохранения элементов - PullRequest
3 голосов
/ 01 апреля 2011

Я делаю инструмент, который может сравнивать и перечислять элементы.Я хотел бы оживить их, чтобы они выглядели круто.Пожалуйста, помогите мне исправить некоторые проблемы в реализации.Есть несколько проблем, поэтому я сделал отдельную проблему для каждой из них.

проблема 1: привязка события mouseout

Иногда панель наложения закрывается, если я выбираю элемент и перетаскиваю его в list1 - list2 - list1.

привязка события выпуска 2 клика

Если я помещаю элемент в список list1, перетаскиваю его в список и нажимаю на другой список, список будет ближе.При нажатии на список1 он анимируется 3 раза вместо одного.

выпуск 3 заполнителей

Как я могу поместить заполнитель в список, что позволяет лучше перестроить и легче понять крест-пропадание (для перетаскивания списка в список и элементов в списки тоже)

выпуск 4 сглаживания анимации

Как сделать анимацию более плавной?Что вы думаете об этом?

выпуск 5, оптимизация

Как вы думаете, если я немного оптимизирую код, он будет быстрее в браузерах?Не могли бы вы дать мне несколько советов для этого, пожалуйста?

выпуск 6 других идей

Если у вас есть какие-то общие идеи для этого, я их тоже приветствую.Загрузите его, используйте как хотите, я делаю это для веб-сайта моей подруги.

Вы можете проверить код здесь - jsFiddle или:

HTML

<div id="overlay" class="clearfix">
    <div id="overlaycontainer">
        <div id="comparecontainer" class="overlaycontainer">
            <div class="icon"></div>
            <ul id="compare">
                <li class="fixed">LIST1</li>        
            </ul>
            <div class="shadow"></div>

        </div>
        <div id="dreamlistcontainer" class="overlaycontainer">
            <div class="icon"></div>
            <ul id="dreamlist">
                <li class="fixed">LIST2</li>
            </ul>
            <div class="shadow"></div>
        </div>
    </div>
</div>

<hr />

<ul class="offers clearfix">
    <li name="deal1">ITEM #1</li>
    <li name="deal2">ITEM #2</li>
    <li name="deal3">ITEM #3</li>
</ul>

CSS

body {background-color: white; padding: 50px 0 0; margin: 0;}
ul {list-style-type: none;}
#overlay {background: black url(img/dreamlist_bg.gif) center center no-repeat; display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%;}
#overlaycontainer {width: 800px; height: 600px; position: relative; margin: auto; top: 50%; margin-top: -300px;}
.clearfix:after {visibility: hidden;display: block;font-size: 0;content: " ";clear: both;height: 0;}
.overlaycontainer { height:500px; float: left;
    box-shadow: 0 0 5px black;
    -moz-box-shadow: 0 0 5px black;
    position: absolute;
    background-color: rgba(255, 255, 255, 0.9);
}
.overlaycontainer.active {
    box-shadow: 0 0 10px #1cb9ee, 0 0 30px #1a86ce, 0 0 3px white;
    -moz-box-shadow: 0 0 10px #1cb9ee, 0 0 30px #1a86ce, 0 0 3px white;
}
#compare {padding: 20px; background-color: yellow;}
#dreamlist {padding: 20px; background-color: white;}        
#comparecontainer {position: absolute; top: 0; left: 0; width: 290px; opacity: 0.9;}
#dreamlistcontainer {position: absolute; top: 0; right: 0; width: 500px; opacity: 0.9;}
li {padding: 10px;}
.drop {width: 10px; height:10px; background-color: red; display: inline-block;}    
.offers {padding: 10px;}
.offers li {width: 194px; height: 300px; overflow: hidden;float: left; margin-right: 5px;}
.fixed {text-transform: uppercase; font-family: "Gill Sans"; color: #1a86ce; font-size: 28px; text-align: center; text-shadow: 0px 1px 0px white;}
.shadow {
    position: absolute;
    bottom: -11px;
    display: block;
    background: transparent url(img/imagesforem.png) no-repeat;
    height: 50px;
    width: 50px;
    margin: 0 auto;
}
.icon {
    position: absolute;
    bottom: 10px;
    display: block;
    background: transparent url(img/imagesforic.png) no-repeat;
    height: 50px;
    width: 50px;
    margin: 0 auto;
}
#comparecontainer .icon {background-position: bottom left; left: 41%;}
#dreamlistcontainer .icon {background-position: bottom right; right: 50%}

JS

function overlayFadeIn() {
    $("#overlay").fadeIn();
}

function overlayFadeOut() {
    //    alert("faded.");
    pushBack();
    $("#overlay").fadeOut();
    $("#overlaycontainer").unbind("mouseleave");
}

function dropOut() {
    $(this).parent().remove();
}

function pushBack() {
    $("#overlaycontainer").unbind("mouseleave");
    $("#dreamlist").parent().animate({
        width: "500px",
        opacity: "0.9",
        right: "0",
        top: "0",
        height: "500px"
    }, 100);
    $("#compare").parent().animate({
        width: "290px",
        opacity: "0.9",
        left: "0",
        top: "0",
        height: "500px"
    }, 100);
    $("#overlaycontainer").bind("mouseleave", overlayFadeOut);
}

function pushBitCloser(which) {
    var which = which;
    var other;
    if (which.attr("id") == "dreamlist") {
        other = $("#compare"); //bal - left
        whleft = "+=15px";
        otleft = "+=0px";
        whright = "+=0px";
        otright = "+=50px";
    }
    else {
        other = $("#dreamlist"); // right
        whleft = "+=0px";
        otleft = "-=10px";
        whright = "+=0px";
        otright = "+=0px";
    }


    if (which.attr("id") == "dreamlist") {
        $("#dreamlist").parent().animate({
            width: "530px",
            opacity: "1",
            height: "550px",
            top: "-25px",
            right: "-15px"
        }, {
            duration: 200,
            specialEasing: {
                width: 'linear',
                opacity: 'linear'
            }
        });
        $("#compare").parent().animate({
            width: "270px",
            opacity: "0.7",
            left: "+10px",
            top: "+10px",
            height: "480px"
        }, {
            duration: 200,
            specialEasing: {
                width: 'linear',
                height: 'linear',
                top: 'linear',
                opacity: 'linear'
            }
        });
    }
    else {
        $("#compare").parent().animate({
            width: "320px",
            opacity: "1",
            left: "+10px",
            top: "-15px",
            height: "530px"
        }, {
            duration: 200,
            specialEasing: {
                width: 'linear',
                height: 'linear',
                top: 'linear',
                opacity: 'linear'
            }
        });
        $("#dreamlist").parent().animate({
            width: "470px",
            opacity: "0.7",
            height: "480px",
            top: "+10px",
            right: "-15px"
        }, {
            duration: 200,
            specialEasing: {
                width: 'linear',
                opacity: 'linear'
            }
        });

    }
}

function pushCloser(which, pb) {
    if (pb == true) {
        pushBack();
    }

    var which = which;
    var other;
    if (which.attr("id") == "dreamlist") {
        other = $("#compare");
    }
    else {
        other = $("#dreamlist");
    }

    which.parent().css({
        "z-index": "20"
    });
    other.parent().css({
        "z-index": "10"
    });



    if (which.attr("id") == "dreamlist") {
        $("#dreamlist").parent().animate({
            width: "550px",
            opacity: "1",
            height: "550px",
            top: "-25px",
            right: "-15px"
        }, {
            duration: 200,
            specialEasing: {
                width: 'linear',
                opacity: 'linear'
            }
        });
        $("#compare").parent().animate({
            width: "270px",
            opacity: "0.7",
            left: "+10px",
            top: "+10px",
            height: "480px"
        }, {
            duration: 200,
            specialEasing: {
                width: 'linear',
                height: 'linear',
                top: 'linear',
                opacity: 'linear'
            }
        });
    }
    else {
        $("#compare").parent().animate({
            width: "320px",
            opacity: "1",
            left: "+15px",
            top: "-15px",
            height: "530px"
        }, {
            duration: 200,
            specialEasing: {
                width: 'linear',
                height: 'linear',
                top: 'linear',
                opacity: 'linear'
            }
        });
        $("#dreamlist").parent().animate({
            width: "490px",
            opacity: "0.7",
            height: "480px",
            top: "+10px",
            right: "-10px"
        }, {
            duration: 200,
            specialEasing: {
                width: 'linear',
                opacity: 'linear'
            }
        });

    }
}

$(".offers li").draggable({
    helper: "clone",
    revert: "invalid",
    cursor: "move",
    zIndex: 30,
    start: function(event, ui) {
        overlayFadeIn();
    },
    stop: function(event, ui) {
        $("#overlaycontainer").bind("mouseleave", overlayFadeOut);
    }
});

$("#compare").droppable({
    activeClass: "ui-state-default",
    hoverClass: "ui-state-hover",
    accept: ":not(.incompare)",
    greedy: true,
    tolerance: 'pointer',
    over: function(event, ui) {
        $(this).parent().addClass("active");
        pushBitCloser($(this));
    },
    out: function(event, ui) {
        $(this).parent().removeClass("active");
        pushBack($(this));

    },
    drop: function(event, ui) {
        $(this).parent().removeClass("active");
        $("#overlaycontainer").bind("mouseleave", overlayFadeOut);

        pushCloser($(this), false);
        var element_id = ui.draggable.attr("name");
        var gotit = $("#compare li[name='" + element_id + "']").size();
        if (gotit != 1) {
            var drop = $('<span></span>').addClass("drop").bind("click", dropOut);
            $('<li class="incompare"></li>').attr("name", element_id).text(ui.draggable.text()).append(drop).appendTo(this);
        }
        $(this).find(".placeholder").remove();
        $("#dreamlist").parent().click(function() {
            pushCloser($("#dreamlist"), true)
        });
    }
}).sortable({
    helper: "clone",
    items: "li:not(.placeholder):not(.fixed)",
    start: function() {
        $("#overlaycontainer").unbind("mouseleave");
    },
    stop: function() {
        $("#overlaycontainer").bind("mouseleave", overlayFadeOut);
    },
    sort: function() {
        $(this).removeClass("ui-state-default");
    }
});

$("#dreamlist").droppable({
    activeClass: "ui-state-default",
    hoverClass: "ui-state-hover",
    accept: ":not(.indreamlist)",
    greedy: true,
    tolerance: 'pointer',
    over: function(event, ui) {
        $(this).parent().addClass("active");
        pushBitCloser($(this));
    },
    out: function(event, ui) {
        $(this).parent().removeClass("active");
        pushBack($(this));

    },
    drop: function(event, ui) {
        $(this).parent().removeClass("active");
        $("#overlaycontainer").bind("mouseleave", overlayFadeOut);
        pushCloser($(this), false);
        var element_id = ui.draggable.attr("name");
        var gotit = $("#dreamlist li[name='" + element_id + "']").size();
        if (gotit != 1) {
            var drop = $('<span></span>').addClass("drop").bind("click", dropOut);
            $('<li class="indreamlist"></li>').attr("name", element_id).text(ui.draggable.text()).append(drop).appendTo(this);
        }
        $(this).find(".placeholder").remove();
        $("#compare").parent().click(function() {
            pushCloser($("#compare"), true)
        });
    }
}).sortable({
    helper: "clone",
    items: "li:not(.placeholder):not(.fixed)",
    start: function() {
        $("#overlaycontainer").unbind("mouseleave");
    },
    stop: function() {
        $("#overlaycontainer").bind("mouseleave", overlayFadeOut);
    },
    sort: function() {
        $(this).removeClass("ui-state-default");
    }
});

Ответы [ 2 ]

13 голосов
/ 20 апреля 2011

Похоже, вы пытаетесь изобрести велосипед и слишком усложнять все ради того, что выглядит сексуально, но в действительности, вероятно, это сведет ваших пользователей с ума.

С нашей стороны (stackoverflow), это целый код, который очень специфичен для того, что вы пытаетесь сделать, но у нас просто очень много времени, чтобы посмотреть на одну область и оказать помощь.

Взгляните на jQuery Sortable: http://jqueryui.com/demos/sortable/#connect-lists. Это очень чистый, но хорошо выглядящий пример, который, безусловно, можно удивить некоторыми CSS-анимациями jQuery.Производительность будет очень хорошей во всех браузерах, и вам будет проще поддерживать ее.

3 голосов
/ 21 апреля 2011

Глядя на ваш код (который выглядит не очень хорошо в Chrome), я не могу не думать, что вы просто пытаетесь заново изобрести функциональность, к которой обращается мультиселект пользовательского интерфейса jQuery, когда он выпускается.В то же время, я использовал этот код довольно часто для сортируемых, выбираемых списков ... это ТАК быстро и просто.

http://quasipartikel.at/multiselect/

Как уже говорили другие, нет причин длязаново изобрести колесо - зайдите в разработку следующего Facebook и помогите поддержать остальных из нас, голодных разработчиков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...