स्वीकृत समाधान बहुत अच्छा काम करता है, लेकिन IMO के पास स्पष्टीकरण की कमी है कि यह क्यों काम करता है। नीचे दिया गया उदाहरण मूल बातें के लिए उबला हुआ है और गैर-प्रासंगिक स्टाइलिंग सीएसएस से महत्वपूर्ण सीएसएस को अलग करता है। एक बोनस के रूप में, मैंने एक विस्तृत विवरण भी शामिल किया है कि CSS पोजिशनिंग कैसे काम करती है।
TLDR; यदि आप केवल कोड चाहते हैं, तो परिणाम को नीचे स्क्रॉल करें ।
समस्या
वहाँ दो अलग-अलग, भाई-बहन, तत्व हैं और लक्ष्य (एक साथ दूसरा तत्व स्थिति है id
की infoi
,) तो यह पिछले तत्व (एक साथ एक के भीतर प्रकट होता है class
की navi
)। HTML संरचना को बदला नहीं जा सकता है।
प्रस्तावित समाधान
इच्छित परिणाम प्राप्त करने के लिए, हम स्थानांतरित करने जा रहे हैं, या स्थिति, दूसरा तत्व, जिसे हम कॉल करेंगे #infoi
इसलिए यह पहले तत्व के भीतर दिखाई देता है, जिसे हम कॉल करेंगे .navi
। विशेष रूप से, हम #infoi
शीर्ष-दाएं कोने में स्थित होना चाहते हैं.navi
।
सीएसएस स्थिति आवश्यक ज्ञान
सीएसएस में स्थिति तत्वों के लिए कई गुण हैं। डिफ़ॉल्ट रूप से, सभी तत्व हैं position: static
। इसका मतलब यह है कि तत्व HTML संरचना में कुछ अपवादों के साथ अपने आदेश के अनुसार स्थित होगा।
अन्य position
मान हैं relative
, absolute
, sticky
, और fixed
। एक तत्व position
को इन अन्य मूल्यों में से किसी एक पर सेट करके, तत्व को स्थिति के लिए निम्नलिखित चार गुणों के संयोजन का उपयोग करना संभव है:
दूसरे शब्दों में, सेटिंग करके position: absolute
, हम top: 100px
पृष्ठ के शीर्ष से तत्व 100 पिक्सेल को जोड़ सकते हैं । इसके विपरीत, यदि हम निर्धारित bottom: 100px
करते हैं कि तत्व पृष्ठ के नीचे से 100 पिक्सेल पर स्थित होगा।
यहां कई सीएसएस नवागंतुक खो गए हैं -position: absolute
संदर्भ का एक फ्रेम है। ऊपर के उदाहरण में, संदर्भ का फ्रेमbody
तत्व है। position: absolute
के साथtop: 100px
तत्व तत्व के शीर्ष से 100 पिक्सल तैनातbody
है।
संदर्भ, या स्थिति के संदर्भ की स्थिति फ्रेम, को position
छोड़कर किसी भी मान केposition: static
लिए मूल तत्व सेट करके परिवर्तित किया जा सकता है । अर्थात्, हम मूल तत्व देकर एक नया स्थान संदर्भ बना सकते हैं:
position: relative;
position: absolute;
position: sticky;
position: fixed;
उदाहरण के लिए, यदि कोई <div class="parent">
तत्व दिया जाता है position: relative
, तो कोई भी बाल तत्व <div class="parent">
अपनी स्थिति के संदर्भ के रूप में उपयोग करता है। यदि एक बाल तत्व दिया गया था position: absolute
और top: 100px
, तत्व तत्व के शीर्ष से 100 पिक्सल तैनात किया जाएगा <div class="parent">
, क्योंकि <div class="parent">
अब स्थिति का संदर्भ है।
अन्य पहलू से अवगत होना स्टैक ऑर्डर है - या तत्वों को जेड-दिशा में कैसे स्टैक किया जाता है। यहाँ अवश्य पता होना चाहिए कि तत्वों का स्टैक ऑर्डर HTML संरचना में उनके ऑर्डर के रिवर्स द्वारा परिभाषित किया गया है। निम्नलिखित उदाहरण पर विचार करें:
<body>
<div>Bottom</div>
<div>Top</div>
</body>
इस उदाहरण में, यदि दो <div>
तत्वों को पृष्ठ पर एक ही स्थान पर तैनात किया गया था, तो <div>Top</div>
तत्व तत्व को कवर करेगा <div>Bottom</div>
। चूंकि HTML संरचना में इसके <div>Top</div>
बाद <div>Bottom</div>
एक उच्च स्टैकिंग क्रम होता है।
div {
position: absolute;
width: 50%;
height: 50%;
}
#bottom {
top: 0;
left: 0;
background-color: blue;
}
#top {
top: 25%;
left: 25%;
background-color: red;
}
<div id="bottom">Bottom</div>
<div id="top">Top</div>
स्टैकिंग ऑर्डर को सीएसएस के साथ z-index
या order
गुणों का उपयोग करके बदला जा सकता है ।
हम इस समस्या में स्टैकिंग क्रम को अनदेखा कर सकते हैं क्योंकि तत्वों की प्राकृतिक HTML संरचना का अर्थ है कि हम जिस तत्व को दिखाना चाहते हैं top
वह दूसरे तत्व के बाद आता है।
तो, समस्या को वापस हाथ में - हम इस मुद्दे को हल करने के लिए स्थिति के संदर्भ का उपयोग करेंगे।
समाधान
जैसा कि ऊपर कहा गया है, हमारा लक्ष्य #infoi
तत्व को स्थिति देना है ताकि यह .navi
तत्व के भीतर दिखाई दे । ऐसा करने के लिए, हम तत्वों .navi
और #infoi
तत्वों को एक नए तत्व में लपेटेंगे <div class="wrapper">
ताकि हम एक नया स्थान संदर्भ बना सकें।
<div class="wrapper">
<div class="navi"></div>
<div id="infoi"></div>
</div>
तब देकर एक नई स्थिति प्रसंग बना .wrapper
एक position: relative
।
.wrapper {
position: relative;
}
इस नई स्थिति के संदर्भ में, हम स्थिति में आ सकते #infoi
हैं .wrapper
। सबसे पहले, #infoi
एक position: absolute
स्थिति दें, जिससे हम #infoi
बिल्कुल स्थिति में आ सकें .wrapper
।
फिर तत्व को शीर्ष-दाएं कोने में जोड़ें top: 0
और right: 0
स्थिति दें #infoi
। याद रखें, क्योंकि #infoi
तत्व .wrapper
अपनी स्थिति के संदर्भ के रूप में उपयोग कर रहा है, यह .wrapper
तत्व के शीर्ष-दाएं में होगा ।
#infoi {
position: absolute;
top: 0;
right: 0;
}
क्योंकि .wrapper
यह केवल एक कंटेनर है .navi
, #infoi
जिसके शीर्ष-दाएं कोने में स्थित होना शीर्ष-दाएं कोने में .wrapper
स्थित होने का प्रभाव देता है.navi
।
और वहां हमारे पास है, #infoi
अब शीर्ष-दाएं कोने में प्रतीत होता है .navi
।
परिणाम
नीचे दिए गए उदाहरण में मूल बातें उबकाई गई हैं, और कुछ न्यूनतम स्टाइल शामिल हैं।
/*
* position: relative gives a new position context
*/
.wrapper {
position: relative;
}
/*
* The .navi properties are for styling only
* These properties can be changed or removed
*/
.navi {
background-color: #eaeaea;
height: 40px;
}
/*
* Position the #infoi element in the top-right
* of the .wrapper element
*/
#infoi {
position: absolute;
top: 0;
right: 0;
/*
* Styling only, the below can be changed or removed
* depending on your use case
*/
height: 20px;
padding: 10px 10px;
}
<div class="wrapper">
<div class="navi"></div>
<div id="infoi">
<img src="http://via.placeholder.com/32x20/000000/ffffff?text=?" height="20" width="32"/>
</div>
</div>
एक वैकल्पिक (ग्रिड) समाधान
यहां तत्व को दूर से .navi
तत्व के साथ स्थित करने के लिए CSS ग्रिड का उपयोग करके एक वैकल्पिक समाधान #infoi
दिया गया है। मैंने grid
इसे यथासंभव स्पष्ट करने के लिए क्रिया गुणों का उपयोग किया है।
:root {
--columns: 12;
}
/*
* Setup the wrapper as a Grid element, with 12 columns, 1 row
*/
.wrapper {
display: grid;
grid-template-columns: repeat(var(--columns), 1fr);
grid-template-rows: 40px;
}
/*
* Position the .navi element to span all columns
*/
.navi {
grid-column-start: 1;
grid-column-end: span var(--columns);
grid-row-start: 1;
grid-row-end: 2;
/*
* Styling only, the below can be changed or removed
* depending on your use case
*/
background-color: #eaeaea;
}
/*
* Position the #infoi element in the last column, and center it
*/
#infoi {
grid-column-start: var(--columns);
grid-column-end: span 1;
grid-row-start: 1;
place-self: center;
}
<div class="wrapper">
<div class="navi"></div>
<div id="infoi">
<img src="http://via.placeholder.com/32x20/000000/ffffff?text=?" height="20" width="32"/>
</div>
</div>
एक वैकल्पिक (कोई आवरण) समाधान
मामले में हम किसी भी HTML को संपादित नहीं कर सकते हैं, जिसका अर्थ है कि हम एक आवरण तत्व नहीं जोड़ सकते हैं, हम अभी भी वांछित प्रभाव प्राप्त कर सकते हैं।
तत्व position: absolute
पर उपयोग करने के बजाय #infoi
, हम उपयोग करेंगे position: relative
। यह हमें #infoi
तत्व को तत्व के नीचे उसकी डिफ़ॉल्ट स्थिति से बदलने की अनुमति देता है .navi
। इसके साथ position: relative
हम top
इसे अपने डिफ़ॉल्ट स्थान से ऊपर ले जाने के लिए एक नकारात्मक मान का उपयोग कर सकते हैं , और कुछ पिक्सेल के left
मान का 100%
उपयोग करके left: calc(100% - 52px)
, इसे दाईं ओर स्थित करने के लिए उपयोग कर सकते हैं ।
/*
* The .navi properties are for styling only
* These properties can be changed or removed
*/
.navi {
background-color: #eaeaea;
height: 40px;
width: 100%;
}
/*
* Position the #infoi element in the top-right
* of the .wrapper element
*/
#infoi {
position: relative;
display: inline-block;
top: -40px;
left: calc(100% - 52px);
/*
* Styling only, the below can be changed or removed
* depending on your use case
*/
height: 20px;
padding: 10px 10px;
}
<div class="navi"></div>
<div id="infoi">
<img src="http://via.placeholder.com/32x20/000000/ffffff?text=?" height="20" width="32"/>
</div>
overflow: hidden
,overflow: visible
इसके बजाय उपयोग करें ।