ЛАБОРАТОРНАЯ РАБОТА № 13 (4 JavaScript)

Тема: Позиционирование и движение элементов на Web-странице

Цель: Изучение средств и возможностей языка JavaScript для позиционирования и организации движения элементов на Web-странице

ОГЛАВЛЕНИЕ

1 Позиционирование элементов на Web-странице
2 Организация движения объектов на Web-странице
2.1 Изменение координат элемента с помощью циклического процесса
2.2 Изменение координат элемента по событиям мышки
2.3 Перетаскивание элементов
3 Свойства и методы объекта Math
Пример 1
Пример 2
Пример 3
Индивидуальные задания

1 Позиционирование элементов на Web-странице

Режим позиционирования элемента Web-страницы, т.е. размещения его на экране, задается с помощью свойства CSS position, которое имеет следующие значения:

При использовании режима позиционирования absolute, положение элемента на экране может быть задано с помощью таких свойств CSS:

Если для одного элемента заданы оба свойства: left и right, то свойство right игнорируется. При совместном задании свойств top и bottom предпочтение отдается свойству top.
Значения свойств left, top, right и bottom могут быть заданы:

Если единицы измерения не указаны, то подразумевается, что они заданы в пикселях.
Ниже приведен пример рисунка, расположенного в 200 пикседях от левой границы экрана и в 100 пикселях от верхней границы экрана:

<IMG NAME="imgs" SRC="fish.gif" STYLE="position:absolute; left:200;top:100">

Если попытаться сдвинуть этот рисунок на экране на 50 пикселей вправо с помощью выражения

imgs.style.left+=50,

то это приведет к возникновению ошибки "Недопустимый аргумент" из-за того, что свойство left возвращает значение не в виде числа 200, а в виде строки "200px".
Поэтому надо или воспользоваться функцией parseInt(), которая возвращает только число:

imgs.style.left=parseInt(imgs.style.left)+50,

или вместо свойств left, top, right и bottom применять свойства:

В нашем примере вместо свойства left необходимо использовать свойство pixelLeft:

imgs.style.pixelLeft+=50;

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

Оглавление

2 Организация движения объектов на Web-странице

Движение элемента на Web-странице осуществляется путем изменения значений свойств, задающих его координаты.
Изменение координат элемента может быть реализовано:

Оглавление

2.1 Изменение координат элемента с помощью циклического процесса

Для организации циклического процесса могут быть использованы следующие методы объекта window:

Использование метода setTimeout() для организации движения элемента показано в примере № 1, где реализовано движение элемента Web-страницы - буквы Z, заданной с помощью тэга <P>, по траектории в виде синусоиды ():
Оглавление

Пример 1

<HTML>
<HEAD>
<TITLE>Изменение координат элемента с помощью циклического процесса</TITLE>
<SCRIPT>
x=0; y=100; dx=0; dy=0;
function f(x) { return 60*Math.sin(x*Math.PI/180);}
function moveTxt()
{
if ((z.style.pixelLeft<document.body.clientWidth-30) && (z.style.pixelTop>30))
{
z.style.left=x+dx;
z.style.top=y+dy-f(x+dx);
dx+=20;
dy+=7;
setTimeout("moveTxt()",125);
}
}
</SCRIPT>
</HEAD>
<BODY>
<P ID="z" STYLE="color:blue;font:8mm; position:absolute;left:0;top:100"
onClick="moveTxt()">Z</P>
</BODY>
</HTML>

В примере 1 с помощью функции f(x) реализовано движение объекта справа налево и сверху вниз по синусоиде y=60sin(x). Поскольку траектория указана в виде тригометрической функции, для ее задания был использован объект Math, свойства и методы которого описаны в разделе 3. При этом было выполнено преобразование аргумента функции sin(x) из градусов в радианы. Направление и скорость движения объекта зависит от величины и знака приращений его координат dx и dy. На скорость движения также влияет промежуток времени, через который эти приращения происходят (2-й параметр метода setTimeout()).
Выбор амплитуды и скорости движения в примере 1 осуществлен из соображений наглядности.
По щелчку мышки по букве Z вызывается функция moveTxt(), которая осуществляет движение этого элемента из точки окна браузера с координатами: left=0; top=100 путем задания приращений его координатам left и top:

z.style.left=x+dx;
z.style.top=y+dy-f(x+dx);

до тех пор, пока он не приблизится к границам окна браузера (граница не достигается, чтобы буква Z оставалась в области полной видимости).
Значения левой и нижней границы окна браузера определяются с помощью свойств тэга <BODY> clientWidth и clientHeight. Эти свойства могут быть использованы для определения размеров любых элементов Web-страницы, которые имеют ширину и высоту.
При использовании альтернативных методов setInterval() и clearInterval() описание функции moveTxt() необходимо несколько изменить:

function moveTxt()
{
if ((z.style.pixelLeft<document.body.clientWidth-30) && (z.style.pixelTop>30))
{
z.style.left=x+dx;
z.style.top=y+dy-f(x+dx);
dx+=20;
dy+=7;
}
else clearInterval(timer);
}

Кроме того, вызов функции moveTxt() в этом случае следует выполнять так:

onClick="timer=setInterval('moveTxt()',125);"

Оглавление

2.2 Изменение координат элемента по событиям мышки

Движение элемента Web-страницы по экрану кроме рассмотренного выше способа изменения его координат с помощью программно организованного циклического процесса, может осуществить сам пользователь Web-сайта с помощью мышки.
В примере № 2 описана функция runRef(), которая каждый раз при достижении указателем мышки ссылки Ссылка или при движении указателя мышки по ссылке выполняет приращения координат этого элемента, реализуя эффект "убегающей" от пользователя ссылки. Все его попытки щелкнуть по ссылке, чтобы загрузить новую страницу (js_1.htm), оказываются безрезультатными.
С помощью переменных dx и dy, которые меняют свой знак на противоложный при достижении соответственно вертикальных или горизонтальных границ окна браузера, реализовано отражение ссылки при движении по экрану от его границ.
Вызов функции runRef() как по событию Mousemove, так и по событию Mouseover обеспечивает более надежную защиту ссылки от щелчка мышки.
Оглавление

Пример 2

<HTML>
<HEAD>
<TITLE>Организация движения элементов Web-страницы с помощью
мышки </TITLE>
<SCRIPT>
dx=10; dy=10;
function runRef()
{
if ((parseInt(m.style.left)<25) ||
(parseInt(m.style.left)>document.body.clientWidth-25)) dx=-dx;
if ((m.style.posTop<25) ||
(m.style.posTop>document.body.clientHeight-25)) dy=-dy;
m.style.pixelLeft+=dx;
m.style.pixelTop+=dy;
}
</SCRIPT>
</HEAD>
<BODY">
<A NAME="m" HREF="js_1.htm"
STYLE="position:absolute;left:100;top:100;color:red"
onMousemove="runRef()"
onMouseover="runRef()"> Ссылка </A>
</BODY>
</HTML>
Оглавление

2.3 Перетаскивание элементов

Перетаскивание элементов Web-страницы с помощью мышки реализуется путем присваивания текущим координатам перемещаемого элемента текущих координат мышки. Доступ к координатам мышки можно осуществить, используя такие свойства объекта event:

В примере № 3 создается Web-страница, содержащая три элемента - рисунок и два слова "ТЕКСТ" одинакового размера, но разных цветов.
Оглавление

Пример 3

<HTML>
<HEAD>
<TITLE>Перетаскивание элементов Web-страницы</TITLE>
<SCRIPT>
var n=0; l=0;
function drag()
{
with (document.all(n).style)
{
position="absolute";
/* window.status= "n="+n+" z-index="+l+" left="+pixelLeft+" top="+pixelTop+
" x="+event.x+" y="+event.y; */
left=event.x;
top=event.y;
zIndex=l;
}
}
</SCRIPT>
</HEAD>
<BODY onClick="n=event.srcElement.sourceIndex;"
onContextmenu="if(l==2) l=0; else l++;return false"
onMousemove="drag()">
<IMG SRC="fish.gif" >
<P STYLE="color:#0FF;font:8mm">TEXT1
<P STYLE="color:#F0F;font:8mm">TEXT2
</BODY>
</HTML>

При щелчке мышки по любому из этих объектов (по событию Click) для отмеченного объекта устанавливается режим перетаскивания: в переменную n заносится порядковый номер этого элемента Web-страницы, например, для рисунка: n=5, для первого текста: n=6, для второго: n=7 (при щелчке по свободному пространству окна браузера n принимает значение 4 - номер тэга BODY).
Режим перетаскивания отмеченного объекта реализуется путем вызова при движении мышки (по событию Mousemove) функции drag(), которая выполняет следующие действия:

При щелчке правой кнопкой мышки (по событию Contextmenu) циклически меняется значение переменной l (0,1,2,0,...), задающей текущее значение свойства z-index, что позволяет любому объекту при задании соответствующего значения или перекрывать другие объкты Web-страницы, или располагаться под ними.
Для отмены режима перетаскивания отмеченного объекта необходимо повторно щелчкнуть мышкой. При этом в переменную n заносится номер уже нового объекта - того, который в момент щелчка находился под перетаскиваемым объектом. Это связано с тем, что при движении координаты указателя мышки на пиксел опережают координаты самого объекта. В этом случае для нового объекта устанавливается режим перетаскивания (если только этим объектом не является тэг BODY).
Добавим, что закомментированные строки функции drag() были использованы при отладке программы для вывода в поле статуса окна браузера значений таких контрольных данных: номер, z-index и координаты перетаскиваемого объекта, а также координаты мышки.
Оглавление

3 Свойства и методы объекта Math

Объект Math позволяет программистам использовать математические константы и функции при написании программ на JavaScript. Имеет следующие свойства:

и методы:

Оглавление

Индивидуальные задания

На языке JavaScript разработать программные средства, выполняющие следующие действия:

ОбъектПараметры движения События
(x,y)f(x)КудаРежим12
1СловоX=0;Y=4502x+5Вправо/вверх3ClickClick
2РисунокX=300;Y=40025cos(x)Вверх2ClickContextmenu
3СсылкаX=450;Y=22040sin(3x)Влево2ClickMouseover
4ТаблицаX=600;Y=400x*x/500Влево/вверх3Click>Mousemove
5БукваX=200;Y=0exp(x/100)Вниз2DblclickDblclick
6РисунокX=10;Y=30030log(x+10)Вправо2DblclickContextmenu
7СсылкаX=600;Y=20010tan(x)Влево2DblclickMouseover
8СловоX=50;Y=500.001x*x+xВправо/вниз3DblclickMousemove
9Кнопка X=500;Y=560sin(x*x)Влево/вниз1ContextmenuContextmenu
10БукваX=250;Y=45025cos(2x+1)Вверх2ContextmenuClick
11КнопкаX=350;Y=00.5exp(x/250)Вниз2ContextmenuDblclick
12Ссылка X=75;Y=17550log(x+5)-50Вправо3ContextmenuMouseover
13ФормаX=20;Y=4200.2x+45Вправо/вверх3ContextmenuMousemove
14Список OLX=550;Y=20-2.5x+15Влево/вниз1MouseoverClick
15ЧислоX=650;Y=5101000/(x+25)Влево/вверх1MouseoverDblclick
16IFRAMEX=20;Y=80x*x*x/(x*x+125))Вправо/вниз3MouseoverContextmenu
17Список ULX=20;Y=330x0.75-15Вправо2MouseoverMouseout
18radioX=620;Y=280x1.05-xВлево2MousemoveClick
19checkboxX=20;Y=440x0.5-50Вправо/вверх3MousemoveDblclick
20SELECTX=580;Y=590(x*x+x+10)0.5Влево/вверх2MousemoveContextmenu