ความแตกต่างระหว่างposition: relative
และposition: absolute
ใน CSS คืออะไร? และเมื่อใดที่คุณควรใช้อันไหน
ความแตกต่างระหว่างposition: relative
และposition: absolute
ใน CSS คืออะไร? และเมื่อใดที่คุณควรใช้อันไหน
คำตอบ:
การวางตำแหน่ง CSS แบบสัมบูรณ์
position: absolute;
การจัดตำแหน่งแบบสัมบูรณ์เป็นวิธีที่เข้าใจง่ายที่สุด คุณเริ่มต้นด้วยposition
คุณสมบัติCSS :
position: absolute;
สิ่งนี้จะบอกเบราว์เซอร์ว่าอะไรก็ตามที่จะถูกวางตำแหน่งควรถูกลบออกจากโฟลว์ปกติของเอกสารและจะถูกวางในตำแหน่งที่แน่นอนบนหน้าเว็บ มันจะไม่ส่งผลกระทบต่อองค์ประกอบก่อนหน้าหรือหลังองค์ประกอบใน HTML บนหน้าเว็บอย่างไรก็ตามมันจะขึ้นอยู่กับการวางตำแหน่งของผู้ปกครองเว้นแต่คุณจะแทนที่
หากคุณต้องการวางตำแหน่งองค์ประกอบ 10 พิกเซลจากด้านบนของหน้าต่างเอกสารคุณจะใช้top
ออฟเซ็ตไปที่position
นั่นด้วยการabsolute
วางตำแหน่ง:
position: absolute;
top: 10px;
องค์ประกอบนี้จะแสดง10px
จากด้านบนของหน้าทุกครั้งโดยไม่คำนึงถึงเนื้อหาที่ส่งผ่านภายใต้หรือเหนือองค์ประกอบ (มองเห็น)
คุณสมบัติการกำหนดตำแหน่งสี่อย่าง ได้แก่ :
top
right
bottom
left
ในการใช้งานคุณต้องคิดว่ามันเป็นคุณสมบัติออฟเซ็ต ในคำอื่น ๆ เป็นองค์ประกอบในตำแหน่งที่ไม่ได้ย้ายไปทางขวาright: 2px
2px
มันด้านขวาจะชดเชยจากด้านขวาของหน้าต่าง (หรือตำแหน่งเอาชนะหลัก) 2px
โดย เช่นเดียวกับอีกสามประการ
การวางตำแหน่งสัมพัทธ์
position: relative;
การวางตำแหน่งสัมพัทธ์ใช้คุณสมบัติการกำหนดตำแหน่งสี่แบบเดียวกันกับการabsolute
จัดตำแหน่ง แต่แทนที่จะยึดตำแหน่งขององค์ประกอบบนพอร์ตมุมมองเบราว์เซอร์ก็จะเริ่มจากการที่องค์ประกอบจะเป็นถ้ามันยังอยู่ในปกติการไหล
ตัวอย่างเช่นหากคุณมีสามย่อหน้าในหน้าเว็บของคุณและส่วนที่สามมีposition: relative
สไตล์วางไว้ตำแหน่งของมันจะถูกชดเชยตามตำแหน่งปัจจุบัน - ไม่ใช่จากด้านเดิมของพอร์ตมุมมอง
ย่อหน้า 1
วรรค 2
วรรค 3 ในตัวอย่างด้านบนย่อหน้าที่สามจะถูกวางตำแหน่ง3em
จากด้านซ้ายขององค์ประกอบคอนเทนเนอร์ แต่จะยังคงต่ำกว่าสองย่อหน้าแรก มันจะยังคงอยู่ในการไหลปกติของเอกสารและจะถูกชดเชยเล็กน้อย หากคุณเปลี่ยนเป็นposition: absolute;
สิ่งใดก็ตามที่ตามมาจะปรากฏอยู่ด้านบนเพราะจะไม่อยู่ในขั้นตอนปกติของเอกสารอีกต่อไป
หมายเหตุ:
ค่าเริ่มต้นwidth
ขององค์ประกอบที่อยู่ในตำแหน่งอย่างแน่นอนคือความกว้างของเนื้อหาภายในซึ่งแตกต่างจากองค์ประกอบที่ค่อนข้างอยู่ในตำแหน่งที่ค่าเริ่มต้นwidth
คือ100%
พื้นที่ที่สามารถเติมได้
คุณสามารถมีองค์ประกอบที่ทับซ้อนกับองค์ประกอบที่มีการจัดวางอย่างแน่นอนในขณะที่คุณไม่สามารถทำสิ่งนี้ได้ด้วยองค์ประกอบที่มีการจัดตำแหน่งที่ค่อนข้างมาก
ล็อตที่ดึงมาจาก: แหล่งข้อมูลนี้
ทั้งตำแหน่ง“ สัมพันธ์” และ“ สัมบูรณ์” นั้นสัมพันธ์กันจริง ๆ เพียงแค่มีกรอบงานที่แตกต่างกัน การจัดตำแหน่ง“ สัมบูรณ์” สัมพันธ์กับตำแหน่งของอีกองค์ประกอบล้อมรอบ การวางตำแหน่ง“ สัมพันธ์” สัมพันธ์กับตำแหน่งที่องค์ประกอบนั้นจะไม่มีโดยไม่มีการกำหนดตำแหน่ง
ขึ้นอยู่กับความต้องการและเป้าหมายที่คุณใช้ ตำแหน่ง“ สัมพันธ์” เหมาะสมเมื่อคุณต้องการแทนที่องค์ประกอบจากตำแหน่งที่จะมีในการไหลขององค์ประกอบเช่นเพื่อให้ตัวละครบางตัวปรากฏในตำแหน่งตัวยก การจัดตำแหน่ง“ แอบโซลูท” เหมาะสำหรับการวางองค์ประกอบในระบบพิกัดที่ตั้งค่าโดยองค์ประกอบอื่นบางอย่างเช่นเพื่อ "พิมพ์ทับ" ภาพที่มีข้อความ
ในฐานะพิเศษให้ใช้การวางตำแหน่ง“ สัมพัทธ์” โดยไม่มีการกระจัด (เพียงแค่ตั้งค่าposition: relative
) เพื่อทำให้องค์ประกอบเป็นกรอบอ้างอิงเพื่อให้คุณสามารถใช้การจัดตำแหน่ง“ สมบูรณ์” สำหรับองค์ประกอบที่อยู่ภายใน (ในมาร์กอัป)
Relative positioning is relative to the position that the element itself would have without positioning
?? องค์ประกอบที่ไม่มีการจัดตำแหน่งจะเป็น "คงที่" ตามค่าเริ่มต้น แต่ไม่ใช่แบบสัมพันธ์
สิ่งที่ควรทราบอีกประการหนึ่งคือถ้าคุณต้องการให้องค์ประกอบแบบสัมบูรณ์ถูก จำกัด ให้อยู่ในองค์ประกอบหลักคุณจะต้องตั้งค่าตำแหน่งขององค์ประกอบหลักเป็นแบบสัมพันธ์ ซึ่งจะทำให้องค์ประกอบลูกอยู่ในองค์ประกอบหลักและจะไม่ "สัมพันธ์" กับทั้งหน้าต่าง
ฉันเขียนโพสต์บล็อกที่ให้ตัวอย่างง่ายๆที่สร้างผลกระทบต่อไปนี้:
นั่นคือ div สีเขียวที่อยู่ในตำแหน่งด้านล่างของ div สีเหลืองหลัก
1 http://blog.troygrosfield.com/2013/02/11/working-with-css-positions-creating-a-simple-progress-bar/
ตำแหน่งญาติ
หากคุณระบุตำแหน่ง: สัมพัทธ์คุณสามารถใช้ด้านบนหรือด้านล่างและซ้ายหรือขวาเพื่อย้ายองค์ประกอบที่สัมพันธ์กับตำแหน่งที่มันจะเกิดขึ้นตามปกติในเอกสาร
ตำแหน่งที่แน่นอน:
เมื่อคุณระบุตำแหน่ง: แน่นอนองค์ประกอบจะถูกลบออกจากเอกสารและวางตรงที่คุณบอกให้ไป
นี่คือตัวอย่างการสอนที่ดีhttp://www.barelyfitz.com/screencast/html-training/css/positioning/พร้อมตัวอย่างการใช้งานของทั้งสองตำแหน่งตามลำดับและการวางตำแหน่งสัมพัทธ์
สัมพัทธ์: สัมพันธ์กับตำแหน่งปัจจุบัน แต่สามารถเคลื่อนย้ายได้ หรือองค์ประกอบตำแหน่งที่สัมพันธ์กันอยู่ในตำแหน่งที่สัมพันธ์กับ ITSELF
ค่าสัมบูรณ์:องค์ประกอบตำแหน่ง ABSOLUTE อยู่ในตำแหน่งที่สัมพันธ์กับตำแหน่งผู้ปกครองที่ใกล้เคียงที่สุด หากมีอยู่แล้วก็จะทำงานเหมือนคงที่ ..... เทียบกับหน้าต่าง
<div style="position:relative"> <!--2nd parent div-->
<div> <!--1st parent div-->
<div style="position:absolute;left:10px;....."> <!--Middle div-->
Md. Arif
</div>
</div>
</div>
ที่นี่ผู้ปกครอง 2 div
ตำแหน่งเป็นญาติดังนั้นกลางประสงค์เปลี่ยนตำแหน่งของมันด้วยความเคารพต่อผู้ปกครองdiv
2 div
หากผู้ปกครอง 1 div
ตำแหน่งจะญาติแล้วกลางหากว่าเปลี่ยนตำแหน่งของมันด้วยความเคารพต่อผู้ปกครองdiv
1 รายละเอียดdiv
ใส่คำตอบตามชื่อเสียงของฉันไม่เพียงพอที่จะแสดงความคิดเห็น แต่อย่าดูที่นี่เป็นคำตอบเพียงข้อมูลเพิ่มเติมเป็นตัวฉันเองมีปัญหาบางอย่างกับส่วนท้ายและการวางตำแหน่ง
เมื่อตั้งค่าหน้ากระดาษเพื่อให้ส่วนท้ายของฉันอยู่ที่ด้านล่างเสมอโดยมีตำแหน่งที่แน่นอนและที่เก็บหลัก / ตำแหน่งในตำแหน่งที่สัมพันธ์กัน
ฉันพบปัญหาบางอย่างกับเนื้อหาข้อความของฉันและเมนูภายในเนื้อหาเดียวกัน (ส่วนสีขาวของหน้าระหว่างส่วนหัวและส่วนท้าย) เมื่อตั้งค่าเหล่านี้เป็นแบบสัมบูรณ์ส่วนท้ายจะไม่หยุดทำงานอีกต่อไป
การโพสต์เป็นสิ่งที่คุณพูดถึงธีมที่ซับซ้อน
วิธีแก้ปัญหาของฉันไปที่เนื้อหาที่ฉันต้องการใน 'สัมบูรณ์' positon ในหน้าเว็บของฉันและไม่ถูกผลักไปด้านข้างเมื่อในตัวอย่างการเปิดเมนูแบบเลื่อนลงคือการให้ตำแหน่งสัมพัทธ์กับโพสต์จริง เมนู. (35em คือความสูงของเมนูแบบเลื่อนลงของฉันเมื่อขยายเต็มที่)
จากนั้นด้านบน: -35em สำหรับเนื้อหาที่ก่อนหน้านี้ถูกผลักไปด้านข้าง จากนั้นเพิ่มระยะขอบล่าง: -35em ด้วยวิธีนี้เนื้อหาคือ "ด้านล่าง" เมนูแบบเลื่อนลงของฉัน แต่เห็นได้ชัดว่ามันเป็นแบบเคียงข้างกับเมนูแบบเลื่อนลงของฉัน! และพื้นที่สีขาวด้านล่างลงไปถึงท้ายกระดาษนั้นมีระยะขอบเพียง 10em เหมือนก่อนที่จะเริ่มเล่นกับสิ่งนี้ ดังนั้นวิธีแก้ไขปัญหาของฉันเป็นเช่นนี้:
html, body {
margin:0;
padding:0;
height:100%;
}
h1 {
margin:0;
}
#webpage {
position:relative;
min-height:100%;
margin:0;
overflow:auto;
}
#header {
height:5em;
width:100%;
padding:0;
margin:0;
}
#text {
position:relative;
margin-bottom:-32em;
padding-top:2em;
padding-right:2em;
padding-bottom:10em;
background-repeat:no-repeat;
width:70%;
padding-left:auto;
margin-left:auto;
margin-right:auto;
right:10em;
float:right;
top:-32em;
}
#dropdown {
position:absolute;
left:0;
width:20%;
clear:both;
display:block;
position:relative;
top:1em;
height:35em;
}
#footer {
position:absolute;
width:100%;
right:0;
bottom:0;
height:5em;
margin:0;
margin-top:5em;
}
ฉันเห็นคำถามของคุณได้รับคำตอบที่ดี แต่หลังจากพบปัญหามากฉันพบว่านี่เป็นวิธีแก้ปัญหาที่ดีมากและวิธีที่จะเข้าใจได้ดีขึ้นว่าการวางตำแหน่งทำงานอย่างไรเมื่อฉันวางเนื้อหาข้อความของฉันใต้เมนูแบบเลื่อนลงของฉัน ไม่ดันข้อความไปด้านข้าง ถ้าฉันเปลี่ยนข้อความให้อยู่ในตำแหน่งที่แน่นอนส่วนท้ายไม่ได้อยู่ในตำแหน่ง เนื่องจากฉันเชื่อว่านี่เป็นปัญหาสำหรับผู้คนจำนวนมากแล้วสำหรับฉันฉันเพิ่มที่นี่ ที่จริงแล้วมีความสุขเกิดอะไรขึ้นฉันใส่ข้อความ 35 อันใต้ดรอปดาวน์ของฉัน
จากนั้นฉันมองเห็นมันติดกับแต่ละคนโดยมีตำแหน่งสัมพัทธ์และด้านบน: -35em ;, และออกพื้นที่กว้างใหญ่ด้านล่างด้วยขอบ: -35em;
ค่าลบจะถูกประเมินค่าต่ำกว่าในบางครั้งฟังก์ชั่นที่ดีมากเมื่อเราเข้าใจตำแหน่งเหล่านี้ดีกว่า!
โดยปกติแล้วตำแหน่งที่แน่นอนดูเหมือนตรรกะสำหรับส่วนท้ายของฉัน แต่ฉันต้องการให้ส่วนท้ายไปด้านล่างวิวพอร์ตหากข้อความหรือเนื้อหานั้นยาวกว่าวิวพอร์ต และอยู่ด้านล่างหากมีเนื้อหาเพียงเล็กน้อยในหน้า
setupp นี้แก้ไขได้เป็นอย่างดีและอย่าลืมใช้ 'em' ไม่ใช่ 'px' สำหรับเค้าโครงหน้ากระดาษที่มีความคล่องแคล่ว / ไดนามิกมากขึ้น! :)
(อาจมีวิธีแก้ปัญหาที่ดีกว่า แต่วิธีนี้ใช้ได้ผลสำหรับฉันข้ามแพลตฟอร์มเช่นเดียวกับอุปกรณ์)
สัมพัทธ์กับแอบโซลูท:
ลองอภิปรายสถานการณ์เพื่ออธิบายความแตกต่างระหว่างสัมบูรณ์เทียบกับญาติ
ภายในองค์ประกอบของร่างกายบอกว่าคุณมีองค์ประกอบส่วนหัวที่มีความสูง 95% ของความสูงคือ 95vh ภายในคอนเทนเนอร์นี้คุณวางรูปภาพและลดความทึบในการพูด 0.5 และตอนนี้คุณต้องการวางภาพโลโก้ใกล้กับมุมบนซ้าย ฉันหวังว่าคุณจะเข้าใจสถานการณ์ ดังนั้นคุณจะมีภาพจางลงในส่วนหัวที่มีโลโก้อยู่ด้านบนของมันในตำแหน่งที่ระบุ
แต่ก่อนที่จะเริ่มสิ่งนี้ฉันได้ตั้งระยะขอบและเติมเต็มเป็น 0 เช่นนี้
*{
margin:0px;
padding:0px;
box-sizing: border-box;
}
สิ่งนี้ทำให้มั่นใจได้ว่าจะไม่มีการกำหนดระยะขอบเริ่มต้นและการเติมเต็มให้กับองค์ประกอบ
เพื่อให้คุณสามารถบรรลุความต้องการของคุณได้สองวิธี
วิธีแรก
ใน css คุณเขียน
.logo{
float:left;
margin-top:40px;
margin-left:40px;
}
แต่เพื่อนของฉันนี่คือการออกแบบที่ไม่ดีเมื่อวางรูปภาพที่คุณใช้ไปโดยไม่จำเป็นต้องใช้พื้นที่มากโดยไม่จำเป็นต้องให้ระยะขอบเมื่อมันไม่จำเป็น สิ่งที่คุณต้องการคือการวางภาพไปยังตำแหน่งนั้น คุณจัดการด้วยการรองรับโดยมีระยะขอบรอบ ๆ ระยะขอบใช้พื้นที่และผลักดันเนื้อหาให้ลึกยิ่งขึ้นให้ความรู้สึกว่ามันอยู่ในตำแหน่งที่คุณต้องการ หวังว่าคุณจะเข้าใจปัญหานี้โดยการแก้ไขปัญหาเช่นนี้ คุณใช้พื้นที่มากเกินความจำเป็นในการวางภาพในตำแหน่งที่ต้องการ
ตอนนี้ลองใช้วิธีอื่น
วิธีที่สอง
คุณตั้งค่าคุณสมบัติตำแหน่งของคลาสส่วนหัวให้สัมพันธ์เช่นนี้
.header{
position: relative;
}
จากนั้นคุณเพิ่มคุณสมบัติต่อไปนี้ในคลาสโลโก้
.logo{
position:absolute;
top:40px;
left:40px
}
ไปแล้ว คุณวางภาพในที่เดียวกัน จะไม่มีความแตกต่างที่ชัดเจนในการวางตำแหน่งจากตาเปล่าระหว่างแนวทางแรกและแนวทางที่สอง แต่ถ้าคุณตรวจสอบองค์ประกอบภาพคุณจะพบว่ามันไม่ได้ใช้พื้นที่เพิ่มเติม มันครอบครองพื้นที่เดียวกันมากเท่ากับความกว้างและความสูงของตัวเอง
เป็นไปได้อย่างไร? ฉันพูดกับคลาสโลโก้รูปภาพที่คุณจะถูกวางเทียบกับคลาสส่วนหัวเนื่องจากคุณเป็นลูกของคลาสนี้และฉันได้กล่าวถึงตำแหน่งของมันในฐานะที่เกี่ยวข้องโดยเฉพาะ เพื่อให้ลูกของมันถูกวางเทียบกับมุมซ้ายบน และตำแหน่งของคุณจะต้องได้รับการแก้ไขภายในองค์ประกอบหลักนี้ ดังนั้นคุณจะได้รับแน่นอน. และคุณต้องขยับจากด้านบนและซ้ายไปยังตำแหน่งที่ฉันต้องการให้คุณเป็น ดังนั้นคุณจะได้รับคุณสมบัติด้านบนและด้านซ้ายด้วย 40px เป็นค่า ด้วยวิธีนี้คุณจะถูกวางให้สัมพันธ์กับพ่อแม่ของคุณเท่านั้น ดังนั้นหากพรุ่งนี้ฉันเลื่อนผู้ปกครองขึ้นหรือลงหรือที่ใดก็ตามคุณจะต้องอยู่ที่ 40px ขึ้นไปด้านบนและด้านซ้ายของมุมซ้ายบนของผู้ปกครองหลัก ดังนั้นตำแหน่งของคุณจะได้รับการแก้ไขภายในผู้ปกครองไม่ว่าตำแหน่งของผู้ปกครองจะได้รับการแก้ไขหรือไม่ในอนาคต (เนื่องจากไม่ใช่ตำแหน่งที่แน่นอนเช่นคุณ)
ดังนั้นใช้สัมพัทธ์และสัมบูรณ์สำหรับผู้ปกครองและลูกตามลำดับ ใช้ครั้งที่สองเมื่อคุณต้องการวางองค์ประกอบลูกในบางตำแหน่งภายในองค์ประกอบหลัก อย่าใช้ฟิลเลอร์เช่นขอบเพื่อผลักดันมัน กำหนดค่าพาเรนต์สัมพันธ์และชายด์ที่คุณต้องการย้ายค่าสัมบูรณ์ ระบุคุณสมบัติด้านบนด้านล่างซ้ายหรือขวาให้กับคลาสของเด็กเพื่อวางไว้ในพาเรนต์ทุกที่ที่คุณต้องการ
ขอบคุณ
Marco Pellicciotta: ตำแหน่งขององค์ประกอบภายในอีกองค์ประกอบสามารถสัมพันธ์กันหรือสัมบูรณ์เกี่ยวกับองค์ประกอบที่อยู่ภายใน
หากคุณต้องการวางตำแหน่งองค์ประกอบในมุมมองหน้าต่างเบราว์เซอร์มุมมองที่ดีที่สุดคือใช้ตำแหน่ง: แก้ไข