ホームページ ウェブフロントエンド jsチュートリアル ネイティブ JS はカルーセル スタイルの画像カルーセル プラグインを実装します

ネイティブ JS はカルーセル スタイルの画像カルーセル プラグインを実装します

May 16, 2016 pm 03:04 PM

私は 3 つの画像カルーセルを自分で作成しました。1 つはアニメーション効果のない単純なネイティブ JS で実装され、もう 1 つは JQuery で実装され、フェードインとフェードアウトを切り替えます。今度は、もっとカッコいいものを作って、ブログや個人のウェブサイトに載せて、自分の作品を紹介したいと思っています。 MOOC の Web サイトを閲覧して、カルーセル jquery プラグインのコースを見つけました。これはちょっとクールだったので、ネイティブ JS でカプセル化することを考えました。やり始めて初めて、それが思ったほど簡単ではないことに気づきました。 。 。さっそく、実装プロセスを説明しましょう。

2. 効果

サーバーがまだ完成していないため。オンラインデモがないので(ORZ...)、レンダリングしか載せられません。

ネイティブ JS はカルーセル スタイルの画像カルーセル プラグインを実装します

おおよその効果は写真からも確認できるので、これ以上は言いません。実際のコードの効果を確認したい場合は、私の github プロジェクトにスターを付けることを忘れずに、コードをダウンロードしてください。^_^

3. 🎜>

HTML 構造


<div class="carrousel-main" data-setting=&#39;{"width":1000,"height":400,
 "carrouselWidth":750,
 "carrouselHeight":400,
 "scale":0.9,
 "verticalAlign":"middle"}&#39;>
 <div class="carrousel-btn carrousel-btn-pre"></div>
 <ul class="carrousel-list">
  <li class="carrousel-item">
  <a href="#"><img  src="/static/imghw/default1.png"  data-src="img/2.jpg"  class="lazy"   alt="ネイティブ JS はカルーセル スタイルの画像カルーセル プラグインを実装します" ></a>
  </li>
  <li class="carrousel-item">
  <a href="#"><img  src="/static/imghw/default1.png"  data-src="img/2.jpg"  class="lazy"   alt="ネイティブ JS はカルーセル スタイルの画像カルーセル プラグインを実装します" ></a>
  </li>
  <li class="carrousel-item">
  <a href="#"><img  src="/static/imghw/default1.png"  data-src="img/3.jpg"  class="lazy"   alt="ネイティブ JS はカルーセル スタイルの画像カルーセル プラグインを実装します" ></a>
  </li>
  <li class="carrousel-item">
  <a href="#"><img  src="/static/imghw/default1.png"  data-src="img/4.jpg"  class="lazy"   alt="ネイティブ JS はカルーセル スタイルの画像カルーセル プラグインを実装します" ></a>
  </li>
  <li class="carrousel-item">
  <a href="#"><img  src="/static/imghw/default1.png"  data-src="img/5.jpg"  class="lazy"   alt="ネイティブ JS はカルーセル スタイルの画像カルーセル プラグインを実装します" ></a>
 </ul>
 <div class="carrousel-btn carrousel-btn-next"></div>
 </div>
ログイン後にコピー
この構造は、一般的なカルーセルの HTML コード構造と同じです。わずかな違いは、メインのカルーセル div にデータがあることです。このプロパティには、カルーセル効果のいくつかのパラメータがあります。パラメータの具体的な意味については後述する。

CSS 部分のコードは掲載しません。レンダリングから分かるように、最も重要なことは要素の絶対位置に注意を払うことです。異なるため、これらは js を通じて制御されるため、絶対位置指定が必要です。以下では、js の実装プロセスに焦点を当てます。

JS 実装プロセス

JS のいくつかの重要な手順について説明します。これらの手順を完了すると、難しいことは何もなくなります。

①デフォルトパラメータ

パッケージプラグインなので、必ず設定が必要なパラメータのデフォルト値がいくつかあります。設定されています。このプラグインの主なパラメータは次のとおりです:

width:1000, //スライド エリアの幅
height:400, //スライド エリアの高さ
carrouselWidth:700, //最初のスライド フレーム幅
carrouselHeight:400, //スライドの最初のフレームの高さ
スケール:0.9,// 表示比率の関係を記録します。たとえば、スライドの幅と高さがどれだけ小さいかを記録します。 2 番目の画像は最初の画像と比較されます。
autoPlay:true,//自動再生するかどうか
timeSpan:3000,//自動再生時間間隔
verticalAlign:'middle' //画像の配置、あります。方法は 3 つあります: topmiddlebottom、デフォルトは middle です

②カプセル化オブジェクト

Web サイトが複数の場所で同じカルーセル プラグインを使用する可能性があるため、カプセル化が重要です。このオブジェクトを定義した後、オブジェクトの初期化メソッドを定義すると、すべてのクラスに同じクラスの DOM を渡すだけで複数のオブジェクトを作成できます。したがって、私の初期化メソッドは次のとおりです。


Carousel.init=function(carrousels){
 var _this=this;
 //将nodeList转换为数组
 var cals= toArray(carrousels); <br> /*因为原生JS获取所有的类,得到的是一个nodeList,是一个类数组,如果想要使用数组的方法则需要转化为真正的数组。这里toArray为转化方法。*/
 cals.forEach(function(item,index,array){
 new _this(item);
 });
 }
ログイン後にコピー
この場合、window.onload にいるときに、Carrousel.init(document.querySelectorAll('.carrousel-main')) を呼び出します。 ; このように複数のカルーセルを作成できます。

③最初のフレームの位置パラメータを初期化します

最初のフレーム以降のすべてのフレームの関連パラメータは最初のフレームを参照するためですフレームによって定義されるため、最初のフレームを適切に定義することが重要です。


setValue:function(){
this.carrousel.style.width=this.Settings.width+&#39;px&#39;;
this.carrousel.style.height=this.Settings.height+&#39;px&#39;;
 /*左右按钮设置,这里要让左右按钮平均地瓜分轮播区域宽减去第一帧宽度之后的区域,z-index要比除第一帧外所有图片都高,而图片刚好左右分放置,因此z-index的值就是图片数量的一半。*/
 var btnW=(this.Settings.width-this.Settings.carrouselWidth)/2;
 this.preBtn.style.width=btnW+&#39;px&#39;;
 this.preBtn.style.height=this.Settings.height+&#39;px&#39;;
 this.preBtn.style.zIndex=Math.ceil(this.carrouselItems.length/2);
 
 this.nextBtn.style.width=btnW+&#39;px&#39;;
 this.nextBtn.style.height=this.Settings.height+&#39;px&#39;;
 this.nextBtn.style.zIndex=Math.ceil(this.carrouselItems.length/2);
 //第一帧相关设置
 this.carrouselFir.style.left=btnW+&#39;px&#39;;
 this.carrouselFir.style.top=this.setCarrouselAlign(this.Settings.carrouselHeight)+&#39;px&#39;;
 this.carrouselFir.style.width=this.Settings.carrouselWidth+&#39;px&#39;;
 this.carrouselFir.style.height=this.Settings.carrouselHeight+&#39;px&#39;;
 this.carrouselFir.style.zIndex=Math.floor(this.carrouselItems.length/2);
},
ログイン後にコピー
ここで、新しいオブジェクトに関しては、dom ノードに移動してデータ設定パラメータを取得し、デフォルトのパラメータ設定を更新します。ここで注意すべき点があります。ユーザーがパラメータを設定するときに、すべてのパラメータが一度に設定されるわけではないため、dom パラメータを取得しても、値を割り当ててデフォルト パラメータを直接更新することはできません。値が直接割り当てられ、ユーザーがすべてのパラメータを設定しない場合、パラメータは失われます。ここでは、パラメーターを更新するために、JQuery の $.extend メソッドに似たオブジェクト拡張メソッドを作成しました。具体的には挙げませんが、興味のある方はダウンロードしてみてください。

④その他の画像位置設定

ここの画像は実際には1枚目以外の画像を左右均等に分割しています。左側の画像の位置は右側の画像の位置と異なるため、個別に設定する必要があります:


//设置右边图片的位置关系
var rightIndex=level;
rightSlice.forEach(function(item,index,array){
 rightIndex--;
 var i=index;
 rw=rw*carrouselSelf.Settings.scale;//右边的图片是按照scale比例逐渐变小的
 rh=rh*carrouselSelf.Settings.scale;
 
 item.style.zIndex=rightIndex;//越往右边z-index的值越小,可以用图片数量的一般逐渐递减
 item.style.width=rw+&#39;px&#39;;
 item.style.height=rh+&#39;px&#39;;
 item.style.opacity=1/(++i);//越往右边透明度越小<br>  //这里的gap计算方法为:轮播区域减去第一帧宽度,除2,再除左边或者右边的图片张数
 item.style.left=(constOffset+(++index)*gap-rw)+&#39;px&#39;;//left的值实际上就是第一帧的left+第一帧的宽度+item的间距减去item的宽度
 item.style.top=carrouselSelf.setCarrouselAlign(rh)+&#39;px&#39;;
});
ログイン後にコピー
左側の設定方法は同様で簡単なので省略します。詳細に。

⑤ 回転中にすべての画像の位置とサイズを調整します

この手順は、画像を回転させるために非常に重要です。次の写真は左にあります。左のボタンをクリックすると右に回転します。現時点では、すべての写真をリングとして表示し、1 回クリックし、1 回位置を変更して回転を完了するだけです。具体的には、左に回転する場合、2 番目のピクチャのパラメータを最初のピクチャと同じにし、3 番目のピクチャを 2 番目のピクチャと同じにし、...最後のピクチャを最初のピクチャと等しくします。右に回転する場合、最初のピクチャのパラメータは 2 番目のピクチャと等しく、2 番目のピクチャのパラメータは 3 番目のピクチャと等しくなります...そして最後のピクチャのパラメータは最初のピクチャと等しくなります。

这里就说说左旋转吧

if(dir==&#39;left&#39;){
 toArray(this.carrouselItems).forEach(function(item,index,array){
 var pre;
 if(index==0){//判断是否为第一张
  pre=_this.carrouselLat;//让第一张的pre等于最后一张
  var width=pre.offsetWidth; //获取相应参数
  var height=pre.offsetHeight;
  var zIndex=pre.style.zIndex;
  var opa=pre.style.opacity;
  var top=pre.style.top;
  var left=pre.style.left;
 }else{
  var width = tempWidth;
  var height = tempHeight;
  var zIndex = tempZIndex;
  var opa = tempOpacity;
  var top = tempTop;
  var left = tempLeft;
 }
  //这里需要注意,因为第二张图片是参照第一张的,而这样改变的时候,第一张是首先被改变的,因此必须先把第一张的相关参数临时保存起来。
 tempWidth = item.offsetWidth;
 tempHeight = item.offsetHeight;
 tempZIndex = item.style.zIndex;
 tempOpacity = item.style.opacity;
 tempTop = item.style.top;
 tempLeft = item.style.left;
 
 item.style.width=width+&#39;px&#39;;
 item.style.height=height+&#39;px&#39;;
 item.style.zIndex=zIndex;
 item.style.opacity=opa;
 item.style.top=top;
  // item.style.left=left;
  animate(item,&#39;left&#39;,left,function(){//自定义的原生js动画函数
  _this.rotateFlag=true;
  });
 });
}
ログイン後にコピー

这里的旋转,如果不使用一些动画过度,会显得很生硬。但是原生JS并没有动画函数,这里我是自己写了一个模仿的动画函数。其原理就是获取dom原来的样式值,与新传入的值比较。用一些方法定义一个速度。我这里的速度就是用其差值除18.然定义一个计时器,参考了一下jquery源码里面的时间间隔为每13毫秒执行一次。然后才原来的样式值每次加上speed后等于传入的值的时候清楚计时器即可。具体可以看这里。

好啦,关键的地方都差不多啦,如果明白这些过程应该就很容易了!

四、总结思考

总结:

个人感觉这还是一个比较好理解的插件。如果能结合JQuery来做就相当简单了。但是用原生来写的话,还是有一些不那么流畅的感觉。应该是自定义动画比不上JQuery封装好的动画吧。

还有,这个插件因为图片需要平均分到左右两边,于是对于偶数数量的图片来说,这里用的方法是克隆第一张,然后加到最后,形成一个奇数。

思考:

如果说有bug的话,那就是我定义了一个rotateFlag的标志去判断当前能否旋转,就是预防快速点击的时候跟不上。我在按下的时候把rotateFlag设置为false,然后在动画结束后再把rotateFlag设置为true,但是好像作用并不明显,希望有关大神可以指教一下,大家共同进步。

更多编程相关知识,请访问:编程入门!!

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

javascriptの分解:それが何をするのか、なぜそれが重要なのか javascriptの分解:それが何をするのか、なぜそれが重要なのか Apr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? Apr 04, 2025 pm 05:09 PM

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は?
または:
Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は? または: Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Apr 04, 2025 pm 05:36 PM

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Apr 04, 2025 pm 05:12 PM

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

JavaScriptは学ぶのが難しいですか? JavaScriptは学ぶのが難しいですか? Apr 03, 2025 am 12:20 AM

JavaScriptを学ぶことは難しくありませんが、挑戦的です。 1)変数、データ型、関数などの基本概念を理解します。2)非同期プログラミングをマスターし、イベントループを通じて実装します。 3)DOM操作を使用し、非同期リクエストを処理することを約束します。 4)一般的な間違いを避け、デバッグテクニックを使用します。 5)パフォーマンスを最適化し、ベストプラクティスに従ってください。

フロントエンド開発でVSCodeと同様に、パネルドラッグアンドドロップ調整機能を実装する方法は? フロントエンド開発でVSCodeと同様に、パネルドラッグアンドドロップ調整機能を実装する方法は? Apr 04, 2025 pm 02:06 PM

フロントエンドのVSCodeと同様に、パネルドラッグアンドドロップ調整機能の実装を調べます。フロントエンド開発では、VSCODEと同様のVSCODEを実装する方法...

See all articles