CSS में div को center align करने का तरीका
(joshwcomeau.com)- CSS में center alignment अब कोई एक trick नहीं रही; यह चुनने का सवाल है कि element document flow में है या floating है या कई elements हैं—इसके आधार पर Flow, Flexbox, Positioned layout, CSS Grid, text-align में से सही तरीका चुनना होता है
- किसी single element को horizontal center में रखने के लिए
max-width: fit-contentसे width सीमित करकेmargin-inline: autoलगाने वाली Flow layout approach sibling elements पर कम असर डालती है - Flexbox में सिर्फ
justify-content: centerऔरalign-items: centerसे single या multiple children को horizontal/vertical center में रखा जा सकता है, और child overflow हो तो भी वह symmetrically overflow होता है - modal या banner जैसे floating UI के लिए
position: fixed,inset: 0, size constraints औरmargin: autoका combination सही है, और CSS Grid छोटा syntax तथा overlapping stack बनाने में मजबूत है - text अपने आप में layout alignment नहीं है; उसके लिए
text-align: centerचाहिए। Flow layout मेंalign-contentsupport व्यापक होने पर simple vertical alignment के लिए Flexbox या Grid पर switch करने की जरूरत घट सकती है
Flow layout में auto margin से horizontal center alignment
- पुराने strategies में से एक तरीका है element की width सीमित करके दोनों तरफ के margins को
autoरखना
.element {
max-width: fit-content;
margin-left: auto;
margin-right: auto;
}
- Flow layout में elements default रूप से horizontal space भरते हैं, इसलिए center में रखने के लिए पहले width constraint जरूरी है
fit-contentelement को content wrap करने देता है, जिससेwidth,heightकी तरह content size से तय होती हैwidthकी जगहmax-widthइस्तेमाल करने पर सिर्फ maximum size सीमित होता है, इसलिए container संकरा होने पर element भी साथ में shrink हो सकता है- अगर सिर्फ
margin-left: autoहो, तो बची हुई space left margin में चली जाती है; दोनों margins कोautoरखने पर बची हुई space बराबर बंटती है और element center में आ जाता है
.element {
max-width: fit-content;
margin-inline: auto;
}
margin-inline,margin-leftऔरmargin-rightको same value पर set करने का modern तरीका है, और इसका browser support अच्छा हैmargin-inlinelogical properties का हिस्सा है, इसलिए यह left/right के बजाय writing direction के inline axis के आधार पर काम करता है- left-to-right और right-to-left दोनों languages में सही side पर margin apply किया जा सकता है
- यह तरीका तब उपयोगी है जब blog post के बीच की image जैसे सिर्फ single child को center align करना हो और sibling elements को प्रभावित नहीं करना हो
Flexbox से single और multiple children को center align करना
- Flexbox main axis के साथ कई items arrange करने में मजबूत layout mode है, और center alignment के लिए भी अक्सर इस्तेमाल होता है
.container {
display: flex;
justify-content: center;
align-items: center;
}
justify-content: centerऔरalign-items: centerसाथ इस्तेमाल करने पर children को horizontal और vertical center में रखा जा सकता है- child container में fit न भी हो, alignment बना रहता है, और overflow की स्थिति में भी symmetrically overflow होता है
- कई children को भी center align किया जा सकता है, और
flex-directionसे stacking direction control किया जाता है
.container {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
gap: 4px;
}
- single या multiple children पर व्यापक रूप से लागू होने वाले default option के रूप में इस्तेमाल करने के लिए अच्छा है
Positioned layout से floating UI को center align करना
- modal, prompt, banner जैसे elements जिन्हें normal document flow से बाहर निकलकर ऊपर float करना होता है, उन्हें Positioned layout से handle किया जा सकता है
.element {
position: fixed;
inset: 0px;
width: 12rem;
height: 5rem;
max-width: 100vw;
max-height: 100dvh;
margin: auto;
}
position: fixedelement को viewport पर fix करता है, औरinset: 0pxtop,left,right,bottomसभी को0pxपर set करता है- सिर्फ
inset: 0pxहोने पर element पूरे viewport को भरने की कोशिश करता है, इसलिएwidth,height,max-width,max-heightसे size constrain करना होता है - यह combination जानबूझकर impossible condition बनाता है
- element left और right दोनों से
0pxदूर रहते हुए साथ ही12remwidth नहीं रख सकता - CSS rendering engine
widthconstraint को प्राथमिकता देता है और language direction के आधार पर उसे किसी एक side से चिपकाकर tension resolve करता है
- element left और right दोनों से
- इसमें
margin: autoजोड़ने पर browser का resolve करने का तरीका बदलता है और element horizontal/vertical center में रखा जाता है - जरूरी चार conditions हैं:
position: fixed,inset: 0px, constrained width और height,margin: auto -
bottom banner की तरह सिर्फ एक direction में center align करना
.element { position: fixed; left: 0px; right: 0px; bottom: 8px; width: 12rem; max-width: calc( 100vw - 8px * 2 ); margin-inline: auto; }top: 0pxहटाने पर vertical direction की impossible condition खत्म हो जाती है, और element bottom पर fixed रहता हैcalc(100vw - 8px * 2)viewport के दोनों तरफ buffer छोड़ने के लिए maximum width सीमित करता हैmargin-inline: autohorizontal center alignment के intent को ज्यादा स्पष्ट दिखाता है
-
ऐसे elements जिनका size पता नहीं
.element { position: fixed; inset: 0; width: fit-content; height: fit-content; margin: auto; }- जब element size पहले से पता न हो, तो
width: fit-contentऔरheight: fit-contentसे content को wrap कराया जा सकता है max-width: 60vwजैसी constraint जोड़ सकते हैं, लेकिन यह अनिवार्य नहीं है और element viewport के भीतर रहेगा
- जब element size पहले से पता न हो, तो
-
जानबूझकर center से थोड़ा हटाना
bottom: 48pxजैसी किसी एक side की inset value adjust करने पर element specified value के आधे से move होता हैbottom: 48pxहो तो element24pxऊपर चला जाता है- ऐसा इसलिए होता है क्योंकि element top/bottom boundaries के बीच बने virtual box में center पर लटका होता है
transform: translateY(-48px)इस्तेमाल करने पर element को ठीक48pxऊपर ले जाया जा सकता हैbottomoffset methodtransformproperty को बाद की animation या entry effect के लिए बचाकर रख सकता है
CSS Grid से कम syntax में center alignment और overlapping stack
- CSS Grid में सबसे छोटा center alignment code
display: gridऔरplace-content: centerका combination है
.container {
display: grid;
place-content: center;
}
-
place-content,justify-contentऔरalign-contentका shorthand है, जो rows और columns पर same value apply करता है -
इस setting से parent container के center में 1×1 Grid cell बनता है
-
Flexbox से अंतर
- यह Flexbox जैसा दिख सकता है, लेकिन CSS Grid पूरी तरह अलग layout algorithm इस्तेमाल करता है
- child को
width: 50%औरheight: 50%देने पर अंतर दिखता है - Flexbox में percentages parent
.containerके आधार पर calculate होते हैं - CSS Grid में percentages Grid cell के आधार पर calculate होते हैं
- अगर
grid-template-columnsयाgrid-template-rowsspecify न करें, तो Grid tracks content के आधार पर size calculate करते हैं, और इससे element अपेक्षा से छोटा हो सकता है - ऐसी स्थिति में Grid ठीक करने के लिए और CSS जोड़ी जा सकती है, लेकिन simple center alignment के लिए Flexbox ज्यादा आसान हो सकता है
-
कई elements को same position पर overlap करके stack करना
.container { display: grid; place-content: center; } .element { grid-row: 1; grid-column: 1; }- CSS Grid कई children को same cell में place कर सकता है
- सभी
.elementपरgrid-row: 1औरgrid-column: 1देने पर elements वही Grid space share करते हैं और आगे-पीछे overlap होकर stack होते हैं - children के sizes अलग-अलग हों तब भी यह काम कर सकता है
.container { display: grid; place-content: center; place-items: center; } .element { grid-row: 1; grid-column: 1; }- अलग-अलग size वाले children को center में overlap करना हो, तो
place-items: centerअतिरिक्त रूप से चाहिए place-items,justify-itemsऔरalign-itemsका shorthand है, और Grid cell के अंदर images की alignment control करता है- यह property न हो तो Grid cell खुद center में होने के बावजूद cell के अंदर images top-left में stack होंगी
- CSS Grid को और गहराई से देखने के लिए An Interactive Guide to CSS Grid देख सकते हैं
text को text-align से अलग से align करें
- CSS में text को अलग से handle करना होता है; Flexbox जैसी layout techniques individual letters को align नहीं करतीं
- Flexbox से paragraph को center में रखने पर paragraph block center में आता है, लेकिन paragraph के अंदर का text left-aligned ही रहता है
- text को center align करने के लिए
text-align: centerइस्तेमाल करना चाहिए
.container {
display: flex;
justify-content: center;
align-items: center;
text-align: center;
}
Flow layout का भविष्य: align-content
- Flow layout में horizontal center alignment auto margin से संभव है, लेकिन vertical center alignment के लिए अब तक Flexbox या Grid जैसे दूसरे layout modes की जरूरत पड़ती थी
- 2024 की शुरुआत तक browser vendors Flow layout में
align-contentimplement कर रहे हैं - यह नया behavior content के block direction alignment को control करता है, और उस समय यह सिर्फ Chrome Canary में flag के पीछे वाली feature और Safari Technical Preview में उपलब्ध था
- example demo actual Flow layout behavior नहीं था, बल्कि Chrome Canary और Safari TP का behavior confirm करने के बाद Flexbox से reproduce किया गया था
- यह feature कोई नया UI नहीं बनाता, लेकिन simple center alignment के लिए अलग layout mode में switch करने की जरूरत कम कर सकता है
स्थिति के हिसाब से selection criteria
- single element को siblings पर असर डाले बिना horizontal center align करना हो, तो Flow layout auto margin strategy इस्तेमाल करें
- modal या banner जैसे floating UI को Positioned layout और auto margin से center में रखें
- कई elements को same position पर overlap करके center में stack करना हो, तो CSS Grid उपयुक्त है
- text को center align करने के लिए
text-alignइस्तेमाल करें; इसे दूसरे center alignment methods के साथ भी इस्तेमाल किया जा सकता है - बाकी अधिकांश स्थितियों में Flexbox सबसे versatile option है
- single या multiple children को handle कर सकता है
- horizontal और vertical center alignment दोनों संभव हैं
- children container के अंदर हों या overflow कर रहे हों, दोनों में इस्तेमाल किया जा सकता है
3 टिप्पणियां
वैसे सोचूं तो GeekNews में भी articles का center alignment न होना अचानक खटकने लगा है, हुहाहा
मैं
place-items: center;का खूब इस्तेमाल करता हूँ, लेकिन और भी कई तरीके हैं।Hacker News की राय
दूसरे comments खुद comments पर ही टिप्पणी कर रहे हैं, तो मैं भी शामिल हो जाऊँ: CSS centering meme से मेरा मतलब ज़्यादातर “एक element को दूसरे element के बिल्कुल center में रखने का तरीका” होता है
implementation के लिहाज़ से centering मुश्किल है और इसके कई मतलब हो सकते हैं—यह बात सही है, लेकिन GeoCities या AngelFire generation के लिए यह समझना मुश्किल था, क्योंकि HTML से 90s में भी 600x600 पीले box के ठीक बीच में
helloबिना दिक्कत रखा जा सकता थाबेहतर बताकर मिला नया tool पहले से किए जा रहे standard काम को नहीं कर पा रहा था, इसलिए झुंझलाहट हुई, और इसी वजह से 2000s के आखिर तक table layout इस्तेमाल करते रहे। CSS मुझे पसंद है, लेकिन शायद यह किसी तरह का Stockholm syndrome भी हो सकता है
valignChromium में न होने पर भी काम करता है, यह देखकर हैरानी हुई; पता नहीं यह हाल का बदलाव है या नहींhelloरखना CSS के पहले version से ही संभव था। उदाहरण के लिए HTML काvalignattribute,inline,inline-block,table-cellboxes केvertical-alignCSS property से मेल खाता हैहालांकि अनुभव के मुताबिक, “सिर्फ tables इस्तेमाल करें” जैसी romantic बात करने या CSS को सीमित और confusing बताकर शिकायत करने वाले कई लोगों ने असल में CSS कैसे काम करता है, यह सीखने की खास कोशिश नहीं की। लेखक कम-से-कम इस बात से वाकिफ है
"valign"attribute के बिना काम करता है। हालांकि fixed layout के बिना tables इस्तेमाल करते समय तीनों प्रमुख browsers के बीच subtle differences हमेशा देखे हैं, इसलिए आम तौर पर automatic layout behavior पर निर्भर नहीं रहूँगाअच्छा लेख है, और nominally technical readership के हिसाब से यहाँ की प्रतिक्रिया काफी चौंकाने वाली है। automatic page layout और formatting वाकई मुश्किल हैं, और सच में PhD thesis का topic बनने लायक हैं[1]
इस complexity को “मेरी मंशा के मुताबिक कर दो” जैसी simple expression में abstract करने की उम्मीद realistic नहीं है
Gwern Branwen की website[2] देखें तो यह art के करीब लगती है, लेकिन core बात यह है कि पहले desired look तय किया जाता है और फिर writing को उस style के अंदर express हो सकने तक constrain किया जाता है
1995 में “web की पहली golf magazine” startup[3] से जुड़ने के बाद से web page layout देखता आ रहा हूँ, और Zen Garden और
A List Apartmailing list/website[4] की बदौलत समझ आया कि अलग-अलग output environments में अच्छा दिखने वाला web content बनाना कितना कठिन हैsemantic content को screen, paper, finite plane पर ले जाना असल में original space से destination space के ruleset तक एक mapping या projection है, और उन rules में physical constraints, browser software constraints, और हर browser का अपना behavior—सब शामिल हैं
इसलिए CSS “शुरू से web page बनाना है” सोचने वाले को mess जैसा दिखता है, लेकिन सच में यह कर सकने वाली चीज़ों को रोकने वाला constraint कम और बहुत ज़्यादा विकल्पों वाला मामला ज़्यादा है
[1] https://scholar.google.com/scholar?hl=en&as_sdt=0%2C5&q=thes...
[2] https://gwern.net/
[3] इसका नाम Golfweb था, और लगता है अंततः CBS Sports का हिस्सा बन गया
[4] https://www.alistapart.com
[1] https://every-layout.dev/rudiments/boxes/
खासकर हर page के लिए fit होने वाला एक बड़ा model बनाने और हर page पर automatic layout फिर से calculate करने का Sisyphean goal जुड़ा हुआ है। इसमें सभी window sizes को target करने का goal भी जोड़ दें, तो समझ नहीं आता कि इसे possible क्यों माना गया
https://css-art.com/the-girl-with-a-p-e-a-r-l-css-earring/
इसमें कितने centered
divहैं, पता नहींखासकर ऐसे tables में, जिनमें हर column में अलग size का text और objects हों, elements को कब और कैसे अगले page पर भेजना है—यह तय करना अच्छे heuristics चुनने वाला tricky काम है
custom appkit, GTK controls, और public न किए गए Lua-based toolkit में भी content center करना या elements को wrap/align करना कोई बड़ी बात नहीं था, तो web में आखिर क्या miss हो रहा है, यह जानना चाहता हूँ
“बस विकल्प भरपूर हैं” वाली बात बहुत पहले दफन हो चुके TMTOWTDI जैसी भी सुनाई देती है
शानदार लेख है और interactive elements खास तौर पर अच्छे हैं। कुछ साल पहले CSS positioning और centering समझने में box model पढ़ने से बहुत मदद मिली थी
box model समझने से DOM के अंदर flow को समझने में मदद मिलती है, और
displayऔरpositionCSS properties भी positioning सीखने की बुनियाद हैं। MDN docs अच्छे हैंhttps://developer.mozilla.org/en-US/docs/Learn/CSS/Building_...
https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layou...
“बीच में align कैसे करें” CSS का classic सवाल है, और यह बात अपने-आप में बहुत कुछ बताती है कि यह सामने दिखने जितना obvious नहीं है। CSS असल में धुंधला-सा खिचड़ी मिक्स है; यह किसी एक committee का नहीं, बल्कि कई committees द्वारा एक साथ design किया गया kitchen-sink collection है
वास्तविक release जैसा concept तो बहुत पहले छोड़ दिया गया था, और CSS की मौजूदा स्थिति लगातार बदलते अलग-अलग modules की states को जमा कर रखने जैसी है। यह software develop करने का तरीका नहीं है, और सच कहें तो कुछ भी बनाने का अच्छा तरीका नहीं है
web और उसकी technologies सामूहिक रूप से किस दिशा में जा रही हैं, यह भी स्पष्ट नहीं है, इसलिए असफल experiments और inconsistencies बहुत होना तय है। यह साफ लक्ष्य और path वाले well-planned engineering project से कहीं ज्यादा व्यापक scope है
जो व्यक्ति webpage को मनचाहा रूप देना सीख रहा होता है, वह आम तौर पर सबसे पहले font size, color, background color, alignment सीखता है; alignment को छोड़ दें तो बाकी चीजें CSS से पहले के तरीकों से लगभग 1:1 match करती हैं
CSS से पहले, अगर content को बीच में रखना होता था तो बस tag में डाल देते थे, चाहे वह text हो या
div, table, button जैसा कोई HTML object। बहुत लोगों को उम्मीद थी कि CSS भी पुराने तरीके की तरह inline और block objects में फर्क किए बिना काम करेगा, लेकिन CSS उस preconception से match नहीं हुआ, इसलिए यह सवाल पैदा हुआयह लेख वाकई अच्छा है, खासकर interaction का तरीका शानदार है। एक tool भी है जो काफी समय से लगभग हमेशा वही result देता आया है जो चाहिए होता है
http://howtocenterincss.com
CSS को content को center में रखने वाली table जितना काम का solution देने में दशकों लग गए, और उस दौरान layout के लिए tables इस्तेमाल करना criticize किया जाता रहा
HTML tables में accessibility के लिए कम-से-कम `` जैसी handling की जरूरत होती है
https://developer.mozilla.org/en-US/docs/Learn/HTML/Tables/A...
CSS Grid Layout resources भी देखने लायक हैं
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_la...
Firefox DevTools > INTRODUCTION TO CSS GRID LAYOUT: https://mozilladevelopers.github.io/playground/css-grid/
CSS Grid Garden: https://cssgridgarden.com/
MDN > "Relationship of grid layout to other layout methods": https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_la...
MDN: "Box alignment in grid layout": https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_la...
web development में content page पर कहां रखा है, इससे कहीं ज्यादा चीजें शामिल होती हैं, और इसी वजह से अच्छा web development मुश्किल है
divऔर CSS का फायदा hipster reputation था, और नुकसान DIV soup थाउस समय CSS लोगों के किए जाने वाले कामों के लिए अविश्वसनीय रूप से अनुपयुक्त था; मेरे हिसाब से वजह यह थी कि इसे document formatting के लिए design किया गया था, web apps या screen layout के लिए नहीं
दूसरी तरफ
tableका फायदा यह था कि वह सच में काम करता थायहां कई लोगों की तरह मुझे भी CSS पूरी तरह disaster लगता है। core problem यह है कि style instructions लगातार एक-दूसरे को overwrite करते रहते हैं, या बिना कोई effect दिखाए चुपचाप fail हो जाते हैं
examples में से एक cookie notice बेरहमी से ईमानदार था, यह अच्छा लगा
“हम आपके personal data को महत्व देते हैं। browsing experience बेहतर करने के लिए हम ऐसे cookies इस्तेमाल करते हैं जो यह data advertisers को बेचते हैं। यह बहुत valuable है”
layout में tables इस्तेमाल करने के इतिहास से सीखने वाली बात दिलचस्प है। tables में border, padding, columns में arranged cell-based layout होता है, और इसे आगे बढ़ाएं तो table और cells के आसपास खाली जगह, यानी margin भी चाहिए
tables layout में लंबे समय से established element रहे हैं, और उनमें यह समझ छिपी थी कि असल में सभी elements को कुछ हद तक table cell की तरह behave करना चाहिए
element को box model follow करना चाहिए, जो typography से जुड़े लोगों के लिए काफी obvious है, लेकिन साथ ही उसे columns में arrange होना चाहिए—यह बात उतनी obvious नहीं है, और यही Grid layout और Bootstrap का आधार बनती है
layout problem आने पर उसे table से solve करना, फिर यह समझना कि table की कुछ properties तो चाहिए लेकिन सारी नहीं, और उसके लिए नई functionality चाहिए—यह एक natural evolution है
CSS ने इसे discover किया, लेकिन अजीब बात है कि word processor जैसे कुछ systems elements को box model के तहत unify नहीं कर पाए
“यह अब भी इतना मुश्किल क्यों है” जैसी शिकायतें मुझे काफ़ी गलत लगती हैं। लेख में जैसा कहा गया है, Flexbox simple हर तरह की centering को सहज तरीके से हल कर देता है
अगर Flexbox से हल नहीं हो रहा, तो वह सिर्फ़ centering नहीं बल्कि कोई ज़्यादा जटिल काम है, और यह उम्मीद करना ठीक नहीं कि implementation बहुत simple होगा
अब तरीके इतने ज़्यादा हैं कि complexity हावी हो जाती है। नए बनाने से ज़्यादा पुराने code को ठीक करने के मामले आते हैं, और यह सोचना पड़ता है कि CSS किसी खास तरीके से क्यों लिखी गई, कौन-से edge cases टूटेंगे, इसे ठीक करना ठीक है या नहीं, और जब मामला simple न हो तो कई solutions में से क्या चुना जाए
लेख को सरसरी तौर पर देखने पर भी यह intuitive नहीं लगता। Flexbox में भी horizontal setting
justify-contentहै और vertical settingalign-items, लेकिन CSS property names इतने ज़्यादा और मनमाने हैं कि अब ठीक से याद नहीं रहतेआखिर फ़र्क यह है कि क्या आप simple, intuitive और भरोसेमंद building blocks से complex solution बनाते हैं, या ऐसे complex building blocks से complex solution बनाते हैं जो आपस में कुछ हद तक overlap करते हैं और जिन्हें बार-बार search करना पड़ता है
Go या Python पहले वाले के करीब हैं, और CSS दूसरे वाले के करीब
लोगों को Bootstrap का grid system पसंद आने की वजह थी, और Flexbox वह सब और उससे भी ज़्यादा सीधे browser के अंदर कर देता है। मुझे यह कितना पसंद है, इसे बढ़ा-चढ़ाकर बताना भी मुश्किल है
divको center करना कीमिया और rocket science के बीच की कोई चीज़ होइससे दिखता है कि वे web development के दूसरे हिस्सों जितना CSS में हुए बदलावों के साथ नहीं चलते, फिर भी ऐसे दावे आराम से कर देते हैं
बाहर से अंदर की ओर, parent element से child element तक चलते जाएँ तो यह कहीं आसान हो जाता है। Skill की ज़रूरत तो होती है, लेकिन मूल रूप से यह elastic algebra के करीब है