โซลูชันที่ได้รับการยอมรับนั้นใช้งานได้ดี แต่ IMO ไม่มีคำอธิบายว่าทำไมมันจึงใช้งานได้ ตัวอย่างด้านล่างนี้ถูกต้มลงไปจนถึงข้อมูลพื้นฐานและแยก CSS สำคัญออกจาก CSS สไตล์ที่ไม่เกี่ยวข้อง เป็นโบนัสฉันยังได้รวมคำอธิบายโดยละเอียดเกี่ยวกับวิธีการวางตำแหน่ง CSS
TLDR; ถ้าคุณต้องการเพียงรหัสเลื่อนลงไปผลที่ตามมา
ปัญหา
มีสองแยกพี่น้ององค์ประกอบและเป้าหมายคือการวางตำแหน่งองค์ประกอบที่สอง (กับid
ของinfoi
) ดังนั้นมันจะปรากฏขึ้นภายในองค์ประกอบก่อนหน้า (หนึ่งที่มีclass
ของnavi
) โครงสร้าง HTML ไม่สามารถเปลี่ยนแปลงได้
โซลูชันที่เสนอ
เพื่อให้บรรลุผลที่ต้องการเรากำลังจะย้ายหรือตำแหน่งองค์ประกอบที่สองซึ่งเราจะเรียกมันจึงปรากฏอยู่ในองค์ประกอบแรกซึ่งเราจะเรียก#infoi
.navi
โดยเฉพาะที่เราต้องการที่จะอยู่ในตำแหน่งที่มุมบนขวาของ#infoi
.navi
ความรู้ที่จำเป็นในตำแหน่ง CSS
CSS มีคุณสมบัติหลายอย่างสำหรับองค์ประกอบการวางตำแหน่ง position: static
โดยค่าเริ่มต้นองค์ประกอบทั้งหมดที่มี ซึ่งหมายความว่าองค์ประกอบจะถูกจัดวางตามลำดับในโครงสร้าง HTML โดยมีข้อยกเว้นเล็กน้อย
อื่น ๆ ที่position
มีค่าrelative
, absolute
, และsticky
fixed
โดยการตั้งค่าองค์ประกอบposition
ให้เป็นหนึ่งในค่าอื่น ๆ เหล่านี้ตอนนี้เป็นไปได้ที่จะใช้การรวมกันของสี่คุณสมบัติต่อไปนี้เพื่อวางตำแหน่งองค์ประกอบ:
กล่าวอีกนัยหนึ่งการตั้งค่าposition: absolute
เราสามารถเพิ่มtop: 100px
องค์ประกอบพิกเซล 100 จากด้านบนของหน้า ในทางกลับกันหากเราตั้งค่าbottom: 100px
องค์ประกอบจะถูกวางตำแหน่ง 100 พิกเซลจากด้านล่างของหน้า
นี่คือสิ่งที่ผู้มาใหม่ CSS หลงทาง -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">
ตอนนี้บริบทบริบทตำแหน่ง
อีกปัจจัยที่ต้องระวังคือการเรียงลำดับสแต็กหรือองค์ประกอบที่ซ้อนกันในทิศทาง z สิ่งที่ต้องรู้ที่นี่คือลำดับสแต็กขององค์ประกอบคือตามค่าเริ่มต้นที่กำหนดโดยการย้อนกลับของลำดับในโครงสร้าง HTML ลองพิจารณาตัวอย่างต่อไปนี้:
<body>
<div>Bottom</div>
<div>Top</div>
</body>
ในตัวอย่างนี้หาก<div>
องค์ประกอบทั้งสองอยู่ในตำแหน่งเดียวกันในหน้า<div>Top</div>
องค์ประกอบจะครอบคลุม<div>Bottom</div>
องค์ประกอบนั้น เนื่องจาก<div>Top</div>
มา<div>Bottom</div>
ในโครงสร้าง HTML จึงมีลำดับการซ้อนสูงกว่า
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>
ลำดับการสแต็กสามารถเปลี่ยนแปลงได้ด้วย CSS โดยใช้คุณสมบัติ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>
โซลูชันสำรอง (กริด)
นี่คือโซลูชันทางเลือกโดยใช้ CSS Grid เพื่อจัดวาง.navi
องค์ประกอบกับ#infoi
องค์ประกอบทางด้านขวาสุด ฉันใช้grid
คุณสมบัติverbose เพื่อให้ชัดเจนที่สุด
: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 ใด ๆ ได้หมายความว่าเราไม่สามารถเพิ่มองค์ประกอบของ wrapper ได้ แต่เรายังสามารถสร้างเอฟเฟกต์ที่ต้องการได้
แทนการใช้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
แทน