Comment faire des coins ronds à la fois à l'intérieur d'une boîte et de son bord?

je suppose que le titre est un peu difficile à comprendre, donc je vais expliquer. Je suis en train de réaliser cet effet:

enter image description here

(une boîte qui a des coins arrondis et sa frontière, qui a aussi des bordures arrondies).

j'ai réussi à le faire, en utilisant le background-clip propriété:

enter image description here

(coins arrondis pour les bordures mais à l'intérieur de la boîte)

La question est, comment puis-je obtenir coins arrondis pour la boîte intérieure?

Merci!

EDIT

le HTML que j'utilise:

<header class="body template-bg template-border radius-all">
        <nav>
            <ul>
                <li><a href="#">Link 1</a></li>
                <li><a href="#">Link 2</a></li>
                <li><a href="#">Link 3</a></li>
                <li><a href="#">Link 4</a></li>
            </ul>
        </nav>
    </header>

et la CSS:

.radius-all {
  border-radius: 10px;
  -moz-border-radius: 10px;
  -webkit-border-radius: 10px;
}

.template-bg {
  background: #FFF;
  -moz-background-clip: padding;
  -webkit-background-clip: padding;
  background-clip: padding-box;
}

.template-border {
  border: 5px solid rgba(255, 255, 255, 0.2);
}
38
demandé sur gentil papillon 2011-01-30 00:40:07

7 réponses

calcul des limites intérieures

tout d'Abord, vous aurez besoin de supprimer -vendor-background-clip: padding-box ou border-box la valeur par défaut afin d'atteindre l'intérieur des frontières de rayon.

le rayon de la bordure intérieure est calculé comme la différence du rayon de la bordure extérieure (border-radius) et la largeur de la bordure (border-width) tels que

inner border radius = outer border radius - border width

Chaque fois que le border-width est plus grand que le border-radius, le rayon de la bordure intérieure est négatif et vous obtenir quelques coins maladroits inversés. Actuellement, Je ne crois pas qu'il y ait une propriété pour ajuster le inner-border-radius, vous aurez donc besoin de le calculer manuellement.

dans votre cas:

inner border radius = 6px - 5px = 1px

Votre nouveau CSS devrait être:

.radius-all { border-radius: 6px; -moz-border-radius: 6px; -webkit-border-radius: 6px; }
.template-bg { background: #FFF; }
.template-border { border: 5px solid rgba(255, 255, 255, 0.2); }

soustrayez simplement le border-radius (6px) valeurs de border-width valeur (5px) afin d'atteindre les résultats souhaités intérieure-border-radius:


Code qui fonctionne pour moi

testé sur Firefox 3.x, Google Chrome, et Safari 5.0

 .radius-all { border-radius: 10px; -moz-border-radius: 10px; -webkit-border-radius: 10px; }
.template-bg { background: #FFF; }
.template-border { border: 5px solid rgba(0, 0, 0, 0.2); } /* Note that white on white does not distinguish a border */

ajouter des couleurs en JavaScript

<script type="text/javascript">
    var bodyBgColor = document.getElementsByTagName('body')[0].style.backgroundColor;;

    // insert opacity decreasing code here for hexadecimal

    var header = document.getElementsByTagName('header')[0];
    header.style.backgroundColor = bodyBgColor;
</script>

Je ne suis pas entièrement sûr de savoir faire l'arithmétique hexadécimale en JavaScript, mais je suis sûr que vous pouvez trouver un algorithme dans Google.


Application Des Frontières Générales

utilisez-vous une boîte séparée <div> pour votre frontière à travers son background propriété? Si oui, vous aurez besoin d'appliquer border-radius et ses propriétés spécifiques au vendeur à la fois sur la boîte de bordure et la boîte intérieure:

<div id="border-box" style="border-radius: 5px;">
    <div id="inner-box" style="border-radius: 5px;">
    </div>
</div>

une façon beaucoup plus efficace consisterait simplement à ce que la boîte intérieure gère sa propre frontière:

<div id="inner-box" style="border: 4px solid blue; border-radius: 5px">
    <!-- Content -->
</div>

CSS-sage, vous pouvez simplement déclarer un .rounded-border la classe et de l'appliquer à chaque zone ont des bords arrondis:

.rounded-borders {
    border-radius: 5px;
    -moz-border-radius: 5px;
    -webkit-border-radius: 5px;
    -khtml-border-radius: 5px;
}

et appliquer la catégorie à toutes les cases qui auront été arrondies frontières:

<div id="border-box" class="rounded-borders">
    <div id="inner-box" class="rounded-borders">
    </div>
</div>

pour un élément de boîte simple, vous devrez quand même déclarer la taille de la bordure pour être affiché:

<style type="text/css">
    #inner-box { border: 4px solid blue; }
</style>

<div id="inner-box" class="rounded-borders">
</div>
34
répondu Gio Borje 2011-01-30 18:53:45

une autre solution consiste à combiner les bordures intérieure et extérieure avec border-radius est de "truquer" la frontière en utilisant le <spread-radius> valeur box-shadow propriété. Cela produit une ombre solide qui peut facilement passer pour une bordure régulière.

par exemple, pour obtenir une bordure 4px et un rayon de bordure blanc 4px, essayez ceci:

/* rounded corners */
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;

/* drop shadow */
-webkit-box-shadow: 0px 0px 0px 4px #fff;
-moz-box-shadow: 0px 0px 0px 4px #fff;
box-shadow: 0px 0px 0px 4px #fff;

si vous voulez ajouter une ombre de goutte "réelle" à l'ensemble du conteneur, vous pouvez simplement enchaîner votre ombre des déclarations comme suit:

/* drop shadow */
-webkit-box-shadow: 0px 0px 0px 4px rgba(255,255,255,1.0),
        1px 1px 8px 0 rgba(0,0,0,0.4);
-moz-box-shadow: 0px 0px 0px 4px rgba(255,255,255,1.0),
        1px 1px 8px 0 rgba(0,0,0,0.4);
box-shadow: 0px 0px 0px 4px rgba(255,255,255,1.0),
        1px 1px 8px 0 rgba(0,0,0,0.4);

Remarque: Conserver à l'esprit que l'ordre des instructions est l'ordre dans lequel il sera rendu.

la seule chose à éviter est que la "fausse bordure" initiale chevauchera les premiers pixels X (où X est la largeur de la bordure) de toute ombre que vous voulez sous elle (et combinez, si vous utilisez l'opacité RGBa sur elle en dessous de 100%.)

Donc il ne fonctionnera pas dans les situations, mais la majorité. Je l'utilise assez souvent quand les bordures régulières ne sont pas idéales.

17
répondu nickb 2011-12-28 23:33:35

Puisqu'il n'y a pas de telle chose que inner-border-radius pour CSS, les navigateurs le font par défaut à border-radius - border-width. Si vous n'aimez pas cela, la solution typique est de créer deux divs avec des bordures pour imiter le rayon intérieur de la bordure, mais cette solution apporte plus de design dans le html. C'est aussi une douleur si c'est un modèle de bordure commune utilisé tout au long du site.

j'ai réussi à trouver un moyen de garder tout cela dans css en produisant la div interne en utilisant :after et content: "". Donc, pour votre cas, il serait être:

.template-border {
    position: relative;
    border-radius: 5px;
    background-color: #000;
    border: 10px solid #000;
    z-index: -2;
}

.template-border:after {
    content: "";
    display: block;
    position: absolute;
    width: 100%;
    height: 100%;
    border-radius: 5px;
    background-color: #FFF;
    z-index: -1;
}
13
répondu Leo Wu 2013-03-11 11:03:50

Vous avez besoin d'avoir deux éléments div, l'un dans l'autre, et d'utiliser un navigateur croix à coins arrondis en css, comme ceci:

.small-rounded {
    border: 1px solid ##000;
    -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px;
    -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px;
    -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px;
    -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px;
    border-radius: 5px;
}
2
répondu Shaun McCran 2011-01-30 18:55:25

Le problème n'est pas le codage de la CSS mais les mathématiques d'un cercle. Essentiellement votre border-inner-radius (je sais que cette propriété n'existe pas) est égale à la border-radius -border-width.

tout simplement déterminer ce que vous voulez que votre rayon intérieur soit, puis Ajouter la largeur de la bordure pour obtenir l'effet désiré.

border-inner-radius+ border-width= border-radius

2
répondu Daniel 2017-01-19 01:10:18

.my-div
{
  background-color: white;
  border: solid 20px black;
  border-radius: 10px;
  box-shadow: 0 0 10px black;
  height: 100px;
  left: 30px;
  position: relative;
  top: 20px;
  width: 200px;
}
.my-div:before
{
  background-color: white;
  border-radius: 5px;
  content: "";
  display: block;
  height: calc(100% + 20px);
  left: -10px;
  position: absolute;
  top: -10px;
  width: calc(100% + 20px);
  z-index: 1;
}
.some-content
{
  height: calc(100% + 20px);
  left: -10px;
  position: relative;
  top: -10px;
  width: calc(100% + 20px);
  z-index: 3;
}
.some-header
{
  background-color: green;
  border-radius: 5px 5px 0 0;
  height: 30px;
}
<html>
	<body>
		<div class="my-div">
			<div class="some-content">
				<div class="some-header">my title</div>
				<div>some other content</div>
			</div>
		</div>
	</body>
</html>
1
répondu Zsolti 2017-01-26 20:19:16

vous devez faire le rayon de bordure à une valeur supérieure à la largeur de bordure jusqu'à ce que vous commenciez à voir une courbe. Ce n'est pas une formule fixe pour définir le rayon de la bordure de +1px plus grand que la largeur de la bordure. Cependant, ce sera certainement une valeur positive. Vous devez expérimenter dans les différents navigateurs où vous avez besoin de cela jusqu'à ce que vous voyez la plus petite valeur de rayon de Frontière possible qui fonctionne assez bon pour vous dans la plupart des navigateurs. (Certains navigateurs peuvent ne pas le supporter. Par exemple, dans Google Chrome, j'ai réglé une largeur de bordure à 10px, mais j'ai dû régler le rayon de bordure à 13px avant de commencer à voir un semblant de courbe de bordure intérieure, tandis que 15px fonctionnait encore mieux.

0
répondu Volomike 2015-12-31 08:01:59