फ्लेक्स-बेस और चौड़ाई के बीच अंतर क्या हैं?


224

इस बारे में सवाल और लेख आए हैं, लेकिन जितना मैं बता सकता हूं उतना कुछ भी निर्णायक नहीं है। सबसे अच्छा सारांश मैं पा सकता हूं

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

... जो अपने आप में फ्लेक्स-बेस सेट वाले तत्वों के व्यवहार के बारे में बहुत कुछ नहीं कहता है । फ्लेक्सबॉक्स के अपने वर्तमान ज्ञान के साथ मैं यह नहीं देखता कि चौड़ाई का वर्णन क्यों नहीं किया जा सकता है ।

मैं जानना चाहता हूं कि वास्तव में फ्लेक्स-बेस व्यवहार में चौड़ाई से कैसे भिन्न है :

  • यदि मैं फ्लेक्स-बेस (और इसके विपरीत) के साथ चौड़ाई को प्रतिस्थापित करता हूं , तो नेत्रहीन क्या बदल जाएगा?
  • यदि मैं दोनों को एक अलग मूल्य पर सेट करूँ तो क्या होगा? यदि उनके समान मूल्य हैं तो क्या होगा?
  • क्या कुछ विशेष मामले हैं जहां या तो चौड़ाई या फ्लेक्स-आधार का उपयोग करने से दूसरे का उपयोग करने के लिए महत्वपूर्ण अंतर होगा?
  • जब फ्लेक्स-रैप , फ्लेक्स-ग्रो और फ्लेक्स-हटना जैसे अन्य फ्लेक्सबॉक्स शैलियों के साथ संयोजन में उपयोग किया जाता है, तो चौड़ाई और फ्लेक्स-आधार भिन्न कैसे होते हैं ?
  • कोई अन्य महत्वपूर्ण अंतर?

संपादित करें / स्पष्टीकरण : यह प्रश्न एक अलग प्रारूप में पूछा गया है कि वास्तव में फ्लेक्स-बेस प्रॉपर्टी सेट क्या है? लेकिन मुझे लगा कि फ्लेक्स-बेस और चौड़ाई (या ऊँचाई ) के अंतर का अधिक प्रत्यक्ष तुलना या सारांश अच्छा होगा।


फ्लेक्स आधार, फ्लेक्स बढ़ने और सिकुड़ने को समझाने वाला सर्वश्रेष्ठ लेख
ZenVentzi

जवाबों:


339

विचार करें flex-direction

आपके प्रश्न को पढ़ते समय पहली बात जो दिमाग में आती है, वह flex-basisयह है कि हमेशा लागू नहीं होती है width

कब flex-directionहै row, flex-basisचौड़ाई को नियंत्रित करता है।

लेकिन जब flex-directionहै column, flex-basisऊंचाई को नियंत्रित करता है।


मुख्य अंतर

यहाँ के बीच कुछ महत्वपूर्ण अंतर हैं flex-basisऔर width/ height:

  • flex-basisकेवल फ्लेक्स आइटम पर लागू होता है। फ्लेक्स कंटेनर (जो फ्लेक्स आइटम भी नहीं हैं) अनदेखी करेंगे flex-basisलेकिन उपयोग कर सकते हैं widthऔर height

  • flex-basisकेवल मुख्य अक्ष पर काम करता है। उदाहरण के लिए, यदि आप कर रहे हैं flex-direction: column, widthसंपत्ति क्षैतिज फ्लेक्स आइटम आकार के लिए जरूरत होगी।

  • flex-basisपूरी तरह से तैनात फ्लेक्स आइटम पर कोई प्रभाव नहीं है। widthऔर heightगुण आवश्यक होंगे। फ्लेक्स लेआउट में पूर्णतया स्थित फ्लेक्स आइटम शामिल नहीं होते हैं

  • flexसंपत्ति का उपयोग करके , तीन गुणों - flex-grow, flex-shrinkऔर flex-basis- को एक घोषणा में बड़े करीने से जोड़ा जा सकता है। का उपयोग करते हुए width, एक ही नियम कोड की कई लाइनों की आवश्यकता होगी।


ब्राउज़र व्यवहार

जब तक उनका प्रतिपादन किया जाता है , तब तक, और , जब तक या के बीच कोई अंतर नहीं होना चाहिए ।flex-basiswidthflex-basisautocontent

कल्पना से:

7.2.3। flex-basisसंपत्ति

के अलावा autoऔर सभी मूल्यों के लिए content, क्षैतिज लेखन मोड में flex-basisउसी तरह हल किया जाता widthहै।

लेकिन के प्रभाव autoया contentकम से कम या बिल्कुल कुछ भी नहीं हो सकता है। कल्पना से अधिक:

auto

जब किसी फ्लेक्स आइटम पर निर्दिष्ट किया जाता है, तो autoकीवर्ड उपयोग किए जाने वाले मुख्य आकार की संपत्ति का मान प्राप्त करता है flex-basis। यदि वह मान स्वयं है auto, तो प्रयुक्त मूल्य है content

content

फ्लेक्स आइटम की सामग्री के आधार पर, स्वचालित आकार का संकेत देता है।

नोट: यह मान फ्लेक्सिबल बॉक्स लेआउट के प्रारंभिक रिलीज में मौजूद नहीं था, और इस प्रकार कुछ पुराने कार्यान्वयन इसका समर्थन नहीं करेंगे। समतुल्य प्रभाव autoमुख्य आकार ( widthया height) के साथ एक साथ उपयोग करके प्राप्त किया जा सकता है auto

तो, युक्ति के अनुसार, flex-basisऔर widthपहचान के अनुसार हल करें, जब तक flex-basisकि autoया नहीं content। ऐसे मामलों में, flex-basisसामग्री की चौड़ाई का उपयोग कर सकते हैं (जो, संभवतः, widthसंपत्ति का उपयोग करेगा, साथ ही)।


flex-shrinkफ़ैक्टर

फ्लेक्स कंटेनर की शुरुआती सेटिंग्स को याद रखना महत्वपूर्ण है। इनमें से कुछ सेटिंग्स में शामिल हैं:

  • flex-direction: row - फ्लेक्स आइटम क्षैतिज रूप से संरेखित होंगे
  • justify-content: flex-start - फ्लेक्स आइटम मुख्य अक्ष पर लाइन की शुरुआत में स्टैक करेंगे
  • align-items: stretch - फ्लेक्स आइटम कंटेनर के क्रॉस-आकार को कवर करने के लिए विस्तारित होंगे
  • flex-wrap: nowrap - फ्लेक्स आइटम को एक ही लाइन में रहने के लिए मजबूर किया जाता है
  • flex-shrink: 1 - एक फ्लेक्स आइटम को सिकुड़ने की अनुमति है

अंतिम सेटिंग पर ध्यान दें।

क्योंकि फ्लेक्स आइटम को डिफ़ॉल्ट रूप से सिकुड़ने की अनुमति है (जो उन्हें कंटेनर को बहने से रोकता है), निर्दिष्ट flex-basis/ width/ heightओवरराइड हो सकता है।

उदाहरण के लिए, flex-basis: 100pxया width: 100px, के साथ युग्मित flex-shrink: 1, जरूरी नहीं कि 100px होगा।

निर्दिष्ट चौड़ाई को रेंडर करने के लिए - और इसे ठीक रखें - आपको सिकुड़ने को अक्षम करना होगा:

div {
   width: 100px;
   flex-shrink: 0;
}  

या

div {
  flex-basis: 100px;
  flex-shrink: 0;
}

या, युक्ति द्वारा अनुशंसित:

flex: 0 0 100px;    /* don't grow, don't shrink, stay fixed at 100px */

7.2। लचीलापन के घटक

लेखकों को flexशॉर्टहैंड का उपयोग करके लचीलेपन को नियंत्रित करने के लिए प्रोत्साहित किया जाता है, न कि सीधे अपने लंबे समय के गुणों के साथ, क्योंकि शॉर्टहैंड किसी भी अनिर्दिष्ट घटक को सामान्य उपयोगों को समायोजित करने के लिए सही ढंग से रीसेट करता है


ब्राउज़र कीड़े

कुछ ब्राउज़रों को नेस्टेड फ्लेक्स कंटेनरों में फ्लेक्स आइटम को आकार देने में परेशानी होती है।

flex-basisएक नेस्टेड फ्लेक्स कंटेनर में नजरअंदाज कर दिया। widthकाम करता है।

उपयोग करते समय flex-basis, कंटेनर अपने बच्चों के आकार की उपेक्षा करता है, और बच्चे कंटेनर को ओवरफ्लो करते हैं। लेकिन widthसंपत्ति के साथ , कंटेनर अपने बच्चों के आकार का सम्मान करता है और तदनुसार फैलता है।

संदर्भ:

उदाहरण:


फ्लेक्स आइटम का उपयोग करना flex-basisऔर कंटेनर को white-space: nowrapओवरफ्लो करना inline-flexwidthकाम करता है।

ऐसा लगता है कि एक फ्लेक्स कंटेनर को एक बच्चे पर inline-flexपहचानने के लिए सेट नहीं किया जाता है, flex-basisजब एक भाई के साथ प्रतिपादन किया जाता है white-space: nowrap(हालांकि यह अपरिभाषित चौड़ाई के साथ एक आइटम हो सकता है)। कंटेनर में वस्तुओं को समायोजित करने के लिए विस्तार नहीं होता है।

लेकिन जब widthइसके बजाय संपत्ति का उपयोग किया जाता है flex-basis, तो कंटेनर अपने बच्चों के आकार का सम्मान करता है और तदनुसार फैलता है। यह IE11 और एज में कोई समस्या नहीं है।

संदर्भ:

उदाहरण:


flex-basis(और flex-grow) तालिका तत्व पर काम नहीं कर रहा है

संदर्भ:


flex-basisक्रोम और फ़ायरफ़ॉक्स में विफल रहता है जब दादा-दादी कंटेनर एक सिकोड़ने योग्य फिट तत्व है। एज में सेट-अप ठीक काम करता है।

जैसे ऊपर दिए गए लिंक में प्रस्तुत उदाहरण में, शामिल position: absolute, का उपयोग floatऔर inline-block, एक ही त्रुटिपूर्ण आउटपुट ( jsfiddle डेमो ) भी प्रस्तुत करेगा ।


IE 10 और 11 को प्रभावित करने वाले कीड़े:


2
कैसे के बारे में min-width:100px;? क्या यह सिकुड़ने को निष्क्रिय करने का विकल्प हो सकता है?
मोरी

1
@ मोरी, हाँ, पर flex-shrinkरुक जाता है min-width। समतुल्य फ्लेक्स नियम होगा flex: 1 0 100px
माइकल बेंजामिन

flex: 1 0 100pxउसी परिणाम की ओर जाता है, लेकिन मुझे यकीन नहीं है कि आप "समकक्ष" से क्या मतलब है।
मोरी

मेरा मतलब है कि हम इसे flex: 0 0 100pxउदाहरण के बराबर क्यों नहीं मानें?
मोरी

2
@ मोरी, क्योंकि तब यह चौड़ाई के बराबर है । इसे फ्लेक्स-ग्रो चाहिए: 1 घटक को फ्लेक्स-बेस द्वारा सेट न्यूनतम तत्व से बढ़ने की अनुमति देने के लिए ।
माइकल बेंजामिन

33

Michael_B के उत्कृष्ट सारांश के अलावा यह इसे दोहराने लायक है:

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

यहां महत्वपूर्ण हिस्सा प्रारंभिक है

अपने आप से, यह चौड़ाई / ऊँचाई तक हल करता है जब तक कि अन्य फ्लेक्स नहीं बढ़ते / सिकुड़ते गुण खेलने में आते हैं।

इसलिए। के साथ एक बच्चा

.child {
 flex-basis:25%;
 flex-grow:1;
}

शुरू में 25% चौड़ा होगा, लेकिन फिर तुरंत उतना ही विस्तार करेंगे जब तक कि अन्य तत्वों में फैक्टर न हो। यदि कोई नहीं हैं..यह 100% चौड़ा / लंबा होगा।

एक त्वरित डेमो:

के साथ प्रयोग flex-grow, flex-shrinkऔर flex-basis (या आशुलिपि flex :fg fs fb) ... कुछ दिलचस्प परिणाम हो सकते हैं।


मुझे लगता है कि आम तौर पर पाया फ्लेक्स संदर्भ में वे दोनों flex-basisऔर width / heightएक तत्व की प्रारंभिक / शुरू करने आकार निर्धारित किया है। उदाहरण के लिए flex-basis: 200pxमूल रूप से के रूप में ही काम करता है flex-basis: auto; width: 200px;। ऐसा लगता है कि जब flex-basisइसे सेट नहीं किया जाता है autoतो यह केवल width / heightमूल्य को ओवरराइड करता है । एकमात्र अंतर जो मुझे दिखाई देता है वह है सामग्री ओवरफ़्लो जिस तरह से नियंत्रित किया जाता है।
करोलिस

5

संभवतः जोड़ने के लिए सबसे महत्वपूर्ण बिंदु:

यदि ब्राउज़र समर्थन नहीं करता है तो क्या होगा flex? ऐसे मामले में, width/heightपदभार संभाल लें और उनके मूल्य लागू हों।

यह एक बहुत अच्छा विचार है - लगभग आवश्यक - width/heightतत्वों पर परिभाषित करने के लिए , भले ही आपके पास तब के लिए पूरी तरह से अलग मूल्य हो flex-basis। याद रखें display:flexकि आप क्या प्राप्त करते हैं और अक्षम करके परीक्षण करना याद रखें ।


2
प्रमुख ब्राउज़रों में, जो केवल फ्लेक्स गुणों का समर्थन नहीं करते हैं वे IE <10. caniuse.com/#search=flex
माइकल बेंजामिन

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