Jak nadać obramowanie dowolnemu elementowi za pomocą css bez dodawania border-width do całej szerokości elementu?


101

Jak nadać obramowanie dowolnemu elementowi za pomocą css bez dodawania border-width do całej szerokości elementu?

Podobnie jak w Photoshopie możemy podać obrys - wewnątrz, na środku i na zewnątrz

Myślę, że domyślne właściwości obramowania CSS to środek jak środek w Photoshopie, mam rację?

Chcę umieścić obramowanie wewnątrz pudełka, a nie na zewnątrz. i nie chcesz uwzględniać szerokości obramowania w szerokości pola.

Odpowiedzi:


221
outline:1px solid white;

Nie doda to dodatkowej szerokości i wysokości.


10
Uwaga: kontur nie definiuje boków, więc działa to tylko wtedy, gdy wszystkie boki są stylizowane.
Screenack,

1
Dodałem odpowiedź, która pozwala na obramowanie tylko jednej strony.
mikevoermans

1
Po prostu uwaga, która nie będzie podążać za krzywymi żadnego promienia obramowania, które możesz mieć na elemencie, więc otrzymasz kwadratową ramkę.
nieograniczona

2
Ale nie obsługuje radious.
Sky

29

Sprawdź rozmiary CSS ...

Można to zrobić za pomocą właściwości CSS3 rozmiaru pudełka. Wartość border-box (w przeciwieństwie do domyślnej wartości content-box) sprawia, że ​​ostateczna renderowana ramka ma zadeklarowaną szerokość, a wszelkie obramowanie i wypełnienie wycięte wewnątrz ramki. Możesz teraz bezpiecznie zadeklarować 100% szerokości elementu, w tym pikselowe wypełnienie i obramowanie, i perfekcyjnie osiągnąć swój cel.

  • -webkit-box-sizing: border-box; / * Safari / Chrome, inny WebKit * /
  • -moz-box-sizing: border-box; / * Firefox, inne Gecko * /
  • box-size: border-box; / * Opera / IE 8+ * /

Proponuję stworzyć mixin, który poradzi sobie z tym za Ciebie. Więcej informacji na temat rozmiarów pudeł można znaleźć pod adresem W3c http://www.w3schools.com/cssref/css3_pr_box-sizing.asp


1
To najlepsza odpowiedź, chociaż nie sądzę, że naprawdę potrzebujesz wszystkich przedrostków. caniuse.com/#feat=css3-boxsizing
Justin,

2
^ Justin ma rację, nie potrzebujesz już przedrostków. box-sizingwystarczy.
Czad

26

W zależności od planowanej obsługi przeglądarki możesz skorzystać z box-shadowwłaściwości.

Możesz ustawić wartość rozmycia na 0, a rozrzut na dowolną grubość. Wspaniałą rzeczą w cieniu pola jest to, że możesz kontrolować, czy jest rysowany na zewnątrz (domyślnie), czy wewnątrz (za pomocą insetwłaściwości).

Przykład:

box-shadow: 0 0 0 1px black; // Outside black border 1px

lub

box-shadow: 0 0 0 1px white inset; // Inside white border 1px

Wielką zaletą korzystania z cienia pudełkowego jest to, że można wykazać się kreatywnością, używając wielu cieni pudełkowych:

box-shadow: 0 0 0 3px black, 0 0 0 1px white inset;

Jedyne, czego nie mogę powiedzieć, to jaka różnica wpłynie na wydajność renderowania. Zakładam, że mogłoby to stać się problemem, gdybyś miał na ekranie jednocześnie setki elementów wykorzystujących tę technikę.


16

Napotkałem ten sam problem.

.right-border {
    position: relative;
}

.right-border:after {
    content: '';
    display: block;
    position: absolute;
        top: 0; right: 0;
    width: 1px;
    height: 100%;
    background: #e0e0e0;
}

Ta odpowiedź pozwala określić jedną stronę. I działałby w IE8 + - w przeciwieństwie do używania box-shadow.

Oczywiście zmień właściwości pseudoelementów, ponieważ musisz wyodrębnić konkretną stronę.

* Nowe i ulepszone *

&:before {
content: '';
display: block;
position: absolute;
    top: 0; right: 0; bottom: 0; left: 0;
border: 1px solid #b7b7b7;
}

Pozwala to na użycie ramki i uderzenie w wiele boków pudełka.


8

Użyj box-sizing: border-box, aby utworzyć obramowanie WEWNĄTRZ div bez modyfikowania szerokości div.

Służy outlinedo tworzenia obramowania NA ZEWNĄTRZ elementu div bez zmiany jego szerokości.

Tutaj przykład: https://jsfiddle.net/4000cae9/1/

Uwagi: border-boxobecnie nie jest obsługiwane przez IE

Wsparcie:

http://caniuse.com/#feat=outline

http://caniuse.com/#search=border-box

#test, #test2 {
    width: 100px;
    height:100px;
    background-color:yellow;
}
#test {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    border: 10px dashed blue;
}
#test2 {
    outline: 10px dashed red;
}


<p>Use box-sizing: border-box to create a border INSIDE a div without modifying div width.</p>
<div id="test">border-box</div>
<p>Use outline to create a border OUTSIDE a div without modifying div width.</p>
<div id="test2">outline</div>

6

Jak powiedział Abenson, możesz użyć konspektu, ale jedną wadą jest to, że Opera może narysować „nieprostokątny kształt”. Inną opcją, która wydaje się działać, jest użycie ujemnych marż, takich jak ten CSS:

div {
  float:left;
  width: 50%;
  border:1px solid black;
  margin: -1px;

}

W tym html:

<body>
  <div>A block</div>
  <div>Another block</div>
</body>

Inną mniej przejrzystą opcją jest dodanie dodatkowych znaczników do kodu HTML. Na przykład ustawiasz szerokość elementu zewnętrznego i dodajesz obramowanie do wewnętrznego. CSS:

.outer { width: 50%; float: left;}
.inner { border: 1px solid black; }

A html:

<body>
  <div class="outer">
    <div class="inner">A block</div>
  </div>
  <div class="outer">
    <div class="inner">Another block</div>
  <div>
</body>

3

Użyj dopełnienia, gdy nie ma obramowania. Usuń wypełnienie, gdy istnieje obramowanie.

.myDiv {
    width: 100px;
    height: 100px;
    padding-left: 2px;
    padding-right: 2px;
}

.myDiv:hover {
    padding-left: 0;
    padding-right: 0;
    border-left: 2px solid red;
    border-right: 2px solid red;
}

Zasadniczo wystarczy zastąpić wypełnienie 2 pikselami obramowaniami 2 piks. Rozmiar DIV pozostaje taki sam.


2

Czy w twoim przypadku możesz to sfałszować, odejmując połowę obramowania od wypełnienia? (-2,5 od wypełnienia, jeśli twoja ramka ma szerokość 5 pikseli, nie możesz mieć ujemnego wypełnienia, więc aby zmniejszyć, zmniejsz całkowitą szerokość ramki). Możesz dodać dodatkowe 2,5 piksela do marginesu, aby zachować ogólny rozmiar pudełka.

Naprawdę nie podoba mi się ta sugestia, ale nie sądzę, aby można było to czysto załatwić.



0

Inna opcja, jeśli kolor tła jest jednolity:

body { background-color: #FFF; }

.myDiv {
    width: 100px;
    height: 100px;
    border: 3px solid #FFF;  // Border is essentially invisible since background is also #FFF;
}

.myDiv:hover {
    border-color: blue;  // Just change the border color
}

Możesz zastąpić #FFFprzezroczystość, a wtedy nie musisz pamiętać o zmianie dwóch wartości. Twoja sugestia ma tę zaletę, że gdybyś potrzebował przerywanej granicy, działałaby tam, gdzie box-shadowbrakuje w tym względzie.
nieograniczona

0

kontur: 3px jednolicie czarny || obramowanie: 3px jednolicie czarne

div{
height:50px;
width:150px;
text-align:center;

}

div{    /*this is what you need ! */
outline:1px solid black
}
<div>
hello world
</div>

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.