ऑटो फ्लेक्सबॉक्स लेआउट में छवि का आकार और पहलू अनुपात रखते हुए?


98

मैंने सीएसएस फ्लेक्स बॉक्स लेआउट का उपयोग किया है जो नीचे दिखाया गया है:

यहां छवि विवरण दर्ज करें

यदि स्क्रीन छोटी हो जाती है तो यह इस में बदल जाती है:

यहां छवि विवरण दर्ज करें

समस्या यह है कि मूल छवि से पहलू राशन को रखते हुए छवियों का आकार परिवर्तन नहीं किया गया है।

यदि स्क्रीन छोटा हो जाता है, तो छवियों को आकार देने के लिए शुद्ध सीएसएस और फ्लेक्स बॉक्स लेआउट का उपयोग करना संभव है?

यहाँ मेरा html है:

<div class="content">
  <div class="row"> 
    <div class="cell">
      <img src="http://i.imgur.com/OUla6mK.jpg"/>
    </div>
    <div class="cell">
      <img src="http://i.imgur.com/M16WzMd.jpg"/>
    </div>
  </div>
</div>

मेरा सीएसएस:

.content {
    background-color: yellow;    
}

.row {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;

    -webkit-box-orient: horizontal; 
    -moz-box-orient: horizontal;
    box-orient: horizontal;
    flex-direction: row;

    -webkit-box-pack: center;
    -moz-box-pack: center;
    box-pack: center;
    justify-content: center;

    -webkit-box-align: center;
    -moz-box-align: center;
    box-align: center;  
    align-items: center;

    background-color: red;

}

.cell {
    -webkit-box-flex: 1;
    -moz-box-flex: 1;
    box-flex: 1;
    -webkit-flex: 1 1 auto;
    flex: 1 1 auto; 

    padding: 10px;
    margin: 10px;

    background-color: green;
    border: 1px solid red;
    text-align: center;

}

जवाबों:


83

img {max-width:100%;}यह करने का एक तरीका है। बस इसे अपने CSS कोड में जोड़ें।

http://jsfiddle.net/89dtxt6s/


3
यदि स्क्रीन छोटा हो जाता है, तो क्या ऊंचाई के आयाम के लिए ऐसा करना संभव है?
जपना

@confile यह आपके कोड लेआउट पर बहुत अधिक निर्भर करेगा, लेकिन आप css में जोड़ने height:100%;का प्रयास कर सकते हैं img
ओमेगा

height: 100vhयह करना होगा, नहीं height: 100%। ऊंचाई के लिए स्टाइल हमेशा मुश्किल है।
gdbj

1
इसे सही उत्तर के रूप में क्यों चिह्नित किया गया है? क्या ओमेगा ने इसे ब्राउज़र डिफ़ॉल्ट व्यवहार में नहीं बदल दिया? jsfiddle.net/89dtxt6s/221
VeeK

69

मैं अपनी विकृत छवियों के जवाब की तलाश में यहां आया था। इस बारे में पूरी तरह से निश्चित नहीं है कि ऑप ऊपर क्या ढूंढ रहा है, लेकिन मैंने पाया कि align-items: centerइसे जोड़ने से यह मेरे लिए हल हो जाएगा। डॉक्स को पढ़ना, यह इस बात को ओवरराइड करने के लिए समझ में आता है यदि आप align-items: stretchडिफ़ॉल्ट रूप से छवियों को सीधे फ्लेक्स कर रहे हैं एक अन्य उपाय यह है कि अपनी छवियों को पहले div से लपेटें।

.myFlexedImage {
  display: flex;
  flex-flow: row nowrap;
  align-items: center;
}

11
"मैं अपनी विकृत छवियों के जवाब की तलाश में यहां आया था" मैं उसी कारण से यहां आया था और आपके समाधान ने मेरी मदद की (जो वास्तविक समाधान के रूप में चिह्नित किया गया था, उससे मुझे कोई मदद नहीं मिली)
वैगनर सिल्वा

इससे मुझे भी मदद मिली, क्या कोई समझा सकता है कि यह काम क्यों करता है?
जेरी बी नंबर 1 इंटर्न

यह मेरे लिए सही उत्तर था। अधिकतम-चौड़ाई: 100%; ऊंचाई को सही नहीं किया (ऊंचाई अभी भी थोड़ा बढ़ाया गया था)। मेरे मामले में मैंने संरेखित-आइटम का उपयोग किया: फ्लेक्स-स्टार्ट; क्योंकि मैं छवि को कंटेनर में केंद्रित नहीं रखना चाहता था, लेकिन यह तब भी काम करता था क्योंकि यह डिफ़ॉल्ट संरेखित-आइटम को ओवरराइड करता है: खिंचाव; यहां उन सभी गुण-मानों की सूची दी गई है,
जिनके साथ

बहुत सी चीजों की कोशिश की, लेकिन आपके संरेखित-आइटम: माता-पिता पर केंद्र केवल एक ही है जिसने चाल चली।
मिक्रोस

यह स्वीकृत उत्तर होना चाहिए। संरेखित करने के संदर्भ में संरेखित-सामग्री मेरे लिए काम नहीं करती थी, लेकिन संरेखित-आइटम करता है, दोनों के अलग-अलग कार्य हैं। यह एसई दोनों के बीच का अंतर साफ करता है: stackoverflow.com/questions/27539262/…
जॉन अर्नेस्ट

41

आप बहुत नई और सरल CSS3 सुविधा आज़माना चाहते हैं:

img { 
  object-fit: contain;
}

यह चित्र अनुपात (जब आप पृष्ठभूमि-चित्र चाल का उपयोग करते हैं) को संरक्षित करता है, और मेरे मामले में एक ही मुद्दे के लिए अच्छी तरह से काम किया।

हालांकि सावधान रहें, यह IE द्वारा समर्थित नहीं है (समर्थन विवरण यहां देखें )।


4
कृपया याद रखें कि मूल वस्तु को एक फ्लेक्स होना चाहिए
लोकिनौ जूल

मैंने यह कोशिश की और यह पूरी तरह से एक फ्लेक्स डिव के भीतर काम किया।
रेमी कालॉस्टियन 13

5

मैं सुझाव दे रहा हूं background-size कि छवि के आकार को समायोजित करने के लिए विकल्पों की करें।

पृष्ठ में छवि रखने के बजाय यदि आपने इसे पृष्ठभूमि छवि के रूप में सेट किया है, तो आप निम्न कार्य कर सकते हैं:

background-size: contain

या

background-size: cover

छवि को स्केल करते समय ये विकल्प ऊंचाई और चौड़ाई दोनों को ध्यान में रखते हैं। यह IE9 और अन्य सभी हालिया ब्राउज़रों में काम करेगा।


3

दूसरी छवि में ऐसा लगता है कि आप बॉक्स को भरने के लिए छवि चाहते हैं, लेकिन आपने जो उदाहरण बनाया है वह पहलू अनुपात को बनाए रखता है (पालतू जानवर सामान्य दिखते हैं, न कि पतले या मोटे)।

मुझे कोई सुराग नहीं है यदि आपने उन छवियों को उदाहरण के रूप में फोटोशॉप किया है या दूसरा यह है कि "यह कैसा होना चाहिए" (आपने आईएस कहा है, जबकि पहला उदाहरण जो आपने कहा "चाहिए")

वैसे भी, मुझे यह मानना ​​होगा:

यदि "छवियों को पहलू राशन रखने के लिए आकार परिवर्तन नहीं किया जाता है" और आप मुझे एक छवि दिखाते हैं जो पिक्सल के पहलू अनुपात को बनाए रखता है, तो मुझे लगता है कि आप "फसल" क्षेत्र के पहलू अनुपात को पूरा करने की कोशिश कर रहे हैं (भीतर का हरे) पिक्सल के पहलू अनुपात को ध्यान में रखते हुए। यानी आप इमेज को बड़ा और क्रॉप करके सेल को इमेज से भरना चाहते हैं।

यदि यह आपकी समस्या है, तो आपके द्वारा प्रदान किया गया कोड "आपकी समस्या" को नहीं दर्शाता है, लेकिन आपका प्रारंभिक उदाहरण है।

पिछली दो मान्यताओं को देखते हुए, आपको जो आवश्यक है वह वास्तविक छवियों के साथ पूरा नहीं किया जा सकता है यदि बॉक्स की ऊंचाई गतिशील है, लेकिन पृष्ठभूमि छवियों के साथ। या तो "बैकग्राउंड-साइज़: समाहित" या इन तकनीकों का उपयोग करके (percents में स्मार्ट पेडिंग जो आपके द्वारा इच्छित कहीं भी क्रॉपिंग या अधिकतम आकार को सीमित करते हैं): http://fofwebdesign.co.uk/template/_testing/scale-img/scale- img.htm

छवियों के साथ यह एकमात्र तरीका है यदि हम आपके दूसरे iimage के बारे में भूल जाते हैं, और कोशिकाओं की एक निश्चित ऊंचाई है, और FORTUNATELY, आपके नमूना चित्रों को देखते हुए, ऊँचाई समान रहती है!

इसलिए यदि आपके कंटेनर की ऊँचाई नहीं बदलती है, और आप अपनी छवियों को वर्गाकार रखना चाहते हैं, तो आपको बस उस बॉक्स के आकार की संपत्ति के आधार पर, उस ज्ञात मान (माइनस पैडिंग या बॉर्डर) पर छवियों की अधिकतम ऊँचाई निर्धारित करनी होगी। कोशिकाओं)

ऐशे ही:

<div class="content">
  <div class="row">    
      <div class="cell">    
          <img src="http://lorempixel.com/output/people-q-c-320-320-2.jpg"/>
      </div>
      <div class="cell">    
          <img src="http://lorempixel.com/output/people-q-c-320-320-7.jpg"/>
      </div>
    </div>
</div>

और सीएसएस:

.content {
    background-color: green;
}

.row {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;

    -webkit-box-orient: horizontal; 
    -moz-box-orient: horizontal;
    box-orient: horizontal;
    flex-direction: row;

    -webkit-box-pack: center;
    -moz-box-pack: center;
    box-pack: center;
    justify-content: center;

    -webkit-box-align: center;
    -moz-box-align: center;
    box-align: center;  
    align-items: center;

}

.cell {
    -webkit-box-flex: 1;
    -moz-box-flex: 1;
    box-flex: 1;
    -webkit-flex: 1 1 auto;
    flex: 1 1 auto;
    padding: 10px;
    border: solid 10px red;
    text-align: center;
    height: 300px;
    display: flex;
    align-items: center;
    box-sizing: content-box;
}
img {
    margin: auto;
    width: 100%;
    max-width: 300px;
    max-height:100%
}

http://jsfiddle.net/z25heocL/

आपका कोड अमान्य है (खुलने वाले टैग बंद होने के बजाय हैं, इसलिए वे NESTED कोशिकाओं का उत्पादन करते हैं, भाई-बहनों का नहीं। उन्होंने दोषपूर्ण कोड के अंदर आपकी छवियों के SCREENSHOT का उपयोग किया है, और फ्लेक्स बॉक्स कक्षों को नहीं पकड़ रहा है, लेकिन दोनों उदाहरण एक कॉलम में हैं। आप "पंक्ति" सेटअप करते हैं, लेकिन एक कोड को दूसरे के अंदर रखने वाले भ्रष्ट कोड के परिणामस्वरूप एक फ्लेक्स के अंदर एक फ्लेक्स होता है, अंत में COLUMNS के रूप में काम करता है। मुझे नहीं पता कि आप क्या हासिल करना चाहते थे, और आप उस कोड के साथ कैसे आए, लेकिन मैं ' मी अनुमान लगा रहा है कि आप क्या चाहते हैं।

मैंने प्रदर्शन जोड़ा: कोशिकाओं को भी फ्लेक्स, इसलिए छवि केंद्रित हो जाती है (मुझे लगता है कि display: tableयहां यह सब मार्के के साथ भी इस्तेमाल किया जा सकता था)


ऐसा नहीं लगता कि आपके पास इस बात का थोड़ा सा सुराग है कि मेरे द्वारा इस सवाल का जवाब कैसे दिया गया। उस jsfiddle में सभी html और सीएसएस प्रश्नकर्ता (@confile) ने प्रदान किए हैं। बस सवाल पढ़ें और आप देखेंगे। मेरा समाधान सीएसएस img {अधिकतम-चौड़ाई: 100%;} की एक सरल रेखा है और प्रश्नकर्ता ने एक साल पहले मेरे उत्तर को स्वीकार कर लिया है क्योंकि यह उस समाधान को प्रदान करता है जो इसके लिए पूछा गया था। मैं यहां आपको शुभकामनाएं देता हूं, कृपया प्रश्नों को सही ढंग से पढ़ने का प्रयास करें और फिर भविष्य में तदनुसार उत्तर दें, धन्यवाद।
ओमेगा

0

HTML:

<div class="container">
    <div class="box">
        <img src="http://lorempixel.com/1600/1200/" alt="">
    </div>
</div>

सीएसएस:

.container {
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: stretch;

  width: 100%;
  height: 100%;

  border-radius: 4px;
  background-color: hsl(0, 0%, 96%);
}

.box {
  border-radius: 4px;
  display: flex;
}

.box img {
  width: 100%;
  object-fit: contain;
  border-radius: 4px;
}

0

यह है कि मैं एक लचीली ग्रिड में विभिन्न छवियों (आकार और अनुपात) को कैसे संभालूंगा।

.images {
  display: flex;
  flex-wrap: wrap;
  margin: -20px;
}

.imagewrapper {
  display: flex;
  justify-content: center;
  align-items: center;
  width: calc(50% - 20px);
  height: 300px;
  margin: 10px;
}

.image {
  display: block;
  object-fit: cover;
  width: 100%;
  height: 100%; /* set to 'auto' in IE11 to avoid distortions */
}
<div class="images">
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/800x600" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/1024x768" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/1000x800" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/500x800" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/800x600" />
  </div>
  <div class="imagewrapper">
    <img class="image" src="https://via.placeholder.com/1024x768" />
  </div>
</div>


-5

मैं अनुपात रखने के लिए jquery या vw का उपयोग कर रहा हूं

jQuery

function setSize() {
    var $h = $('.cell').width();
    $('.your-img-class').height($h);
}
$(setSize);
$( window ).resize(setSize); 

VW

 .cell{
    width:30vw;
    height:30vw;
}
.cell img{
    width:100%;
    height:100%;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.