Comment puis-je faire ma courbe de rayon de frontière vers l'extérieur?
J'essaie de faire en sorte qu'un div ait des bordures comme le dessin suivant:
C'est ce que j'ai essayé:
div {
height: 100px;
width: 100px;
border-bottom-right-radius:100px 10px;
border:1px solid #000;
}
<div></div>
Qu'est-ce qu'un moyen d'effet pour y parvenir?
22
demandé sur
misterManSam
2015-05-08 04:28:56
3 réponses
À l'Aide de :before
et :after
La bordure supérieure est créée avec :before
:
Sa hauteur est la même que la frontière rayon
Il est placé juste à l'extérieur avec
top
et s'aligne avec le bord gauche grâce àleft
Sa largeur est calculée avec
calc
précisément la ligne du haut de la courbeLa courbe peut être raffiné avec
transform: skewX(-60deg)
La gauche la bordure est créée avec :after
:
- on lui donne une hauteur de 100% moins la hauteur de l'avant et l'épaisseur de la bordure avec
calc
Exemples
Numéro 1 - un peu pointu
div {
border-bottom-right-radius: 100px 20px;
border: 1px solid #000;
border-top: none;
height: 500px;
width: 200px;
position: relative;
border-left: none;
}
div:before,
div:after {
content: '';
display: block;
position: absolute;
left: -1px;
}
div:before {
height: 20px;
width: 100%;
width: calc(100% + 1px);
border-bottom-right-radius: 100px 20px;
border-bottom: 1px solid #000;
border-right: solid 1px #000;
top: -1px;
}
div:after {
height: calc(100% - 18px);
border-left: 1px solid #000;
top: 19px;
}
<div></div>
Numéro 2 - point lissé avec biais
div {
border-bottom-right-radius: 100px 20px;
border: 1px solid #000;
border-top: none;
height: 200px;
width: 200px;
position: relative;
border-left: none;
}
div:before,
div:after {
content: '';
display: block;
position: absolute;
left: -1px;
}
div:before {
height: 20px;
width: 100%;
width: calc(100% - 36px);
border-bottom-right-radius: 100px 20px;
border-bottom: 1px solid #000;
border-right: solid 2px #000;
top: 0px;
left: 17px;
transform: skewX(-60deg);
}
div:after {
height: calc(100% - 19px);
border-left: 1px solid #000;
top: 20px;
}
<div></div>
27
répondu
misterManSam
2015-05-08 07:38:07
Je pourrais le faire en utilisant DIVs, mais je suis sûr qu'il existe une façon plus élégante de le faire:
#container {
border:none;
height:100px;
border-right: solid 1px #000;
}
#square_top {
border-bottom-right-radius:100px 10px;
border:none;
border-bottom: solid 1px #000;
height:10px;
}
#square_bottom {
border-bottom-right-radius:100px 10px;
border:none;
border-bottom: solid 1px #000;
border-right:solid 1px #000;
border-left:solid 1px #000;
height:10px;
}
#square {
height: 90px;
border-left:solid 1px #000;
}
<div id="container">
<div id="square_top"></div>
<div id="square">TEXT HERE</div>
</div>
<div id="square_bottom"></div>
7
répondu
Nizam
2015-05-08 02:33:23
Bien que CSS puisse le faire, il existe une autre approche qui permet plus de flexibilité: SVG
Cette approche permet :
- la forme ajoute sa taille à la taille du contenu
- Réactif
- permet tout type d'arrière-plan (image, dégradés, couleur semi-transparente...)
- permet tout type de remplissage pour la forme (image, dégradés, couleur semi-transparente...)
- plus facile à contrôler les courbes haut et bas :
body {background: url('http://lorempixel.com/output/people-q-g-640-480-9.jpg');background-size: cover;}
div {
position: relative;
width: 30%;
padding: 5%;
color: #fff;
text-align: center;
}
svg {
position: absolute;
top: 0; left: 0;
width: 100%; height: 100%;
z-index: -1;
}
<div>
<p>Some text</p>
<p>Some text</p>
<p>Some text</p>
<p>Some text</p>
<p>Some text</p>
<p>Some text</p>
<p>Some text</p>
<p>Some text</p>
<p>Some text</p>
<svg viewbox="0 0 50 100" preserveAspectRatio="none">
<path d="M1 9 C49 10 49 1 49 1 V90 C49 91 49 99 1 99z" stroke-width="0.5" stroke="#000" fill-opacity="0.5" />
</svg>
</div>
4
répondu
web-tiki
2015-05-09 05:53:01