Noktalı kenarlık noktaları arasındaki boşluk nasıl artırılır


286

Kutumda noktalı stil kenarlığı kullanıyorum

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

Sınırın her bir noktası arasındaki boşluğu artırmak istiyorum.

Yanıtlar:


444

Bu hile hem yatay hem de dikey kenarlıklar için çalışır:

/*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;

Boyutu arka plan boyutuyla ve orantıyı doğrusal gradyan yüzdeleriyle ayarlayabilirsiniz. Bu örnekte 1 piksel noktalı ve 2 piksel aralıklı noktalı bir çizgim var. Bu şekilde, birden çok arka plan kullanarak birden çok noktalı kenarlığa sahip olabilirsiniz.

Bu JSFiddle'da deneyin veya kod snippet örneğine bir göz atın:


26
Seçilen cevap olmalı.
Kevin Jurkowski

7
imho bu n derece hack.
Muhammed Umer

7
Aynı şeyi yapmak istiyorum ama noktalı kenarlık genişliği 1 piksel yerine 3 piksel ve şimdi noktalı yerine kare haline geliyor.
Bhojendra Rauniyar

5
Bunu uygulamak ve renkleri ve aralıkları hızla değiştirmek için bir SCSS karışımı yaptım. Bunu github.com/florbraz/Dotted-Border-w-custom-spacing-SCSS-Mixin adresinden kontrol edin .
Flor Braz

5
4 kenarın da kesik olmasını istersem ne olur?
Ryan Shillington

141

İşte son zamanlarda yatay kenarlıklarla istediğim her şeyi elde etmek için kullandığım bir püf noktası. <hr/>Her yatay sınıra ihtiyacım olduğunda kullanıyorum . Bu saate bir kenarlık eklemenin temel yolu

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

Ancak sınırın kontrolünü ele geçirmek ve örneğin noktalar arasındaki boşluğu artırmak istiyorsanız, şöyle bir şey deneyebilirsiniz:

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

Ve aşağıda, sınırınızı oluşturursunuz (burada noktalara sahip bir örnek)

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

Bu ayrıca noktalara, degradelere vb. Metin gölgesi ekleyebileceğiniz anlamına gelir.

Yatay sınırlar için gerçekten harika çalışıyor. Dikey olanlara ihtiyacınız varsa, başka bir saat için bir sınıf belirtebilir ve CSS3 rotationözelliğini kullanabilirsiniz .


2
Bu çapraz tarayıcı uyumlu mu?
J82

57
A ** 'da ne tür bir acıyı koruyacağını hayal edemiyorum.
Kzqai

1
dikey için aynı etki nasıl elde edilir?
Rinku

4
Dönüştürme ile Rinku: döndürme (90 derece); Ekran bloğu;
Jeroen K

4
çok çirkin, ama çok zeki :) Ayrıca yüksekliği ayarlarsam 0: ve yerleşimi kontrol etmek için dolgu kullanın. Bu yüzden aşağıda küçük bir oda ile altındaki noktalı çizgi istedim bu yüzden dolgu kullandım: 0 0 10px;
MatthewLee

121

Saf CSS ile yapamazsınız - CSS3 spesifikasyonunun bununla ilgili özel bir teklifi bile vardır:

Not: Noktaların ve kısa çizgilerin aralığı üzerinde veya kısa çizgilerin uzunluğu üzerinde herhangi bir denetim yoktur. Uygulamalar köşeleri simetrik hale getirecek bir boşluk seçmeye teşvik edilir.

Bununla birlikte, hile yapan bir kenarlık görüntüsü veya arka plan görüntüsü kullanabilirsiniz.


7
Tamamen özelleştirilebilir bir sınır için degradeleri (saf CSS) kullanabilirsiniz. Aşağıdaki cevaba bakınız
Olivictor

3
-1, @Shadikka, ne CSS3 Spec diyor o kullanılarak yapılamaz olmasıdır border: dotted, ancak bir Eagorajose cevabı gösterdiği gibi renk geçişlerini kullanarak bunu yapmak mümkün.
Pacerier

30

Bu, standart CSS kenarlığını ve sözde öğe + taşma: gizli kullanır. Örnekte üç farklı 2 piksel kesikli kenarlık elde edersiniz: normal, 5 piksel gibi aralıklı, 10 piksel gibi aralıklı. Aslında 10px sadece 10-8 = 2px görünür.

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>

Büyük yuvarlatılmış köşeleri olan küçük elemanlara uygulandığında bazı eğlenceli efektler elde edebilirsiniz.


2
Güçlü iş! Bu cevaplardan, sürdürmek için korkunç olmadan gerçekten işe yarayan tek şey, IMO. Kabul edilen cevap bile div'in sadece bir kenarı için geçerlidir. Bu tüm sınır için geçerlidir.
Ryan Shillington

1
Bu açık ara en iyi ve en zarif cevap. Çözüm olarak işaretlenmelidir ...
Beejee

19

Bu yüzden verilen cevaptan başlayarak ve CSS3'ün birden fazla ayara izin verdiği gerçeğini uygulayarak - aşağıdaki kod tam bir kutu oluşturmak için yararlıdır:

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

Arka plan boyutundaki 10 pikselin çizgi ve boşluğun kaplayacağı alana verdiğini belirtmek gerekir. Arka plan etiketinin% 50'si çizgi gerçekte ne kadar geniştir. Bu nedenle, her kenar tarafında farklı uzunluk çizgileri olması mümkündür.


17

Aşağıdakiler için kullanılabilir değerler için MDN belgelerine bakın border-style:

  • none: Kenarlık yok, genişliği 0 olarak ayarlar. Bu, varsayılan değerdir.
  • hidden: Tablo öğelerinin sınır çakışması çözümü hariç, 'hiçbiri' ile aynı.
  • kesikli: Kısa kesikli çizgiler veya çizgi segmentleri.
  • noktalı: Nokta serisi.
  • çift: Kenarlık genişliği olarak tanımlanan piksel miktarına kadar eklenen iki düz çizgi.
  • oluk: Oyma etkisi.
  • inset: Kutunun gömülü görünmesini sağlar.
  • başlangıç: 'iç metin' karşısı. Kutunun 3D (kabartmalı) görünmesini sağlar.
  • sırt: 'oluğun' karşısında. Kenarlık 3D görünür (çıkıyor).
  • düz: Tek, düz, düz çizgi.

Bu seçeneklerin yanı sıra, standart sınırın tarzını etkilemenin bir yolu yoktur.

Olasılıklar beğeninize yoksa, sen olabilir CSS3 kullanalım border-imageancak bunun için tarayıcı desteği çok sivilceli hala olduğunu not.


teşekkürler pekka, yani border özelliği kullanamıyorum ... bu yüzden bunun için görüntü kullanmak zorunda.
Kali Charan Rajput

@kc sınır stillerinden hiçbiri beğeninize göre değilse, evet.
Pekka

8

@ Eagorajose'un steno sözdizimi ile verdiği cevaba dayanarak 4 kenar çözümü oluşturmak:

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>


8

Bu eski, ama yine de çok alakalı bir konudur. Şu anki en iyi cevap iyi çalışıyor, ancak sadece çok küçük noktalar için. Bhojendra Rauniyar'ın yorumlarda zaten belirttiği gibi, daha büyük (> 2px) noktalar için noktalar yuvarlak değil kare görünür. Bu sayfayı , aralıklı kareleri değil aralıklı noktaları ararken buldum (hatta bazı cevapların kullandığı gibi tire).

Buna dayanarak kullandım radial-gradient. Ayrıca, Ukuser32'nin cevabı kullanılarak , nokta özellikleri dört kenarlığın tümü için kolayca tekrarlanabilir. Sadece köşeler mükemmel değil.

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>

radial-gradient beklediği :

  • şekil ve isteğe bağlı konum
  • iki veya daha fazla durak: bir renk ve yarıçap

Burada, 5 piksel çapında (2,5 piksel yarıçap) bir nokta istedim, noktalar arasında 2 kat daha fazla (10 piksel), 15 piksele kadar ekledim. background-sizeBu uymalıdır.

İki durak, noktanın güzel ve pürüzsüz olacağı şekilde tanımlanır: yarıçapın yarısı için tam siyah ve tam yarıçap için bir gradyan.


6

Bu gerçekten eski bir soru ama Google'da yüksek bir sıralamaya sahip, bu yüzden ihtiyaçlarınıza bağlı olarak çalışabilecek yöntemimi atacağım.

Benim durumumda, çizgiler arasında minimum bir kırılma olan kalın kesikli bir kenarlık istedim. Bir CSS desen oluşturucu kullandım (bunun gibi: http://www.patternify.com/ piksel genişliğinde ve 1 piksel uzunluğunda bir desen oluşturmak için ). 9px katı çizgi rengidir, 1px beyazdır.

CSS'imde bu deseni arka plan görüntüsü olarak ekledim ve ardından arka plan boyutu özelliğini kullanarak ölçeklendirdim. Sonunda 20px 2px tekrarlanan çizgi, 18px düz çizgi ve 2px beyaz oldu. Gerçekten kalın kesikli bir çizgi için daha da büyütebilirsiniz.

Güzel bir şey, görüntü veri olarak kodlandığı için ek dış HTTP isteğiniz olmadığı için performans yükü yoktur. Resmimi SASS değişkeni olarak sakladım, böylece sitemde tekrar kullanabildim.



2

Pek çok insan "Yapamazsın" der. Evet yapabilirsin. Çizgiler arasındaki oluk boşluğunu kontrol etmek için bir css kuralı olmadığı, ancak css'in başka yetenekleri olduğu doğrudur. Bir şeyin yapılamayacağını söylemek için çok hızlı olma.

.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%;
}

Temel olarak kenarlık yüksekliği (bu durumda 5 piksel), oluğun "genişliğini" belirleyen kuraldır. Tabii ki renkleri ihtiyaçlarınıza göre ayarlamanız gerekir. Bu aynı zamanda yatay bir çizgi için küçük bir örnektir, dikey çizgiyi yapmak için sol ve sağ kullanın.


1
Adil olmak gerekirse, çoğu insan bunu sınır noktalı stilini ayarlamak için gerçek soruya yapamayacağınızı söylüyor. Diğer CSS özelliklerini kullanarak benzer bir şeyin mümkün olmadığını söylemiyorlar. Benim görüşüme göre, anlamsal bir bakış açısından, diğerlerinin gösterdiği gibi, bir arka plan görüntüsü veya kenarlık görüntüsü kullanmak, sahte öğeler ve bir düzine CSS satırı kullanmaktan çok daha mantıklıdır.
Alex

2

Svg ile noktalar oluşturmak için bir javascript işlevi yaptım. Javascript kodunda nokta aralığını ve boyutunu ayarlayabilirsiniz.

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>


1

Yalnızca modern tarayıcıları hedefliyorsanız VE sınırınızı içeriğinizden ayrı bir öğeye sahip olabilirseniz, daha büyük bir nokta veya çizgi elde etmek için CSS ölçek dönüşümünü kullanabilirsiniz:

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

Sıralamak için çok fazla konum ayarlaması gerekiyor, ancak işe yarıyor. Kenarlığın kalınlığını, başlangıç ​​boyutunu ve ölçek faktörünü değiştirerek, istediğiniz yaklaşık kalınlık-uzunluk oranına ulaşabilirsiniz. Dokunamayacağınız tek şey tire-boşluk oranıdır.


Bunu yaparak içerik de uygulanacaktırscale(8)
Pardeep Jain

kenarlık: 1 piksel kesik siyah; , krom tarayıcıda bilinmeyen bir özellik olarak kabul edilir.
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>

yaptığım şey budur - bir resim kullanın resim açıklamasını buraya girin


0

AFAIK bunu yapmanın bir yolu yok. Kesikli bir kenarlık kullanabilir veya kenarlığın genişliğini biraz artırabilirsiniz, ancak CSS ile daha fazla aralıklı nokta elde etmek imkansızdır.


0

Bir tuval oluşturabilir (javascript aracılığıyla) ve içine noktalı bir çizgi çizebilirsiniz. Tuval içinde çizgi ve aradaki boşluğun ne kadar süreceğini kontrol edebilirsiniz.


Bu çok kıvrımlı bir çözüm. Bu sayfadaki JS'nin geri kalanının ağırlığına bağlı olarak, performans ve algılanan yükleme sürelerinde de biraz daha pahalıya mal olacağını hissetmiyorum.
Emmett R.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.