Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перемещение объектов 
:(
    Опции темы
pushok
Дата 6.3.2014, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 7.2.2007

Репутация: нет
Всего: нет



Доброго времени суток.

Хотел создать тему вчера, но нашел ссылку на статью (drag&drop), прочитал, реализовал и все круто - работает. При этом взял конкретное число объектов и сделал то, что мне нужно.

Решил по аналогии сделать в нужном мне месте, появились проблемы. Вот понять и не могу в чем проблемы, может быть в CSS, а может и в JavaScript.

Задание: написание теста, конкретно реализация типа вопроса - сопоставить пары ответов, хочется, чтобы пользователь перетаскивал прямоугольники с текстом.

Как работает: есть контейнер (<div>), в нем n-ое количество пар (<span>), каждому из них присваиваются уникальные id. Когда перетаскиваем <span>'ы , при отпускании кнопки мыши если они в пределах <div>, то срабатывает обработка их координат (т.е. загоняем индексы id <span>'ов и упорядочиваем по координате (top), далее расставляем в новом порядке на прежние места, т.е. пары в левом столбике всегда там и останутся, в правом также, только порядок следования по вертикали меняется)

Добавляю аналог с работающей странички в нужный мне шаблон, и возникает проблема.

Проблема 1: при изменении разрешения экрана блоки <span> начинают упорно убегать. Сделал как надо, но только для одного разрешения (1280 на 800). В нескольких местах добавил при вычислении координат (+-100 и +-150). В коде все убрал, чтобы была видна проблема.
Возможно связано с центрированием страницы,
возможно со значениями свойства position у div'ов.
Прилагаю код странички (выкинул все лишнее, чтобы была как можно меньше)
Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
  <title>Тест</title>
    <style>
        body { margin: 0; }
        #div_top
            {
            position: absolute;
            top: 0px;
            left: 50%;
            width: 960px;
            height: 100px;
            margin: 0px;
            margin-left: -490px;
            background: #FEDFC0;
            padding: 10px;
            border: 0px;
            }
        #div_content
            {
            position: absolute;
            overflow: auto;
            margin: 0px;
            margin-left: -490px;
            padding: 0px;
            top: 100px;
            left: 50%;
            width: 980px;
            background: #DCDCDC;
            border: 0px;
            }
        #div_ask
            {
            padding: 10px;
            width: 960px;
            margin: 0px;
            background: #6495ED;
            border: 0px;
            }
        #div_quest_text
            {
            padding: 10px;
            width: 960px;
            margin: 0px;
            background: #00FF7F;
            border: 0px;
            }
        #div_answer
            {
            padding: 10px;
            width: 960px;
            margin: 0px;
            background: #FFD700;
            border: 0px;
            }
    </style>
    </head>
    <body>
    <form name="form_question" method="post">
    <div id="div_top">
        <div id="div_top_info">.</div>
        <div id="div_top_fonts_button">
            .
        </div>
        <div id="div_top_next_button">
            .
        </div>
        <div id="div_top_exit_button">
            .
        </div>
    </div>
    <div id="div_content">
        <div id="div_ask">Задание</div>
        <div id="div_quest_text">Вопрос</div>
        <div id="div_answer">
            <style>
            #els    {    
                margin: 0px;    
                padding: 10px;    
                height: 110px;    
                background: #DCDCDC;    
                }
            #el11, #el21, #el12, #el22, #el13, #el23{    
                position: absolute;    
                margin: 0px;    
                padding: 5px;    
                height: 20px;    
                background: #AF9FED;    
                }
            </style>
            <div id="els">
                <span id="el11">пара2</span>
                <span id="el12">пара3</span>
                <span id="el13">пара1</span>
                <span id="el21">пара2</span>
                <span id="el22">пара1</span>
                <span id="el23">пара3</span>
            </div>
        <script>
                    onload = function() {
                            var dragObjects = document.getElementById("els").getElementsByTagName("span")
                            for(var i=0; i<dragObjects.length; i++) {
                                    new DragObject(dragObjects[i])
                            }
                            new DropTarget(document.getElementById("els"))
                            
                         f_resize();
                    }
                    function f_resize()
                        {
                        var br=getOffset(document.getElementById("els"));
                         for(i1=1;i1<=3;i1++)
                            {
                            var title="el1"+String(i1);
                            document.getElementById(title).style.top=parseInt(br.top+10+30*(i1-1))+"px";
                            document.getElementById(title).style.left=parseInt(br.left+10)+"px";
                            }
                        var max_width=0;
                        var i1;
                        for(i1=1;i1<=3;i1++)
                            {
                            var el_title="el1"+i1;
                            if (parseInt(document.getElementById(el_title).offsetWidth) > max_width)
                                {
                                max_width=parseInt(document.getElementById(el_title).offsetWidth);
                                }
                            }
                        for(i1=1;i1<=3;i1++)
                            {
                            var title="el1"+String(i1);
                            document.getElementById(title).style.width=max_width+"px";
                            }
                        for(i1=1;i1<=3;i1++)
                            {
                            var title="el2"+String(i1);
                            document.getElementById(title).style.top=parseInt(br.top+10+30*(i1-1))+"px";
                            document.getElementById(title).style.left=parseInt(br.left+10+max_width+20+10)+"px";
                            }
                        var max_width=0;
                        var i1;
                        for(i1=1;i1<=3;i1++)
                            {
                            var el_title="el2"+i1;
                            if (parseInt(document.getElementById(el_title).offsetWidth) > max_width)
                                {
                                max_width=parseInt(document.getElementById(el_title).offsetWidth);
                                }
                            }
                        for(i1=1;i1<=3;i1++)
                            {
                            var title="el2"+String(i1);
                            document.getElementById(title).style.width=max_width+"px";
                            }
                        }        
                    function DropTarget(element) {                        
                        element.dropTarget = this                        
                        this.canAccept = function(dragObject) {
                            return true
                        }                        
                        this.accept = function(dragObject) {
                            this.onLeave();
                        var sms=String(dragObject);
                        sms=sms.substring(2,3);
                        var mas_title = [ "el"+sms+"1", "el"+sms+"2", "el"+sms+"3"];
                        var mas_id = [0, 1, 2];
                        var i=0;
                        var e=0;
                        for(i=0;i<=1;i++)
                            {
                            for(e=i+1;e<=2;e++)
                                {
                                var br1=getOffset(document.getElementById(mas_title[mas_id[i]]));
                                var br2=getOffset(document.getElementById(mas_title[mas_id[e]]));
                                if (br1.top > br2.top)
                                    {
                                    var t=mas_id[i];
                                    mas_id[i]=mas_id[e];
                                    mas_id[e]=t;
                                    }
                                }
                            }
                        var br=getOffset(document.getElementById("els"));
                        for(i=0;i<3;i++)
                            {
                            document.getElementById(mas_title[mas_id[i]]).style.top=parseInt(br.top+10+30*i)+"px";
                            if (parseInt(sms) == 1)
                                {
                                document.getElementById(mas_title[mas_id[i]]).style.left=parseInt(br.left+10)+"px";
                                }
                            else
                                {
                                document.getElementById(mas_title[mas_id[i]]).style.left=parseInt(br.left+10+parseInt(document.getElementById("el11").offsetWidth)+20)+"px";    
                                }
                            }
                        }                        
                        this.onLeave = function() {
                            element.className =  ""
                        }                        
                        this.onEnter = function() {
                            element.className = "uponMe"
                        }                        
                        this.toString = function() {
                            return element.id
                        }
                    }
        </script>
        <script src="DragObject.js"></script>
        <script src="dragMaster.js"></script>
        <script src="helpers.js"></script>
        </div>
        </div>
        </form>
        </body>
        </html>

Все равно 200 строк осталось.
Файлы скриптов (которых в файле нет) стандартны и мной не изменялись.

Проблема 2: при перетаскивании <span>, естественно заходит за другой <span>, который был отрисован позже. 
Возможно ли как-то программно менять уровень слоя при начале переноса элемента на более высокий (верхний), чтобы элемент (<span>) при перетаскивании скользил над остальными, либо нужно создавать копию элемента (естественно она будет выше остальных, т.к. создана последней), а сам элемента на время перетаскивания прятать?

Это сообщение отредактировал(а) pushok - 6.3.2014, 18:06
PM ICQ   Вверх
pushok
Дата 7.3.2014, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 7.2.2007

Репутация: нет
Всего: нет



Тихо здесь...

Проблему решил:

1. При выравнивании блоков (<div>) использую в стилях следующий способ:

left: 10%;
right: 10%;
min-width: 500px;
margin: 0 auto;

2. Проблему со сдвигом элементов и курсора мыши по вертикали, решил заданием координат относительно 2го блока (id="content"). Не знаю почему именно оттуда координаты берутся, но видимо где-то в статьях упустил, что при абсолютном позиционировании блоков вложенных в блоки без абсолютного позиционирования, координаты вложенных (top, left) считаются относительно родительского блока (т.е. при нулевом значении top он цепляется к верхней границе родителя).

3. Проблему со сдвигом элементов по вертикали решил аналогично, а вот сдвиг курсора по вертикали, чуток по-другому: при вычислении координат курсора вычитаю вычисленные 20% от ширины страницы (по 10% с каждой стороны)
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0425 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.