в некоторыханимацияНастройка,Мы можем использовать существующий атрибут анимации в CSS, чтобы легко установить эффект анимации.,Например, анимацияанимация,переход переход,Они сочетают в себе немного 2D,3D-трансформация позволяет добиться значительного эффекта анимации.,Но оно включает в себя все более и более сложныеанимация На данный момент нам также необходимо опираться наJavaScriptвыполнить。Здесь мы определяемJavaScriptПрактичная функция для будущих настроек。
Настройка анимации заключается в смене ключевых кадров внутри непрерывного интервала, чтобы они временно были непрерывными в поле зрения человеческого глаза. Как добиться этого временного интервала? Реализация временного интервала зависит от API таймера setTimeout, и будущие настройки анимации также будут основаны на этом API.
window.onload=setTimeout("changeNumber()",2000);//Вызов этой функции через 2 секунды
функция изменения Номер()
{
var test=document.getElementById("тест");
test.innerHTML="предупреждение!";
}
Мы можем очистить таймер так же, как очищаем число с плавающей запятой, используяclearTimeout(variable). Использование: сначала присвойте таймер переменной, а затем используйте эту переменную в качестве параметра ClearTimeout:
window.onload=function()
{
var timer=setTimeout("changeNumber()",2000);
clearTimeout(timer);
}
function changeNumber()
{
var test=document.getElementById("test");
test.innerHTML="warning!";
}
Таким образом таймер будет освобожден.
Теперь, когда у нас есть таймер, мы можем устанавливать анимацию на основе API таймера. Как это анимировать? Нам нужно менять положение цели через определенные промежутки времени, пока мы не достигнем конечной точки. Пока этот интервал достаточно мал, человеческий глаз будет воспринимать его как непрерывную плавную анимацию. Я решил определить функцию moveElement, которая будет менять положение цели через определенные промежутки времени, пока она не достигнет конца:
function moveElement(elementId,final_x,final_y,interval)
{
if(!document.getElementById) return false;
if(!document.getElementById(elementId)) return false;
var elem=document.getElementById(elementId);
var x=parseInt(elem.style.left);
var y=parseInt(elem.style.top);
if(x==final_x&&y==final_y) return true;//граничные условия
if(x<final_x){
x++;}
if(x>final_x){
x--;}
if(y<final_y){
y++;}
if(y>final_y){
y--;}
elem.style.left=x+"px";
elem.style.top=y+"px";
var repeat="moveElement('"+elementId+"',"+final_x+","+final_y+","+interval+")";
timer=setTimeout(repeat,interval);//Настройка таймера, рекурсивный вызов
}
Эта функция реализуется простым рекурсивным вызовом. Одна проблема, на которую нам нужно обратить внимание, заключается в том, что атрибут elem.style — это встроенный стиль тега elem, а не атрибуты id или class в CSS. Если вы хотите использовать неинициализированный стиль, значение переменной в стиле будет NAN. Итак, если вы хотите использовать значение переменной в стиле, есть два способа: (1) Встроенная инициализация:
<p id="test" style="top: 0px;left:0px;" >Hello World!</p>
<script src="test.js"></script>
(2) Инициализация DOM Мы определяем функцию инициализации и используем эту функцию для инициализации атрибута стиля или инициализируем его непосредственно внутри функции moveElement:
function positionessage(elementId,first_x,first_y)
{
if(!document.getElementById) return false;
var elem=document.getElementById(elementId);
elem.style.position="absoluate";
elem.style.left=first_x+"px";
elem.style.top=first_y+"px";
}
Выше мы получили функцию анимации, которая может заставить наши элементы двигаться в любом направлении. Теперь мы используем эту функцию для создания более практичных приложений для улучшения наших веб-страниц. Мы до сих пор смотрим Картинную галереяэтот пример:Картинная галерея Мы хотим, чтобы при наведении курсора мыши на изображение изображение ниже обновлялось, чтобы мы могли иметь эффект предварительного просмотра. Есть простой способ справиться с этим — изменить onclick на onmouseover, чтобы на наведение мыши реагировало.
function prepareGallery()
{
if(!document.getElementsByTagName) return false;
if(!document.getElementById) return false;
if(!document.getElementById("photoGallery")) return false;
var gallery=document.getElementById("photoGallery");
var links=gallery.getElementsByTagName("a");
for(var i=0;i<links.length;i++)
{
links[i].onmouseover=function()
{
return !showPic(this);//Вызов функции showPic
}
links[i].onkeypress=links[i].onmouseover;
}
}
Однако недостатком этого подхода является то, что реакция не является достаточно плавной.,Потому что загрузка новых изображений неизбежно займет время.,то, что мы хотим, этоБолее быстрые и плавные результаты:
Теперь, когда все изображение видно, мы хотим показать только фиксированную область шириной 400 пикселей и высотой 300 пикселей, скрывая при этом остальные области. Это невозможно сделать с помощью JavaScript, но мы можем установить это с помощью свойства CSS overflow: Обработка переполнения блочной модели
масса | описывать |
---|---|
visible | Все переливы видны |
hidden | Скрытый, внешняя часть не видна |
scroll | Показать полосы прокрутки |
auto | если есть больше, чем,Показать полосы прокрутки |
Теперь мы можем скрыть остальное, но для достижения эффекта просмотра мы должны иметь возможность показывать остальные части. Вы можете установить эффект смещения для изображения, чтобы можно было переходить к другим областям. Как установить смещение Возможно, вы подумаете о свойстве style.backgroundPositionX, но здесь мы используем функцию анимации moveElement, определенную ранее. HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Photo Gallery</title>
<link rel="stylesheet" type="text/css" href="photo gallery.css">
<script src="photo gallery.js"></script>
</head>
<body>
<h1>Photo Gallery</h1>
<ul id="linkList">
<li><a href="images/1.png" title="Кипчоге1"><img src="images/1.png" width="55" height="45"></a></li>
<li><a href="images/2.png" title="Кипчоге2"><img src="images/2.png" width="55" height="45"></a></li>
<li><a href="images/3.png" title="Кипчоге3"><img src="images/3.png" width="55" height="45"></a></li>
<li><a href="images/4.png" title="Бекеле1"><img src="images/4.png" width="55" height="45"></a></li>
<li><a href="images/5.png" title="Бекеле2"><img src="images/5.png" width="55" height="45"></a></li>
<li><a href="images/6.png" title="Бекеле3"><img src="images/6.png" width="55" height="45"></a></li>
</ul>
<div id="slidShow">
<img src="images/test.jpg" alt="Choos a picture" id="preview" />
</div>
</body>
</html>
JavaScript:
function addLoadEvent(func)
{
var oldonload=window.onload;
if(typeof window.onload!='function')//не привязано
{
window.onload=func;
}
else
{
window.onload=function()//добавлена анонимная функция
{
oldonload();
func();
}
}
}
addLoadEvent(prepareSlidshow);
function prepareSlidshow()
{
if(!document.getElementById) return false;
if(!document.getElementsByTagName) return false;
if(!document.getElementById("linkList")) return false;
if(!document.getElementsByTagName("preview")) return false;
var preview=document.getElementById("preview");
preview.style.position="absolute";
preview.style.left="0px";
preview.style.top="0px";
var list=document.getElementById("linkList");
var links=list.getElementsByTagName("a");
/* for(var i=0;i<links.length;i++) { links[i].οnmοuseοver=function() { var move=-(i+1)*400; moveElement("preview",move,0,10); } } */
links[0].onmouseover=function()
{
var move=0;
moveElement("preview",move,0,0.01);
}
links[1].onmouseover=function()
{
var move=-400;
moveElement("preview",move,0,0.01);
}
links[2].onmouseover=function()
{
var move=-800;
moveElement("preview",move,0,0.01);
}
links[3].onmouseover=function()
{
var move=-1200;
moveElement("preview",move,0,0.01);
}
links[4].onmouseover=function()
{
var move=-1600;
moveElement("preview",move,0,0.01);
}
links[5].onmouseover=function()
{
var move=-2000;
moveElement("preview",move,0,0.01);
}
links[6].onmouseover=function()
{
var move=-2400;
moveElement("preview",move,0,0.01);
}
}
function moveElement(elementId,final_x,final_y,interval)
{
if(!document.getElementById) return false;
if(!document.getElementById(elementId)) return false;
var elem=document.getElementById(elementId);
var x=parseInt(elem.style.left);
var y=parseInt(elem.style.top);
if(x==final_x&&y==final_y) return true;//граничные условия
if(x<final_x){
x++;}
if(x>final_x){
x--;}
if(y<final_y){
y++;}
if(y>final_y){
y--;}
elem.style.left=x+"px";
elem.style.top=y+"px";
var repeat="moveElement('"+elementId+"',"+final_x+","+final_y+","+interval+")";
timer=setTimeout(repeat,interval);//Настройка таймера, рекурсивный вызов
}
В приведенном выше процессе мы проходим по всем гиперссылкам, и когда указатель мыши наводится на изображение, мы устанавливаем смещение анимации moveElement для длинного изображения. Обратите внимание, что мы не можем использовать циклическую обработку, поскольку цикл является одноразовым и не может быть приостановлен ни в каком случае. время. Эффект возможности двигаться! На первый взгляд эффект движения вроде бы достигнут, но вроде есть какие-то проблемы. При подвешивании картинок в обе стороны картинки не двигаются, а вибрируют туда-сюда. В чем проблема? Накопленные события: При наведении мыши на изображение вызывается функция moveElement и выполняется таймер движения. При наведении другого изображения также выполняется второй таймер движения. В это время изображение не может определить, кто его выполняет, и, таким образом, изображение не может определить, кто его выполняет. происходит путаница. Очистить накопленные события Мы хотим добавить что-то внутри функции moveElement. Когда выполняется moveElement, существующий таймер должен быть очищен:
var таймер;//Определяем глобальные переменные
function moveElement(elementId,final_x,final_y,interval)
{
if(!document.getElementById) return false;
if(!document.getElementById(elementId)) return false;
var elem=document.getElementById(elementId);
var x=parseInt(elem.style.left);
var y=parseInt(elem.style.top);
if(timer) clearTimeout(timer);
if(x==final_x&&y==final_y) return true;//граничные условия
if(x<final_x){
x++;}
if(x>final_x){
x--;}
if(y<final_y){
y++;}
if(y>final_y){
y--;}
elem.style.left=x+"px";
elem.style.top=y+"px";
var repeat="moveElement('"+elementId+"',"+final_x+","+final_y+","+interval+")";
timer=setTimeout(repeat,interval);//Настройка таймера, рекурсивный вызов
}
JavaScriptпозвольте намСоздайте новое свойство: elem.property=value. Мы можем установить таймер атрибута для элемента. Если атрибут существует, очистите его, в противном случае выполните его напрямую:
function moveElement(elementId,final_x,final_y,interval)
{
if(!document.getElementById) return false;
if(!document.getElementById(elementId)) return false;
var elem=document.getElementById(elementId);
var x=parseInt(elem.style.left);
var y=parseInt(elem.style.top);
if(elem.timer) clearTimeout(elem.timer);
if(x==final_x&&y==final_y) return true;//граничные условия
if(x<final_x){
x++;}
if(x>final_x){
x--;}
if(y<final_y){
y++;}
if(y>final_y){
y--;}
elem.style.left=x+"px";
elem.style.top=y+"px";
var repeat="moveElement('"+elementId+"',"+final_x+","+final_y+","+interval+")";
elem.timer=setTimeout(repeat,interval);//Настройка таймера, рекурсивный вызов
}
Метод добавления значений атрибутов кажется более безопасным, а использование инкапсулированной функции moveElement весьма осмысленно.
Наша функция moveElement каждый раз перемещается на 1 пиксель. Вам кажется, что это слишком монотонно? Теперь я хочу внести в него некоторые изменения, исходя из расстояния от области до цели. Чем дальше расстояние, тем быстрее изменение, а чем ближе изменение, тем медленнее:
function moveElement(elementId,final_x,final_y,interval)
{
if(!document.getElementById) return false;
if(!document.getElementById(elementId)) return false;
var elem=document.getElementById(elementId);
var x=parseInt(elem.style.left);
var y=parseInt(elem.style.top);
if(elem.timer) clearTimeout(elem.timer);
if(x==final_x&&y==final_y) return true;//граничные условия
var dis_x,dis_y;
dis_x=Math.ceil((final_x-x)/10);//Округляем вверх
x+=dis_x;
//округляем вниз
dis_y=Math.ceil((final_y-y)/10);//Округляем вверх
y+=dis_y;
elem.style.left=x+"px";
elem.style.top=y+"px";
var repeat="moveElement('"+elementId+"',"+final_x+","+final_y+","+interval+")";
elem.timer=setTimeout(repeat,interval);//Настройка таймера, рекурсивный вызов
}
Это будет хороший выбор
Предыдущая область слайд-шоу посвящена поддержке JavaScript. Если рассматривается плавное ухудшение, если JavaScript не поддерживается, может ли веб-страница плавно ухудшаться? Но это не так. Когда JavaScript отключен на веб-странице, наша область будет неизменяемой. Такая область будет бесполезна, поскольку ее изображение фиксировано, а это означает, что мы не смогли плавно деградировать, поэтому мы это сделали. Чтобы завершить разделение JavaScript: HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Photo Gallery</title>
<link rel="stylesheet" type="text/css" href="photo gallery.css">
<script src="photo gallery.js"></script>
</head>
<body>
<h1>Photo Gallery</h1>
<ul id="linkList">
<li><a href="images/1.png" title="Кипчоге1"><img src="images/1.png" width="55" height="45"></a></li>
<li><a href="images/2.png" title="Кипчоге2"><img src="images/2.png" width="55" height="45"></a></li>
<li><a href="images/3.png" title="Кипчоге3"><img src="images/3.png" width="55" height="45"></a></li>
<li><a href="images/4.png" title="Бекеле1"><img src="images/4.png" width="55" height="45"></a></li>
<li><a href="images/5.png" title="Бекеле2"><img src="images/5.png" width="55" height="45"></a></li>
<li><a href="images/6.png" title="Бекеле3"><img src="images/6.png" width="55" height="45"></a></li>
</ul>
</body>
</html>
JavaScript:
function prepareSlidshow()
{
if(!document.getElementById) return false;
if(!document.getElementsByTagName) return false;
if(!document.getElementById("linkList")) return false;
if(!document.getElementsByTagName("preview")) return false;
var slideShow=document.createElement("div");
slideShow.setAttribute("id","slideShow");
var preview=document.createElement("img");
preview.setAttribute("src","images/test.jpg");
preview.setAttribute("alt","Choose a picture");
preview.setAttribute("id","preview");
slideShow.appendChild(preview);
var list=document.getElementById("linkList");
insertAfter(slideShow,list);
var preview=document.getElementById("preview");
preview.style.position="absolute";
preview.style.left="0px";
preview.style.top="0px";
var links=list.getElementsByTagName("a");
/* for(var i=0;i<links.length;i++) { links[i].οnmοuseοver=function() { var move=-(i+1)*400; moveElement("preview",move,0,10); } } */
links[0].onmouseover=function()
{
var move=0;
moveElement("preview",move,0,15);
}
links[1].onmouseover=function()
{
var move=-400;
moveElement("preview",move,0,15);
}
links[2].onmouseover=function()
{
var move=-800;
moveElement("preview",move,0,15);
}
links[3].onmouseover=function()
{
var move=-1200;
moveElement("preview",move,0,15);
}
links[4].onmouseover=function()
{
var move=-1600;
moveElement("preview",move,0,15);
}
links[5].onmouseover=function()
{
var move=-2000;
moveElement("preview",move,0,15);
}
}
Того же эффекта можно добиться:
Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/184857.html Исходная ссылка: https://javaforall.cn