फ्लेक्सबॉक्स: केंद्र क्षैतिज और लंबवत


670

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

.flex-container {
  padding: 0;
  margin: 0;
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: center;
}
row {
  width: 100%;
}
.flex-item {
  background: tomato;
  padding: 5px;
  width: 200px;
  height: 150px;
  margin: 10px;
  line-height: 150px;
  color: white;
  font-weight: bold;
  font-size: 3em;
  text-align: center;
}
<div class="flex-container">
  <div class="row">
    <span class="flex-item">1</span>
  </div>
  <div class="row">
    <span class="flex-item">2</span>
  </div>
  <div class="row">
    <span class="flex-item">3</span>
  </div>
  <div class="row">
    <span class="flex-item">4</span>
  </div>
</div>

http://codepen.io/anon/pen/zLxBo



आपके सीएसएस में आपके पास row{पंक्तियों पर कोई प्रभाव नहीं है। यदि आप इसे .row{परिणाम में बदलते हैं तो यह पूरी तरह से अलग होगा।
हामिद मयेली

जवाबों:


751

मुझे लगता है कि आप निम्नलिखित जैसा कुछ चाहते हैं।

html, body {
    height: 100%;
}
body {
    margin: 0;
}
.flex-container {
    height: 100%;
    padding: 0;
    margin: 0;
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
    align-items: center;
    justify-content: center;
}
.row {
    width: auto;
    border: 1px solid blue;
}
.flex-item {
    background-color: tomato;
    padding: 5px;
    width: 20px;
    height: 20px;
    margin: 10px;
    line-height: 20px;
    color: white;
    font-weight: bold;
    font-size: 2em;
    text-align: center;
}
<div class="flex-container">
    <div class="row"> 
        <div class="flex-item">1</div>
        <div class="flex-item">2</div>
        <div class="flex-item">3</div>
        <div class="flex-item">4</div>
    </div>
</div>

डेमो यहां देखें: http://jsfiddle.net/audetwebdesign/tFscL/

यदि आप ठीक से काम करने के लिए ऊँचाई और ऊपर / नीचे पैडिंग चाहते हैं, तो आपके .flex-itemतत्वों को ब्लॉक स्तर ( divबजाय span) होना चाहिए ।

इसके बजाय , पर .rowचौड़ाई सेट करें ।auto100%

आपके .flex-containerगुण ठीक हैं।

यदि आप चाहते हैं .row, असाइन 100% ऊंचाई तक दृश्य पोर्ट में लंबवत रूप से केंद्रित किए जाने की htmlऔर body, और भी शून्य बाहर bodyमार्जिन।

ध्यान दें कि .flex-containerऊर्ध्वाधर संरेखण प्रभाव को देखने के लिए ऊंचाई की आवश्यकता होती है, अन्यथा, कंटेनर सामग्री को घेरने के लिए आवश्यक न्यूनतम ऊंचाई की गणना करता है, जो इस उदाहरण में दृश्य पोर्ट की ऊंचाई से कम है।

पाद-टिप्पणी: , , गुण इस डिजाइन आसान लागू करने के लिए बनाया जा सकता था। मुझे लगता है कि कंटेनर की जरूरत नहीं है जब तक कि आप तत्वों (पृष्ठभूमि छवि, सीमाओं और इतने पर) के आसपास कुछ स्टाइल नहीं जोड़ना चाहते।
flex-flowflex-directionflex-wrap.row

एक उपयोगी संसाधन है: http://demo.agektmr.com/flexbox/


5
फ्लेक्स आइटम को तब तक ब्लॉक स्तर की आवश्यकता नहीं है जब तक कि उसमें मौजूद सामग्री की आवश्यकता न हो। इसके अलावा, आपने सभी प्रदर्शन गुणों को उपसर्ग किया है, लेकिन अन्य फ्लेक्सबॉक्स गुणों में से कोई भी उपसर्ग नहीं किया है (जो अन्य ड्राफ्ट में अलग-अलग नाम हैं)।
cimmanon

1
@cimmanon मैं आपसे ब्लॉक स्तर के बारे में सहमत हूं, और मैंने उसी के अनुसार अपनी पोस्ट संपादित की। ब्लॉक स्तर संरेखण के लिए आवश्यक नहीं है, लेकिन जरूरत हो सकती है यदि उपयोगकर्ता ऊंचाई और इतने पर निर्दिष्ट करना चाहता है। मैंने ब्राउज़र उपसर्गों के बारे में स्वतंत्रता ली, मैंने सिर्फ एक काम करने वाले डेमो पर पहुंचने के लिए एक आदर्श ब्राउज़र ग्रहण किया। आपकी टिप्पणी के लिए फिर से धन्यवाद, प्रतिक्रिया की सराहना करें।
मार्क ऑडिट

1
यदि यह अधिक मात्रा में उगता है, तो यह शीर्ष फसल देता है। i.imgur.com/3dgFfQK.png इससे बचने का कोई उपाय?
ब्रायन गेट्स

1
@BrianGates यदि विंडो की ऊंचाई बहुत कम है, तो आप कैसे चाहते हैं कि 4 तत्व डिस्प्ले, 2x2, 1x4 हो?
मार्क ऑडिट


252

फ्लेक्सबॉक्स में ऊर्ध्वाधर और क्षैतिज रूप से केंद्र तत्वों को कैसे करें

नीचे दो सामान्य केंद्रित समाधान दिए गए हैं।

एक लंबवत-संरेखित फ्लेक्स आइटम ( flex-direction: column) के लिए और दूसरा क्षैतिज-संरेखित फ्लेक्स आइटम ( flex-direction: row) के लिए।

दोनों ही मामलों में केन्द्रित विभाजनों की ऊंचाई परिवर्तनशील, अपरिभाषित, अज्ञात, जो भी हो। केंद्रित divs की ऊंचाई कोई फर्क नहीं पड़ता।

यहाँ दोनों के लिए HTML है:

<div id="container"><!-- flex container -->

    <div class="box" id="bluebox"><!-- flex item -->
        <p>DIV #1</p>
    </div>

    <div class="box" id="redbox"><!-- flex item -->
        <p>DIV #2</p>
    </div>

</div>

सीएसएस (सजावटी शैलियों को छोड़कर)

जब फ्लेक्स आइटम खड़ी खड़ी हो जाती हैं:

#container {
    display: flex;           /* establish flex container */
    flex-direction: column;  /* make main axis vertical */
    justify-content: center; /* center items vertically, in this case */
    align-items: center;     /* center items horizontally, in this case */
    height: 300px;
}

.box {
    width: 300px;
    margin: 5px;
    text-align: center;     /* will center text in <p>, which is not a flex item */
}

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

डेमो


जब फ्लेक्स आइटम क्षैतिज रूप से स्टैक्ड होते हैं:

flex-directionऊपर दिए गए कोड से नियम को समायोजित करें ।

#container {
    display: flex;
    flex-direction: row;     /* make main axis horizontal (default setting) */
    justify-content: center; /* center items horizontally, in this case */
    align-items: center;     /* center items vertically, in this case */
    height: 300px;
}

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

डेमो


फ्लेक्स आइटम की सामग्री को केंद्रित करना

एक फ्लेक्स स्वरूपण संदर्भ का दायरा माता-पिता-बच्चे के संबंध तक सीमित है। बच्चों से परे एक फ्लेक्स कंटेनर के वंशज फ्लेक्स लेआउट में भाग नहीं लेते हैं और फ्लेक्स गुणों की अनदेखी करेंगे। अनिवार्य रूप से, फ्लेक्स गुण बच्चों से परे अंतर्निहित नहीं हैं।

इसलिए, आपको बच्चे को फ्लेक्स गुणों को लागू करने के लिए हमेशा एक मूल तत्व display: flexया display: inline-flexआवेदन करना होगा।

लचीले आइटम में निहित लंबवत और / या क्षैतिज रूप से केंद्र पाठ या अन्य सामग्री के लिए, आइटम को एक (नेस्टेड) ​​फ्लेक्स कंटेनर बनाते हैं, और केंद्र के नियमों को दोहराते हैं।

.box {
    display: flex;
    justify-content: center;
    align-items: center;        /* for single line flex container */
    align-content: center;      /* for multi-line flex container */
}

यहाँ अधिक विवरण: फ्लेक्सबॉक्स के अंदर पाठ को लंबवत रूप से कैसे संरेखित करें?

वैकल्पिक रूप से, आप margin: autoफ्लेक्स आइटम के सामग्री तत्व पर आवेदन कर सकते हैं ।

p { margin: auto; }

फ्लेक्स autoमार्जिन के बारे में यहाँ जानें : फ्लेक्स आइटम्स को संरेखित करने के तरीके (देखें बॉक्स # 56)।


फ्लेक्स आइटम की कई लाइनों को केंद्रित करना

जब एक फ्लेक्स कंटेनर में कई लाइनें (लपेटने के कारण) होती हैं, तो align-contentसंपत्ति क्रॉस-अक्ष संरेखण के लिए आवश्यक होगी।

कल्पना से:

8.4। पैकिंग फ्लेक्स लाइन्स: align-content संपत्ति

align-contentसंपत्ति फ्लेक्स कंटेनर के भीतर एक फ्लेक्स कंटेनर की लाइनों संरेखित करता है जब पार अक्ष में अतिरिक्त स्थान, कैसे करने के लिए इसी तरह की है justify-contentमुख्य अक्ष के भीतर संरेखित करता है अलग-अलग आइटम। ध्यान दें, इस संपत्ति का एकल-लाइन फ्लेक्स कंटेनर पर कोई प्रभाव नहीं है।

यहां अधिक विवरण: एलाइन-सेल्फ, अलाइन-आइटम और एलाइन-कंटेंट के साथ फ्लेक्स-रैप कैसे काम करता है?


ब्राउज़र का समर्थन

फ्लेक्सबॉक्स IE <10 को छोड़कर सभी प्रमुख ब्राउज़रों द्वारा समर्थित है । कुछ हालिया ब्राउज़र संस्करणों, जैसे कि सफारी 8 और IE10 को वेंडर उपसर्गों की आवश्यकता होती है । उपसर्गों को जोड़ने के एक त्वरित तरीके के लिए ऑटोप्रिफ़र का उपयोग करेंइस उत्तर में अधिक जानकारी ।


पुराने ब्राउज़रों के लिए समाधान केंद्रित करना

CSS टेबल और पोजिशनिंग प्रॉपर्टी के उपयोग से वैकल्पिक सेंटरिंग सॉल्यूशन के लिए यह उत्तर देखें: https://stackoverflow.com/a/31977476/3597276


क्या हम इसे क्षैतिज रूप से दाएं, बाएं और लंबवत केंद्र में कर सकते हैं?
कपिल

2
@kapil, जस्ट -कंटेंट प्रॉपर्टी को स्पेस-बीच या स्पेस- अराउंड में एडजस्ट करें ... jsfiddle.net/8o29y7pd/105
माइकल बेंजामिन

3
यह उत्तर शीर्ष पर होना चाहिए। फ्लेक्स का उपयोग करना ऐसा करने के लिए पसंदीदा तरीका होना चाहिए, क्योंकि यह पूरे डिवाइस और स्क्रीन पर अच्छी तरह से मापता है। फ़्लोट्स का उपयोग करने और कई divs का प्रबंधन करने की तुलना में इसका अधिक आसान है।
SeaWarrior404

Ie 11 ठीक से काम नहीं कर रहा है क्षैतिज और ऊर्ध्वाधर केंद्र
GiveJob

1
एकदम सही जवाब, शायद Google पर सबसे अच्छा!
जन

43

जोड़ना

.container {
    display: flex;
    justify-content: center;
    align-items: center;
}

जो भी आप केंद्र में रखना चाहते हैं उसके कंटेनर तत्व। दस्तावेज़ीकरण: औचित्य-सामग्री और संरेखित-आइटम


3
रसीले उत्तर के लिए धन्यवाद। जबकि ऊपर दी गई सभी क्रिया ठीक है, ये 3 पंक्तियाँ ठीक वैसी ही हैं जैसे मैं यहाँ पहुँचा (अच्छी तरह से, display: inline-flexअपने मामले में, लेकिन यह एक आसान संपादन था।)
जेफ वार्ड

27

महत्वपूर्ण ब्राउज़र विशिष्ट विशेषताओं का उपयोग करना न भूलें:

संरेखित-आइटम: केंद्र; ->

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

औचित्य-सामग्री: केंद्र; ->

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

बेहतर समझ के लिए आप इस दो लिंक को पढ़ सकते हैं फ्लेक्स: http://css-tricks.com/almanac/properties/j/justify-content/ और http://ptb2.me/flexbox/

शुभ लाभ।


1
यह एक अच्छा बिंदु है, आज के लिए (केवल नवीनतम ब्राउज़रों का समर्थन करने के लिए) आपको बस अंतिम दो लाइनों की आवश्यकता है -webkit .. सफारी के लिए और अन्य सभी के लिए अंतिम एक
पीट कोज़ाक

1
+1 क्योंकि पुराने 2009 और मार्च 2012 में काम करने वाले ड्राफ्ट अभी भी महत्वपूर्ण उपयोगकर्ता साझा हैं ( caniuse.com के अनुसार लगभग 8% )।
बेनेबुन

फ्लेक्स सफारी में काम नहीं करता है, आप उस समस्या को कैसे हल कर सकते हैं?
user3378649

मैंने कई दिनों पहले खिड़कियों पर सफारी के अंतिम संस्करण की जांच की और मुझे यह बहुत अच्छी तरह से याद नहीं है, लेकिन मैं आपको बताऊंगा और आपको बताऊंगा। कृपया मुझे बताएं कि सफारी के किस संस्करण का क्या मतलब है? और किस ओएस पर?
QMaster

: @ user3378649 नवीनतम सफारी संस्करण फ्लेक्स बॉक्स का समर्थन कर सकता है, कृपया इस लिंक को देख caniuse.com/#search=flexbox
Qmaster

15

1 - पेरेंट डिव पर CSS सेट करें display: flex;

2 - पेरेंट डिव पर CSS सेट करें flex-direction: column;
ध्यान दें कि इससे उस div लाइन के अंदर सभी कंटेंट ऊपर से नीचे तक बनेंगे। यह सबसे अच्छा काम करेगा अगर माता-पिता में केवल बच्चा हो और कुछ नहीं।

3 - पेरेंट डिव पर CSS सेट करें justify-content: center;

यहाँ एक उदाहरण है कि सीएसएस कैसा दिखेगा:

.parentDivClass {
  display: flex;
  flex-direction: column;
  justify-content: center;
}



8

diplay: flex;यह कंटेनर के लिए है और इसके margin:auto;लिए यह आइटम सही काम करता है।

नोट: आपको सेटअप widthऔर heightप्रभाव देखना होगा।

#container{
  width: 100%; /*width needs to be setup*/
  height: 150px; /*height needs to be setup*/
  display: flex;
}

.item{
  margin: auto; /*These will make the item in center*/
  background-color: #CCC;
}
<div id="container">
   <div class="item">CENTER</div>
</div>


3

यदि आपको एक लिंक में एक पाठ को केन्द्रित करने की आवश्यकता है तो यह चाल चलेगा:

div {
  display: flex;

  width: 200px;
  height: 80px;
  background-color: yellow;
}

a {
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center; /* only important for multiple lines */

  padding: 0 20px;
  background-color: silver;
  border: 2px solid blue;
}
<div>
  <a href="#">text</a>
  <a href="#">text with two lines</a>
</div>


1
मिठाई! कभी-कभी मुझे लगता है कि मैं फ्लेक्सबॉक्स के लिए बहुत डंप हूं।) मान लीजिए मुझे अधिक अभ्यास की आवश्यकता है, इसके कुछ तर्क अभी भी स्पष्ट नहीं हैं। धन्यवाद, लियो!
ज़ोल्टन

3

margin: autoFlexbox के साथ एकदम सही काम करता है। यह लंबवत और क्षैतिज रूप से केंद्रीकृत होता है।

html, body {
  height: 100%;
  max-height: 100%;
}

.flex-container {
  display: flex;
    
  height: 100%;
  background-color: green;
}

.container {
  display: flex;
  margin: auto;
}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS</title>
</head>
<body>
  <div class="flex-container">
    <div class="container">
      <div class="row">
        <span class="flex-item">1</span>
      </div>
      <div class="row">
        <span class="flex-item">2</span>
      </div>
      <div class="row">
        <span class="flex-item">3</span>
      </div>
     <div class="row">
        <span class="flex-item">4</span>
    </div>
  </div>  
</div>
</body>
</html>


1

परिणाम: कोड

कोड

HTML:

<div class="flex-container">
  <div class="rows">

    <div class="row">
      <span class="flex-item">1</span>
    </div>
    <div class="row">
      <span class="flex-item">2</span>
    </div>
    <div class="row">
      <span class="flex-item">3</span>
    </div>
    <div class="row">
      <span class="flex-item">4</span>
    </div>

  </div>  
</div>

सीएसएस:

html, body {
  height: 100%;  
}

.flex-container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100%;
}

.rows {
  display: flex;
  flex-direction: column;
}

जहाँ flex-containerdiv का उपयोग लंबवत और क्षैतिज रूप से आपके rowsdiv को केन्द्रित करने के लिए किया जाता है , और rowsdiv का उपयोग आपके "आइटम" को समूहीकृत करने के लिए किया जाता है और उन्हें एक स्तंभ में क्रमबद्ध किया जाता है।


0
    .flex-container {
  padding: 0;
  margin: 0;
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: center;
}
row {
  width: 100%;
}
.flex-item {
  background: tomato;
  padding: 5px;
  width: 200px;
  height: 150px;
  margin: 10px;
  line-height: 150px;
  color: white;
  font-weight: bold;
  font-size: 3em;
  text-align: center;
}

हालांकि यह कोड इस सवाल का जवाब दे सकता है कि समस्या को हल करने के तरीके के बारे में अतिरिक्त संदर्भ प्रदान करता है और यह समस्या को हल करता है और उत्तर के दीर्घकालिक मूल्य में सुधार करेगा।
पियोट्र लेबुनस्की

-7

CSS + का उपयोग करना

<div class="EXTENDER">
  <div class="PADDER-CENTER">
    <div contentEditable="true">Edit this text...</div>
  </div>
</div>

यहाँ देखो


1
चूँकि यह आसानी से और व्यापक रूप से आधुनिक ब्राउज़र द्वारा समर्थित होता है, शुद्ध फ्लेक्सबॉक्स के साथ आपका पुस्तकालय समाधान निश्चित रूप से आवश्यक नहीं है। खासकर जब से उन्होंने पूछा कि फ्लेक्स बॉक्स का उपयोग कैसे करना है, सीएसएस लाइब्रेरी नहीं।
वनफॉस्कैट्स 16
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.