Bir kutuya boyut / kısmi kenarlık bildirmenin herhangi bir yolu var mı?


105

CSS'de bir kutuya boyut / kısmi kenarlık bildirmenin herhangi bir yolu var mı? Örneğin, 350pxbunun olduğu bir kutu ilklerinde yalnızca bir kenarlık-altını gösterir 60px. Bunun çok faydalı olabileceğini düşünüyorum.

Örnekler:

görüntü açıklamasını buraya girin görüntü açıklamasını buraya girin

Yanıtlar:


155

Pek sayılmaz. Ancak efekti, zarif bir şekilde azalacak ve gereksiz işaretleme gerektirmeyecek şekilde elde etmek çok kolaydır:

div {
  width: 350px;
  height: 100px;
  background: lightgray;
  position: relative;
  margin: 20px;
}

div:after {
  content: '';
  width: 60px;
  height: 4px;
  background: gray;
  position: absolute;
  bottom: -4px;
}
<div></div>


3
+ 1'lenmeden doğru yanıtı işaretlemek gibisi yoktur. Ama seni + 1'ledim! Bu benim sorunum için mükemmel bir çözümdü. Teşekkürler! düzenle Sanırım OP olabilir ve başka biri tarafından -1'lenmiş olabilirsin. Oh iyi. Cevabınız için minnettarım ve önemli olan bu, değil mi ;-)
— CWSpear

7
İkinci örneğinde olduğu gibi bunun merkezde olmasını nasıl sağlıyorsunuz?
— Cameron Martin

Üst öğe bir akışkan genişlikli satır içi blok öğesi olduğunda eklemeliyim. Açıkçası sabit genişlikte olduğunda kolaydır.
— Cameron Martin

4
Boşver, istediğim efekti aldım - dabblet.com/gist/e5a78f2d4bf50b6be4d3 . Bu utanç verici ::outsideve ::insidesözde unsurların henüz mevcut olmaması, sadece stil için işaret koymaktan nefret ediyorum, ancak başka bir yolu olduğunu düşünmüyorum.
— Cameron Martin

Bu çalışıyor! React ile kullanmak contentiçin :after, satır içi stil veya JSS olarak kullanamazsınız , ancak stilize edilmiş bileşenleri kullanarak iyi çalışır.
— Raphael Pinel

26

Biliyorum, bu zaten çözüldü ve pikseller istendi. Ancak, sadece bir şeyler paylaşmak istedim ...

Kısmen altı çizili metin öğeleri, display:tableveya kullanılarak kolayca elde edilebilir.display:inline-block

( Kullanmıyorum display:inline-blockçünkü, evet biliyorsun, garip 4pxboşluk).

Metinsel Öğeler

h1 {
  border-bottom: 1px solid #f00;
  display: table;
}
<h1>Foo is not equal to bar</h1>

Merkezleme , display:tableelemanın ortalanmasını imkansız hale getirir text-align:center.
Şununla çalışalım margin:auto...

h1 {
  border-bottom: 1px solid #f00;
  display: table;
  margin-left: auto;
  margin-right: auto;
}
<h1>Foo is not equal to bar</h1>

Eh , bu güzel, ama değil kısmen .
As bookcasey zaten tanıtılan, sözde elemanları değerinde altın.

h1 {
  display: table;
  margin-left: auto;
  margin-right: auto;
}

h1:after {
  border-bottom: 1px solid #f00;
  content: '';
  display: block;
  width: 50%;
}
<h1>Foo is not equal to bar</h1>

Ofset , alt çizgi şimdi sola hizalı. Ortalamak için, sözde öğeyi width( 50% / 2 = 25%) yarısını sağa doğru itmeniz yeterlidir .

h1 {
  display: table;
  margin-left: auto;
  margin-right: auto;
}

h1:after {
  border-bottom: 1px solid #f00;
  content: '';
  display: block;
  margin-left: 25%;
  width: 50%;
}
<h1>Foo is not equal to bar</h1>

... davidmatas'ın dediği gibi , kullanmak margin:autobazen- marginofseti elle hesaplamaktan daha pratiktir .

Böylece, aşağıdaki widthkombinasyonlardan birini kullanarak alt çizgiyi sola, sağa veya ortaya (akımı bilmeden ) hizalayabiliriz :

  • Sol : margin-right: auto (veya sadece bırakın)
  • Orta :margin: auto
  • Doğru :margin-left: auto

Tam örnek

.underline {
  display: table;
  margin-left: auto;
  margin-right: auto;
}

.underline:after {
  border-bottom: 1px solid #f00;
  content: '';
  display: block;
  width: 50%;
}

.underline--left:after {
  margin-right: auto; /* ...or just leave it off */
}

.underline--center:after {
  margin-left: auto;
  margin-right: auto;
}

.underline--right:after {
  margin-left: auto
}
<h1 class="underline underline--left">Foo is not equal to bar</h1>
<h1 class="underline underline--center">Foo is not equal to bar</h1>
<h1 class="underline underline--right">Foo is not equal to bar</h1>

Blok Düzeyindeki Öğeler

Bu kolayca benimsenebilir, böylece blok düzeyindeki öğeleri kullanabiliriz. İşin püf noktası, sözde öğelerin yüksekliğini gerçek öğesiyle aynı yüksekliğe ayarlamaktır (basitçe height:100%):

div {
  background-color: #eee;
  display: table;
  height: 100px;
  width: 350px;
}
div:after {
  border-bottom: 3px solid #666;
  content: '';
  display: block;
  height: 100%;
  width: 60px;
}
<div></div>


2
Mükemmel cevap. İçin :afterdaha bir benzeri I margin: 0 autoyerine yaklaşımı margin-left: 25%Eğer matematik yapmak gerek kalmadan beyan herhangi genişliğinde çalışacaktır çünkü.
— davidmatas

1
@davidmatas İyi nokta! El ile manuel olarak nasıl konumlandırılacağını netleştirmek için matematiksel yolu kullandım. Bu örnekle herkes onu sola / ortaya / sağa nasıl hizalayacağını anlayabilir. Her neyse, auto- simplificator'ı ekleyeceğim :)
— yckart

17

İşte linear-gradientistediğiniz her tür hattı kolayca nerede oluşturabileceğinize dayanan başka bir çözüm . Birden çok arka plan kullanarak birden çok satırınız da olabilir (örneğin her iki tarafta):

İşte yukarıdakiyle aynı şeyi elde etmek için başka bir sözdizimi:

.box1 {
  width: 200px;
  padding: 20px;
  margin: 10px auto;
  text-align: center;
  background: 
   linear-gradient(#000, #000) top /40% 3px no-repeat, 
   #ccc
}

.box2 {
  width: 200px;
  padding: 20px;
  margin: 10px auto;
  text-align: center;
  background: 
    linear-gradient(red,red) bottom/ 60% 2px no-repeat, 
    #ccc;
}

.box3{
  width: 200px;
  padding: 20px;
  margin: 10px auto;
  text-align: center;
  background: 
   linear-gradient(red , red)bottom left/ 60% 2px,
   linear-gradient(blue, blue) 60% 0 / 40% 2px,
   linear-gradient(brown, brown) left/ 3px 30%,
   linear-gradient(orange, orange) right / 3px 40%,
   #ccc;
  background-repeat:no-repeat;
}
<div class="box1">
  Box1
</div>
<div class="box2">
  Box2
</div>
<div class="box3">
  Box3
</div>


1
Vay canına ... Saatlerdir "ima edilen" bir kutunun sadece üst sol ve sağ üst köşelerine sahip olmanın bir yolunu bulmak için uğraşıyorum. : önce ve: sonra çok sınırlıydı, nesnenin konumunu bozdu. Bu harika bir çözüm!
— Wouter

Bunun neden ve nasıl çalıştığına dair bazı arka plan bilgileri: webfx.com/blog/web-design/background-css-shorthand
— Wouter

Kullanılırsa köşe kenarlıklarını border-radius
— kırpar

2

Bazı sınırları çizmek için bir ızgara kullandım.

Buraya bakın .

Kod:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Responsive partial borders</title>
    <style>
        /* ungrid without mobile */
        .row{width:100%;display:table;table-layout:fixed;}
        .col{display:table-cell;}

        /* things to change */
        .row{width: 70%; margin: auto;}
        .mid.row > .col{ height: 150px; }

        /* draw box and align text */
        .col{ text-align: center;}
        .top.left.col{
            border-top: 1px solid black;
            border-left: 1px solid black;
        }
        .top.right.col{
            border-top: 1px solid black;
            border-right: 1px solid black;
        }
        .bottom.left.col{
            border-bottom: 1px solid black;
            border-left: 1px solid black;
        }
        .bottom.right.col{
            border-bottom: 1px solid black;
            border-right: 1px solid black;
        }
        .mid.row > .col{
            border-left: 1px solid black;
            border-right: 1px solid black;
            vertical-align: middle;
        }
        .top.center.col{
            position: relative;
            top: -0.5em;
        }
        .bottom.center.col{
            position: relative;
            bottom: -0.5em;
        }
    </style>
</head>
<body>

    <div class="row">
        <div class="top left col"></div>
        <div class="top center col">Top</div>
        <div class="top right col"></div>
    </div>
    <div class="mid row">
        <div class="col">Mid</div>
    </div>
    <div class="row">
        <div class="bottom left col"></div>
        <div class="bottom center col">Bottom</div>
        <div class="bottom right col"></div>
    </div>  

</body>
</html>

@ SverriM.Olsen, kişi kodu düzenlediğinden beri yorum geçerliliğini yitirdi
— Sagar V

0

CSS, kısmi sınırları desteklemez. Bunu simüle etmek için bitişik bir öğe kullanmanız gerekir.


Veya yukarıdaki cevaplarda gösterildiği gibi tamamen CSS ile yapabileceğiniz ve herhangi bir işaretleme eklemeyeceğiniz bir sözde öğe
— OG Sean
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.