69 votes

Comment faire des coins arrondis à l'intérieur d'une boîte et de sa bordure?

Je suppose que le titre est un peu difficile à comprendre, donc je vais vous 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, à l'aide de la background-clip de la propriété:

enter image description here

(coins arrondis de la frontière, mais pas à l'intérieur de la boîte)

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

Merci!!!!

MODIFIER

Le HTML 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 le 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);}

64voto

Gio Borje Points 2615

La bordure intérieure calculs

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

Le cadre intérieur rayon est calculé comme la différence de la frontière extérieure de rayon (border-radius) et la largeur de la bordure (border-width) tels que

inner border radius = outer border radius - border width

Chaque fois que l' border-width est supérieure à la border-radius, à l'intérieur des frontières de rayon est négatif et vous obtenez certains maladroits inversé les coins. Actuellement, je ne crois pas qu'il existe une propriété pour le réglage de l' inner-border-radius, de sorte que vous aurez besoin de 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); }

Il suffit de soustraire le border-radius (6px) les valeurs de l' border-width de la 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 */

En ajoutant de la couleur des superpositions 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 comment faire hexadécimal arithmétique en JavaScript mais je suis sûr que vous pouvez trouver un algorithme dans Google.


L'Application Générale Des Frontières

Êtes-vous à l'aide d'une boîte séparée <div> pour votre frontière par le biais de son background de la propriété? Si oui, vous aurez besoin d'appliquer border-radius et son fournisseur des propriétés spécifiques à la fois la zone de bordure et à l'intérieur de la boîte:

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

Une façon beaucoup plus efficace serait tout simplement avoir à l'intérieur de la zone de gérer ses propres frontières:

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

CSS-sage, vous avez juste à déclarer .rounded-border de 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 de les appliquer à la classe de toutes les boîtes qui ont des bords arrondis:

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

Pour un seul élément de boîte, vous serez toujours tenus de déclarer la taille de la bordure afin d'être montré:

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

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

25voto

nickb Points 861

Une autre solution consiste à faire correspondre les frontières intérieures et extérieures combinées avec border-radius est de "faux" de la frontière à l'aide de l' <spread-radius> de la valeur de l' box-shadow de la propriété. Cela produit un solide ombre qui peut facilement passer pour un régulier de la frontière.

Par exemple, pour atteindre un 4px frontière et une 4px blanc rayon des frontières, 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 souhaitez ajouter un "réel" de l'ombre portée à l'ensemble du conteneur, vous pouvez simplement la chaîne de 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: Gardez à l'esprit que l'ordre des instructions est l'ordre dans lequel il sera rendu.

La seule chose à garder, c'est que la première "fausse frontière" chevauchera la première de X pixels (où X est la largeur de la bordure de l'ombre que vous souhaitez en dessous (et de les combiner, si vous utilisez RGBa opacité sur elle-dessous de 100%.)

De sorte qu'il ne fonctionne pas dans toutes les situations, mais il va obtenir la majorité. J'utilise assez souvent, lorsque les frontières ne sont pas idéales.

19voto

Leo Wu Points 21

Depuis il n'y a pas une telle chose comme inner-border-radius pour le CSS, les navigateurs par défaut pour border-radius - border-width. Si vous n'aimez pas que, la solution classique consiste à créer deux divs avec des bordures pour imiter l'intérieur des frontières de rayon, mais cette solution apporte en plus de la conception dans le code html. C'est aussi une douleur si c'est une frontière commune servi de modèle à travers le site.

J'ai réussi à trouver un moyen de garder le tout en css, par la production de l'intérieur à l'aide de div :after et content: "". Donc, pour votre cas, il serait:

.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;
}

3voto

Shaun McCran Points 123

Vous devez avoir deux éléments div, l'un dans l'autre, et utiliser un CSS de coin arrondi de navigateur croisé, 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;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X