स्वीकृत समाधान बहुत अच्छा काम करता है, लेकिन 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इसके बजाय उपयोग करें ।