अनुलंब ऊंचाई के साथ एक div के अंदर एक छवि संरेखित करें


135

मेरे पास निम्न कोड है जो एक कंटेनर सेट करता है जिसकी ऊँचाई चौड़ाई के साथ बदल जाती है जब ब्राउज़र फिर से आकार होता है (एक वर्ग पहलू अनुपात बनाए रखने के लिए)।

एचटीएमएल

<div class="responsive-container">
    <div class="dummy"></div>
    <div class="img-container">
        <IMG HERE>
    </div>
</div>

सीएसएस

.responsive-container {
    position: relative;
    width: 100%;
    border: 1px solid black;
}

.dummy {
    padding-top: 100%; /* forces 1:1 aspect ratio */
}

.img-container {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
}

मैं कंटेनर के अंदर IMG को लंबवत रूप से कैसे संरेखित कर सकता हूं? मेरी सभी छवियों में परिवर्तनशील ऊँचाइयाँ हैं और कंटेनर में एक निश्चित ऊँचाई / रेखा की ऊँचाई नहीं हो सकती क्योंकि यह उत्तरदायी है ... कृपया मदद करें!


1
यहाँ एक सरल flexbox समाधान है: stackoverflow.com/a/31977476/3597276
माइकल बेंजामिन

जवाबों:


381

यहां एक माता-पिता के अंदर , क्षैतिज और लंबवत रूप से एक ही समय में इनलाइन तत्वों को संरेखित करने की तकनीक है :

लंबवत संरेखण

1) इस दृष्टिकोण में, हम माता-पिताinline-block के पहले (या अंतिम) बच्चे के रूप में एक (छद्म-) तत्व बनाते हैं , और अपनी संपत्ति को अपने माता-पिता की सभी ऊंचाई लेने के लिए निर्धारित करते हैं ।height100%

2) इसके अलावा, जोड़ने vertical-align: middleसे लाइन अंतरिक्ष के बीच में इनलाइन (-ब्लॉक) तत्व रहते हैं। तो, हम उस सीएसएस घोषणा को पहले बच्चे और हमारे तत्व ( छवि ) दोनों में जोड़ते हैं ।

3) अंत में, इनलाइन (-ब्लॉक) तत्वों के बीच सफेद अंतरिक्ष वर्ण को हटाने के लिए , हम अभिभावक के फ़ॉन्ट आकार को शून्य से सेट कर सकते हैं font-size: 0;

नोट: मैंने निम्नलिखित में निकोलस गैलाघर की छवि प्रतिस्थापन तकनीक का उपयोग किया ।

क्या लाभ हैं?

  • कंटेनर ( माता-पिता ) में गतिशील आयाम हो सकते हैं।
  • छवि तत्व के आयामों को स्पष्ट रूप से निर्दिष्ट करने की कोई आवश्यकता नहीं है।

  • हम इस दृष्टिकोण का उपयोग आसानी से एक <div>तत्व को लंबवत रूप से संरेखित करने के लिए कर सकते हैं ; जिसमें एक गतिशील सामग्री (ऊंचाई और / या चौड़ाई) हो सकती है। लेकिन ध्यान दें कि आपको अंदर के पाठ को प्रदर्शित करने font-sizeके divलिए संपत्ति को फिर से सेट करना होगा । ऑनलाइन डेमो

<div class="container">
    <div id="element"> ... </div>
</div>
.container {
    height: 300px;
    text-align: center;  /* align the inline(-block) elements horizontally */
    font: 0/0 a;         /* remove the gap between inline(-block) elements */
}

.container:before {    /* create a full-height inline block pseudo=element */
    content: ' ';
    display: inline-block;
    vertical-align: middle;  /* vertical alignment of the inline element */
    height: 100%;
}

#element {
    display: inline-block;
    vertical-align: middle;  /* vertical alignment of the inline element */
    font: 16px/1 Arial sans-serif;        /* <-- reset the font property */
}

उत्पादन

ऊर्ध्वाधर रूप से इसके कंटेनर में एक तत्व संरेखित करें

उत्तरदायी कंटेनर

यह खंड प्रश्न का उत्तर देने वाला नहीं है क्योंकि ओपी पहले से ही जानता है कि एक उत्तरदायी कंटेनर कैसे बनाया जाए। हालाँकि, मैं समझाता हूँ कि यह कैसे काम करता है।

कंटेनर तत्व की ऊँचाई को उसकी चौड़ाई (पहलू अनुपात का सम्मान करते हुए) में परिवर्तन करने के लिए, हम शीर्ष या निचले paddingगुण के लिए प्रतिशत मान का उपयोग कर सकते हैं।

शीर्ष / निचले पैडिंग या मार्जिन पर एक प्रतिशत मान युक्त ब्लॉक की चौड़ाई के सापेक्ष है।

उदाहरण के लिए:

.responsive-container {
  width: 60%;

  padding-top: 60%;    /* 1:1 Height is the same as the width */
  padding-top: 100%;   /* width:height = 60:100 or 3:5        */
  padding-top: 45%;    /* = 60% * 3/4 , width:height =  4:3   */
  padding-top: 33.75%; /* = 60% * 9/16, width:height = 16:9   */
}

यहाँ ऑनलाइन डेमो है । नीचे से लाइनों को टिप्पणी करें और प्रभाव को देखने के लिए पैनल का आकार बदलें।

इसके अलावा, हम paddingएक ही परिणाम प्राप्त करने के लिए एक डमी बच्चे या :before/ :afterछद्म तत्व के लिए संपत्ति को लागू कर सकते हैं । लेकिन ध्यान दें कि इस मामले में, प्रतिशत मान स्वयं paddingकी चौड़ाई के सापेक्ष .responsive-containerहै।

<div class="responsive-container">
  <div class="dummy"></div>
</div>
.responsive-container { width: 60%; }

.responsive-container .dummy {
  padding-top: 100%;    /*  1:1 square */
  padding-top: 75%;     /*  w:h =  4:3 */
  padding-top: 56.25%;  /*  w:h = 16:9 */
}

डेमो # 1
डेमो # 2 ( :afterछद्म तत्व का उपयोग करके )

सामग्री जोड़ना

padding-topसंपत्ति का उपयोग कंटेनर के अंदर, सामग्री के ऊपर या नीचे एक विशाल स्थान का कारण बनता है

आदेश है कि ठीक करने के लिए, हम एक आवरण तत्व द्वारा सामग्री लपेट, का उपयोग करके दस्तावेज़ सामान्य प्रवाह से वह तत्व निकाल राशि पूर्ण स्थिति , और अंत में आवरण का विस्तार (बू का उपयोग कर top, right, bottomऔर leftगुण) अपनी मूल के पूरे स्थान को भरने के, कंटेनर

ये रहा:

.responsive-container {
  width: 60%;
  position: relative;
}

.responsive-container .wrapper {
  position: absolute;
  top: 0; right: 0; bottom: 0; left: 0;
}

यहाँ ऑनलाइन डेमो है


सभी का साथ मिल रहा है

<div class="responsive-container">
  <div class="dummy"></div>

  <div class="img-container">
    <img src="http://placehold.it/150x150" alt="">
  </div>
</div>
.img-container {
  text-align:center; /* Align center inline elements */
  font: 0/0 a;       /* Hide the characters like spaces */
}

.img-container:before {
  content: ' ';
  display: inline-block;
  vertical-align: middle;
  height: 100%;
}

.img-container img {
  vertical-align: middle;
  display: inline-block;
}

यहाँ काम कर रहा डेमो है

जाहिर है, आप ब्राउज़र संगतता के::before लिए छद्म तत्व का उपयोग करने से बच सकते हैं , और पहले बच्चे के रूप में एक तत्व बना सकते हैं :.img-container

<div class="img-container">
    <div class="centerer"></div>
    <img src="http://placehold.it/150x150" alt="">
</div>
.img-container .centerer {
  display: inline-block;
  vertical-align: middle;
  height: 100%;
}

अद्यतन डेमो

max-*गुणों का उपयोग करना

कम चौड़ाई में बॉक्स के अंदर छवि रखने के लिए, आप छवि पर सेट max-heightऔर max-widthसंपत्ति कर सकते हैं:

.img-container img {
    vertical-align: middle;
    display: inline-block;
    max-height: 100%;  /* <-- Set maximum height to 100% of its parent */
    max-width: 100%;   /* <-- Set maximum width to 100% of its parent */
}

यहाँ अद्यतन DEMO है


1
हाय हशेम आपके उत्तर के लिए बहुत धन्यवाद - यह डेस्कटॉप ब्राउज़रों के लिए जादू की तरह काम करता है, तब भी जब छोटी चौड़ाई में पुन: आकार दे रहा हो। लेकिन दुर्भाग्य से चित्र मोबाइल से (Android v2.3.5) कंटेनर डिव के नीचे स्थिति से बाहर दिखाई दे रहे हैं। इसके लिए एक तय पर कोई विचार?
user1794295

3
@ user1794295 मैंने इस एंड्रॉइड v2.3 (गैलेक्सी एस II, गैलेक्सी नोट, मोटोरोला ड्रॉयड 4) के साथ तीन एंड्रॉइड डिवाइस पर इस फिडेल को ब्राउस्टैक.कॉम के माध्यम से परीक्षण किया, जैसा कि मैंने उम्मीद की थी, सब कुछ काम करता है। आप यहां परिणाम पा सकते हैं: browserstack.com/shreenshots /… । कृपया एक स्क्रीनशॉट प्रदान करें या अपनी समस्या का विशिष्ट परीक्षण करें। मैं यथासंभव मदद करूँगा।
हशम क़ोलमी

1
नमस्ते यहाँ कुछ स्क्रीनशॉट हैं: browserstack.com/screenshots/… - जैसा कि आप छोटे उपकरणों के साथ देख सकते हैं (जैसे एक्सपीरिया, एलजी नेक्सस 4) कंटेनर के नीचे चित्र दिखाई देते हैं ... क्या चल रहा है ?!
user1794295

3
@HashemQolami यह सबसे आश्चर्यजनक सीएसएस बात है, जब से मैंने वेबसाइटों का निर्माण शुरू किया है :)।
अलेक्जेंडर सोलोनिक

1
के लिए धन्यवाद font-size: 0;!
जोहान्स लिबरमैन

47

Flexbox के साथ यह आसान है:

बेला

बस छवि कंटेनर में निम्नलिखित जोड़ें:

.img-container {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    display: flex; /* add */
    justify-content: center; /* add to align horizontal */
    align-items: center; /* add to align vertical */
}

2
यह समाधान काम करता है और मेरे मामले में बहुत अधिक सुरुचिपूर्ण है। CSS3 फ्लेक्स कमाल है!
डेनियल बॉननेल

2
यह सफारी में काम नहीं करता है :( मुझे लगता है कि समस्या फ्लेक्स है
yennfer

1
सफारी के लिए @ रेफर -webkit-उपसर्ग का उपयोग करें , या उपसर्ग की तरह एक पुस्तकालय का प्रयास करें ।js :)
QUB3X

यह तब काम नहीं करता जब कंटेनर की ऊंचाई उत्तरदायी (प्रतिशत में) हो।
जेनमप्‍टन

1
सही समाधान!
वायरस

16

इस सीएसएस का उपयोग करें, क्योंकि आपके पास पहले से ही इसके लिए मार्कअप है:

.img-container {
    position: absolute;
    top: 50%;
    left: 50%;
}

.img-container > img {
  margin-top:-50%;
  margin-left:-50%;  
}

यहाँ एक कार्यशील JBBin है: http://jsbin.com/ihilUnI/1/edit

यह समाधान केवल वर्ग छवियों के लिए काम करता है (क्योंकि प्रतिशत मार्जिन-टॉप मान कंटेनर की चौड़ाई पर निर्भर करता है, ऊंचाई नहीं)। यादृच्छिक आकार की छवियों के लिए, आप निम्न कार्य कर सकते हैं:

.img-container {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%); /* add browser-prefixes */
}

कार्य JsBin समाधान: http://jsbin.com/ihilUnI/2/edit


क्षमा करें, मेरे लिए काम नहीं कर रहा है - यह सिर्फ कंटेनर की चौड़ाई की छवियों के आकार को कम कर रहा है।
user1794295

2
मैं यह नहीं देखता कि कैसे सीएसएस से उल्लेख किया जा सकता है। कृपया एक कार्य नमूना प्रदान करें जिसे मैं देख सकता हूं ताकि मैं अपने उत्तर को बेहतर बना सकूं। पुनश्च: मैंने एक और समाधान भी प्रदान किया :)
टिबोस

11

आप क्षैतिज और लंबवत, उपयोग margin: autoऔर पूर्ण स्थिति दोनों में एक छवि को केंद्र में रख सकते हैं । इसके अलावा:

  1. छद्म तत्वों का उपयोग करके अतिरिक्त मार्कअप को खोदना संभव है।
  2. नकारात्मक बाएं, ऊपर, दाएं और नीचे मूल्यों का उपयोग करके LARGE छवियों के मध्य भाग को प्रदर्शित करना संभव है।

.responsive-container {
  margin: 1em auto;
  min-width: 200px;       /* cap container min width */
  max-width: 500px;       /* cap container max width */
  position: relative;     
  overflow: hidden;       /* crop if image is larger than container */
  background-color: #CCC; 
}
.responsive-container:before {
  content: "";            /* using pseudo element for 1:1 ratio */
  display: block;
  padding-top: 100%;
}
.responsive-container img {
  position: absolute;
  top: -999px;            /* use sufficiently large number */
  bottom: -999px;
  left: -999px;
  right: -999px;
  margin: auto;           /* center horizontally and vertically */
}
<p>Note: images are center-cropped on &lt;400px screen width.
  <br>Open full page demo and resize browser.</p>
<div class="responsive-container">
  <img src="http://lorempixel.com/400/400/sports/9/">
</div>
<div class="responsive-container">
  <img src="http://lorempixel.com/400/200/sports/8/">
</div>
<div class="responsive-container">
  <img src="http://lorempixel.com/200/400/sports/7/">
</div>
<div class="responsive-container">
  <img src="http://lorempixel.com/200/200/sports/6/">
</div>


धन्यवाद! आपका .responsive-कंटेनर img css केवल एक ही था जो मेरे लिए काम करता था।
डियोगो गार्सिया

4

इसको आजमाओ

  .responsive-container{
          display:table;
  }
  .img-container{
          display:table-cell;
          vertical-align: middle;
   }

क्षमा करें, यह काम नहीं करता है, मुझे लगता है कि क्योंकि मेरी .img-containerस्थिति बिल्कुल ठीक है - यह वर्ग पहलू अनुपात / गतिशील ऊंचाई रखने के लिए आवश्यक है।
user1794295

2

यहाँ एक तकनीक है जो आपको किसी भी सामग्री को लंबवत और क्षैतिज रूप से केन्द्रित करने की अनुमति देती है!

असल में, आपको बस दो कंटेनरों की आवश्यकता है और सुनिश्चित करें कि आपके तत्व निम्नलिखित मानदंडों को पूरा करते हैं।

Outher कंटेनर:

  • होना चाहिए display: table;

आंतरिक कंटेनर:

  • होना चाहिए display: table-cell;
  • होना चाहिए vertical-align: middle;
  • होना चाहिए text-align: center;

सामग्री बॉक्स:

  • होना चाहिए display: inline-block;

यदि आप इस तकनीक का उपयोग करते हैं, तो बस अपनी छवि (किसी अन्य सामग्री के साथ जिसे आप इसके साथ जाना चाहते हैं) सामग्री बॉक्स में जोड़ें।

डेमो:

body {
    margin : 0;
}

.outer-container {
    position : absolute;
    display: table;
    width: 100%;
    height: 100%;
    background: #ccc;
}

.inner-container {
    display: table-cell;
    vertical-align: middle;
    text-align: center;
}

.centered-content {
    display: inline-block;
    background: #fff;
    padding : 12px;
    border : 1px solid #000;
}

img {
   max-width : 120px;
}
<div class="outer-container">
   <div class="inner-container">
     <div class="centered-content">
        <img src="https://i.stack.imgur.com/mRsBv.png" />
     </div>
   </div>
</div>

यह भी देखें फिडल !


2

मैं इस समाधान की तलाश में इस सूत्र में आया कि:

  • दी गई छवि की चौड़ाई का 100% उपयोग करता है
  • छवि पहलू अनुपात रखता है
  • छवि को लंबवत मध्य में संरेखित करता है
  • ब्राउज़रों में काम करता है जो पूरी तरह से फ्लेक्स का समर्थन नहीं करता है

ऊपर पोस्ट किए गए कुछ समाधानों का परीक्षण करना , मुझे इस सभी मानदंडों को पूरा करने के लिए एक नहीं मिला, इसलिए मैंने इस सरल को एक साथ रखा, जो अन्य लोगों के लिए भी उपयोगी हो सकता है:

.container {
  width: 30%;
  float: left;
  border: 1px solid turquoise;
  margin-right: 3px;
  margin-top: 3px;
}

.container:last-of-kind {
  margin-right: 0px;
}

.image-container {
  position: relative;
  overflow: hidden;
  padding-bottom: 70%;
  /* this is the desired aspect ratio */
  width: 100%;
}

.image-container img {
  position: absolute;
  /* the following 3 properties center the image on the vertical axis */
  top: 0;
  bottom: 0;
  margin: auto;
  /* uses image at 100% width (also meaning it's horizontally center) */
  width: 100%;
}
<div class="container">
  <div class="image-container">
    <img src="http://placehold.it/800x800" class="img-responsive">
  </div>
</div>

<div class="container">
  <div class="image-container">
    <img src="http://placehold.it/800x800" class="img-responsive">
  </div>
</div>

<div class="container">
  <div class="image-container">
    <img src="http://placehold.it/800x800" class="img-responsive">
  </div>
</div>

JSFiddle पर काम कर रहे उदाहरण


0

प्रयत्न

एचटीएमएल

<div class="responsive-container">
     <div class="img-container">
         <IMG HERE>
     </div>
</div>

सीएसएस

.img-container {
    position: absolute;
    top: 0;
    left: 0;
height:0;
padding-bottom:100%;
}
.img-container img {
width:100%;
}

0

HTML कोड

<div class="image-container"> <img src=""/> </div>

सीएसएस कोड

img
{
  position: relative;
  top: 50%;
  transform: translateY(-50%);
 }

जब भी यह कोड स्निपेट स्वागत योग्य है, और कुछ मदद प्रदान कर सकता है, तो यह बहुत ही बेहतर होगा यदि इसमें एक स्पष्टीकरण शामिल है कि यह प्रश्न को कैसे संबोधित करता है। इसके बिना, आपके उत्तर का शैक्षिक मूल्य बहुत कम है - याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, न कि केवल उस व्यक्ति से जो अब पूछ रहा है! कृपया स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें, और इस बात का संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं।
टोबी स्पाइट

0

एक और div बनाओ और div के अंदर दोनों 'डमी' और 'img- कंटेनर' जोड़ो

HTML और CSS को निम्न प्रकार से करें

html , body {height:100%;}
.responsive-container { height:100%; display:table; text-align:center; width:100%;}
.inner-container {display:table-cell; vertical-align:middle;}
<div class="responsive-container">
    <div class="inner-container">
		<div class="dummy">Sample</div>
		<div class="img-container">
			Image tag
		</div>
	</div>	
</div>

'उत्तरदायी-कंटेनर' के लिए 100% के बजाय आप अपनी इच्छानुसार ऊँचाई दे सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.