ฉันจะกำจัดการชดเชยขององค์ประกอบโดยใช้ CSS ได้อย่างไร


88

ฉันมีปัญหาในการวางตำแหน่งกับองค์ประกอบบางอย่างเมื่อตรวจสอบเครื่องมือสำหรับนักพัฒนา IE8 มันแสดงให้ฉันเห็นสิ่งนี้:

ออฟเซ็ตมาจากไหน?

ตอนนี้ฉันค่อนข้างแน่ใจว่าปัญหาของฉันคือ 12 ออฟเซ็ต แต่ฉันจะลบมันได้อย่างไร ฉันไม่พบการกล่าวถึงคุณสมบัติออฟเซ็ต CSS เราต้องการ Offset นอกเหนือจาก margin หรือไม่?

นี่คือรหัสที่สร้างสิ่งนี้:

 <div id="wahoo" style="border: solid 1px black; height:100px;">

    <asp:TextBox ID="inputBox" runat="server" />

    <input id="btnDropDown" type="button" style="width:26px; height:26px; background-position: center center; border-left-color: buttonface; background-image: url(Images/WebResource.gif); border-bottom-color: buttonface; border-top-color: buttonface; background-repeat: no-repeat; border-right-color: buttonface;"  tabindex="99" />

    <div id="ListboxWrapper" style="display:none; position:absolute; onfocusout="this.style.display = 'none'"">
       <asp:ListBox ID="lstBoxCompany" runat="server" AutoPostBack="True" OnSelectedIndexChanged="lstBoxCompany_SelectedIndexChanged" style="z-index: 100;" Width="300px" />               
    </div>

</div>

องค์ประกอบที่มีค่าชดเชยคือ inputBox


องค์ประกอบของคุณอยู่ในตำแหน่งหรือไม่ ตรวจสอบleftและtopคุณสมบัติ.
jessegavin

6
โค้ดเล็ก ๆ น้อย ๆ จะมีประโยชน์มากที่นี่ ไม่มีกฎ 'ชดเชย' ใน CSS แต่ IE มีแนวโน้มที่จะเพิ่มพิกเซลแบบสุ่มในตำแหน่งสุ่ม โดยปกติแล้วการลอยตัวและการวางตำแหน่ง
Alex

ฉันจะถือว่า 'ออฟเซ็ต' คือ 'พิกเซลที่เกี่ยวข้องกับองค์ประกอบอื่น ๆ ' - เช่นระยะขอบขององค์ประกอบก่อนหน้าที่ดันองค์ประกอบนี้ลง ฉันไม่มีเวลาทดลองกับ IE dev tools ในตอนนี้เพื่อหาคำตอบ
Quentin

ฉันได้เพิ่มโค้ดที่สมบูรณ์ด้วย CSS แบบอินไลน์เพื่อที่เราจะได้เห็นว่าเกิดอะไรขึ้น
m.edmondson

มีตัวอย่างหน้าเว็บที่เราสามารถดูได้หรือไม่ - ตัวอย่างเช่นเพื่อให้เราสามารถชี้ firebug ไปที่มันและเข้าใจหน้ากว้างขึ้น เช่นการควบคุมอินพุตของคุณสืบทอดมาร์จิ้นหรือช่องว่างภายในจากนิยาม css อื่นหรือไม่
Kris C

คำตอบ:


43

ค่าชดเชยนั้นโดยพื้นฐานแล้วคือตำแหน่ง x, y ที่เบราว์เซอร์คำนวณสำหรับองค์ประกอบตามแอตทริบิวต์ตำแหน่ง css ดังนั้นถ้าคุณใส่<br>ก่อนมันหรือองค์ประกอบอื่น ๆ มันจะเปลี่ยนออฟเซ็ต ตัวอย่างเช่นคุณสามารถตั้งค่าเป็น 0 โดย:

#inputBox{position:absolute;top:0px;left:0px;}

หรือ

#inputBox{position:relative;top:-12px;left:-2px;}

ดังนั้นปัญหาการวางตำแหน่งใด ๆ ที่คุณมีไม่จำเป็นต้องเป็นปัญหากับการชดเชยแม้ว่าคุณจะแก้ไขได้โดยการเล่นกับแอตทริบิวต์ด้านบนซ้ายขวาและล่าง

ปัญหาของเบราว์เซอร์เข้ากันไม่ได้หรือไม่?


2
โปรดดูความคิดเห็นของ Stony เกี่ยวกับแนวตั้งเช่นกัน การแก้ไขการตั้งค่าการจัดตำแหน่งดูเหมือนว่าจะดีกว่าในการบังคับให้มีการบังคับแทนที่การวางตำแหน่งองค์ประกอบของเบราว์เซอร์
Jeremy Condit

33

สำหรับฉันมันเป็นvertical-align: baselineเทียบกับvertical-align: topที่ทำให้เกิดการชดเชยด้านบน

ลองตั้งค่า vertical-align: top


2
สิ่งนี้ดีกว่าการใช้การกำหนดตำแหน่งแบบสัมบูรณ์
user1

2
คำตอบของคุณยอดเยี่ยมความจริงที่ว่าฉันต้องตั้งค่าแนวตั้งเมื่อฉันมี 4 อินไลน์บล็อก Divs ที่ปฏิเสธที่จะจัดแนวเป็นวัว คุณสิ้นสุดชั่วโมงการทำงาน ขอขอบคุณ.
Corey Ogburn

ทำงานโดย<button>ฝังอยู่ใน<li>องค์ประกอบ
Amessihel

9

แก้ไขด่วน:

position: relative;
top: -12px;
left: -2px;

สิ่งนี้ควรทำให้สมดุลกับการชดเชยเหล่านั้น แต่บางทีคุณควรดูเลย์เอาต์ทั้งหมดของคุณและดูว่ากล่องนั้นโต้ตอบกับกล่องอื่นอย่างไร

ในฐานะที่เป็นคำศัพท์left, right, topและbottomมี CSS ชดเชยคุณสมบัติ ใช้สำหรับการกำหนดตำแหน่งองค์ประกอบในตำแหน่งเฉพาะ (เมื่อใช้กับตำแหน่งabsoluteหรือการfixedวางตำแหน่ง) หรือเพื่อเคลื่อนย้ายโดยเทียบกับตำแหน่งเริ่มต้น (เมื่อใช้กับการrelativeกำหนดตำแหน่ง) ในทางกลับกันระยะขอบระบุช่องว่างระหว่างกล่องและบางครั้งก็ยุบดังนั้นจึงไม่สามารถใช้เป็นค่าชดเชยได้อย่างน่าเชื่อถือ

แต่โปรดทราบว่าในกรณีของคุณการชดเชยอาจไม่ได้คำนวณ (แต่เพียงอย่างเดียว) จากออฟเซ็ต CSS


นั่นก็แค่ย้ายช่องว่างไปอีกด้านหนึ่งขององค์ประกอบ
Quentin

@ เดวิดช่องว่างอะไร? และทำไมสิ่งอื่นที่ไม่ใช่กล่องเป้าหมายจะถูกย้าย?
Alin Purcaru

ช่องว่างคือช่องว่างที่ไม่มีอะไรอยู่ในนั้น สิ่งอื่นนอกเหนือจากกล่องเป้าหมายจะไม่ถูกย้ายนั่นคือประเด็น หากคุณมีบางอย่างด้านล่าง 1px และคุณเลื่อนขึ้น 12px แสดงว่าเป็น 13px ด้านล่างแทนที่จะเป็น 1px
Quentin

2
@David เราอาจไม่มีนิยามของช่องว่างเหมือนกัน แต่ฉันเข้าใจในสิ่งที่คุณพยายามจะพูด ฉันยอมรับว่าช่องว่างจะถูกย้ายไปอีกด้านหนึ่ง ฉันระบุว่าโซลูชันนี้เป็น "การแก้ไขด่วน" เพราะอาจใช้งานได้หรือไม่ได้ เป็นสิ่งเดียวที่ฉันแนะนำได้จนกว่าผู้ถามจะให้รายละเอียดเพิ่มเติม
Alin Purcaru

3

การตั้งค่าคุณสมบัติด้านบนและด้านซ้ายเป็นค่าลบอาจไม่ใช่วิธีแก้ปัญหาที่ดีหากปัญหาของคุณคือคุณอยู่ในโหมดแปลก ๆ กรณีนี้อาจเกิดขึ้นได้หากเพจไม่มีการ<!DOCTYPE>ประกาศทำให้แสดงผลในโหมดแปลก ๆ ใน IE8 ใน IE8 Developer Tools ตรวจสอบให้แน่ใจว่าไม่ได้เลือก "Quirks Mode" ใน "Document Mode" หากถูกเลือกคุณอาจต้องเพิ่มการ<!DOCTYPE>ประกาศที่เหมาะสม


2

หากคุณกำลังใช้เครื่องมือสำหรับนักพัฒนา IE ตรวจสอบให้แน่ใจว่าคุณไม่ได้ตั้งใจทิ้งไว้ที่การตั้งค่าที่เก่ากว่า ฉันกำลังทำให้ตัวเองคลั่งไคล้กับปัญหาเดียวกันนี้จนกระทั่งฉันเห็นว่ามันถูกตั้งค่าเป็นมาตรฐานของ Internet Explorer 7 เปลี่ยนเป็นมาตรฐานของ Internet Explorer 9 และทุกอย่างก็เข้าที่


1
พวกเราบางคนมีผู้ใช้ที่ยังใช้ IE7
15ee8f99-57ff-4f92-890c-b56153

2

การเคลื่อนย้ายองค์ประกอบด้านบน: -12px หรือการวางตำแหน่งไม่ได้ช่วยแก้ปัญหา แต่เพียงมาสก์

ฉันมีปัญหาเดียวกัน - ตรวจสอบว่าคุณมีองค์ประกอบการห่อแบบผสมอยู่หรือไม่: องค์ประกอบลอยกับองค์ประกอบที่ไม่ลอย - องค์ประกอบที่ไม่ลอยของฉันทำให้เกิดการชดเชยที่แปลกประหลาดนี้กับองค์ประกอบที่ลอยอยู่


ในกรณีของฉันฉันพยายามจับคู่รูปลักษณ์ของเว็บไซต์กับของต้นแบบ ฉันมีแถวของ Divs แบบอินไลน์บล็อกที่มีความกว้างเท่ากันกับต้นแบบ แต่ออฟเซ็ตของฉันลดลง 4 ฉันพบว่าฉันมี div แบบลอยและไม่ลอยอยู่ในเว็บไซต์ การทำให้ทั้งหมดลอยลบการชดเชยพิเศษ สิ่งนี้น่างงเป็นพิเศษเพราะฉันมองไม่เห็นความแตกต่างระหว่าง CSS มากนัก
Clint Brown

1

กำหนดระยะขอบและช่องว่างภายในสำหรับองค์ประกอบที่ประสบปัญหา:

#element_id {margin: 0; padding: 0}  

และดูว่ามีปัญหาหรือไม่ IE แสดงผลหน้าด้วยการสืบทอดที่ไม่ต้องการมากขึ้น คุณควรหยุดไม่ให้ทำเช่นนั้น


1

นี้ดูเหมือนว่าแปลก แต่คุณสามารถลองตั้งค่าvertical-align: topในCSSสำหรับปัจจัยการผลิต ซึ่งแก้ไขได้ใน IE8 เป็นอย่างน้อย


1

ฉันมีปัญหาเดียวกันในเว็บไซต์ที่ใช้. NET ซึ่งทำงานบน DotNetNuke (DNN) และสิ่งที่แก้ไขได้สำหรับฉันก็คือการรีเซ็ตระยะขอบอย่างง่ายของแท็กฟอร์ม เว็บไซต์ที่ใช้. NET มักถูกรวมไว้ในรูปแบบและโดยไม่ต้องรีเซ็ตระยะขอบคุณจะเห็นการชดเชยแปลก ๆ ปรากฏขึ้นในบางครั้งโดยส่วนใหญ่จะมีสคริปต์บางส่วนรวมอยู่ด้วย

ดังนั้นหากคุณกำลังพยายามแก้ไขปัญหานี้ในไซต์ของคุณให้ลองป้อนสิ่งนี้ลงในไฟล์ CSS ของคุณ:

form {
  margin: 0;
}

ฉันมีปัญหาเดียวกันและการเปลี่ยนระยะขอบแบบฟอร์มก็ใช้ได้ผลสำหรับฉัน
David Derman

0

คุณสามารถใช้รีเซ็ต css เพื่อกำจัด 'ค่าเริ่มต้น' เหล่านั้นได้ นี่คือตัวอย่างของ CSS รีเซ็ตhttp://meyerweb.com/eric/tools/css/reset/ เพียงใช้รูปแบบการรีเซ็ตก่อนสไตล์ของคุณเอง


0

ผมมีปัญหาเดียวกัน. ค่าชดเชยปรากฏขึ้นหลังจากการรีเฟรช UpdatePanel วิธีแก้คือเพิ่มแท็กว่างก่อน UpdatePanel ดังนี้:

<div></div>

...


1
UpdatePanel เป็น ASP.NET ใช่มั้ย? เพราะดูเหมือนจะไม่ใช่คำถาม ASP.NET
Joe Mabel

ในความเป็นจริงหากคุณดูข้อมูลโค้ดในคำถามคุณจะสังเกตเห็นว่าเป็นคำถาม ASP.NET
mitkob

อา. ขออภัยเพิ่งอ่านไม่ได้สังเกต asp: TextBox FWIW ที่ปัญหาไม่ได้เป็น ASP.NET ปัญหา เมื่อปัญหานี้ปรากฏขึ้นโดยทั่วไปความหมายคือค่าชดเชยที่เป็นปัญหาเกิดจากองค์ประกอบอื่น ๆ มีขนาดใหญ่ขึ้นและหากส่งผลให้รูปแบบที่ไม่ดีโดยปกติคีย์จะลดระยะขอบช่องว่างภายในหรือเส้นขอบในองค์ประกอบอื่น ๆ ภายใน div ระดับบนสุดเดียวกัน
Joe Mabel


0

ในกรณีของฉันมีการเพิ่มออฟเซ็ตให้กับองค์ประกอบที่กำหนดเองด้วยเค้าโครงตารางภายใน li ในขณะที่ ul เป็น flexbox แนวตั้ง

ป้อนคำอธิบายภาพที่นี่

วิธีแก้ปัญหาที่ค่อนข้างง่ายคือตั้งค่ากำหนด li เป็นองค์ประกอบบล็อกด้วย

li {
 display: block;
}

และการชดเชยก็หายไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.