Cara menambah ruang di antara titik-titik batas bertitik

286

Saya menggunakan perbatasan gaya bertitik di kotak saya suka

.box {
    width: 300px;
    height: 200px;
    border: dotted 1px #f00;
    float: left;
}

Saya ingin menambah ruang antara setiap titik perbatasan.

Kali Charan Rajput
sumber

Jawaban:

444

Trik ini berfungsi untuk batas horizontal dan vertikal:

/*Horizontal*/
background-image: linear-gradient(to right, black 33%, rgba(255,255,255,0) 0%);
background-position: bottom;
background-size: 3px 1px;
background-repeat: repeat-x;

/*Vertical*/
background-image: linear-gradient(black 33%, rgba(255,255,255,0) 0%);
background-position: right;
background-size: 1px 3px;
background-repeat: repeat-y;

Anda dapat menyesuaikan ukuran dengan ukuran latar belakang dan proporsi dengan persentase linear-gradien. Dalam contoh ini saya memiliki garis titik-titik titik 1px dan spasi 2px. Dengan cara ini Anda dapat memiliki beberapa batas bertitik juga menggunakan beberapa latar belakang.

Cobalah di JSFiddle ini atau lihat contoh cuplikan kode:

Olivictor
sumber
26
Seharusnya jawaban yang dipilih.
Kevin Jurkowski
7
Iho itu hack n derajat.
Muhammad Umer
7
Saya ingin melakukan hal yang sama tetapi lebar garis putus-putus adalah 3px daripada 1px dan sekarang menjadi persegi daripada putus-putus.
Bhojendra Rauniyar
5
Saya telah membuat mixin SCSS untuk mengimplementasikan ini dan mengubah warna dan mengatur jarak dengan cepat. Lihat di github.com/florbraz/Dotted-Border-w-custom-spacing-SCSS-Mixin .
Flor Braz
5
Bagaimana jika saya ingin semua 4 tepi putus?
Ryan Shillington
141

Berikut adalah trik yang saya gunakan pada proyek baru-baru ini untuk mencapai hampir semua yang saya inginkan dengan batas horizontal. Saya menggunakan <hr/>setiap kali saya membutuhkan batas horisontal. Cara dasar untuk menambahkan perbatasan ke jam ini adalah sesuatu seperti

 hr {border-bottom: 1px dotted #000;}

Tetapi jika Anda ingin mengendalikan perbatasan dan, misalnya menambah, jarak antar titik, Anda dapat mencoba sesuatu seperti ini:

hr {
height:14px; /* specify a height for this hr */
overflow:hidden;
}

Dan berikut ini, Anda membuat perbatasan Anda (inilah contoh dengan titik-titik)

hr:after {
content:".......................................................................";
letter-spacing: 4px; /* Use letter-spacing to increase space between dots*/
}

Ini juga berarti bahwa Anda dapat menambahkan bayangan teks ke titik, gradien, dll. Apa pun yang Anda inginkan ...

Yah, ini bekerja sangat bagus untuk batas horizontal. Jika Anda membutuhkan yang vertikal, Anda dapat menentukan kelas untuk jam lain dan menggunakan rotationproperti CSS3 .

Mat
sumber
2
Apakah cross-browser ini kompatibel?
J82
57
Saya tidak bisa membayangkan betapa sakitnya di a ** itu untuk mempertahankan.
Kzqai
1
bagaimana cara mendapatkan efek yang sama untuk yang vertikal?
Rinku
4
@Rinku dengan transform: rotate (90deg); display: blok;
Jeroen K
4
sangat jelek, tapi sangat pintar :) Saya juga memperhatikan bahwa saya dapat memiliki kontrol yang lebih baik atas penempatan jika saya mengatur tinggi: 0; dan gunakan bantalan untuk mengontrol penempatan. Jadi saya ingin garis putus-putus di bagian bawah dengan ruang kecil di bawah jadi saya menggunakan padding: 0 0 10px;
MatthewLee
121

Anda tidak dapat melakukannya dengan CSS murni - spec CSS3 bahkan memiliki kutipan spesifik tentang ini:

Catatan: Tidak ada kontrol atas jarak titik-titik dan garis putus-putus, atau atas panjang garis putus-putus. Implementasi didorong untuk memilih spasi yang membuat sudut simetris.

Anda bisa, bagaimanapun, menggunakan baik perbatasan-gambar atau gambar latar belakang yang melakukan trik.

Shadikka
sumber
7
Anda dapat menggunakan gradien (CSS murni) untuk batas sepenuhnya dapat disesuaikan. Lihat jawaban di bawah ini
Olivictor
3
-1, @Shadikka, Apa CSS3 spesifikasi mengatakan adalah bahwa hal itu tidak dapat dilakukan dengan menggunakan border: dotted, tetapi adalah mungkin untuk melakukannya menggunakan gradien sebagai jawaban Eagorajose telah menunjukkan.
Pacerier
30

Ini menggunakan perbatasan CSS standar dan elemen pseudo + overflow: disembunyikan. Pada contoh Anda mendapatkan tiga garis putus-putus 2px berbeda: normal, spasi seperti 5px, spasi seperti 10px. Sebenarnya 10px dengan hanya 10-8 = 2px terlihat.

div.two{border:2px dashed #FF0000}

div.five:before {
  content: "";
  position: absolute;
  border: 5px dashed #FF0000;
  top: -3px;
  bottom: -3px;
  left: -3px;
  right: -3px;
}

div.ten:before {
  content: "";
  position: absolute;
  border: 10px dashed #FF0000;
  top: -8px;
  bottom: -8px;
  left: -8px;
  right: -8px;
}

div.odd:before {left:0;right:0;border-radius:60px}

div {
  overflow: hidden;
  position: relative;


  text-align:center;
  padding:10px;
  margin-bottom:20px;
}
<div class="two">Kupo nuts here</div>
<div class="five">Kupo nuts<br/>here</div>
<div class="ten">Kupo<br/>nuts<br/>here</div>
<div class="ten odd">Kupo<br/>nuts<br/>here</div>

Diterapkan pada elemen kecil dengan sudut bulat besar dapat membuat beberapa efek menyenangkan.

Lenioia
sumber
2
Kerja keras! Ini adalah satu-satunya jawaban yang benar-benar berfungsi tanpa harus dipertahankan, IMO. Bahkan jawaban yang diterima hanya bekerja untuk satu sisi div. Ini berfungsi untuk seluruh perbatasan.
Ryan Shillington
1
Sejauh ini, inilah jawaban terbaik dan paling elegan. Harus ditandai sebagai solusinya ...
Beejee
19

Jadi, mulailah dengan jawaban yang diberikan dan terapkan fakta bahwa CSS3 memungkinkan beberapa pengaturan - kode di bawah ini berguna untuk membuat kotak lengkap:

#border {
  width: 200px;
  height: 100px;
  background: yellow;
  text-align: center;
  line-height: 100px;
  background: linear-gradient(to right, orange 50%, rgba(255, 255, 255, 0) 0%), linear-gradient(blue 50%, rgba(255, 255, 255, 0) 0%), linear-gradient(to right, green 50%, rgba(255, 255, 255, 0) 0%), linear-gradient(red 50%, rgba(255, 255, 255, 0) 0%);
  background-position: top, right, bottom, left;
  background-repeat: repeat-x, repeat-y;
  background-size: 10px 1px, 1px 10px;
}
<div id="border">
  bordered area
</div>

Perlu dicatat bahwa 10px dalam ukuran latar belakang memberikan area yang akan ditutupi oleh dasbor dan celah. 50% dari tag latar belakang adalah seberapa lebar tanda hubung sebenarnya. Karena itu dimungkinkan untuk memiliki garis putus-putus yang berbeda di setiap sisi perbatasan.

Ukuser32
sumber
17

Lihat dokumen MDN untuk nilai yang tersedia untuk border-style:

  • tidak ada: Tanpa batas, set lebar menjadi 0. Ini adalah nilai default.
  • tersembunyi: Sama seperti 'tidak ada', kecuali dalam hal resolusi konflik perbatasan untuk elemen tabel.
  • putus-putus: Seri strip pendek atau segmen garis.
  • burik: Seri titik.
  • ganda: Dua garis lurus yang menambahkan hingga jumlah piksel yang didefinisikan sebagai lebar-batas.
  • alur: efek diukir.
  • inset: Membuat kotak tampak tertanam.
  • awal: Berlawanan dengan 'inset'. Membuat kotak muncul 3D (timbul).
  • ridge: Berlawanan dengan 'groove'. Perbatasan muncul 3D (keluar).
  • solid: Tunggal, lurus, garis solid.

Terlepas dari pilihan-pilihan itu, tidak ada cara untuk mempengaruhi gaya perbatasan standar.

Jika kemungkinan tidak sesuai dengan keinginan Anda, Anda dapat menggunakan CSS3 border-imagetetapi perhatikan bahwa dukungan browser untuk ini masih sangat jerawatan.

Pekka
sumber
terima kasih pekka, itu berarti saya tidak dapat menggunakan properti perbatasan ... jadi saya harus menggunakan gambar untuk itu.
Kali Charan Rajput
@ kc jika tidak ada gaya perbatasan yang sesuai dengan keinginan Anda, ya.
Pekka
8

Membangun solusi 4 edge berdasarkan jawaban @ Eagorajose dengan sintaks steno:

background: linear-gradient(to right, #000 33%, #fff 0%) top/10px 1px repeat-x, /* top */
linear-gradient(#000 33%, #fff 0%) right/1px 10px repeat-y, /* right */
linear-gradient(to right, #000 33%, #fff 0%) bottom/10px 1px repeat-x, /* bottom */
linear-gradient(#000 33%, #fff 0%) left/1px 10px repeat-y; /* left */

#page {
    background: linear-gradient(to right, #000 33%, #fff 0%) top/10px 1px repeat-x, /* top */
    linear-gradient(#000 33%, #fff 0%) right/1px 10px repeat-y, /* right */
    linear-gradient(to right, #000 33%, #fff 0%) bottom/10px 1px repeat-x, /* bottom */
    linear-gradient(#000 33%, #fff 0%) left/1px 10px repeat-y; /* left */
    
    width: 100px;
    height: 100px;
}
<div id="page"></div>

Aleksander Stelmaczonek
sumber
8

Ini adalah topik yang lama, tetapi masih sangat relevan. The arus atas jawabannya bekerja dengan baik, tapi hanya untuk titik-titik yang sangat kecil. Seperti yang telah ditunjukkan oleh Bhojendra Rauniyar dalam komentar, untuk titik yang lebih besar (> 2px), titik-titik tersebut tampak persegi, bukan bulat. Saya menemukan halaman ini mencari titik spasi , bukan kotak spasi (atau bahkan garis putus-putus, karena beberapa jawaban digunakan di sini).

Membangun ini, saya gunakan radial-gradient. Juga, menggunakan jawaban dari Ukuser32 , sifat-titik dapat dengan mudah diulang untuk keempat batas. Hanya sudut-sudutnya yang tidak sempurna.

div {
    padding: 1em;
    background-image:
        radial-gradient(circle at 2.5px, #000 1.25px, rgba(255,255,255,0) 2.5px),
        radial-gradient(circle, #000 1.25px, rgba(255,255,255,0) 2.5px),
        radial-gradient(circle at 2.5px, #000 1.25px, rgba(255,255,255,0) 2.5px),
        radial-gradient(circle, #000 1.25px, rgba(255,255,255,0) 2.5px);
    background-position: top, right, bottom, left;
    background-size: 15px 5px, 5px 15px;
    background-repeat: repeat-x, repeat-y;
}
<div>Some content with round, spaced dots as border</div>

Yang radial-gradient diharapkan :

  • bentuk dan posisi opsional
  • dua atau lebih berhenti: warna dan jari-jari

Di sini, saya ingin sebuah titik 5 pixel diameter (2.5px radius), dengan 2 kali diameter (10px) antara titik-titik, menambahkan hingga 15px. The background-sizeharus sesuai ini.

Kedua stop didefinisikan sedemikian rupa sehingga titiknya bagus dan halus: hitam pekat untuk setengah jari-jari dan daripada gradien ke jari-jari penuh.

Marten Koetsier
sumber
6

Ini adalah pertanyaan yang sangat lama tetapi memiliki peringkat tinggi di Google jadi saya akan membahas metode saya yang dapat bekerja tergantung pada kebutuhan Anda.

Dalam kasus saya, saya ingin garis putus-putus tebal yang memiliki sedikit celah di antara garis putus-putus. Saya menggunakan generator pola CSS (seperti ini: http://www.patternify.com/ ) untuk membuat lebar 10px dengan pola tinggi 1px. 9px itu adalah warna garis putus-putus, 1px berwarna putih.

Di CSS saya, saya memasukkan pola itu sebagai gambar latar belakang, dan kemudian meningkatkannya dengan menggunakan atribut ukuran latar belakang. Saya berakhir dengan 20px oleh 2px dasbor berulang, 18px dari itu menjadi garis solid dan 2px putih. Anda bisa meningkatkannya untuk garis putus-putus yang sangat tebal.

Yang menyenangkan adalah karena gambar dikodekan sebagai data Anda tidak memiliki tambahan permintaan HTTP luar, jadi tidak ada beban kinerja. Saya menyimpan gambar saya sebagai variabel SASS sehingga saya dapat menggunakannya kembali di situs saya.

Nick Angiolillo
sumber
2

Jawaban singkat: Anda tidak bisa.

Anda harus menggunakan border-imageproperti dan beberapa gambar.

Crozin
sumber
2

Begitu banyak orang mengatakan "Kamu tidak bisa". Ya kamu bisa. Memang benar bahwa tidak ada aturan css untuk mengontrol ruang selokan di antara tanda hubung tetapi css memiliki kemampuan lain. Jangan terlalu cepat mengatakan bahwa suatu hal tidak dapat dilakukan.

.hr {
    border-top: 5px dashed #CFCBCC;
    margin: 30px 0;
    position: relative;
}

.hr:before {
    background-color: #FFFFFF;
    content: "";
    height: 10px;
    position: absolute;
    top: -2px;
    width: 100%;
}

.hr:after {
    background-color: #FFFFFF;
    content: "";
    height: 10px;
    position: absolute;
    top: -13px;
    width: 100%;
}

Pada dasarnya tinggi batas atas (5px dalam kasus ini) adalah aturan yang menentukan selokan "lebar". Tentu saja Anda perlu menyesuaikan warna agar sesuai dengan kebutuhan Anda. Ini juga merupakan contoh kecil untuk garis horizontal, gunakan kiri dan kanan untuk membuat garis vertikal.

devinfd
sumber
1
Agar adil, saya pikir sebagian besar orang mengatakan Anda tidak bisa melakukannya dengan pertanyaan harfiah menyesuaikan gaya bertitik perbatasan. Mereka tidak mengatakan sesuatu yang serupa tidak mungkin menggunakan properti CSS lainnya. Menurut pendapat saya, jauh lebih masuk akal dari sudut pandang semantik untuk menggunakan gambar latar belakang atau gambar perbatasan seperti yang ditunjukkan orang lain, daripada menggunakan elemen pseudo dan selusin baris CSS.
Alex
2

Saya membuat fungsi javascript untuk membuat titik dengan svg. Anda dapat menyesuaikan jarak dan ukuran titik dalam kode javascript.

var make_dotted_borders = function() {
    // EDIT THESE SETTINGS:
    
    var spacing = 8;
    var dot_width = 2;
    var dot_height = 2;
    
    //---------------------

    var dotteds = document.getElementsByClassName("dotted");
    for (var i = 0; i < dotteds.length; i++) {
        var width = dotteds[i].clientWidth + 1.5;
        var height = dotteds[i].clientHeight;

        var horizontal_count = Math.floor(width / spacing);
        var h_spacing_percent = 100 / horizontal_count;
        var h_subtraction_percent = ((dot_width / 2) / width) * 100;

        var vertical_count = Math.floor(height / spacing);
        var v_spacing_percent = 100 / vertical_count;
        var v_subtraction_percent = ((dot_height / 2) / height) * 100;

        var dot_container = document.createElement("div");
        dot_container.classList.add("dot_container");
        dot_container.style.display = getComputedStyle(dotteds[i], null).display;

        var clone = dotteds[i].cloneNode(true);

        dotteds[i].parentElement.replaceChild(dot_container, dotteds[i]);
        dot_container.appendChild(clone);

        for (var x = 0; x < horizontal_count; x++) {
            // The Top Dots
            var dot = document.createElement("div");
            dot.classList.add("dot");
            dot.style.width = dot_width + "px";
            dot.style.height = dot_height + "px";

            var left_percent = (h_spacing_percent * x) - h_subtraction_percent;
            dot.style.left = left_percent + "%";
            dot.style.top = (-dot_height / 2) + "px";
            dot_container.appendChild(dot);

            // The Bottom Dots
            var dot = document.createElement("div");
            dot.classList.add("dot");
            dot.style.width = dot_width + "px";
            dot.style.height = dot_height + "px";

            dot.style.left = (h_spacing_percent * x) - h_subtraction_percent + "%";
            dot.style.top = height - (dot_height / 2) + "px";
            dot_container.appendChild(dot);
        }

        for (var y = 1; y < vertical_count; y++) {
            // The Left Dots:
            var dot = document.createElement("div");
            dot.classList.add("dot");
            dot.style.width = dot_width + "px";
            dot.style.height = dot_height + "px";

            dot.style.left = (-dot_width / 2) + "px";
            dot.style.top = (v_spacing_percent * y) - v_subtraction_percent + "%";
            dot_container.appendChild(dot);
        }
        for (var y = 0; y < vertical_count + 1; y++) {
            // The Right Dots:
            var dot = document.createElement("div");
            dot.classList.add("dot");
            dot.style.width = dot_width + "px";
            dot.style.height = dot_height + "px";

            dot.style.left = width - (dot_width / 2) + "px";
            if (y < vertical_count) {
                dot.style.top = (v_spacing_percent * y) - v_subtraction_percent + "%";
            }
            else {
                dot.style.top = height - (dot_height / 2) + "px";
            }

            dot_container.appendChild(dot);
        }
    }
}

make_dotted_borders();
div.dotted {
    display: inline-block;
    padding: 0.5em;
}

div.dot_container {
    position: relative;
    margin-left: 0.25em;
    margin-right: 0.25em;
}

div.dot {
    position: absolute;
    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" height="100" width="100"><circle cx="50" cy="50" r="50" fill="black" /></svg>');
}
<div class="dotted">Lorem Ipsum</div>

Demodo
sumber
1

JIKA Anda hanya menargetkan browser modern, DAN Anda dapat memiliki perbatasan pada elemen terpisah dari konten Anda, maka Anda dapat menggunakan transformasi skala CSS untuk mendapatkan titik atau garis yang lebih besar:

border: 1px dashed black;
border-radius: 10px;
-webkit-transform: scale(8);
transform: scale(8);

Diperlukan banyak penyesuaian posisi untuk membuatnya berbaris, tetapi berhasil. Dengan mengubah ketebalan batas, ukuran awal dan faktor skala, Anda dapat mencapai rasio ketebalan-panjang yang Anda inginkan. Satu-satunya hal yang tidak dapat Anda sentuh adalah rasio dash-to-gap.

Dave
sumber
Dengan melakukan hal itu, konten juga akan diterapkanscale(8)
Pardeep Jain
perbatasan: 1px putus-putus hitam; dianggap properti tidak dikenal di browser chrome.
Inzmam ul Hassan
1
<div style="width: 100%; height: 100vh; max-height: 20px; max-width: 100%; background: url('https://kajabi-storefronts-production.global.ssl.fastly.net/kajabi-storefronts-production/themes/853636/settings_images/Ei2yf3t7TvyRpFaLQZiX_dot.jpg') #000; background-repeat: repeat;">&nbsp;</div>

inilah yang saya lakukan - gunakan gambar masukkan deskripsi gambar di sini

Christine Nicole Yu
sumber
0

AFAIK tidak ada cara untuk melakukan ini. Anda bisa menggunakan garis batas putus-putus atau mungkin sedikit menambah lebar batas, tetapi hanya mendapatkan lebih banyak titik tidak mungkin dengan CSS.

Bojangles
sumber
0

Anda bisa membuat kanvas (via javascript) dan menggambar garis putus-putus di dalamnya. Di dalam kanvas Anda dapat mengontrol berapa lama tanda hubung dan ruang di antara akan.

velop
sumber
Itu adalah solusi yang sangat berbelit-belit. Saya merasa bahwa ini juga akan sedikit lebih mahal dalam kinerja dan waktu pemuatan yang dirasakan, tergantung pada berat JS yang tersisa pada halaman.
Emmett R.