CSS frontières en médaillon

j'ai une question rapide sur les frontières CSS.

j'ai besoin de créer une bordure pleine couleur. C'est le morceau de CSS que j'utilise:

border: 10px inset rgba(51,153,0,0.65);

malheureusement, cela crée une bordure striée 3D (ignorer les carrés et la boîte de description sombre):

http://dl.dropbox.com/u/12147973/border-current.jpg

C'est le but:

http://dl.dropbox.com/u/12147973/border-boal.jpg

des idées?

55
demandé sur JacobTheDev 2011-12-10 02:55:28

11 réponses

vous pouvez utiliser box-shadow , éventuellement:

#something {
    background: transparent url(https://i.stack.imgur.com/RL5UH.png) 50% 50% no-repeat;
    min-width: 300px;
    min-height: 300px;
    box-shadow: inset 0 0 10px #0f0;
}

#something {
  background: transparent url(https://i.stack.imgur.com/RL5UH.png) 50% 50% no-repeat;
  min-width: 300px;
  min-height: 300px;
  box-shadow: inset 0 0 10px #0f0;
}
<div id="something"></div>

cela a l'avantage de superposer l'image de fond du div , mais elle est, bien sûr, floue (comme on peut s'y attendre de la propriété box-shadow ). Pour construire le density de l'ombre vous pouvez ajouter des ombres de cours:

#something {
    background: transparent url(https://i.stack.imgur.com/RL5UH.png) 50% 50% no-repeat;
    min-width: 300px;
    min-height: 300px;
    box-shadow: inset 0 0 20px #0f0, inset 0 0 20px #0f0, inset 0 0 20px #0f0;
}

#something {
  background: transparent url(https://i.stack.imgur.com/RL5UH.png) 50% 50% no-repeat;
  min-width: 300px;
  min-height: 300px;
  box-shadow: inset 0 0 20px #0f0, inset 0 0 20px #0f0, inset 0 0 20px #0f0;
}
<div id="something"></div>

Edité parce que je me suis rendu compte que je suis un idiot, et oublié d'offrir la solution la plus simple premier , qui utilise un élément d'enfant autrement-vide pour appliquer les frontières sur le fond:

#something {
  background: transparent url(https://i.stack.imgur.com/RL5UH.png) 50% 50% no-repeat;
  min-width: 300px;
  min-height: 300px;
  padding: 0;
  position: relative;
}
#something div {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  border: 10px solid rgba(0, 255, 0, 0.6);
}
<div id="something">
  <div></div>
</div>

édité après , au-dessous de :

jsfiddle.net/dPcDu/2 vous pouvez ajouter un 4ème paramètre px pour le box-shadow qui fait la propagation et reflètera plus facilement ses images.

#something {
  background: transparent url(https://i.stack.imgur.com/RL5UH.png) 50% 50% no-repeat;
  min-width: 300px;
  min-height: 300px;
  box-shadow: inset 0 0 0 10px rgba(0, 255, 0, 0.5);
}
<div id="something"></div>
116
répondu David Thomas 2017-05-23 10:31:39

je recommande l'utilisation de box-sizing .

*{
  -webkit-box-sizing:border-box;
  -moz-box-sizing:border-box;
  -ms-box-sizing:border-box;
  box-sizing:border-box;
}

#bar{
  border: 10px solid green;
  }
33
répondu Stefan Hans Schonert 2013-07-01 08:19:09

pour produire une bordure inset à l'intérieur d'un élément la seule solution que j'ai trouvée (et j'ai essayé toutes les suggestions dans ce thread en vain) est d'utiliser un pseudo-élément tel que: avant

E. G.

.has-inset-border:before {
  content: "foo"; /* you need something or it will be invisible at least on Chrome */
  color: transparent;
  position: absolute;
  left: 10px;
  right: 10px;
  top: 10px;
  width: 10px;
  border: 4px dashed red;
}

la propriété box-sizing ne fonctionnera pas, car la bordure finit toujours en dehors de tout.

Le box-shadow options a la double désavantages de ne pas vraiment travailler et de ne pas être pris en charge comme largement (et le coût plus de cycles CPU à rendre, si vous vous souciez).

8
répondu podperson 2013-07-24 19:44:10

c'est une vieille astuce, mais je trouve que la façon la plus facile de faire cela est d'utiliser un outline-offset avec une valeur négative (exemple ci-dessous utilise-6px). Voici un violon de celui-ci-j'ai fait la bordure extérieure rouge et le contour blanc pour différencier les deux:

.outline-offset {
width:300px;
height:200px;
background:#333c4b;
border:2px solid red;
outline:2px #fff solid;
outline-offset:-6px;
}

<div class="outline-offset"></div>
7
répondu Vanessa King 2015-02-21 22:06:38

Je ne sais pas à quoi vous vous comparez.

mais une façon très simple d'avoir une bordure en médaillon par rapport à d'autres articles non bordés est d'ajouter un border: ?px solid transparent; à tous les articles et non ont une bordure.

il fera l'article bordé regarder en médaillon.

http://jsfiddle.net/cmunns/cgrtd /

2
répondu Adam Munns 2012-10-03 08:24:17

Si vous voulez vous assurer que la frontière est à l'intérieur de votre élément, vous pouvez utiliser

box-sizing:border-box;

ceci placera la frontière suivante à l'intérieur de l'élément:

border: 10px solid black;

(résultat similaire que vous obtiendriez en utilisant le paramètre additonal inset sur box-shadow, mais à la place celui-ci est pour la frontière réelle et vous pouvez toujours utiliser votre ombre pour autre chose.)

Note à une autre réponse ci-dessus: dès que vous utilisez n'importe quel inset sur box-shadow d'un certain élément, vous êtes limité à un maximum de 2 cases-ombres sur cet élément et exigerait un div enveloppant pour plus de shadowing.

les deux solutions devraient aussi bien vous débarrasser des effets 3D indésirables. Notez également que les deux solutions sont empilables (voir l'exemple que j'ai ajouté en 2018)

.example-border {
  width:100px;
  height:100px;
  border:40px solid blue;
  box-sizing:border-box;
  float:left;
}

.example-shadow {
  width:100px;
  height:100px;
  float:left;
  margin-left:20px;
  box-shadow:0 0 0 40px green inset;
}

.example-combined {
  width:100px;
  height:100px;
  float:left;
  margin-left:20px;
  border:20px solid orange;
  box-sizing:border-box;
  box-shadow:0 0 0 20px red inset;
}
<div class="example-border"></div>
<div class="example-shadow"></div>
<div class="example-combined"></div>
2
répondu Chris S. 2018-09-12 08:48:14

si box-sizing n'est pas une option, une autre façon de le faire est juste de faire un enfant de l'élément de taille.

Démo

CSS

.box {
  width: 100px;
  height: 100px;
  display: inline-block;
  margin-right: 5px;
}
.border {
  border: 1px solid;
  display: block;
}
.medium { border-width: 10px; }
.large  { border-width: 25px; }



HTML

<div class="box">
  <div class="border small">A</div>
</div>
<div class="box">
  <div class="border medium">B</div>
</div>
<div class="box">
  <div class="border large">C</div>
</div>
0
répondu Adam Grant 2014-02-06 19:19:14

vous pouvez utiliser background-clip: border-box;

exemple:

.example {
padding: 2em;
border: 10px solid rgba(51,153,0,0.65);
background-clip: border-box;
background-color: yellow;
}

<div class="example">Example with background-clip: border-box;</div>
0
répondu Jaha Ganiev 2017-01-23 09:43:22

donc j'ai essayé de faire apparaître une bordure en stationnaire mais elle a déplacé toute la barre du bas du menu principal qui n'avait pas l'air si bien que je l'ai corrigé avec ce qui suit:

#top-menu .menu-item a:hover {
    border-bottom:4px solid #ec1c24;
    padding-bottom:14px !important;
}
#top-menu .menu-item a {
    padding-bottom:18px !important;
}

j'espère que cela aidera quelqu'un là-bas.

0
répondu Derrik de Moei 2017-06-22 09:04:09

Simple SCSS solution avec les pseudo-éléments

Live demo: https://codepen.io/vlasterx/pen/xaMgag

// Change border size here
$border-width: 5px;

.element-with-border {
	display: flex;
	height: 100px;
	width: 100%;
	position: relative;
	background-color: #f2f2f2;
	box-sizing: border-box;
	
	// Use pseudo-element to create inset border
	&:before {
		position: absolute;
		content: ' ';
		display: flex;
		border: $border-width solid black;
		left: 0;
		right: 0;
		top: 0;
		bottom: 0;
		border: $border-width solid black;
		// Important: We must deduct border size from width and height
		width: calc(100% - $border-width); 
		height: calc(100% - $border-width);
	}
}
<div class="element-with-border">
  Lorem ipsum dolor sit amet
</div>
0
répondu Vladimir Jovanović 2018-09-20 11:12:25

je sais que c'est trois ans, mais pensé qu'il pourrait être utile à quelqu'un.

le concept consiste à utiliser le sélecteur :after (ou :before) pour positionner une bordure à l'intérieur de l'élément parent.

    .container{
        position:relative; /*Position must be set to something*/
    }

    .container:after{
        position:relative;
        top: 0;
        content:"";
        left:0;
        height: 100%; /*Set pixel height and width if not defined in parent element*/
        width: 100%; 

        -webkit-box-sizing:border-box;
        -moz-box-sizing:border-box;
        -ms-box-sizing:border-box;
        box-sizing:border-box;

        border:1px solid #000; /*set your border style*/

    }
-2
répondu Rick 2014-12-17 23:52:25