গৃহীত সমাধানটি দুর্দান্ত কাজ করে তবে এটি কেন কাজ করে তা সম্পর্কিত আইএমওর কোনও ব্যাখ্যা নেই। নীচের উদাহরণটি বেসিকগুলিতে সিদ্ধ হয় এবং গুরুত্বপূর্ণ সিএসএসকে অ-প্রাসঙ্গিক স্টাইলিং সিএসএস থেকে পৃথক করে। বোনাস হিসাবে, আমি সিএসএস পজিশনিং কীভাবে কাজ করে তার একটি বিশদ বিবরণ অন্তর্ভুক্ত করেছি।
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
পরিবর্তে ব্যবহার করুন।