写真のプレビューとアップロード機能を実現するhtml+css+js

写真のプレビューとアップロード機能を実現するhtml+css+js

はじめに: Web ページを作成するときに、画像をアップロードする必要がある場合がよくあります。画像を選択したり、写真を撮影してアップロードしたりすることがあります。 <input type="file"/>を単純に使用してもこの機能は実現できますが、ユーザー エクスペリエンスが少し悪くなる可能性があります。そのため、この記事では、画像を選択した後のプレビューと圧縮アップロード機能を実現するための CSS + JS の使用を記録します。その一部はインターネットから取得したもので、ここに記録および整理されています。

効果プレビュー:

1. index.htmlを作成する

<!DOCTYPE html>
<html>
    <ヘッド>
        <メタ文字セット="UTF-8">
        <meta name="viewport" content="width=デバイス幅、初期スケール=1.0、最大スケール=1.0、ユーザースケーラブル=いいえ">
        <title>写真のアップロード</title>
        <link rel="スタイルシート" href="index.css"/>
        <script type='text/javascript' src='index.js' charset='utf-8'></script>
    </head>
    <本文>
         <フォームid="メインフォーム">
            <div class="content">
                <div class="label">ID カード</div>
                <div class="img-area">
                    <div class="コンテナ">
                        <input type="file" id='id-face' name='face' accept="image/*" />
                        <div id='顔の空の結果'>
                            <img style='width:4rem' src="https://github.com/wangheng3751/my-resources/blob/master/images/camera.png?raw=true" alt="">
                            <p>身分証明書の表面の写真</p>
                        </div>
                        <img スタイル='幅: 100%' id='顔結果'/>
                    </div>
                    <div class="container" style='margin-top:0.5rem;'>
                        <input type="file" id='id-back' name='back' accept="image/*" />
                        <div id='戻る空の結果'>
                            <img style='width:4rem' src="https://github.com/wangheng3751/my-resources/blob/master/images/camera.png?raw=true" alt="">
                            <p>身分証明書の裏面の写真</p>
                        </div>
                        <img style='width: 100%' id='back-result'/>
                    </div>
                </div>
            </div>
            <div class="btn">
                送信</div>
         </フォーム>
    </本文>
</html>

2. index.cssを作成する

体{
    マージン: 0
}
。コンテンツ{
    パディング:0.5rem;
    ディスプレイ: フレックス;
    アイテムの位置を中央揃えにします。
    下境界線: 1px #999 実線
}
。ラベル{
    幅:5rem;
}
.img-エリア{
    フレックス:1
}
。容器{
    背景色:#e7e7e7;
    位置: 相対的;
}
.コンテナdiv{
    テキスト配置: 中央;
    パディング:0.5rem 0
}
.コンテナ入力{
    不透明度:0;
    フィルター:アルファ(不透明度=0);
    高さ: 100%;
    幅: 100%;
    位置: 絶対;
    上: 0;
    左: 0;
    zインデックス: 9;
}
.コンテナ p{
    フォントサイズ: 0.9rem;
    色:#999
}
.btn{
    背景色: #4363ab;
    色: #fff;
    テキスト配置: 中央;
    パディング: 0.5rem 1rem;
    幅:80%;
    境界線の半径: 0.2rem;
    マージン: 2rem 自動;
    フォントの太さ: 600;
    フォントサイズ: 1.2rem
}

3. index.jsを作成する

window.onload = 関数(){
    document.getElementById("id-face").addEventListener("change", function(){       
        onFileChange(this、"face-result"、"face-empty-result")
    });
    document.getElementById("id-back").addEventListener("change", function(){       
        onFileChange(this、back-result、back-empty-result) は、
    });
    document.getElementsByClassName("btn")[0].addEventListener("click", function(){       
        提出する();
    });
};
/**
 * 画像が選択されたときの処理* @param {*} fileObj 入力ファイル要素* @param {*} el //選択後に画像を表示するために使用する要素ID
 * @param {*} btnel //画像が選択されていないときに表示されるボタン領域ID
 */
関数 onFileChange(fileObj,el,btnel){
    var windowURL = window.URL || window.webkitURL;
    var データURL;
    var imgObj = document.getElementById(el);
    document.getElementById(btnel).style.display="なし";
    imgObj.style.display="ブロック";
    fileObj && fileObj.files && fileObj.files[0] の場合 {
        データURL = windowURL.createObjectURL(fileObj.files[0]);
        imgObj.src=データURL;
    } それ以外 {
        データURL = fileObj.値;
        imgObj.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)";
        imgObj.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = dataURL;
    }
}
/**
 * 画像を圧縮し、データを base64 形式で返します* @param {*} image 画像要素* @param {*} width 圧縮画像の幅* @param {*} height 圧縮画像の高さ* @param {*} qua // 画像品質 1-100
 */
関数compressImageTobase64(画像,幅,高さ,qua){
    var quality = qua ? qua / 100 : 0.8;
    var キャンバス = document.createElement("キャンバス"),     
        ctx = キャンバス.getContext('2d');     
    var w = image.naturalWidth、     
        h = イメージの自然な高さ;     
    キャンバスの幅 = 幅||w;     
    キャンバスの高さ = 高さ||h;     
    ctx.drawImage(画像, 0, 0, w, h, 0, 0, 幅||w, 高さ||h);
    var data = canvas.toDataURL("image/jpeg", 品質);     
    データを返します。
}
//送信関数submit(){
    //1. フォームの送信 //document.getElementById("mainForm").submit();
    //2. 圧縮後の Ajax 送信 var face_data=compressImageTobase64(document.getElementById("face-result"),200,100,90);
    var back_data=compressImageTobase64(document.getElementById("back-result"),200,100,90);
    var フォームデータ = 新しいフォームデータ();  
    フォームデータを追加します。("face"、face_data);
    formData.append("戻る",back_data);
    //jQueryを導入する必要がある
    $.ajax({
        url:"/アドレス",
        タイプ: 'POST'、
        キャッシュ: false、
        データ: フォームデータ、
        タイムアウト:180000、
        プロセスデータ: false、
        コンテンツタイプ: false、
        成功:function(r){
        },
        エラー:関数(r){  
        }
   });
}

ソースコード: Githubアドレス

要約する

上記は、写真のプレビューと写真のアップロード機能を実現するために私が紹介した html+css+js です。お役に立てれば幸いです。ご質問がある場合は、メッセージを残してください。すぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。

<<:  MySQLインデックスが失敗するいくつかの状況の詳細な分析

>>:  Vue で AES.js を使用する詳細な手順

推薦する

MySQL ストアド プロシージャ (in、out、inout) の詳細な説明

1. はじめにバージョン 5.0 以降でサポートされています。特定の機能を実行するための SQL ス...

Vue-router ネストルーティングの詳細な説明

目次ステップ1. ルーティング ルールを設定し、子構成項目を使用します。 2. ジャンプ(フルパスを...

Docker コンテナで ASP.NET Core を実行する手順

最近は学ぶべき知識が多すぎて、どれを先に学べばいいのかわかりません。このブログはもともとxamari...

MySQL シャーディングの詳細

1. ビジネスシナリオの紹介MySQLを使用する電子商取引システムがあるとします。大量のデータを保存...

Docker Swarm クラスタ管理の使用と原理の分析

Swarm クラスター管理導入Docker Swarm は Docker 用のクラスター管理ツールで...

UbuntuにProtobuf 3をインストールするための詳細なチュートリアル

いつインストールするかprotoc コマンドを使用しても Protoc が見つからない場合は、インス...

JavaScript での HTML キャンバスとページ ストレージ テクノロジの使用に関する詳細な説明

目次1. JavaScriptはHTMLでキャンバスを使用する2. ページストレージ技術1. Jav...

データベースのデフォルトパスを変更した後にmysqlが起動できない問題の解決策

序文mysql がデフォルトのデータベース パスを変更したため、サービスを開始できませんでした。ログ...

Jenkins + Docker + ASP.NET Core の自動デプロイメントの問題について (落とし穴を避ける)

このブログを書くつもりはなかったのですが、実際の操作中に、ネットワークの問題に圧倒されたこと (ネッ...

Web 開発の面接と筆記試験に必須の知識(必読)

HTML のインライン要素とブロックレベル要素の違い:標準的なドキュメント フローでは、ブロック ...

Linux システムで時間を取得して使用する方法

Linux システム時間には 2 種類あります。 (1)暦上の時刻。値は、指定された時刻、1970 ...

Docker+DockerCompose を使用して Web アプリケーションをカプセル化する方法

目次テクノロジースタックバックエンドビルドAPIフロントエンドウェブ構築ゲートウェイ建設ゲートウェイ...

Bツリーの特性の紹介

B ツリーは一般的なデータ構造です。彼と一緒にB+ツリーがあります。ここで、概念を明確にする必要があ...

InnoDB エンジンの redo ファイルのメンテナンス方法

InnoDB REDO ログ ファイルのサイズと数を調整する場合は、次の手順に従います。 1. My...