ホームページ ウェブフロントエンド jsチュートリアル zepto.js_javascriptスキルをベースにした携帯電話のQQ空間を模した大型画像閲覧コンポーネント ImageView.jsの詳細説明

zepto.js_javascriptスキルをベースにした携帯電話のQQ空間を模した大型画像閲覧コンポーネント ImageView.jsの詳細説明

May 16, 2016 pm 04:11 PM

呼び出しメソッド: ImageView(index,imgData) --index パラメータはデフォルトで画像に表示されるインデックス値、型は Number --imaData パラメータは画像 URL 配列、型は Array

zepto.js ファイルを使用する前に導入してください

ImageView.js の具体的なコードは次のとおりです:

コードをコピー コードは次のとおりです:

/*
* ImageView v1.0.0
* --zepto.js
に基づいた大きな画像の表示 * -- メソッド ImageView(index,imgDada)
を呼び出します * --index 画像デフォルト値表示インデックス、数値 --imgData 画像 URL 配列、Array
* */
var ImageView=(function(window,$){
var _this=$("#slideView"),_ImgData=[],_index=0,_length=0,
_start=[],_org=[],_orgTime=null,
_lastTapDate=null,
_zoom=1,_zoomXY=[0,0],_transX=null,
_advancedSupport = false,
_doubleDistOrg=1,_doubleZoomOrg=1,isDoubleZoom = false,
isSlide=true、isDrag=false、timer=null、
winW=window.innerWidth,winH=window.innerHeight;
/**
* イベントオブジェクトevent
​​*/
var イベント={
touchstart:function(e){
e.preventDefault();
If (_advancedSupport && e.touches && e.touches.length >= 2) {
var img = getImg();
$(img).css({"-webkit-transitionDuration": "0ms","transitionDuration": "0ms"});
_doubleZoomOrg = _zoom;
_doubleDistOrg = getDist(e.touches[0].pageX, e.touches[0].pageY, e.touches[1].pageX, e.touches[1].pageY);
isdoublezoom = true;
戻る
}
e = e.touches ? e.touches[0] : e;
isDoubleZoom = false;
_start = [e.pageX, e.pageY];
_org = [e.pageX, e.pageY];
_orgTime = Date.now();
_transX = -_index * winW;
if(_zoom!=1){
_zoomXY = _zoomXY || [0, 0];
_orgZoomXY = [_zoomXY[0], _zoomXY[1]];
var img = getImg();
img&&($(img).css({"-webkit-transitionDuration": "0ms","transitionDuration": "0ms"}));
isDrag = true
}その他{
_this.find(".pv-inner").css({"-webkit-transitionDuration":"0ms","transitionDuration":"0ms"});
isSlide = true
}
}、
touchmove:function(e){
e.preventDefault();
If (_advancedSupport && e.touches && e.touches.length >= 2) {
var newDist = getDist(e.touches[0].pageX, e.touches[0].pageY, e.touches[1].pageX, e.touches[1].pageY);
_zoom = (newDist/_doubleDistOrg) * _doubleZoomOrg
                var img = getImg();
                $(img).css({"-webkit-transitionDuration": "0ms","transitionDuration": "0ms"});
                if (_zoom                     _ズーム = 1;
                    _zoomXY = [0, 0];
                    $(img).css({"-webkit-transitionDuration": "200ms","transitionDuration": "200ms"})
                } else if (_zoom >getScale(img) * 2){
                     _zoom = getScale(img) * 2;
                }
                $(img).css({"-webkit-transform": "scale(" _zoom ") translation(" _zoomXY[0] "px," _zoomXY[1] "px)","transform": "scale(" _zoom ") translation(" _zoomXY[0] "px," _zoomXY[1] "px)"});
                戻る
            }
            if (isDoubleZoom){
                戻る;
            }
            e = e.タッチ ? e.touches[0] : e;
            if (_zoom != 1) {
                var deltaX = (e.pageX - _start[0]) / _zoom;
                var deltaY = (e.pageY - _start[1]) / _zoom;
                _start = [e.pageX, e.pageY];
                var img = getImg();
                var newWidth = img.clientWidth *_zoom,
                    newHeight = img.clientHeight * _zoom;
                var borderX = (newWidth - winW) / 2 / _zoom,
                    borderY = (newHeight - winH) / 2 / _zoom;
                (borderX >= 0)&&(_zoomXY[0] < -borderX || _zoomXY[0] > borderX)&&(deltaX /= 3);
                (borderY > 0)&&(_zoomXY[1] borderY)&&(deltaY /= 3);
                _zoomXY[0] = デルタX;
                _zoomXY[1] = デルタY;
                (_length == 1 && newWidth < winW||newWidth < winW)&&(_zoomXY[0] = 0);
                (_length == 1 && newHeight < winH||newHeight < winH)&&(_zoomXY[1] = 0);
                $(img).css({"-webkit-transform": "scale(" _zoom ") translation(" _zoomXY[0]
                    "px," _zoomXY[1] "px)","transform": "scale(" _zoom ") translation(" _zoomXY[0]
                    "px," _zoomXY[1] "px)"})
            }その他{
                if (!isSlide) return;
                var deltaX = e.pageX - _start[0];
                (_transX > 0 || _transX < -winW * (_length - 1))&&(deltaX /= 4);
                _transX = -_index * winW デルタX;
                _this.find(".pv-inner").css({"-webkit-transform":"translate(" _transX "px,0px) translationZ(0)"});
            }
        }、
        touchend:function(e){
            if (isDoubleZoom) {
                戻る;
            }
            if (_zoom != 1) {
                if (!isDrag){return;}
                var img = getImg();
                var newWidth = img.clientWidth *_zoom,
                    newHeight = img.clientHeight * _zoom;
                var borderX = (newWidth - winW) / 2 / _zoom,
                    borderY = (newHeight - winH) / 2 / _zoom;
                if (_length > 1 && borderX >= 0) {
                    var updateDelta = 0;
                    var switchDelta = winW / 6;
                    if (_zoomXY[0] < -borderX - switchDelta / _zoom && _index < _length - 1){
                        updateDelta = 1;
                    }else if (_zoomXY[0] > borderX switchDelta / _zoom && _index > 0){
                        updateDelta = -1;
                    }
                    if (updateDelta != 0) {
                        スケールダウン(img);
                        changeIndex(_index updateDelta);
                        戻る
                    }
                }
                var デルタ = Date.now() - _orgTime;
                if (デルタ                     (デルタ                     var deltaDis = Math.pow(180 / デルタ, 2);
                    _zoomXY[0] = (_zoomXY[0] - _orgZoomXY[0]) * deltaDis;
                    _zoomXY[1] = (_zoomXY[1] - _orgZoomXY[1]) * deltaDis;
                    $(img).css({"-webkit-transition": "400ms cubic-bezier(0.08,0.65,0.79,1)","transition": "400ms cubic-bezier(0.08,0.65,0.79,1)" })
                } else{
                    $(img).css({"-webkit-transition": "200ms リニア","transition": "200ms リニア"});
                }
                if (borderX >= 0){
                    if (_zoomXY[0] < -borderX){
                        _zoomXY[0] = -borderX;
                    }else if (_zoomXY[0] > borderX){
                        _zoomXY[0] = 境界X;
                    }
                }
                if (borderY > 0){
                    if (_zoomXY[1] < -borderY){
                        _zoomXY[1] = -borderY;
                    }else if (_zoomXY[1] >borderY){
                        _zoomXY[1] = 境界Y;
                    }
                }
                if (Math.abs(_zoomXY[0]) <10) {
                    $(img).css({"-webkit-transform": "scale(" _zoom ") 変換(0px," _zoomXY[1] "px)","transform": "scale(" _zoom ") 変換(0px) ," _zoomXY[1] "px)"});
                    戻る
                } else{
                    $(img).css({"-webkit-transform": "scale(" _zoom ") translation(" _zoomXY[0] "px," _zoomXY[1] "px)","transform": "scale(" _zoom ") translation(" _zoomXY[0] "px," _zoomXY[1] "px)"});
                }
                isDrag = false
            }その他{
                if (!isSlide){ return;}
                var deltaX = _transX - -_index * winW;
                var updateDelta = 0;
                if (deltaX > 50){
                    updateDelta = -1;
                }else if(deltaX < -50){
                    updateDelta = 1;
                }
                _index=_index updateDelta;
                changeIndex(_index);
                isSlide =false
            }
        }、
        click:function(e){
            _zoom=1;
            _zoomXY=[0,0];
            _this.css("不透明度","0");
            timer=setTimeout(function(){
                _this.css({"表示":""}).html("");
                unbind();
            },150)
        }、
        dobelTap:function(e){
            clearTimeout(タイマー);
            var now = 新しい日付;
            if (現在 - _lastTapDate < 500){
                戻る;
            }
            _lastTapDate = 今;
            var img = getImg();
            if (!img){
                戻る;
            }
            if (_zoom != 1){
                スケールダウン(img);
            }その他{
                スケールアップ(img);
            }
        }、
        setView:function(e){
            winW=window.innerWidth;
            winH=window.innerHeight;
            _this.width(window.innerWidth).height(window.innerHeight);
            translation((-_index*window.innerWidth),0,0,$(".pv-inner")[0]);
            スケールダウン(getImg())
        }
    };
    var handleEvent=function(e){
        スイッチ (e.type){
            ケース「タッチスタート」:
                Event.touchstart(e);
                休憩;
            ケース「タッチムーブ」:
                Event.touchmove(e);
                休憩;
            ケース「タッチキャンセル」:
            ケース「タッチエンド」:
                Event.touchend(e);
                休憩;
            case "方向変更":
            ケース "サイズ変更":
                Event.setView(e);
                休憩
        }
    };
    /**
* 結合イベント
​​*/
    varbind=function(){
        _this.on("シングルタップ",function(e){
            e.preventDefault();
            var now = 新しい日付;
            if (現在 - _lastTapDate < 500){
                戻る;           
            }
            _lastTapDate = 今;
            Event.click(e);
            false を返します;
        }).on("ダブルタップ", function(e) {
            e.preventDefault();
            Event.dobelTap(e);
            false を返します;
        });
        _this.on("タッチスタート タッチ移動 タッチエンド タッチキャンセル", function(e) {
            handleEvent(e);
        });
        Event.setView();
        ウィンドウの「onorientationchange」? window.addEventListener("方向変更",Event.setView,false) : window.addEventListener("resize",Event.setView,false);
    };
    /**
* * イベントを終了
​​*/
    var unbind= function() {
         _this.off();
        ウィンドウの「onorientationchange」? window.removeEventListener("orientationchange",Event.setView, false) : window.removeEventListener("resize",Event.setView, false)
    };
    var getDist= function(x1, y1, x2, y2) {
        return Math.sqrt(Math.pow(x2 - x1, 2) Math.pow(y2 - y1, 2), 2)
    }
    /**
* 画像ズーム
​​*/
    var getScale=function(img) {
        var h = img.naturalHeight、w = img.naturalWidth、
        スケール=w*h/(img.clientHeight*img.clientWidth);
        スケールを返します;
    };
    varscaleUp=function(img) {
        varscale = getScale(img);
        if (スケール > 1)
            $(img).css({"-webkit-transform": "scale(" スケール ")","transform": "scale(" スケール ")","-webkit-transition": "200ms","transition ": "200ms"});
        _zoom = スケール;
    };
    varscaleDown=function(img) {
        _ズーム = 1;
        _zoomXY = [0, 0];
        _doubleDistOrg = 1;
        _doubleZoomOrg = 1;
        $(img).css({"-webkit-transform": "scale(1)","transform": "scale(1)","-webkit-transition": "200ms","transition": "200ms "});
    };
    /**
* スライド効果
* 距離
​​*/
    var translation = function( distX,distY,speed,ele) {
if( !!ele ){ ele=ele.style; }else{ return; }
ele.webkitTransitionDuration = ele.MozTransitionDuration = ele.msTransitionDuration = ele.OTransitionDuration = ele.transitionDuration = speed + 'ms';
ele.webkitTransform = 'translate(' + distX + 'px,'+distY+'px)' + 'translateZ(0)';
ele.msTransform = ele.MozTransform = ele.OTransform = 'translateX(' + distX + 'px) translateY(' + distY + 'px)';
};
/**
* 更改索引值 _index
*/
var changeIndex=function(index,force){
if (index < 0){
index = 0;
}else if(index >= _length){
            index =_length - 1;
        }
        _index = index;
        translate((-_index*window.innerWidth),0,force? "0" : "200" ,$(".pv-inner")[0]);
        $("#J_index").html(_index+1+"/"+_length);
        imgLoad();
    }
    /**
     * 图片获取
     */
    var getImg=function(index) {
        var img = _this.find("li").eq(index || _index).find("img");
        if (img.size() == 1){
            return img[0];
        }else{
            return null
        }
    }
    /**
     * 图片加载
     */
    var imgLoad=function(){
        if($(".pv-img").eq(_index).find("img")[0]){
            $("#J_loading").css("display","");
            return;
        }else{
            $("#J_loading").css("display","block");
            var tempImg=new Image(),w,h,set;
            tempImg.src=_ImgData[_index];
            $(".pv-img").eq(_index)[0].appendChild(tempImg);
            tempImg.onload=function(){
                $("#J_loading").css("display","");
            }
        }
    };
    /**
     * 创建大图查看Dome结构
     */
    var Create=function(){
        _this.append("
    ").append("

    "+(_index+1)+"/"+_length+"

    ").append("")
            for(var i=0;i<_length;i++){
    $(".pv-inner").append("
  • ")
            }
            imgLoad();
        };
        /**
         * 大图查看初始化
         */
        var init=function(){
            !!_this[0]||$("body").append("
    ");
    _this=$("#slideView");
    ($.os.iphone || $.os.android && parseFloat($.os.version) >= 4)&&(_advancedSupport = true);
    }();
    /**
    * * 拡大画像ビューリターンインターフェース関数
    * ImageView(インデックス,データ)
    * インデックスの初期インデックス値 numbermer
    * データ画像配列 array
    ​​*/
    var ImageView=function(インデックス,データ){
    _ImgData=データ;
    _index=index;
    _length=data.length;
    //dom構造を作成
    Create();
    //dom構造表示
    _this.css("表示","ブロック");
    //イベントをバインド
    bind();
    }
    ImageView を返します;
    })(ウィンドウ,ゼプト);

    ImageView.js で使用される CSS コードは次のとおりです:

    コードをコピー コードは次のとおりです:

    /*大图查看*/
    .slide-view {背景: #000;位置: 固定;幅: 100%;高さ: 100%;オーバーフロー: 非表示;上: 0;左: 0;Z インデックス: 100;不透明度: 0;表示: なし; -webkit-animation:fadeIn .2s リニア フォワード;アニメーション:fadeIn .2s リニア フォワード;-webkit-touch-callout: none;-webkit-transform-style:preserve-3d; }
    .slide-view .counts {position:Absolute;top:5%;left:0;right:0;text-align:center;font-size:0;-webkit-transform-style:preserve-3d; }
    .slide-view .counts .value {border-radius: 9px;line-height: 18px;padding: 0 6px;font-size: 11px;display: inline-block;background-color: rgba(102,102,102,.6);色: #f1f1f1;}
    .pv-inner {位置: 相対;z-index: -1;表示: -webkit-box;表示: ボックス;幅: 100%;高さ: 100%;-webkit-transition: すべて 350 ミリ秒線形;-webkit-backface -可視性: 非表示;トランジション: すべて 350 ミリ秒のリニア;背面の可視性: 非表示;-webkit-touch-callout: なし;-webkit-transform-style: 3d を保持; }
    .pv-inner li {text-align: center;display: -webkit-box;display: box;-webkit-box-align: center;overflow: hidden;width: 100%;height: 100%;-webkit-touch -コールアウト: なし;背面の可視性:非表示;-webkit-transform-style:preserve-3d; }
    .pv-inner img {最大幅: 97%;最大高さ: 100%;-webkit-transform: スケール(1) 変換(0px,0px);変換: スケール(1) 変換(0px,0px);可視性: 表示;-webkit-transition: 200ms;transition: 200ms;-webkit-user-select: none;user-select: none;display: block;margin: 0 auto;backface-visibility: hidden;-webkit-transform-style : 保存-3d; }
    @-webkit-keyframes フェードイン{
        0%{不透明度:0;}
        100%{不透明度:1;}
    }
    @keyframes フェードイン{
        0%{不透明度:0;}
        100%{不透明度:100%;}
    }
    /*---------------------読み込み中---------------*/
    .ui-loading {position: 絶対;left: 50%;top: 50%;display: none;vertical-align: middle;font: 0/0 arial;margin: -5px 0 0 -10px;}
    .ui-loading i {表示: インラインブロック;幅: 5px;高さ: 12px;背景: #fff;vertical-align: トップ;-webkit-animation: ローディング-スピン 1 秒無限リニア;アニメーション: ローディング-スピン 1 秒無限線形;}
    .ui-loading i {-webkit-animation: ローディング-スピン 1 秒の無限リニア;アニメーション: ローディング-スピン 1 秒の無限リニア}
    .ui-loading i.t2 {マージン: 0 3px;-webkit-アニメーション名:loading-spin-one;アニメーション名:loading-spin-one}
    .ui-loading i.t3 {-webkit-animation-name:loading-spin-two;animation-name:loading-spin-two}
    @-webkit-keyframes ローディングスピン {
        0% {不透明度: 0}
        30% {不透明度: 1;-webkit-transform:scale(1,1.2)}
        60% {不透明度: 0;-webkit-transform:scale(1)}
        100% {不透明度: 0}
    }
    @-webkit-keyframesloading-spin-one {
        0% {不透明度: 0}
        20% {不透明度: 0}
        50% {不透明度: 1;-webkit-transform:scale(1,1.2)}
        80% {不透明度: 0;-webkit-transform:scale(1)}
        100% {不透明度: 0}
    }
    @-webkit-keyframesloading-spin-two {
        0% {不透明度: 0}
        40% {不透明度: 0}
        70% {不透明度: 1;-webkit-transform:scale(1,1.2)}
        100% {不透明度: 0;-webkit-transform:scale(1)}
    }
    @keyframes ローディングスピン {
        0% {不透明度: 0}
        30% {不透明度: 1;変換: スケール(1,1.2)}
        60% {不透明度: 0;変換: スケール(1)}
        100% {不透明度: 0}
    }
    @keyframes ロードスピンワン {
        0% {不透明度: 0}
        20% {不透明度: 0}
        50% {不透明度: 1;変換: スケール(1,1.2)}
        80% {不透明度: 0;変換: スケール(1)}
        100% {不透明度: 0}
    }
    @keyframes ローディングスピンツー {
        0% {不透明度: 0}
        40% {不透明度: 0}
        70% {不透明度: 1;変換: スケール(1,1.2)}
        100% {不透明度: 0;変換: スケール(1)}
    }
    /*---------------------読み込み終了----------------------*/

    ps:代価機能は非常に単純なので、多くの問題が発生する可能性があります。しかし、頑張って使用することもできます。

    以下はImageView.jsを使用する例です:

    复制代码代码如下:



    <頭>


                                                                                         





                                                                                            ;(関数(){
    //htmlの画像要素を取得
    var aImg=document.querySelectorAll("img"),
    aImgSrc=[];
    //クリックイベントを画像にバインドします
    for(var i=0,l=aImg.length;i aImg[i].index=i;
    aImg[i].className =" conPic";
    aImgSrc.push(aImg[i].src);
    }
    for(var i=0;i If($(".conPic")[i].complete){
    addTap($(".conPic")[i])
    }else{
    $(".conPic")[i].onload=function(){
    addTap(this);
    } }
    }
    関数 addTap(obj){
    $(obj).on("タップ",function(){
    //ImageView
    を呼び出します ImageView($(obj)[0].index,aImgSrc);
    })
    }
    })();
                                                                                             



    上記がこの記事の全内容です。皆さんに気に入っていただければ幸いです
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

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

    SublimeText3 中国語版

    SublimeText3 中国語版

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

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

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

    JavaScriptの文字列文字を交換します JavaScriptの文字列文字を交換します Mar 11, 2025 am 12:07 AM

    JavaScript文字列置換法とFAQの詳細な説明 この記事では、javaScriptの文字列文字を置き換える2つの方法について説明します:内部JavaScriptコードとWebページの内部HTML。 JavaScriptコード内の文字列を交換します 最も直接的な方法は、置換()メソッドを使用することです。 str = str.replace( "find"、 "置換"); この方法は、最初の一致のみを置き換えます。すべての一致を置き換えるには、正規表現を使用して、グローバルフラグGを追加します。 str = str.replace(/fi

    カスタムGoogle検索APIセットアップチュートリアル カスタムGoogle検索APIセットアップチュートリアル Mar 04, 2025 am 01:06 AM

    このチュートリアルでは、カスタムGoogle検索APIをブログまたはWebサイトに統合する方法を示し、標準のWordPressテーマ検索関数よりも洗練された検索エクスペリエンスを提供します。 驚くほど簡単です!検索をyに制限することができます

    8見事なjQueryページレイアウトプラグイン 8見事なjQueryページレイアウトプラグイン Mar 06, 2025 am 12:48 AM

    楽なWebページレイアウトのためにjQueryを活用する:8本質的なプラグイン jQueryは、Webページのレイアウトを大幅に簡素化します。 この記事では、プロセスを合理化する8つの強力なjQueryプラグイン、特に手動のウェブサイトの作成に役立ちます

    独自のAjax Webアプリケーションを構築します 独自のAjax Webアプリケーションを構築します Mar 09, 2025 am 12:11 AM

    それで、あなたはここで、Ajaxと呼ばれるこのことについてすべてを学ぶ準備ができています。しかし、それは正確には何ですか? Ajaxという用語は、動的でインタラクティブなWebコンテンツを作成するために使用されるテクノロジーのゆるいグループ化を指します。 Ajaxという用語は、もともとJesse Jによって造られました

    &#x27; this&#x27; JavaScriptで? &#x27; this&#x27; JavaScriptで? Mar 04, 2025 am 01:15 AM

    コアポイント これは通常、メソッドを「所有」するオブジェクトを指しますが、関数がどのように呼び出されるかに依存します。 現在のオブジェクトがない場合、これはグローバルオブジェクトを指します。 Webブラウザでは、ウィンドウで表されます。 関数を呼び出すと、これはグローバルオブジェクトを維持しますが、オブジェクトコンストラクターまたはそのメソッドを呼び出すとき、これはオブジェクトのインスタンスを指します。 call()、apply()、bind()などのメソッドを使用して、このコンテキストを変更できます。これらのメソッドは、与えられたこの値とパラメーターを使用して関数を呼び出します。 JavaScriptは優れたプログラミング言語です。数年前、この文はそうでした

    ソースビューアーでjQueryの知識を向上させます ソースビューアーでjQueryの知識を向上させます Mar 05, 2025 am 12:54 AM

    jQueryは素晴らしいJavaScriptフレームワークです。ただし、他のライブラリと同様に、何が起こっているのかを発見するためにフードの下に入る必要がある場合があります。おそらく、バグをトレースしているか、jQueryが特定のUIをどのように達成するかに興味があるからです

    モバイル開発用のモバイルチートシート10個 モバイル開発用のモバイルチートシート10個 Mar 05, 2025 am 12:43 AM

    この投稿は、Android、BlackBerry、およびiPhoneアプリ開発用の有用なチートシート、リファレンスガイド、クイックレシピ、コードスニペットをコンパイルします。 開発者がいないべきではありません! タッチジェスチャーリファレンスガイド(PDF) Desigの貴重なリソース

    独自のJavaScriptライブラリを作成および公開するにはどうすればよいですか? 独自のJavaScriptライブラリを作成および公開するにはどうすればよいですか? Mar 18, 2025 pm 03:12 PM

    記事では、JavaScriptライブラリの作成、公開、および維持について説明し、計画、開発、テスト、ドキュメント、およびプロモーション戦略に焦点を当てています。

    See all articles