Как я могу отобразить текст в упорядоченном списке, используя JavaScript - PullRequest
0 голосов
/ 09 мая 2011

Может кто-нибудь проверить мой код? Спасибо

Вот сайт скрипки, если вы хотите проверить: http://jsfiddle.net/66QYr/

Я бы хотел, чтобы первые 3 текста появлялись слева (вертикально) а затем следующие 3 текста появляются справа (по вертикали) затем следующие 2 текста появятся в нижнем правом нижнем углу (по вертикали) и последние 2 текста появляются внизу слева внизу (по вертикали)

http://i197.photobucket.com/albums/aa253/tintingerri/Test/pic001.png

<html>
<head>
    <title>tintin</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <style type="text/css">


        #tintin{
        position: relative;
        top: 211px;
        left: 12px;
        font-size:14pt;
        font-weight:bold;
        font-family: Calibri;
        color:red;
        filter:alpha(opacity=0);
        opacity:0;}


        .image{
        height:350px;
        width: 855px;}


    </style>
    <script type="text/javascript">



        var txt=['text1','text2', 'text3', 'text4', 'text5', 'text6', 'text7', 'text8', 'text9', 'text10'], init=0,i=0,k=0,speed=20,el;



        var loopCount=1000;
        var j=0;
        //var padd = 20; //set this to an approriate increment
        function fade(){
        init==0?i++:i--;
        el.filters?el.style.filter='alpha(opacity='+i+')':el.style.opacity=i/100;
        el.firstChild.nodeValue=txt[k];
        if(i==100)init=1;
        if(i==0) {init=0;k++;j++;
        el.style.paddingLeft=20*k;
        }
        if(k==txt.length)k=0;
        if (j<loopCount) setTimeout('fade()',speed);
        }
        window.onload=function(){
        el=document.getElementById('tintin');
        fade();
        }
        </script>
        </head>
        <body>
            <div id="tintin">&nbsp;</div>

            <div class="image" style="background-image:url('pic007s.jpg')">;



            </div>
        </body>
        </html>

1 Ответ

2 голосов
/ 09 мая 2011

Здесь вы пытаетесь решить две проблемы:

  1. Размещение текста в соответствующих местах
  2. Заставить их исчезнуть

Шаг первый

Первая проблема может быть решена с помощью простого CSS. Начните с контейнера:

#container {
    position:relative;
    width:150px;
    height:150px;
}

<div id="container"></div>

Ширина и высота могут быть любыми, но вы должны сказать это что-то . Мы собираемся поместить наш текст в этот контейнер, но затем используем position:absolute. Это выведет их из нормального потока документов и свернет контейнер, если мы укажем ему явную высоту.

Следующим шагом является текст. Вам понадобится четыре элемента div с текстом внутри абзацев:

<div class="text" id="text1">
    <p>text 1</p>
    <p>text 2</p>
    <p>text 3</p>
</div>

Сделайте это для каждого из четырех блоков текста, которые вы хотите иметь. Используйте одно и то же имя класса для каждого, но присвойте каждому свой уникальный идентификатор (text2, text3 и т. Д.).

Наконец, просто используйте (как я уже говорил ранее) абсолютное позиционирование, чтобы разместить их там, где вы хотите:

.text { position:absolute; }
#text1 { top:0;  left:0; }
#text2 { top:0; right:0; }

... и так далее. Когда вы закончите, у вас должно получиться что-то вроде этого:

four absolutely positioned divs

Шаг второй

Затухающие элементы требуют анимации. У вас вроде есть базовая функция анимации, но я предлагаю вам прочитать статью Роберта Пеннера о анимации и анимации. Он был написан для ActionScript, но применяются те же принципы.

На данный момент, есть хороший универсальный метод JavaScript, который будет принимать элемент и постепенно его увеличивать:

function fadeIn(totalTime, elem, after) {
    var cos = Math.cos,
        PI = Math.PI,
        startTime = +new Date(),
        endTime = startTime + totalTime,
        timer;

    elem.style.opacity = 0;
    elem.style.filter = 'alpha(opacity=0)';

    timer = setInterval(function () {
        var currentTime = +new Date();
        currentTime = currentTime > endTime ? 1 : (currentTime - startTime) / totalTime;

        var distance = (1 - cos(currentTime * PI)) / 2;
        elem.style.opacity = distance;
        elem.style.filter = 'alpha(opacity=' + distance * 100 + ')';

        if (currentTime === 1) {
            clearInterval(timer);
            if (after) {
                after();
            }
        }
    }, 40);
}

Вы указываете этой функции, как долго вы хотите, чтобы анимация длилась (в миллисекундах ), и вы также можете дать ей функцию, которая будет выполняться, когда затухание закончено (если вы хотите; это не нужно) .

Если я правильно понял ваш вопрос, вы хотите, чтобы все тексты начинались невидимыми, а затем постепенно появлялись, по одному, по часовой стрелке сверху. Мы можем сделать их невидимыми с помощью CSS, но если пользователь отключил JS, страница будет пустой. Поэтому вам нужно сначала «получить» все элементы (либо с какой-то функцией getByClass, либо с четырьмя различными вызовами getElementById) и установить их непрозрачность равной 0.

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

var text1 = document.getElementById('text1');
fadeIn(1000, text1);

Проблема в том, что, делая это, невозможно определить, когда начинать следующую анимацию. Поэтому нам нужно создать функцию с помощью замыканий, чтобы отслеживать вещи (это предполагает, что вы уже получили элементы в JS и сделали их невидимыми):

var tracker = (function () {
    var texts = [text1, text2, text3, text4],
        i = 0;

    return function () {
        var text = texts[i];
        if (text) {
            fadeIn(1000, text, tracker);
            i += 1;
        }
    };
}());

Эта функция циклически перебирает каждый элемент и добавляет его к концу, когда предыдущий элемент сделан. (Это нормально, если код не имеет большого смысла; замыкания - это сложные вещи.)

Вот окончательный результат в JSFiddle. Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...