圖片溢出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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...