Bagaimana cara menghilangkan elemen offset menggunakan CSS?

88

Saya punya masalah pemosisian dengan beberapa elemen, setelah memeriksanya alat Pengembang IE8 itu menunjukkan kepada saya ini:

Dari mana asal offset?

Sekarang saya cukup yakin masalah saya adalah 12 offset itu, tetapi bagaimana cara menghapusnya ? Saya tidak dapat menemukan penyebutan properti CSS offset. Apakah kita membutuhkan Offset selain margin?

Berikut adalah kode yang menghasilkan ini:

 <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>

Elemen dengan offset adalah inputBox

m.edmondson
sumber
Apakah elemen Anda diposisikan? Periksa leftdan topproperti.
jessegavin
6
Sedikit kode akan sangat berguna di sini. Tidak ada aturan 'offset' dalam CSS, tetapi IE memiliki kecenderungan untuk menambahkan piksel acak di tempat acak. Ini biasanya berkaitan dengan float dan positioning
Alex
Saya akan berasumsi 'offset' adalah 'piksel yang terkait dengan elemen lain' - seperti margin pada elemen sebelumnya yang mendorong yang satu ini ke bawah. Saya tidak punya waktu untuk bereksperimen dengan alat dev IE sekarang untuk mencari tahu.
Quentin
Saya telah menambahkan kode lengkap dengan inline CSS sehingga kita dapat melihat apa yang terjadi
m.edmondson
Apakah ada contoh halaman web yang dapat kita lihat tentang ini - misalnya agar kita dapat mengarahkan firebug ke sana dan memahami halaman yang lebih luas. Misalnya apakah kontrol input Anda mewarisi margin atau padding dari definisi css lain?
Kris C

Jawaban:

43

Offset itu pada dasarnya adalah posisi x, y yang telah dihitung browser untuk elemen berdasarkan atribut css posisinya. Jadi jika Anda meletakkan <br>sebelum itu atau elemen lain, itu akan mengubah offset. Misalnya, Anda dapat menyetelnya menjadi 0 dengan:

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

atau

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

Oleh karena itu, masalah pemosisian apa pun yang Anda miliki, belum tentu merupakan masalah dengan offset, meskipun Anda selalu dapat memperbaikinya dengan memainkan atribut atas, kiri, kanan, dan bawah.

Apakah masalah Anda tidak kompatibel dengan browser?

Neo
sumber
2
Silakan lihat komentar Stony tentang perataan vertikal juga. Memperbaiki pengaturan penyelarasan tampaknya lebih baik daripada mengganti posisi elemen secara paksa di browser.
Jeremy Condit
33

Bagi saya, itu vertical-align: baselinevs vertical-align: topyang menyebabkan offset teratas.

Cobalah untuk mengatur vertical-align: top

Richard
sumber
2
Ini lebih baik daripada menggunakan pemosisian absolut
pengguna1
2
Jawaban Anda luar biasa, fakta bahwa saya harus menyetel perataan vertikal ketika saya memiliki 4 div blok sebaris yang menolak untuk disejajarkan adalah banteng. Anda mengakhiri jam kerja. Terima kasih.
Corey Ogburn
Bekerja dengan elemen yang <button>disematkan <li>.
Amessihel
9

Perbaikan cepat:

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

ini harus menyeimbangkan offset tersebut, tetapi mungkin Anda harus melihat seluruh tata letak Anda dan melihat bagaimana kotak itu berinteraksi dengan kotak lain.

Adapun terminologi, left, right, topdan bottomadalah CSS mengimbangi properti. Mereka digunakan untuk memosisikan elemen di lokasi tertentu (saat digunakan dengan absoluteatau fixedmemposisikan), atau untuk memindahkannya relatif ke lokasi defaultnya (saat digunakan dengan relativepemosisian). Margin di sisi lain menentukan celah antara kotak dan terkadang menciut, sehingga tidak dapat digunakan sebagai offset dengan andal.

Namun perhatikan bahwa dalam kasus Anda, offset tersebut tidak dapat dihitung (hanya) dari offset CSS.

Alin Purcaru
sumber
Itu hanya memindahkan spasi putih ke sisi lain elemen.
Quentin
@David Whitespace apa? Dan mengapa selain kotak yang ditargetkan akan dipindahkan?
Alin Purcaru
Spasi putih adalah ruang yang tidak ada isinya. Hal-hal selain kotak yang ditargetkan tidak akan dipindahkan, itulah intinya. Jika Anda memiliki sesuatu 1px di bawah, dan Anda naik 12px, maka itu adalah 13px di bawah, bukan 1px.
Quentin
2
@ David Kami mungkin tidak memiliki definisi spasi putih yang sama, tapi saya mengerti apa yang ingin Anda katakan. Saya setuju bahwa celah akan dipindahkan ke sisi lain. Saya memberi label solusi sebagai "perbaikan cepat" karena mungkin atau mungkin tidak dapat digunakan. Itu satu-satunya hal yang dapat saya sarankan sampai penanya memberikan rincian lebih lanjut.
Alin Purcaru
3

Menyetel properti atas dan kiri ke nilai negatif mungkin bukan solusi yang baik jika masalah Anda hanya karena Anda berada dalam mode quirks. Hal ini dapat terjadi jika halaman kehilangan <!DOCTYPE>deklarasi, menyebabkannya dirender dalam mode quirks di IE8. Di Alat Pengembang IE8, pastikan bahwa "Mode Quirks" tidak dipilih di bawah "Mode Dokumen". Jika dipilih, Anda mungkin perlu menambahkan <!DOCTYPE>pernyataan yang sesuai .

regularmike
sumber
2

Jika Anda menggunakan alat pengembang IE, pastikan Anda tidak meninggalkannya secara tidak sengaja di pengaturan yang lebih lama. Saya membuat diri saya sendiri gila dengan masalah yang sama sampai saya melihat bahwa itu telah diatur ke Standar Internet Explorer 7. Mengubahnya menjadi Standar Internet Explorer 9 dan semuanya langsung ke tempatnya.

Tom McGee
sumber
1
Beberapa dari kita memiliki pengguna yang masih menggunakan IE7.
15ee8f99-57ff-4f92-890c-b56153
2

memindahkan elemen atas: -12px atau memposisikannya sama sekali tidak menyelesaikan masalah tetapi hanya menutupinya

Saya memiliki masalah yang sama - periksa apakah Anda memiliki satu elemen pembungkus yang dicampur: elemen mengambang dengan elemen non-mengambang - elemen non-mengambang saya menyebabkan offset aneh ini ke yang mengambang

Picard
sumber
Dalam kasus saya, saya mencoba mencocokkan tampilan situs web dengan prototipe. Saya memiliki deretan div blok sebaris dengan lebar yang sama dengan prototipe, tetapi offset saya meleset sebesar 4. Saya menemukan bahwa saya memiliki campuran div mengambang dan non-mengambang di situs web. Membuat semuanya mengambang menghilangkan offset ekstra. Ini sangat membingungkan karena saya tidak bisa melihat banyak perbedaan lain di antara CSS.
Clint Brown
1

tentukan margin dan padding untuk elemen yang menghadapi masalah:

#element_id {margin: 0; padding: 0}  

dan lihat apakah ada masalah. IE merender laman dengan warisan yang lebih tidak diinginkan. Anda harus menghentikannya.

Pmpr
sumber
1

Hal ini tampaknya aneh, tapi Anda dapat mencoba pengaturan vertical-align: topdi CSSatas masukan. Itu memperbaikinya di IE8, setidaknya.

BrainCoder
sumber
1

Saya memiliki masalah yang sama di situs web berbasis .NET kami, berjalan di DotNetNuke (DNN) dan yang menyelesaikannya bagi saya pada dasarnya adalah pengaturan ulang margin sederhana dari tag formulir. Situs web berbasis .NET sering kali dibungkus dalam bentuk dan tanpa mengatur ulang margin Anda dapat melihat offset aneh kadang-kadang muncul, kebanyakan ketika ada beberapa skrip yang disertakan.

Jadi jika Anda mencoba untuk memperbaiki masalah ini di situs Anda, coba masukkan ini ke dalam file CSS Anda:

form {
  margin: 0;
}
Vlastique
sumber
Saya memiliki masalah yang sama dan mengubah margin formulir juga berhasil untuk saya.
David Derman
0

Anda dapat menerapkan reset css untuk menghilangkan 'default' tersebut. Berikut adalah contoh reset css http://meyerweb.com/eric/tools/css/reset/ . Cukup terapkan gaya setel ulang SEBELUM gaya Anda sendiri.

sawe
sumber
0

Saya memiliki masalah yang sama. Offset muncul setelah pembaruan UpdatePanel. Solusinya adalah menambahkan tag kosong sebelum UpdatePanel seperti ini:

<div></div>

...

mitkob
sumber
1
UpdatePanel adalah hal ASP.NET, bukan? Karena ini sepertinya bukan pertanyaan ASP.NET.
Joe Mabel
Bahkan jika Anda melihat potongan kode dalam pertanyaan Anda akan melihat bahwa itu adalah pertanyaan ASP.NET.
mitkob
Ah. Maaf, baru saja membaca sepintas, tidak memperhatikan asp: TextBox. FWIW, masalahnya bukan masalah ASP.NET . Saat masalah ini muncul, biasanya artinya offset yang dimaksud disebabkan oleh beberapa elemen lain yang lebih besar, dan jika menghasilkan tata letak yang buruk, kuncinya biasanya untuk mengurangi margin, padding, atau batas pada beberapa elemen lain di dalamnya. div induk yang sama.
Joe Mabel
0

Atur saja garis luarnya menjadi tidak seperti ini

[Identifier] {outline: none; }

Daniel Barde
sumber
0

Dalam kasus saya, offset ditambahkan ke elemen kustom dengan tata letak grid dalam li sedangkan ul adalah flexbox vertikal.

masukkan deskripsi gambar di sini

Solusi yang cukup sederhana adalah dengan mengatur mendefinisikan li sebagai elemen blok

li {
 display: block;
}

Dan offsetnya hilang

Th3S4mur41
sumber