Długość obramowania mniejsza niż szerokość div?


115

Mam następujący kod

div {
   width:200px;
   border-bottom:1px solid magenta;
   height:50px;   
}

PRÓBNY

Szerokość div to 200px, więc border-bottom to również 200px, ale co mam zrobić, jeśli chcę, żeby border-bottom miał tylko 100px bez zmiany szerokości div?

Odpowiedzi:


224

Możesz użyć pseudoelementów. Na przykład

div {
  width   : 200px;
  height  : 50px;   
  position: relative;
  z-index : 1;
  background: #eee;
}

div:before {
  content : "";
  position: absolute;
  left    : 0;
  bottom  : 0;
  height  : 1px;
  width   : 50%;  /* or 100px */
  border-bottom:1px solid magenta;
}
<div>Item 1</div>
<div>Item 2</div>

Nie ma potrzeby używania dodatkowych znaczników do celów prezentacyjnych. : after jest również obsługiwany z IE8.

edytować:

jeśli potrzebujesz obramowania wyrównanego do prawej, po prostu zmień go za left: 0pomocąright: 0

jeśli potrzebujesz obramowania wyśrodkowanego, po prostu ustaw left: 50px;


To też była moja technika, ale zauważ, że da ona granicę na lewej połowie div. Jeśli chcesz, aby był wyśrodkowany, podaj plik div:before left: 50px.
Chowlett,

Pytanie nie określa, w której pozycji powinna pojawić się granica, więc nie rozważałem innych pozycji
Fabrizio Calderan,

5
jeśli szerokość dolnej granicy wynosi 50%, a chcesz to skoncentrowane, potrzeb stylu być left: 25%ponieważ będzie to 25% + 50% + 25%
skift

5
Tak, wiem, że w tym przykładzie działa. Ale dla innych, którzy robią coś podobnego, co może próbować sprawić, że będzie responsywny, może być konieczne użycie%, tak jak wtedy, gdy potrzebowałem odpowiedzi.
skift

4
Zastosowanie margin: auto, right: 0, left: 0az :beforecentrum linii. Głosuj za, jeśli ci to pomogło.
Ale_info

40

Innym sposobem na zrobienie tego (w nowoczesnych przeglądarkach) jest użycie ujemnego rozszerzonego cienia pola. Sprawdź to zaktualizowane skrzypce: http://jsfiddle.net/WuZat/290/

box-shadow: 0px 24px 3px -24px magenta;

Myślę jednak, że najbezpieczniejszym i najbardziej zgodnym sposobem jest zaakceptowana powyżej odpowiedź. Pomyślałem, że podzielę się inną techniką.


9

Możesz użyć gradientu liniowego:

div {
    width:100px;
    height:50px;
    display:block;
    background-image: linear-gradient(to right, #000 1px, rgba(255,255,255,0) 1px), linear-gradient(to left, #000 0.1rem, rgba(255,255,255,0) 1px);
	background-position: bottom;
	background-size: 100% 25px;
	background-repeat: no-repeat;
    border-bottom: 1px solid #000;
    border-top: 1px solid red;
}
<div></div>


8

Dodałem linię pod tagiem h3 w ten sposób

<h3 class="home_title">Your title here</h3> 
.home_title{
    display:block;
}
.home_title:after {
    display:block;
    clear:both;
    content : "";
    position: relative;
    left    : 0;
    bottom  : 0;
    max-width:250px;
    height  : 1px;
    width   : 50%;  /* or 100px */
    border-bottom:1px solid #e2000f;
    margin:0 auto;
    padding:4px 0px;
}

4

Nie możesz mieć obramowania innego rozmiaru niż sam element DIV.

rozwiązaniem byłoby po prostu dodanie kolejnego elementu DIV pod równym, wyśrodkowanym lub bezwzględnym, z żądaną ramką 1 piksela i wysokością tylko 1 piksela.

http://jsfiddle.net/WuZat/3/

Zostawiłem oryginalne obramowanie, abyś mógł zobaczyć szerokość, i mam dwa przykłady - jeden o szerokości 100, a drugi o szerokości 100 pośrodku. Usuń ten, którego nie chcesz używać.


3

Spóźniony na imprezę, ale dla każdego, kto chce zrobić 2 obramowania (na dole i po prawej w moim przypadku) możesz użyć techniki w zaakceptowanej odpowiedzi i dodać: after psuedo-element dla drugiej linii, a następnie po prostu zmień właściwości takie jak więc: http://jsfiddle.net/oeaL9fsm/

div
{
  width:500px;
  height:500px;   
  position: relative;
  z-index : 1;
}
div:before {
  content : "";
  position: absolute;
  left    : 25%;
  bottom  : 0;
  height  : 1px;
  width   : 50%;
  border-bottom:1px solid magenta;
}
div:after {
  content : "";
  position: absolute;
  right    : 0;
  bottom  : 25%;
  height  : 50%;
  width   : 1px;
  border-right:1px solid magenta;
}

2

Mam przypadek, aby mieć jakieś dolne obramowanie między obrazami w kontenerze div, a najlepszy był kod jednej linii - border-bottom-style: inset;


2
div{
    font-size: 25px;
    line-height: 27px;
    display:inline-block;
    width:200px;
    text-align:center;
}

div::after {
    background: #f1991b none repeat scroll 0 0;
    content: "";
    display: block;
    height: 3px;
    margin-top: 15px;
    width: 100px;
    margin:auto;
}

2

Zrobiłem coś takiego w swoim projekcie. Chciałbym się nim tutaj podzielić. Możesz dodać kolejny element div jako dziecko i nadać mu ramkę o małej szerokości i umieścić go po lewej, środku lub prawej stronie za pomocą zwykłego CSS

Kod HTML:

    <div>
        content 
        <div class ="ac-brdr"></div>
    </div>

CSS, jak poniżej:

   .active {
    color: magneta;
  }
   .active .ac-brdr {
        width: 20px;
        margin: 0 auto;
        border-bottom: 1px solid magneta;
  }

1

Obramowanie zawiera cały element HTML. Jeśli chcesz mieć połowę dolnej krawędzi, możesz owinąć ją innym identyfikowalnym blokiem, takim jak rozpiętość.

Kod HTML:

<div> <span>content here </span></div>

CSS, jak poniżej:

 div{
    width:200px;
    height:50px;   
    }
 span{
        width:100px;
        border-bottom:1px solid magenta;   
    } 


1

Właśnie wykonałem odwrotność tego użycia :afteri ::afterponieważ musiałem poszerzyć dolną granicę 1.3rem:

Mój żywioł, ale bardzo zdeformowany, kiedy używany :beforei :afterw tym samym czasie, ponieważ elementy są ustawione poziomo z display: flex, flex-direction: rowi align-items: center.

Możesz użyć tego do zrobienia czegoś szerszego lub węższego, lub prawdopodobnie dowolnych modyfikacji wymiarów matematycznych:

a.nav_link-active {
  color: $e1-red;
  margin-top: 3.7rem;
}
a.nav_link-active:visited {
  color: $e1-red;
}
a.nav_link-active:after {
  content: '';
  margin-top: 3.3rem;      // margin and height should
  height: 0.4rem;          // add up to active link margin
  background: $e1-red;
  margin-left: -$nav-spacer-margin;
  display: block;
}
a.nav_link-active::after {
  content: '';
  margin-top: 3.3rem;      // margin and height should
  height: 0.4rem;          // add up to active link margin
  background: $e1-red;
  margin-right: -$nav-spacer-margin;
  display: block;
}

Przepraszamy, to jest SCSS, po prostu pomnóż liczby przez 10 i zmień zmienne na jakieś normalne wartości.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.