圖片溢出div問題的最終解決方案

来源:http://www.cnblogs.com/shouce/archive/2016/04/28/5441238.html
-Advertisement-
Play Games

前兩天編寫了一個前端頁面,在本機上顯示一切正常。不過在不斷的測試中,發現了一個嚴重的問題,如果圖片過大,會撐破div溢出來。再由於頁面是自適應頁面,根據不同解析度的顯示器會做出相應的div寬度調整,所以圖片即使不大,但是因解析度不同也會出現溢出的情況。 這裡探討總結一下解決方法。 首先我們先來做個簡 ...


  前兩天編寫了一個前端頁面,在本機上顯示一切正常。不過在不斷的測試中,發現了一個嚴重的問題,如果圖片過大,會撐破div溢出來。再由於頁面是自適應頁面,根據不同解析度的顯示器會做出相應的div寬度調整,所以圖片即使不大,但是因解析度不同也會出現溢出的情況。

  這裡探討總結一下解決方法。

  首先我們先來做個簡單的css佈局:

複製代碼
<html>
<
head> <meta charset="utf-8" /> <title>div圖片溢出的解決方案</title> <style type="text/css"> #div_home { width:80%; margin: 0 auto; } #div_left { width:70%; height: 800px; float:left; padding: 20px; } #div_right { width: 15%; float: right; height: 800px; padding: 20px; } </style> <script type="text/javascript"> </script> </head> <body> <div id="div_home"> <div id="div_left"> <img src="http://images.cnblogs.com/cnblogs_com/hlwyfeng/600950/o_123.png" alt="小圖片"/> </div> <div id="div_right"></div> </div> </body> </html>
複製代碼

  

  下麵我們再插入尺寸大於div的圖片

<img id="img_test" src="http://www.xiaoxiongbizhi.com/wallpapers/__85/y/w/ywzwdjof0.jpg" alt="大圖片"/>

  來看看效果:
 

  這裡的圖片過大,溢出了div,這裡來探討一下解決方案:

 

解決方案一

  在css中設置該圖片的樣式,把最大寬設置為小於它父級div的寬

img {
    max-width: 730px;
}

  但是這樣對於不同解析度的屏幕,也會出現溢出的問題

  先來看一下1366*728的解析度(本機解析度)下的圖片顯示情況:


  似乎解決了問題,我們把解析度調為 1024*768,來看看效果:


  圖片還是溢出來了,對於這種解析度的屏幕,肯定體驗很不友好。

  那麼,為瞭解決還是溢出的問題,可以加入另外一種方法:

 

解決方案二

  不顯示溢出的部分:

overflow: hidden;


  這個代碼加在div_left 下麵:

複製代碼
#div_left {
    width:70%;
    height: 800px;
    float:left;
    padding: 20px;

    overflow: hidden;
}
複製代碼


  顯然,這種方法的弊端就是圖片不能完全顯示,我們來試試:



 
  雖然解決了溢出的問題,但是顯示效果上不友好,如果被隱藏的部分剛好有重要的信息,那麼這樣的設計是不合理的。 

 

最終解決方案

  要滿足解決圖片溢出div問題,同時圖片能完整顯示,也要相容不同的解析度這三個條件,這裡用一段JavaScript代碼來解決。
  思路是獲取 div 的寬,然後動態設置圖片的寬度,就這麼簡單。

  在敲代碼之前,先刪除 overflow:hidden; 代碼,這種“將就”的處理方法我們應該摒棄。

複製代碼
window.onload = function(){
    var getEle = document.getElementsByTagName("img");
    var getEle_divLeft = document.getElementById("div_left");
    for(var i=0; i<getEle.length; i++){
        getEle[i].style["max-width"] = getEle_divLeft.offsetWidth - 40 + "px"; //這裡-40是padding的左右寬度和
    }
}
複製代碼


  在1028*768的屏幕下的效果:


  

  在1366*768下的效果:

 

可能存在的bug及解決對策

  有些div在開始載入的時候,會因為圖片的寬度比較大而變寬,然後再由於佈局浮動的影響再變小,由於圖片獲取的是一開始的div寬度,所以他的寬度還是不變。

  這裡給出保守的解決方案:

  在css中,先把圖片屬性設置為none,不顯示。在載入javascript代碼的時候,設置寬高,再顯示出來:

img {
    max-width: 730px;
    display: none;
}

 

  在JavaScript後面加入顯示圖片代碼:

getEle[i].style["display"] = "inline"; 


  在代碼中的位置:

複製代碼
window.onload = function(){
    var getEle = document.getElementsByTagName("img");
    var getEle_divLeft = document.getElementById("div_left");
    for(var i=0; i<getEle.length; i++){
        getEle[i].style["max-width"] = getEle_divLeft.offsetWidth - 40 + "px"; //這裡-40是padding的左右寬度和
        getEle[i].style["display"] = "inline";
    }
}
複製代碼


  這樣就解決了這個圖片顯示溢出div問題,並滿足上面三個條件。

  完整代碼:

複製代碼
<html>
<head>
    <meta charset="utf-8" />
    <title>div圖片溢出的解決方案</title>

<style type="text/css">

#div_home {
    width:80%;
    margin: 0 auto;
}

#div_left {
    width:70%;
    height: 800px;
    float:left;
    background-color: #836FFF;

    padding: 20px;
}

#div_right {
    width: 15%;
    float: right;
    height: 800px;
    background-color: #CDCD00;

    padding: 20px;
}

img {
    max-width: 730px;
    display: none;
}

</style>

<script type="text/javascript">

window.onload = function(){
    var getEle = document.getElementsByTagName("img");
    var getEle_divLeft = document.getElementById("div_left");
    for(var i=0; i<getEle.length; i++){
        getEle[i].style["max-width"] = getEle_divLeft.offsetWidth - 40 + "px"; //這裡-40是padding的左右寬度和
        getEle[i].style["display"] = "inline";
    }
}

</script>

</head>


<body>
    <div id="div_home">
        <div id="div_left">
            <img src="http://images.cnblogs.com/cnblogs_com/hlwyfeng/600950/o_123.png" alt="小圖片"/>
            <img src="http://www.xiaoxiongbizhi.com/wallpapers/__85/y/w/ywzwdjof0.jpg" alt="大圖片"/>
        </div>
        <div id="div_right"></div>
    </div>
</body>
</html>
複製代碼

 

補充:

如果瀏覽器不支持max-width屬性,可以給出一個判斷,具體思路如下:

如果瀏覽器不支持某個CSS屬性,那麼得到的返回值為undefined,如果支持,則返回空,基於這一點,我們可以加一個判斷

代碼:

if(getEle[0].style["max-width"]==''){
//支持max-width的瀏覽器    
}else{
//不支持max-width的處理
}
複製代碼
<script type="text/javascript">

window.onload = function(){
    var getEle = document.getElementsByTagName("img");
    var getEle_divLeft = document.getElementById("div_left");

    if(getEle[0].style["max-width"]==''){for(var i=0; i<getEle.length; i++){
            getEle[i].style["max-width"] = getEle_divLeft.offsetWidth - 40 + "px"; //這裡-40是padding的左右寬度和
            getEle[i].style["display"] = "inline";
        }
    }else{
        //不支持max-width的解決方案
        for(var i=0; i<getEle.length; i++){
            if(getEle[i].width > getEle_divLeft.offsetWidth-40){
                getEle[i].style["width"] = getEle_divLeft.offsetWidth - 40 + "px"; 
            }
            getEle[i].style["display"] = "inline";
        }
    }
}

</script>
複製代碼

 

版權聲明 作者:Tab Weng
Email:hlwyfeng(Geek)gmail.com 請將(Geek)換成@  
出處:博客園 Tab Weng的技術博客:http://www.cnblogs.com/hlwyfeng
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則保留追究法律責任的權利。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Java中可以使用HttpURLConnection來請求WEB資源。HttpURLConnection對象不能直接構造,需要通過URL.openConnection()來獲得HttpURLConnection對象,示例代碼如下:String szUrl = "http://www.ee2ee.co ...
  • Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n. For example, given n = 12, ...
  • 核心技術:Maven,Springmvc mybatis shiro, Druid, Restful, Dubbo, ZooKeeper,Redis,FastDFS,ActiveMQ,Nginx 1. 項目核心代碼結構截圖 項目模塊依賴 特別提醒:開發人員在開發的時候可以將自己的業務REST服務化或 ...
  • ...
  • 上一篇:《 "DDD 領域驅動設計-如何控制業務流程?" 》 開源地址: "https://github.com/yuezhongxin/CNBlogs.Apply.Sample" (代碼已更新,並增加了應用層代碼) 在 JsPermissionApply 領域模型中,User 被設計為值對象,也就 ...
  • 第一章介紹了android系統移植與驅動開發的一些基本的概念,我做瞭如下總結: 一、android的系統架構分為四層 第一層是linux內核層 第二層是c/c++代碼庫 第三層是android Sdk API 第四層是應用程式層 android系統移植與驅動開發主要就是在linux內核層上進行的。a ...
  • oaoDailog開發幫助 1. 幫助文檔關鍵字 boostrap模態框oaoDailog 2. 使用場景 當網頁上點擊某個按鈕需要給予用戶提示確認,用戶點擊確認按鈕才能繼續執行,或者用戶點擊取消按鈕則取消執行操作; 當網頁上點擊查看,展示的數據需要使用彈出框展示的情況下,可以使用oaoDailog ...
  • Stylus是一款需要編譯的css語言,所以其本身文件不能被html直接調用,需要要編譯為css文件後再進行日常的載入。 stylus是一款優秀的css編譯語言,需要node.js支持,第一步需要安裝node.js 問題:Windows調試時ctrl+d無效果 ctrl+c退出? 怎樣直接在wind ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...