input[type='file']樣式美化及實現圖片預覽

来源:http://www.cnblogs.com/shapeY/archive/2017/11/24/7891636.html
-Advertisement-
Play Games

前言 上傳圖片是常見的需求,多使用input標簽。本文主要介紹 input標簽的樣式美化 和 實現圖片預覽。 用到的知識點有: 1、input標簽的使用 2、filelist對象 和 file對象 3、fileReader對象 樣式美化 原生的input標簽樣式單一,且在不同瀏覽器下的表現還不一致。 ...


前言

  上傳圖片是常見的需求,多使用input標簽。本文主要介紹 input標簽的樣式美化 和 實現圖片預覽

  用到的知識點有:

    1、input標簽的使用

    2、filelist對象 和 file對象

    3、fileReader對象

樣式美化

  原生的input標簽樣式單一,且在不同瀏覽器下的表現還不一致。所以為了美觀和統一,我們需要自定義input標簽的樣式。

  實現的方式有很多中,這裡採用的是:用一個div將input標簽包裹,然後再將input標簽透明度設置為0,再對div設置自己需要的樣式。html和css如下:

      <div class="upload-file">
        <input type="file" class="input-file" multiple="true">  // mulitiple屬性控制是否允許上傳多個文件
        <span class="tip">點擊上傳圖片</span>
      </div>
    .upload-file{
      position: relative;
      width: 100px;
      padding: 10px 15px;
      border: 1px solid rgb(119, 154, 80);
      border-radius: 5px;
      background-color: rgb(66, 215, 142);
      color: #333333;
      font-size: 14px;
      text-align: center;
      overflow: hidden;
    }

    .upload-file span{ //單行顯示
      text-overflow: ellipsis;
      white-space: nowrap;
      overflow: hidden;
    }

    .upload-file:hover{ //簡單的hover效果
      font-size: 15px;
      border-color: rgb(39, 226, 81);
    }

    .upload-file input[type='file']{
      height: 100%;
      width: 100%;
      position: absolute; //設置為絕對定位,不會影響到其他元素
      top: 0;
      right: 0;
      opacity: 0;   //透明度為0
      filter: alpha(opacity=0);
      cursor: pointer;
    }
View Code

  這樣點擊div,其實也就點擊到了input標簽,可已正常觸發選擇文件的。

  效果如下:

               

   

  但是這樣就會產生一個問題,如何獲取選擇文件的文件名稱呢?需要用到file對象的name屬性

filelist和file對象--獲取文件名

  input元素選擇文件後會返回FileList對象,比如

//input元素
var fileInput = document.querySelector('.input-file');
//filelist對象
var filelist = fileInput.files
//file對象 

var file = filelist.item(0)
或者 var file = filelist[0]

  我們知道,每個input[type='file']都有一個files屬性,返回的就是filelist 就和nodelist類似,不是數組。filelist就是由多個file對象組成的,每個file對象都是一個文件。

  filelist對象有個length屬性,可以獲取長度;還有item(index)方法,可以獲取到file對象,當然可以通過 filelist[index]來獲取。

  file對象常用的屬性有:

    lastModified : 返回當前 File 對象所引用文件最後修改時間, 自 1970年1月1日0:00 以來的毫秒數。
    lastModifiedDate : 返回當前 File 對象所引用文件最後修改時間的 Date 對象。
    name : 文件名。
    size : 文件大小。
    type :文件類型。

  所以我們可以通過file對象的name屬性來獲取到文件名,在修改到span元素中

    var fileInput = document.querySelector('.input-file');
    var tip = document.querySelector('.tip');
 
    fileInput.addEventListener('change',function(e){ //監聽change事件,選擇文件後觸發
      if(this.files.length === 1){ //處理文件名
        tip.textContent = this.files[0].name;
      }else {
        tip.textContent = '已選擇 ' + this.files.length + ' 個文件';
      }
    })

  效果如下:

      

  現在已經自定義了input[type='file']的樣式,而且實現了原有的功能。那麼如何實現圖片預覽呢?

FileReader 對象 --實現圖片預覽

   FileReader 對象允許Web應用程式非同步讀取存儲在用戶電腦上的文件(或原始數據緩衝區)的內容。也就是說FIlereader對象可以讀取到input選擇的文件。filereader對象在讀取file對象時,當讀取完成時,readystate屬性的值會變為DONE,會觸發load事件。而且有多種讀取方式:

  readAsBinaryString()讀取完成後,result屬性中包含原始數據的二進位數據,readAsDataURL()讀取完成後,result屬性中包含data:url格式的數據,readAsText()讀取完成後,result屬性中包含字元串格式的數據,readAsArrayBuffer()result屬性中將包含一個ArrayBuffer對象以表示所讀取文件的內容。

  這裡上傳的時圖片,所以使用readAsDataURL()讀取。現在html中加入個預覽觸發按鈕,而預覽圖片存放的區域。

//簡單結構 
     <div class="preview">
        <button type="button" name="button">預覽</button>
      </div>

//樣式
    .preview{
      margin-top: 10px;
      width: 150px;
    }

    .preview img{
      margin: 5px 0;
      width: 100%;
    }

  實現預覽功能,註釋中已有詳細解釋,不再重覆。註意一定要等filereader讀取完成後,再進行賦值,不然圖片的src屬性會是空的

   
    var preview = document.querySelector('.preview')
    var previewBtn = preview.children[0];

    previewBtn.addEventListener('click',function(e){
      var filelist = fileInput.files;
      if(filelist.length < 1){
        alert("未選擇圖片,無法預覽");
        return false;
      }

      [].slice.call(filelist).forEach(function(value,index){  //遍歷file對象
        var fileReader = new FileReader(); //創建一個filereader對象
        var img = new Image();  //創建一個圖片對象
        fileReader.readAsDataURL(value)  //讀取所上傳對的文件
        fileReader.onload = function(){
          img.src = this.result;   //讀取完成後,賦值給img對象
          preview.appendChild(img)  //添加到預覽區域
        }
      })
    })

  效果如下:

  

總結

  總結來說,就是  input[type='file']的files屬性 --> filelist對象 --> file對象 --> filereader對象讀取file對象。通過它們的一些參數值實現我們想要的功能。由於只是簡單demo,不嚴謹的地方和醜陋的樣式就多多包涵了。

  再下一步就是要上傳圖片到伺服器了,會在下個隨筆中記錄。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 緣由 在項目中,閑來無聊寫了個bug 好像還好是吧,來我告訴你前面一行是什麼 所以,我列印了HttpServletRequest,然後報錯了 一個我到現在都不懂的異常,似乎是Spring框架對這個有攔截吧。。 所以,我在一行代碼中寫了一個神奇的異常,然後又是完全沒有存在價值的一個功能。。 所以,好好 ...
  • 一、背景&問題 之前框架是一個基於SOA思想設計的分散式框架。各應用通過服務方式提供使用,服務之間通信是RPC方式調用,具體實現基於.NET的WCF通信平臺。框架存在如下2個問題: 1、高併發處理能力不足。一當高併發請求,可能出現多個服務待定處理,導致整個系統出現瓶頸。 2、隨著移動端廣泛應用,服務 ...
  • perspective() 未完待寫 ...
  • 一、jQuery的父節點查找方法 $(selector).parent(selector):獲取父節點 $(selector).parentNode:以node[]的形式存放父節點,如果沒有父節點,則返回空數組 $(selector).parents(selector):獲取祖先元素 二、jQuer ...
  • 說明: Angular2出來後,一直想找個基於Angular2的前端後臺管理框架,但一直沒有找到比較適合的。前段時間在Angular官網資源無意之間看到NG-ZORRO,NG-ZORRO由阿裡計算平臺事業部、阿裡雲等不同部門的一些小伙伴在原業務組件的基礎上共同構建而成,而且已開源,現在是0.6.0的 ...
  • CSS之BFC、IFC、FFC and GFC 什麼是FC? BFC(Block Formatting Contexts) BFC的佈局規則: 如何生成BFC: IFC(Inline Formatting Contexts) FFC(Flex Formatting Contexts) GFC(Gri ...
  • 1 ...
  • 閑來沒事,研究了一下多屏適配和響應式佈局的 CSS。 第一種寫法 第二種寫法 max-device-width 與 max-width 的區別 頁面示例 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...