Урок 13. Управление шрифтами в CSS
New Page 1
Уроки web-программирования:
«Java
Script: Дождь на странице. Продолжение разбора скрипта».
Продолжим разбирать скрипт, создающий эффект дождя. Вот его исходный код:
<html>
<head>
<title>Урок 31. Java Script: Дождь на странице. Продолжение.</title>
</head>
<body bgcolor="#EDEDED" text="#000000" link="#000000" topmargin="0"
leftmargin="0">
<center>
<SCRIPT LANGUAGE="JavaScript">
<!-- Begin
var no = 50;
var speed = 1;
var is_ns = (document.layers) ? 1 : 0;
var is_ie = (document.all) ? 1 : 0;
var s, x, y, sn, cs;
var a, r, cx, cy;
var i, doc_width = 800, doc_height = 600;
if (is_ns) {
doc_width = self.innerWidth;
doc_height = self.innerHeight;
}
else
if (is_ie) {
doc_width = document.body.clientWidth;
doc_height = document.body.clientHeight;
}
x = new Array();
y = new Array();
r = new Array();
cx = new Array();
cy = new Array();
s = 8;
for (i = 0; i < no; ++ i) {
initRain();
if (is_ns) {
if (i == 0) {
document.write("<layer name=\"dot"+ i +"\" left=\"1\" ");
document.write("top=\"1\" visibility=\"show\"><font color=\"blue\">");
document.write(",</font></layer>");
}
else {
document.write("<layer name=\"dot"+ i +"\" left=\"1\" ");
document.write("top=\"1\" visibility=\"show\"><font color=\"blue\">");
document.write(",</font></layer>");
}
}
else
if (is_ie) {
if (i == 0) {
document.write("<div id=\"dot"+ i +"\" style=\"POSITION: ");
document.write("absolute; Z-INDEX: "+ i +"; VISIBILITY: ");
document.write("visible; TOP: 15px; LEFT: 15px;\"><font color=\"blue\">");
document.write(",</font></div>");
}
else {
document.write("<div id=\"dot"+ i +"\" style=\"POSITION: ");
document.write("absolute; Z-INDEX: "+ i +"; VISIBILITY: ");
document.write("visible; TOP: 15px; LEFT: 15px;\"><font color=\"blue\">");
document.write(",</font></div>");
}
}
}
function initRain() {
a = 6;
r[i] = 1;
sn = Math.sin(a);
cs = Math.cos(a);
cx[i] = Math.random() * doc_width + 1;
cy[i] = Math.random() * doc_height + 1;
x[i] = r[i] * sn + cx[i];
y[i] = cy[i];
}
function makeRain() {
r[i] = 1;
cx[i] = Math.random() * doc_width + 1;
cy[i] = 1;
x[i] = r[i] * sn + cx[i];
y[i] = r[i] * cs + cy[i];
}
function updateRain() {
r[i] += s;
x[i] = r[i] * sn + cx[i];
y[i] = r[i] * cs + cy[i];
}
function raindropNS() {
for (i = 0; i < no; ++ i) {
updateRain();
if ((x[i] <= 1) || (x[i] >= (doc_width - 20)) || (y[i] >= (doc_height -
20))) {
makeRain();
doc_width = self.innerWidth;
doc_height = self.innerHeight;
}
document.layers["dot"+i].top = y[i];
document.layers["dot"+i].left = x[i];
}
setTimeout("raindropNS()", speed);
}
function raindropIE() {
for (i = 0; i < no; ++ i) {
updateRain();
if ((x[i] <= 1) || (x[i] >= (doc_width - 20)) || (y[i] >= (doc_height -
20))) {
makeRain();
doc_width = document.body.clientWidth;
doc_height = document.body.clientHeight;
}
document.all["dot"+i].style.pixelTop = y[i];
document.all["dot"+i].style.pixelLeft = x[i];
}
setTimeout("raindropIE()", speed);
}
if (is_ns) {
raindropNS();
}
else
if (is_ie) {
raindropIE();
}
// End -->
</script>
</body>
</html>
|
На
прошлом
уроке мы остановились на цикле
for (i = 0; i < no; ++ i) { |
который, как
я уже писал, повторяется n раз. Это самое число
n, повторюсь, регулирует количество капель.
Теперь
разберем, что же у нас в цикле:
Это процедура
инициализации "дождя". Вот как она выглядит:
function initRain() {
a = 6;
r[i] = 1;
sn = Math.sin(a);
cs = Math.cos(a);
cx[i] = Math.random() * doc_width + 1;
cy[i] = Math.random() * doc_height + 1;
x[i] = r[i] * sn + cx[i];
y[i] = cy[i];
} |
В ней мы с
помощь различных математических функций вычисляем начальные координаты капель
дождя. Для генерации случайных чисел мы используем функцию Math.random(). В
переменной "a" мы задаем угол наклона дождя в
радианах. В переменных sn и cs
у нас через синунс и косинус вычисляет вектор наклона капель дождя.
Давайте
немного "поизвращаемся", присвоим переменной "a"
другое значение, например 5. У нас капли станут капать под другим углом.
Вызывается
эта процедура у нас для каждой капли, поэтому она расположена в цикле, который
повторяется столько раз, сколько у нас капель.
if (is_ns) {
if (i == 0) {
document.write("<layer name=\"dot"+ i +"\" left=\"1\" ");
document.write("top=\"1\" visibility=\"show\"><font color=\"blue\">");
document.write(",</font></layer>");
}
else {
document.write("<layer name=\"dot"+ i +"\" left=\"1\" ");
document.write("top=\"1\" visibility=\"show\"><font color=\"blue\">");
document.write(",</font></layer>");
}
}
else
if (is_ie) {
if (i == 0) {
document.write("<div id=\"dot"+ i +"\" style=\"POSITION: ");
document.write("absolute; Z-INDEX: "+ i +"; VISIBILITY: ");
document.write("visible; TOP: 15px; LEFT: 15px;\"><font color=\"blue\">");
document.write(",</font></div>");
}
else {
document.write("<div id=\"dot"+ i +"\" style=\"POSITION: ");
document.write("absolute; Z-INDEX: "+ i +"; VISIBILITY: ");
document.write("visible; TOP: 15px; LEFT: 15px;\"><font color=\"blue\">");
document.write(",</font></div>");
}
} |
Здесь мы
рисуем каплю, в зависимости от браузера используем тот или иной алгоритм
рисования.
Теперь
разберем еще несколько функций.
Функция
"бросания" капель для бразузера
Netscape:
function raindropNS() {
for (i = 0; i < no; ++ i) {
updateRain();
if ((x[i] <= 1) || (x[i] >= (doc_width - 20)) || (y[i] >= (doc_height -
20))) {
makeRain();
doc_width = self.innerWidth;
doc_height = self.innerHeight;
}
document.layers["dot"+i].top = y[i];
document.layers["dot"+i].left = x[i];
}
setTimeout("raindropNS()", speed);
} |
Для
Internet Explorer:
function raindropIE() {
for (i = 0; i < no; ++ i) {
updateRain();
if ((x[i] <= 1) || (x[i] >= (doc_width - 20)) || (y[i] >= (doc_height -
20))) {
makeRain();
doc_width = document.body.clientWidth;
doc_height = document.body.clientHeight;
}
document.all["dot"+i].style.pixelTop = y[i];
document.all["dot"+i].style.pixelLeft = x[i];
}
setTimeout("raindropIE()", speed);
} |
В зависимости
от того, под каким браузером работает наш скрипт, вызывается соответствующая
процедура, что бы использовать подходящий для данного браузера синтаксис.
Функция
"бросания" дождя вызывает
updateRain() и
makeRain(), давайте посмотрим на эти функции:
function makeRain() {
r[i] = 1;
cx[i] = Math.random() * doc_width + 1;
cy[i] = 1;
x[i] = r[i] * sn + cx[i];
y[i] = r[i] * cs + cy[i];
}
function updateRain() {
r[i] += s;
x[i] = r[i] * sn + cx[i];
y[i] = r[i] * cs + cy[i];
} |
Как видим,
они пересчитывают координаты.
И наконец,
что бы функция обновления местоположения капель дождя вызывалась периодически,
используется команда
setTimeout("raindropIE()", speed) или
setTimeout("raindropNS()", speed);
На этом я
закончу урок, до новых встреч.
|