Форум программистов, компьютерный форум, киберфорум
jQuery
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 10
1

Анимированное смещение элемента по событию

12.10.2014, 01:04. Показов 3005. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем добрый вечер! Только начал изучать jQuery. Прошу помощи в следующем. Есть несколько флагов, расположеных по дуге. Слева и справа дуги - стрелки. Соответсвенно, при нажатии на левую стелку флаги должны анимироваться на одну позицию влево, при нажатии правой стрелки - соответсвенно вправо. При смещении влево справа появляется его копия и наоборот.
Я так понял, алгоритм будет следующим.
1. Вычисляем координаты флагов использую .position().
2. При клике стреки меняю позицию с одной в другую, использую .animate(position).
3. Если флаг выходит за пределы координат, то используешь клон флага (т.е сместил все, один не поместился, клоню в переменную, удаляю текущую, на свободное место вывожу клон флага и меняю позицию.
Правильно ли я построил алгоритм? Если да, помогите с реалиацией, так как практика программирования на JS отсутсвует.
Если нет, помогите построить правильный алгоритм и реализовать его на практике.
Заранее спасибо!
Вот мой HTML+CSS:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
<div class="slider">
                <div class="arrow left"></div>
                <div class="slides">
                    <div id="de"><a href=""><img src="pictures/Flags/Germany.png" alt="Немецкий"><span>Немецкий</span></a></div>
                    <div id="es"><a href=""><img src="pictures/Flags/Spain.png" alt="Испанский"><span>Испанский</span></a></div>
                    <div id="it"><a href=""><img src="pictures/Flags/Italy.png" alt="Итальянский"><span>Итальянский</span></a></div>
                    <div id="en"><a href=""><img src="pictures/Flags/UK.png" alt="Английский"><span>Английский</span></a></div>
                    <div id="fr"><a href=""><img src="pictures/Flags/France.png" alt="Французский"><span>Французский</span></a></div>
                    <div id="nl"><a href=""><img src="pictures/Flags/Netherlans.png" alt="Голландский"><span>Голландский</span></a></div>
                </div>
                <div class="arrow right"></div>
        </div>
CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.slider { position: absolute; top: 135px; left: 150px; }
.slider > div { display:inline-block; }
.slides { width:550px; height:53px; position:relative; font-size:70%; }
.arrow { width: 16px; height: 15px; background: url(pictures/arrowsSprite.png) no-repeat;}
.arrow.left  { background-position: -16px 0; }
.left:hover { background-position: 0 0; }
.arrow.right { background-position: -32px 0; }
.right:hover { background-position: -48px 0 }
.slides > div span { min-width:50px; position:absolute; display:inline-block; top:25px; left:15px; text-align:center; }
 
#de, #es, #it,
#en, #fr, #nl { position: absolute; color: #0094d9; }
#de { top: 10px; }
#es { top: 2px; left: 90px; }
#it { left: 180px; }
#en { left: 280px; }
#fr { top: 2px; left: 373px; }
#nl { top: 10px; left: 463px; }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.10.2014, 01:04
Ответы с готовыми решениями:

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

Как по событию TreeView_SelectedItemChanged получить индекс выделенного элемента
Здравствуйте. Как по событию TreeView_SelectedItemChanged получить индекс выделенного элемента?

Обновление файла по событию создания или изменения элемента инфоблока
Доброго врмени суток ! Есть компонент (news.list), который выводит слайдер на главной. Через...

Подсчитать общую сумму только по событию №1 или по событию №2
Добрый день. Подскажите пожалуйста, в базе имеются &quot;№ Событий&quot;, &quot;потери&quot; по этим событиям в...

6
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 10
18.10.2014, 12:46  [ТС] 2
Комьюнити, неужели нет идей, как создать скрипт? Может, мой css неправильный. Посоветуйте, как его изменить и уже на его основании создать скрипт
0
Lazy_Den
18.10.2014, 12:50
  #3

Не по теме:

Цитата Сообщение от John18 Посмотреть сообщение
неужели нет идей, как создать скрипт?
Идеи может и есть, но лично я ничего не понял из вашего вопроса.

0
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 10
18.10.2014, 19:47  [ТС] 4
Добавлено через 1 минуту
Цитата Сообщение от Lazy_Den Посмотреть сообщение
Не по теме:
Сообщение от John18
неужели нет идей, как создать скрипт?
Идеи может и есть, но лично я ничего не понял из вашего вопроса.
Задача в том, чтобы при клике на стрелку слева фажки смещялись на одну позицию. Т.е. голландский на место французкого, французкий - английского, английский - итальянского, итальянский - испанского, испанский - германского, германский - голландского. При этом, крайний левый флажок (при первом клике - это германский) копируется и появляется на месте голонндского посредством использования jQuery.clone. Крайним левым флагом становится испанский. При следующем клике на стрелку слева снова происходит смещение флагов на одну позицию. В этом случае уже копируется испанский флаг. И так далее. Подобное смещение на одну позицию вправо происходить и при нажатии на стрелку справа.
Я подал свой html&css расположения флагов. Также спросил, верен и мой ход мыслей по организации алгоритма. Если да, то помочь создать скрипт, если нет - то помочь уяснить другой алгоритм и помочь создать код
0
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
18.10.2014, 20:55 5
John18, Клонировать элементы тут абсолютно не нужно. Всё делается гораздо проще:
Javascript
1
2
3
4
5
6
7
8
9
var slides = $('.slides'),
    opts = {
        left: ['div:first', 'appendTo'],
        right: ['div:last', 'prependTo']
    };
$('.arrow').on('click', function(){
    var dir = $(this).hasClass('left') ? 'left' : 'right';
    $(opts[dir][0], slides)[opts[dir][1]](slides);    
});
А вот проблема у вас будет с тем, что вы жёстко привязали стили по ID к элементам. Перепишите их, используя псевдоклассы nth-child или nth-of-type. Тогда перемещаемый элемент, будет принимать стили, которые относятся к тому элементы, который должен находится на определенной позиции.
0
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 10
19.10.2014, 13:09  [ТС] 6
Цитата Сообщение от Lazy_Den Посмотреть сообщение
Клонировать элементы тут абсолютно не нужно. Всё делается гораздо проще
Спасибо за помощь. Проблема как раз в том, что .clone() и .animate() мне необходимо использовать согласно заданию(
0
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
19.10.2014, 17:54 7
Цитата Сообщение от John18 Посмотреть сообщение
.clone() и .animate() мне необходимо использовать согласно заданию
Ха. Или вам дали задание не по уровню, или вы плохо учились Смотрите такой вариант. Я не использовал .queue и прочие опасности. Думаю, что в таком варианте, вам будет проще разобраться.
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
var slides = $('.slides'),
    slOffset = slides.position(),
    pT = slOffset.top,
    pL = slOffset.left,
    pR = slides.width(),
    pB = pT + slides.height(),
    opts = {
        moveLeft: ['div:first', 'prependTo', 'appendTo'],
        moveRight: ['div:last', 'appendTo', 'prependTo']
    },
    delay = 250,
    flag = false;
$('.slider').on('click', '.arrow', function () {
    if(flag) return false;
    flag = true;
    var dir = $(this).hasClass('left') ? 'moveLeft' : 'moveRight',
        mDiv = $(opts[dir][0], slides),
        cDiv = mDiv.clone();
    /* 
    * Добавляем клонированный элемент
    * и скрываем перемещаемый элемент
    */
    cDiv[opts[dir][1]](slides).addClass('clone').css({
        left: mDiv.position().left
    });
    mDiv.addClass('hidden');
    /* 
    * Пошаговая анимация перемещения
    */
    mDiv.hide(delay);
    cDiv.animate({
        top: pB
    }, 250, function(){
        $(this).animate({
            left: (dir == 'moveLeft' ? pR - $(this).innerWidth() : 0)
        }, delay*2, function(){
            mDiv[opts[dir][2]](slides).show(delay, function(){
                cDiv.animate({
                    top: 0
                }, delay, function(){
                    $(this).remove();
                    mDiv.removeClass('hidden');
                    flag = false;
                });
            });
        });
    });    
});
Добавлено через 17 минут
P.S. Забыл поудалять лишние переменные. Сами уже глянете какие из них не используются и ликвидируете.
0
19.10.2014, 17:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2014, 17:54
Помогаю со студенческими работами здесь

Ограничение на смещение центрированного элемента
Имеется строка, для которой установлено свойство text-align: center; Можно ли сделать так, чтобы...

смещение элемента каждую секунду
добрые люди подскажите как сделать так чтобы каждую секунду какой либо элемент смещался на...

Как получить handle дочернего элемента если функция вызывается по событию?
Для задания координат подсказки для элементов div на все div с name=&quot;div2&quot; навешивается Listener...

Остановить смещение элемента от левого края
Есть элементы которые адаптируются под разное разрешение, так вот размеры width я ограничил...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru