গৃহীত সমাধানটি দুর্দান্ত কাজ করে তবে এটি কেন কাজ করে তা সম্পর্কিত আইএমওর কোনও ব্যাখ্যা নেই। নীচের উদাহরণটি বেসিকগুলিতে সিদ্ধ হয় এবং গুরুত্বপূর্ণ সিএসএসকে অ-প্রাসঙ্গিক স্টাইলিং সিএসএস থেকে পৃথক করে। বোনাস হিসাবে, আমি সিএসএস পজিশনিং কীভাবে কাজ করে তার একটি বিশদ বিবরণ অন্তর্ভুক্ত করেছি।
TLDR; আপনি শুধুমাত্র কোড চাই, এর নিচে স্ক্রল ফল ।
সমস্যাটি
দুটি পৃথক, ভাইবোন উপাদান ও লক্ষ্য (একটি দ্বিতীয় উপাদান অবস্থান হয় idএর infoi,) তাই এটি পূর্ববর্তী উপাদান (ক সঙ্গে এক মধ্যে প্রদর্শিত classএর navi)। এইচটিএমএল কাঠামো পরিবর্তন করা যায় না।
প্রস্তাবিত সমাধান
কাঙ্ক্ষিত ফলাফল অর্জনের জন্য আমরা সরাতে যাচ্ছি দ্বিতীয় অবস্থান, বা অবস্থান, যা আমরা কল করব #infoiতাই এটি প্রথম উপাদানটির মধ্যে উপস্থিত হবে, যা আমরা কল করব .navi। বিশেষত, আমরা #infoiউপরের-ডানদিকে অবস্থিত হতে চাই .navi।
সিএসএস অবস্থান প্রয়োজনীয় জ্ঞান
সিএসএসের অবস্থানের উপাদানগুলির জন্য বেশ কয়েকটি বৈশিষ্ট্য রয়েছে। ডিফল্টরূপে, সমস্ত উপাদান হয় position: static। এর অর্থ কিছু ব্যতিক্রম বাদে উপাদানটি এইচটিএমএল কাঠামোর ক্রম অনুসারে অবস্থান করবে।
অন্যান্য positionমান relative, absolute, sticky, এবং fixed। positionএই অন্যান্য মানগুলির একটিতে একটি উপাদানের সেট করে এখন উপাদানটি অবস্থানের জন্য নিম্নলিখিত চারটি বৈশিষ্ট্যের সংমিশ্রণ ব্যবহার করা সম্ভব:
অন্য কথায়, সেট করে position: absoluteআমরা top: 100pxপৃষ্ঠার শীর্ষ থেকে 100 পিক্সেল উপাদান যুক্ত করতে পারি । বিপরীতে, যদি আমরা bottom: 100pxউপাদানটি সেট করি তবে পৃষ্ঠার নীচ থেকে 100 পিক্সেল অবস্থান করা হবে।
এখানে অনেকগুলি সিএসএস আগত লোক হারিয়ে যেতে পারে -position: absoluteএখানে একটি ফ্রেম রেফারেন্স রয়েছে। উপরের উদাহরণে রেফারেন্সের ফ্রেমটিbodyউপাদানis 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">এখন অবস্থান প্রসঙ্গে।
সচেতন হওয়ার মতো অন্য উপাদানটি হ'ল স্ট্যাক অর্ডার - বা কীভাবে উপাদানগুলি জেড-দিকের দিকে সজ্জিত করা হয়। এখানে অবশ্যই জানতে হবে উপাদানগুলির স্ট্যাক ক্রম হ'ল ডিফল্টরূপে, এইচটিএমএল কাঠামোর মধ্যে তাদের ক্রমের বিপরীত দ্বারা সংজ্ঞায়িত করা হয়। নিম্নলিখিত উদাহরণ বিবেচনা করুন:
<body>
<div>Bottom</div>
<div>Top</div>
</body>
এই উদাহরণে, যদি দুটি <div>উপাদান পৃষ্ঠার একই জায়গায় অবস্থান করা হয়, তবে <div>Top</div>উপাদানটি উপাদানটি আবরণ করবে <div>Bottom</div>। যেহেতু <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বৈশিষ্ট্যগুলি ব্যবহার করে পরিবর্তন করা যেতে পারে ।
আমরা এই ইস্যুতে স্ট্যাকিং অর্ডারটিকে উপেক্ষা করতে পারি কারণ উপাদানগুলির প্রাকৃতিক এইচটিএমএল কাঠামোর অর্থ আমরা যে উপাদানটিতে প্রদর্শিত হতে চাই তা topঅন্য উপাদানগুলির পরে আসে।
সুতরাং, হাতে থাকা সমস্যার দিকে ফিরে - আমরা এই সমস্যাটি সমাধানের জন্য অবস্থানের প্রসঙ্গটি ব্যবহার করব।
সমাধান
উপরে বর্ণিত হিসাবে, আমাদের লক্ষ্য #infoiউপাদানটিকে অবস্থান দেওয়া তাই এটি .naviউপাদানটির মধ্যে উপস্থিত হয় appears এই কাজের জন্য, আমরা মোড়ানো করব .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সঙ্গে উপাদান #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>
একটি বিকল্প (কোনও আবরণ নেই) সমাধান
ক্ষেত্রে আমরা কোনও এইচটিএমএল সম্পাদনা করতে পারি না, এর অর্থ আমরা একটি মোড়কের উপাদান যুক্ত করতে পারি না, আমরা এখনও পছন্দসই প্রভাব অর্জন করতে পারি।
উপাদানটি ব্যবহার 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পরিবর্তে ব্যবহার করুন।