2

JQUERY を推奨しないでください - 私は学習目的でこの演習を行っています。

10 秒の設定間隔を使用して、タイマーで画像 (_elementSlideChange) を回転させる JavaScript を実装しました。また、これにスライド機能を追加しました。これは 7 ミリ秒 (_slideImage) です。

画像は、ページの読み込み時に 10 秒ごとに自動的に回転します。ユーザーが画像を手動で変更できるように、次へボタンと前へボタンも用意しました。

_elementSlideChange: function () {
  var myString;
  var myText;
  for (var i = 0; i < this._imgArray.length; i++) {
    var imageArr = "url(" + this._imgArray[i].src + ")";
    var imageBg = this._imageHolder.style.background + "";
    if (imageArr == imageBg) {
      if (i == (this._imgArray.length - 1)) {
        myString = "url(" + this._imgArray[0].src + ")";
        myText = this._infoArray[0];
      } else {
        myString = "url(" + this._imgArray[(i + 1)].src + ")";
        myText = this._infoArray[i + 1];
      }
    }
  }
  this._imageNextSlide.style.background = myString;
  this._imageNextSlide.style.background);
  this._infoElement.innerHTML = myText;
  this._myTimer = setInterval(MyProject.Utils.createDelegate(this._slideImage, this),  7);
},
_slideImage: function () {
  if (parseInt(this._imageHolder.style.width) >= 0 && parseInt(this._imageNextSlide.style.width) <= 450) {
    this._imageHolder.style.backgroundPosition = "right";
    this._imageHolder.style.width = (parseInt(this._imageHolder.style.width) - 1) + 'px';
    console.log(this._imageNextSlide.style.background);
    this._imageNextSlide.style.width = (parseInt(this._imageNextSlide.style.width) + 1) + 'px';
  } else {
    console.log("reached 0px");
    if (parseInt(this._imageHolder.style.width) == 0) {
      this._imageHolder.style.background = this._imageNextSlide.style.background;
      this._imageHolder.style.width = 450 + 'px';
      this._imageHolder === this._imageNextSlide;
      this._imageHolder.className = "orginalImage";
      this._imageNextSlide.style.width = 0 + "px";
      this._imageNextSlide = this._dummyImageNextSlide;
      this._imagesElement.appendChild(this._imageHolder);
      this._imagesElement.appendChild(this._imageNextSlide);
      clearInterval(this._myTimer);
    }
    clearInterval(this._myTimer);
    clearInterval(this._elementSlideChange);
  }
}

したがって、ユーザーが [次へ] 矢印ボタンをクリックすると、「クリック」のイベント リスナーがトリガーされます。これにより、現在表示されている画像の div が作成され、次の画像を含む新しい div が作成されます。画像のスライドと回転は正しく機能します ( または のonLoadいずれかonClick)。私が抱えている問題は、[次へ] ボタンをクリックすると、新しい div 画像が所定の位置にスライドしている間に無限ループに陥り、表示される画像と同じ div がスライドし続け、より多くの[次へ] ボタンをクリックすると、画像の回転が速くなります。

画像の回転とスライダーに明確な間隔を設定しようとしましたが、コードが間違っていることを理解しています。これにより、スライド画像の無限ループが発生します。そして、私は機能の完成に近づいていることを知っています。

誰が私がどこで間違っているのか教えてもらえますか? または、別の方法でスライディング DIV を実装しようとする必要がありますか?

繰り返しになりますが、jQuery はお勧めしません。

そして、事前に助けてくれてありがとう。

クッシュ

4

3 に答える 3

0

この問題を解決するために、コード全体を書き直しました。ここには、次と前のボタンイベントリスナーがありました。

myProject.Utils.addHandler(this._nextImageElement, "click", myProject.Utils.createDelegate(this._changeImage, this));

両方のボタンが同じ関数を呼び出します:

_changeImage: function (e)

この関数では、関数が遷移(画像の変更)であるかどうかを確認し、ブール値を宣言します var forward = e.target == this._nextImageElement;

次に、転送する場合は現在のインデックスを確認しますか?他に1を足してマイナス1

this._currentImageIndex += forward ? 1 : -1;

配列の最後にあり、順方向がtrueの場合、this._currentImageIndexを割り当てて0にリセットするか、逆の場合はArray.length –1にリセットします。

次に、「div」にスライド効果を与える別の関数を呼び出します。この場合、それを呼び出しますthis._transitionImage(forward);

この関数では、this._inTranstionをtrueに設定します。(この場合、divがスライドしているため)。

次のコードは私が抱えていた問題を解決しました。

this._slideImageElement.style.backgroundImage = "url(\"" + this._imgArray[this._currentImageIndex].src + "\")";

this._slideImageElement.style.backgroundPosition = forward ? "left" : "right";        
this._slideImageElement.style.left = forward ? "auto" : "0px";
this._slideImageElement.style.right = forward ? "0px" : "auto";

上記のコードは非常に重要です。オブジェクトは、現在の表示可能な「div」の「sliding in div」をユーザーに左または右に配置することであり、これは主に、forward変数がtrueかfalseかによって異なります。

var i = 0;

次に、移行を開始します

setInterval( function() {
    this._currentImageElement.style.backgroundPosition = (forward ? -1 : 1) * (i + 1) + "px";
       this._slideImageElement.style.width = (i + 1) + "px";

前方に-1または+1を掛けると、前方にbgPositionが左に移動するかどうかが決定されることに注意してください。たとえば、ユーザーが[次のボタン]をクリックした場合、前方=trueです。最初に行うことは

this._slideImageElement.style.backgroundPosition = "left"

それで

this._slideImageElement.style.left = "auto"
this._slideImageElement.style.right = "0px"

これは、スライド画像が背景位置で移動する場合は左ですが、divは右から0pxに配置されることを意味します。 次にthis._currentImageElement.style.backgroundPosition = -1 * (i + 1) は、currentImageElementの位置を1px左に移動します

この場合は現在のdivの右側にあるslideImageの幅を広げます。現在のdivが左に移動すると、スライド画像が右から表示され始めます。(デフォルトでは、slideImageElementの幅を0pxに設定して、divは存在するが、ユーザーには表示されないようにします)。これにより、右から来る新しい画像を前方に移動するスライド効果が得られます。

this._slideImageElement.style.width = (i + 1) + "px";

次に、画像の幅になったら停止するように宣言します。この場合、500pxになります。 if((i = i + 2)== 500){ このifステートメントでは、currentImageElementの背景をリセットし、背景の位置「右」または「左」は、リセットされている限り実際には重要ではありません。

間隔をクリアします。遷移を再度falseに設定します。次に、関数changeImageのsetTimeoutを呼び出します。これは、スライドが完了するまで続きます。

以下にリセットコードを示します。これは同じ画像の繰り返しを防ぐために非常に重要であるためです(これで問題全体が解決しました)

// set the current image to the "new" current image and reset it's background position
this._currentImageElement.style.backgroundImage = "url(\"" + this._imgArray[this._currentImageIndex].src + "\")";
this._currentImageElement.style.backgroundPosition = "right";

// reset the slide image width
this._slideImageElement.style.width = "0px";

// clear the transition interval and mark as not in transition
clearInterval(this._transitionInterval);
                this._inTransition = false;

// setup the next image timer
this._nextImageTimeout = setTimeout(myProject.Utils.createDelegate(this._changeImage, this), 2500);

}

問題の論理を理解しやすくなるため、詳細を説明しました。同じ問題が発生していなくても、問題を特定するのに役立つ場合があります。

JSfiddleを提供できませんでした。Javascriptを使用してCSSを作成したため、これを行うにはさまざまな方法がありますが、順方向と逆方向の背後にあるロジックを理解し、継続的に前進するタイマーを用意したいと思いました。

于 2013-01-04T11:26:09.343 に答える
0

スライドのアニメーションをキャンセルしたいようです (おそらく、次のスライドのアニメーション中にフェードアウトするか、アニメーションを突然キャンセルするか、終了させて​​ボタンのクリックを無視します)

私が通常個人的に行っているのは、アニメーション化された状態をチェックすることです (はい、jquery を使用していますが、同じ方法でアニメーション化に使用している CSS または配置値をテストできるはずです)。「アクティブ」を追加することもできます。アニメーション中にクラスまたはデータ型を使用して、テストを容易にします。グローバルフラグも機能します。アニメーションがある場合は、ボタンを無視します。(私の仕事のため...あなたの意図に依存します)

私が言ったように、問題はアニメーション ルーチンではなく、ボタンの動作にある可能性があります。ボタンのクリックからこれを呼び出す方法と、意図した結果がどうなるかを確認すると便利です。

于 2013-01-03T17:27:25.683 に答える
-2

CSS3トランジションはどうですか?

transition: all 1s ease 0.5s;

JS Fiddle の簡単な例

これでアニメーションが処理されるので、JavaScript を使用して目的の宛先を設定するだけです。

this.style.left = '100px';

または

this.style.top = '30px';

また、CSS3 トランジションは要素をスムーズにスライドさせます。

クロスブラウザ注意!

一部のtransitionブラウザーでは、プロパティにベンダー プレフィックスが必要な場合があります。私は最新の製品版 Firefox を使用していますが-moz、その必要はありません。同じことが Opera にも当てはまり、'-o' は必要ありません。Internet Exporer 10 にはプレフィックスは必要ありません。Safari / Chrome で使用する必要があるかもしれませんが-webkit、最初は使用せずにテストしてください。

于 2013-01-03T11:55:46.163 に答える