Ketika batas 1 px ditambahkan ke div, ukuran Div meningkat, Tidak ingin melakukan itu

128

Pada klik Saya menambahkan, 1px berbatasan dengan div, jadi ukuran Div bertambah 2px X 2px. Saya tidak ingin ukuran div bertambah. Apakah ada cara sederhana untuk melakukannya?

Penjelasan Terperinci Berantakan
Sebenarnya saya menambahkan DIV dengan float: left (ukuran yang sama, seperti ikon) ke container-div, jadi semua menumpuk satu demi satu, dan ketika (lebar container-div adalah 300px) tidak ada spasi yang tersisa Anak DIV datang di baris berikutnya, jadi seperti katalog, tetapi karena perbatasan hanya ukuran DIV yang dipilih yang bertambah, DIV di bawah DIV yang dipilih pergi ke kanan dan menciptakan ruang kosong di bawah DIV yang dipilih.

EDIT:
Mengurangi Tinggi / Lebar pada seleksi, tetapi bagaimana meningkatkannya kembali. Menggunakan beberapa kerangka pihak ke-3, jadi tidak ada acara ketika DIV kehilangan pilihan ..

Nachiket
sumber

Jawaban:

49

Properti border css akan meningkatkan semua elemen ukuran "luar", kecuali tds dalam tabel. Anda bisa mendapatkan gambaran visual tentang cara kerjanya di Firebug ( dihentikan ), di bawah tab tata letak html->.

Seperti contoh, div dengan lebar dan tinggi 10px dan border 1px, akan memiliki lebar dan tinggi 12px.

Untuk kasus Anda, untuk membuatnya tampak seperti bingkai berada di "dalam" div, di kelas CSS yang Anda pilih, Anda dapat mengurangi lebar dan tinggi elemen dengan menggandakan ukuran bingkai Anda, atau Anda dapat melakukan hal yang sama untuk elemen bantalan.

Misalnya:

div.navitem
{
    width: 15px;
    height: 15px;
    /* padding: 5px; */
}

div.navitem .selected
{
    border: 1px solid;
    width: 13px;
    height: 13px;
    /* padding: 4px */
}
Sean Amos
sumber
thnx, saya memiliki kelas .dragdrop-selected tetapi itu digunakan oleh semua objek yang dapat diseret dan saya memiliki 3 ukuran yang berbeda (3 jenis yang berbeda) dari objek yang dapat diseret, jadi saya tetap mengisi padding yang sama di semua 3 DAN mengatur padding di .dragdrop-selected. . & berhasil. :)
Nachiket
Ini bukan solusi yang baik untuk desain responsif. Menggunakan outlineatau perbatasan dengan warna yang sama dengan latar belakang (dan mengubah warnanya ke warna lain saat dipilih) lebih fleksibel.
AliBZ
1
Tapi misalkan Anda perlu menghindari hard-coding lebar, untuk membiarkan elemen mengalir atau merespons lebar view-port: lihat jawaban saya menggunakanborder-color: transparent
Edward Newell
Tidak perlu untuk perhitungan ini, cukup setel ukuran kotak ke kotak batas. Lihat jawaban ejfrancis di bawah , dan lihat artikel ini .
jbyrd
Apakah Anda yakin tentang td dalam tabel? Di Chrome sepertinya masih menambah ukuran.
Pelindung satu
105

Ini juga membantu dalam skenario ini. ini memungkinkan Anda untuk mengatur batas tanpa mengubah lebar div

textarea { 
  -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
  -moz-box-sizing: border-box;    /* Firefox, other Gecko */
  box-sizing: border-box;         /* Opera/IE 8+ */
}

Diambil dari http://css-tricks.com/box-sizing/

ejfrancis
sumber
4
box-sizing: border-box harus benar-benar diatur dalam segala hal sebagai praktik terbaik modern. Lihat paulirish.com/2012/box-sizing-border-box-ftw
jbyrd
6
Ini tampaknya tidak berhasil dalam beberapa kasus; tidak begitu yakin mengapa. Lihat: codepen.io/anon/pen/QZaBQG
Wilson Biggs
51

atur batas di atasnya sebelum Anda mengklik agar warnanya sama dengan latar belakang.

Kemudian ketika Anda mengklik ubah saja warna latar belakang dan lebarnya tidak akan berubah.

corymathews
sumber
3
Berbakat! Seandainya aku memikirkannya sendiri.
Rijul Gupta
9
Ya, tetapi jika Anda tidak memiliki latar belakang berwarna solid? Lihat jawaban saya menggunakanborder-color: transparent
Edward Newell
44

Solusi lain yang baik adalah dengan menggunakan outlinebukan border. Ini menambahkan batas tanpa mempengaruhi model kotak. Ini berfungsi di IE8 +, Chrome, Firefox, Opera, Safari.

( https://stackoverflow.com/a/8319190/2105930 )

chowey
sumber
Ini bagus, tapi dibandingkan dengan border, tidak ada "outline-left, ...", tidak untuk kasus saya.
Imskull
2
Maka saya sarankan menggunakan box-shadowper jawaban saya yang lain pada pertanyaan serupa. Itu tidak memiliki dukungan browser yang sama, tetapi itu bukan masalah hari ini.
chowey
Terima kasih #chowey, baru sadar box-shadowbisa mendukung perbatasan satu sisi juga, solusi prefek.
Imskull
border-color: transparentmemiliki dukungan lintas-browser yang lebih baik --- lihat jawaban saya ...
Edward Newell
1
Komentar ini diremehkan. Ini cara yang bagus untuk membuat perbatasan di sekitar elemen tanpa mengubah ukurannya!
Sebastian Nemeth
42

Coba ubah borderke outline:

outline: 1px solid black;
panwp
sumber
8
Bekerja kecuali jika Anda memiliki radius batas.
Jean-Marie Dalmasso
28

Setelah menggunakan banyak dari solusi ini, menurut saya menggunakan trik pengaturan border-color: transparentmenjadi yang paling fleksibel dan didukung secara luas:

.some-element {
    border: solid 1px transparent;
}

.some-element-selected {
    border: solid 1px black;
}

Mengapa lebih baik:

  • Tidak perlu melakukan hard-code untuk lebar elemen
  • Dukungan lintas-browser yang hebat (hanya IE6 yang terlewat)
  • Berbeda dengan outline, Anda masih dapat menentukan, misalnya, batas atas dan bawah secara terpisah
  • Tidak seperti mengatur warna perbatasan menjadi latar belakang, Anda tidak perlu memperbarui ini jika Anda mengubah latar belakang, dan itu kompatibel dengan latar belakang berwarna non-solid.
Edward Newell
sumber
1
Saya menemukan ini untuk bekerja paling baik dengan item berukuran dinamis di UX saya. Menghentikan sepenuhnya perubahan ukuran yang terjadi onMouseOver! Terima kasih Tuan Newell!
d3r3kk
Ramah. Terimakasih!
Harald Hoerwick
Itu dia!
sementara benar
transparentinilah yang dibutuhkan!
dimpiax
Inilah yang saya butuhkan (Y)
HaxxanRaxa
20

Coba ini

box-sizing: border-box;
Hoang Trung
sumber
4
Ini harus menjadi jawabannya, sangat sederhana.
Spesialis
Mengapa ini tidak berhasil di semua tempat? Misalnya codepen.io/anon/pen/QZaBQG
Tom
hai @ Tom, saya tidak yakin mengapa ini belum berhasil. Tetapi dalam kasus Anda, harap pertimbangkan untuk menghapus ketinggian dalam wadah dan menggunakan bantalan sebagai gantinya. Dapat memecahkan masalah Anda.
Hoang Trung
17

Saya biasanya menggunakan padding untuk mengatasi masalah ini. Padding akan ditambahkan saat pembatas menghilang dan dihapus saat pembatas muncul. Kode sampel:

.good-border {
  padding: 1px;
}

.good-border:hover {
  padding: 0px;
  border: 1px solid blue;
}

masukkan deskripsi gambar di sini

Lihat kode sampel lengkap saya di JSFiddle: https://jsfiddle.net/3t7vyebt/4/

Tho
sumber
1
Bisakah Anda ceritakan apa yang sebenarnya terjadi, saya bingung, mengapa di perbatasan yang buruk hover di sini bergeser ke bawah saat Anda mengarahkan kursor ke atasnya?
Suraj Jain
@SurajJain Karena ukuran div "perbatasan buruk" akan berubah (tambahkan batas 1px) saat Anda mengarahkan kursor ke atasnya.
Tho
6

Kurangi saja lebar dan tinggi dua kali lipat dari lebar bingkai

Sadat
sumber
3

Anda dapat melakukan beberapa hal mewah dengan bayangan inset. Contoh untuk meletakkan perbatasan di bagian bawah elemen tanpa mengubah ukurannya:

.bottom-border {
  box-shadow:inset 0px -3px 0px #000;
}
Luke Taylor
sumber
3

Terkadang Anda tidak ingin tinggi atau lebar terpengaruh tanpa menyetelnya secara eksplisit. Dalam hal ini, saya merasa terbantu dengan menggunakan elemen pseudo.

.border-me {
    position: relative;
}

.border-me::after {
    content: "";
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    border: solid 1px black;
}

Anda juga dapat melakukan lebih banyak hal dengan elemen pseudo sehingga ini adalah pola yang cukup kuat.

Jack Guy
sumber
1
Saya memiliki batas 1px yang ingin saya ubah menjadi 2px, dan satu-satunya cara yang dapat saya lakukan untuk melakukannya adalah dengan menghapus widthdan heightdan menambahkan properti bottomdan leftselain topdan left, yang semuanya harus disetel dengan lebar yang berlawanan dari perbatasan asli (dalam kasus saya -1px). Peretasan hebat
Chase Sandmann
2

Coba kurangi ukuran margin saat Anda menambah batas

arun
sumber
2

Saya harus dapat "membatasi" elemen apa pun dengan menambahkan kelas dan tidak memengaruhi dimensinya. Solusi yang baik bagi saya adalah menggunakan box-shadow. Tetapi dalam beberapa kasus, efeknya tidak terlihat karena saudara kandung lainnya. Jadi saya menggabungkan kedua bayangan kotak khas serta bayangan kotak sisipan. Hasilnya adalah tampilan tepi tanpa mengubah dimensi apa pun.

Nilai dipisahkan dengan koma. Berikut contoh sederhananya:

.add_border {
    box-shadow:-1px 0 1px 1px rgba(0, 0, 0, 0.75), inset -1px 0 0 1px rgba(0, 0, 0, 0.75);
}

jsfiddle.dll

Sesuaikan dengan tampilan pilihan Anda dan Anda siap berangkat!

Chris
sumber
2

Kita juga bisa menggunakan fungsi css calc ()

width: calc(100% - 2px);

mengurangi 2px untuk perbatasan

Rajeev Singh
sumber
1
.filter_list_button_remove {
    border: 1px solid transparent; 
    background-color: transparent;
}
.filter_list_button_remove:hover {
    border: 1px solid; 
}
peevo
sumber
1
Saya pikir akan lebih membantu bagi OP dan pengunjung selanjutnya, bila Anda menambahkan beberapa penjelasan untuk maksud Anda.
Reporter
1

Anda bisa membuat elemen dengan border dengan warna yang sama dengan background Anda, lalu saat ingin menampilkan border, ubah saja warnanya.

Matt Karatilovly
sumber
1
Ya, tapi misalkan latar belakang Anda bukan warna solid ... lihat tanggapan saya berdasarkan penggunaanborder-color: transparent
Edward Newell
Atau bersama-sama sepertiul li a{border-bottom:2px solid transparent;} ul li a:hover{border-bottom:2px solid red;}
stackunderflow
0

Jika konten Anda divdirender secara dinamis dan Anda ingin menyetel tingginya, Anda dapat menggunakan trik sederhana dengan outline:

button {
    padding: 10px;
    border: 4px solid blue;
    border-radius: 4px;
    outline: 2px solid white;
    outline-offset: -4px;
}

button:hover {
    outline-color: transparent;
}

Contoh di sini: https://codepen.io/Happysk/pen/zeQzaZ

Matúš Šťastný
sumber
Sayangnya, garis besar tidak memiliki sudut membulat :(
M3RS
0

Anda dapat mencoba inset box-shadow

sesuatu seperti ini: box-shadow: inset 0px -5px 0px 0px #fff

menambahkan batas 5px putih ke bagian bawah elemen tanpa menambah ukuran

Mzard31
sumber