2025, Oct 16 20:31
Solara में height: 100% क्यों टूटता है और सही लेआउट कैसे करें
Solara AppLayout में Title जोड़ने पर height: 100% क्यों टूटता है, और Column/Row के साथ full-height layout सेट करने के व्यावहारिक तरीके व कोड उदाहरण जानें
Solara पेज में सामग्री को पूरे ऊंचाई तक फैलाना सुनने में आसान लगता है, लेकिन जैसे ही एक साधारण-सा हेडिंग जोड़ते हैं, सब कुछ फिर से डिफ़ॉल्ट ऊंचाई पर सिमट जाता है। अगर आपका लक्ष्य मानक AppLayout को बनाए रखते हुए मुख्य कंटेंट क्षेत्र के भीतर किसी विजेट को उपलब्ध पूरी ऊर्ध्वाधर जगह तक फैलने देना है, तो एक अहम बात ध्यान में रखनी होगी।
सेटअप और चौंकाने वाला व्यवहार
एक साधारण पेज और ऐसे बटन से शुरू करें जिसे पूरी ऊंचाई घेरनी चाहिए। यह उम्मीद के मुताबिक काम करता है।
import solara
@solara.component
def LayoutOnly():
    solara.Button(label="Action", style={"height": "100%"})
अब बटन से पहले पेज टाइटल जोड़ें। बटन अब नहीं फैलता; वह फिर से मानक ऊंचाई पर लौट आता है।
import solara
@solara.component
def LayoutWithTitle():
    solara.Title("Layout test")
    solara.Button(label="Action", style={"height": "100%"})
यही मूल समस्या है: Title जोड़ने से लेआउट का व्यवहार बदल जाता है और चाइल्ड कंपोनेंट को पूरी ऊर्ध्वाधर जगह लेने से रोक देता है।
असल में होता क्या है
Title अपने-आप कंटेंट को एक अतिरिक्त div में लपेट देता है जिसकी न्यूनतम ऊंचाई होती है। नतीजतन, इसका व्यवहार ऐसा होता है मानो अंदरखाते एक Column जोड़ दिया गया हो, लेकिन वह कंटेनर आपके नियंत्रण में नहीं होता, इसलिए आप height: 100% को नीचे तक नहीं पहुँचा पाते। व्यावहारिक तौर पर, DevTools में पेज देखने पर बटन एक ऐसे रैपर के भीतर दिखता है जिसे भी height: 100% चाहिए, पर इसे सीधे सेट करने का तरीका नहीं है। कुछ CSS स्थितियों में height: 100% !important से मानों को जबरन लागू करना मदद करता है, लेकिन यहां इस तरीके पर निर्भर रहना सही नहीं।
नियंत्रित समाधान
कंटेनर को स्पष्ट रूप से परिभाषित करें। कंटेंट को स्वयं Column में लपेटें और उस कंटेनर को height: 100% दें। अब जिस parent को फैलना है वह आपके नियंत्रण में है, और child अपेक्षित रूप से विरासत में लेकर शेष जगह भर सकता है।
import solara
@solara.component
def FixedLayout():
    with solara.Column(style={"height": "100%"}):
        solara.Title("Layout test")
        solara.Button(label="Action", style={"height": "100%"})
इस संरचना में बटन अधिकतम ऊंचाई और अधिकतम चौड़ाई तक फैल जाता है।
Row आधारित विकल्प
अगर आप क्षैतिज लेआउट पसंद करते हैं, तो Row भी तब काम करता है जब वही height धारण करता है। इस स्थिति में, बटन अधिकतम ऊंचाई तक तो पहुंचता है, लेकिन न्यूनतम चौड़ाई ही रखता है, जो क्षैतिज व्यवस्था में ठीक वैसा ही हो सकता है जैसा आप चाहते हैं।
import solara
@solara.component
def RowVariant():
    with solara.Row(style={"height": "100%"}):
        solara.Title("Layout test")
        solara.Button(label="Action", style={"height": "100%"})
एक आम गलती
अगर कोई भी कंपोनेंट Column या Row के बाहर रखा जाए, तो वही समस्या दिखती है। यहां तक कि लेआउट कंटेनर के ऊपर रखा एक अकेला Button भी आपके full-height एलिमेंट को फैलने से रोक सकता है।
import solara
@solara.component
def MixedLayout():
    solara.Button(label="Top", style={"height": "100%"})
    with solara.Row(style={"height": "100%"}):
        solara.Title("Layout test")
        solara.Button(label="Action", style={"height": "100%"})
जिस कंटेंट को फैलाना चाहते हैं, उसे अपने नियंत्रित, स्पष्ट रूप से परिभाषित लेआउट कंटेनर के भीतर ही रखें।
यह क्यों मायने रखता है
Solara में ऊंचाई का प्रसार कंटेनर की पदानुक्रम पर निर्भर करता है। जब आपके पेज और उस कंपोनेंट के बीच, जिसे बढ़ना चाहिए, न्यूनतम ऊंचाई वाला कोई रैपर आ जाता है, तो child पर लगाया गया height: 100% सही तरह से हल नहीं हो पाता। लेआउट कंटेनर को ही height: 100% देने और कंटेंट को उसके भीतर रखने से साइजिंग पूर्वानुमेय और स्थिर हो जाती है, भले ही Title जैसे संरचनात्मक तत्व मौजूद हों।
निष्कर्ष और व्यावहारिक सलाह
अपने कंटेंट को ऐसे Column या Row के भीतर रखें जो स्पष्ट रूप से उपलब्ध ऊंचाई पर फैला हो। जिस कंटेनर और जिन कंपोनेंट्स को फैलना है, उन पर height: 100% लागू करें। मुख्य लेआउट कंटेनर के बाहर तत्व छोड़ने से बचें, क्योंकि वे फिर से न्यूनतम-ऊंचाई वाले रैपर की समस्या ला सकते हैं। अगर फिर भी बात न बने, तो DevTools में वास्तविक DOM और computed CSS की जांच करें ताकि सही एलिमेंट के पास height का स्वामित्व हो, फिर वहीं से 100% ऊंचाई पेड़ में नीचे की ओर धकेलें।
यह लेख StackOverflow पर प्रश्न user31238335 द्वारा और furas के उत्तर पर आधारित है।