Brand binnenin div plaatsen en niet op de rand

Ik heb een <div>element en ik wil er een rand omheen zetten. Ik weet dat ik style="border: 1px solid black"kan schrijven, maar dit voegt 2px toe aan beide zijden van de div, wat niet is wat ik wil.

Ik zou liever hebben dat deze rand -1px vanaf de rand van de div is. De div zelf is 100px x 100px, en als ik een rand toevoeg, moet ik wat rekenwerk doen om de rand te laten verschijnen.

Is er een manier waarop ik de rand kan laten verschijnen en ervoor kan zorgen dat het vak nog steeds 100px is (inclusief de rand)?


Antwoord 1, autoriteit 100%

Stel de eigenschap box-sizingin op border-box:

div {
    box-sizing: border-box;
    -moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;
    width: 100px;
    height: 100px;
    border: 20px solid #f00;
    background: #00f;
    margin: 10px;
}
div + div {
    border: 10px solid red;
}
<div>Hello!</div>
<div>Hello!</div>

Antwoord 2, autoriteit 62%

Je kunt box-shadow ook als volgt gebruiken:

div{
    -webkit-box-shadow:inset 0px 0px 0px 10px #f00;
    -moz-box-shadow:inset 0px 0px 0px 10px #f00;
    box-shadow:inset 0px 0px 0px 10px #f00;
}

Voorbeeld hier: http://jsfiddle.net/nVyXS/(beweeg om de rand te bekijken)

Dit werkt alleen in moderne browsers. Bijvoorbeeld: Geen IE 8-ondersteuning.
Zie caniuse.com (box-shadow-functie)voor meer informatie.


Antwoord 3, autoriteit 15%

Waarschijnlijk is het een laat antwoord, maar ik wil mijn bevindingen delen. Ik heb 2 nieuwe benaderingen voor dit probleem gevonden die ik hier niet in de antwoorden heb gevonden:

Binnenrand door box-shadowcss-eigenschap

Ja, box-shadow wordt gebruikt om box-shadows aan de elementen toe te voegen. Maar u kunt de inset-schaduw specificeren, die eruitziet als een binnenrand in plaats van als een schaduw. U hoeft alleen horizontale en verticale schaduwen in te stellen op 0pxen de eigenschap “spread” van de box-shadowop de breedte van de rand jij wil hebben. Dus voor de ‘binnenste’ rand van 10px zou je het volgende schrijven:

div{
    width:100px;
    height:100px;
    background-color:yellow;
    box-shadow:0px 0px 0px 10px black inset;
    margin-bottom:20px;
}

Hier is een jsFiddlevoorbeeld dat het verschil illustreert tussen box-shadowrand en ‘normale’ rand. Op deze manier zijn je rand en de breedte van het vak in totaal 100px inclusief de rand.

Meer over box-shadow:hier

Rand door CSS-eigenschap omtrek

Hier is een andere benadering, maar op deze manier zou de grens buiten de gebaande paden vallen. Hier is een voorbeeld.
Zoals uit het voorbeeld volgt, kunt u de css outlineeigenschap gebruiken om de rand in te stellen die geen invloed heeft op de breedte en hoogte van het element. Op deze manier wordt de randbreedte niet opgeteld bij de breedte van een element.

div{
   width:100px;
   height:100px;
   background-color:yellow;
   outline:10px solid black;
}

Meer over Outline: hier


4, Autoriteit 7%

Yahoo! Dit is echt mogelijk. Ik heb het gevonden.

Voor onderrand:

div {box-shadow: 0px -3px 0px red inset; }

Voor bovenrand:

div {box-shadow: 0px 3px 0px red inset; }

5, Autoriteit 4%

Gebruik pseudo-element :

.button {
    background: #333;
    color: #fff;
    float: left;
    padding: 20px;
    margin: 20px;
    position: relative;
}
.button::after {
    content: '';
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    border: 5px solid #f00;
}
<div class='button'>Hello</div>

Antwoord 6, autoriteit 3%

Je kunt de eigenschappen outlineen outline-offsetgebruiken met een negatieve waarde in plaats van een gewone borderte gebruiken, werkt voor mij:

div{
    height: 100px;
    width: 100px;
    background-color: grey;
    margin-bottom: 10px; 
}
div#border{
    border: 2px solid red;
}
div#outline{
    outline: 2px solid red;
    outline-offset: -2px;
}
Using a regular border.
<div id="border"></div>
Using outline and outline-offset.
<div id="outline"></div>

Antwoord 7

Ik weet dat dit wat ouder is, maar aangezien de trefwoorden ‘border inside’ me hier direct belandden, wil ik graag enkele bevindingen delen die het vermelden waard zijn.
Toen ik een rand aan de hover-status toevoegde, kreeg ik de effecten waar OP het over heeft. De rand voegt pixels toe aan de afmeting van de doos, waardoor deze springerig werd.
Er zijn nog twee manieren om hiermee om te gaan die ook werken voor IE7.

1)
Zorg dat er al een rand aan het element is bevestigd en verander eenvoudig de kleur. Op deze manier is de wiskunde al inbegrepen.

div {
   width:100px;
   height:100px;
   background-color: #aaa;
   border: 2px solid #aaa; /* notice the solid */
}
div:hover {
   border: 2px dashed #666;
}

2)
Compenseer je rand met een negatieve marge. Dit zal nog steeds de extra pixels toevoegen, maar de positionering van het element zal niet springerig zijn op

div {
   width:100px;
   height:100px;
   background-color: #aaa;
}
div:hover {
  margin: -2px;
  border: 2px dashed #333;
}

Antwoord 8

voeg voor consistente weergave tussen nieuwe en oudere browsers een dubbele container toe, de buitenste met de breedte, de binnenste met de rand.

<div style="width:100px;">
<div style="border:2px solid #000;">
contents here
</div>
</div>

dit is uiteraard alleen mogelijk als uw precieze breedte belangrijker is dan extra markeringen!


Antwoord 9

Als u box-sizing gebruikt: border-box betekent niet alleen rand,
opvulling, marge, enz. Alle elementen komen binnen de bovenliggende
element.

div p {
    box-sizing: border-box;
    -moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;
    width: 150px;
    height:100%;
    border: 20px solid #f00;
    background-color: #00f;
    color:#fff;
    padding: 10px;
}
<div>
  <p>It was popularised in the 1960s with the release of Letraset sheets</p>
</div>

10

Beste cross-browseroplossing (meestal voor IE-ondersteuning) zoals @Steve zei dat het is om een ​​div 98px in de breedte en hoogte te maken dan er een rand van 1px eromheen toe te voegen, of je kunt een achtergrondafbeelding maken voor Div 100×100 PX en een grens voor Div 100×100 PX erop.


11

U kunt met offset naar overzicht kijken, maar dit heeft wat vulling nodig om op uw div te bestaan. Of je kunt absoluut een rand van de grens plaatsen, zoiets als

<div id='parentDiv' style='position:relative'>
  <div id='parentDivsContent'></div>
  <div id='fakeBordersDiv' 
       style='position: absolute;width: 100%;
              height: 100%;
              z-index: 2;
              border: 2px solid;
              border-radius: 2px;'/>
</div>

Mogelijk moet je met marges op de nepgrenzen div om het te passen zoals je wilt.


12

Eén oplossing die ik niet heb genoemd hierboven is het geval waar u op vulling op uw invoer hebt, die ik 99% van de tijd doe. Je kunt iets doen in de lijnen van …

input {
  padding: 8px;
}
input.invalid {
  border: 2px solid red;
  padding: 6px; // 8px - border or "calc(8px - 2px)"
}

Wat ik leuk vind, is dat ik het volledige menu van de rand + vulling + overgangseigenschappen voor elke kant heb.

Other episodes