76 votes

Couper les coins à l'aide de CSS

Je cherche à "couper" le coin supérieur gauche d'un div, comme si vous aviez plié le coin d'une page vers le bas.

J'aimerais le faire en pure CSS, y a-t-il des méthodes ?

3voto

hakJav Points 271

Avec une petite modification du code de Joseph, l'élément ne nécessite pas un arrière-plan solide :

div {
    height: 300px;
    background: url('http://images2.layoutsparks.com/1/190037/serene-nature-scenery-blue.jpg');
    position: relative;
}

div:before {
    content: '';
    position: absolute;
    top: 0; right: 0;
    border-top: 80px solid white;
    border-left: 80px solid rgba(0,0,0,0);
    width: 0;
}

http://jsfiddle.net/2bZAW/1921/

Cette utilisation de rgba(0,0,0,0) permet de rendre invisible le "coin" intérieur. .

Vous pouvez également modifier le 4ème paramètre 'a', où 0 < a < 1 pour avoir une ombre afin d'obtenir un effet de "coin plié" :

http://jsfiddle.net/2bZAW/1922/ (avec ombre)


NOTE : Les valeurs de couleur RGBA sont prises en charge par IE9+, Firefox 3+, Chrome, Safari et Opera 10+.

2 votes

Utilisez le mot "transparent" au lieu de rgba(0,0,0,0) et vous obtiendrez un meilleur support dans IE7+.

2 votes

El parent doit toujours être de couleur unie (par exemple, dans votre exemple, il est blanc uni), ce qui, je pense, est la limitation à laquelle Joseph faisait référence. La réponse de @web-tiki gère de manière fantastique les arrière-plans plus complexes.

3voto

Kiwad Points 400

Selon la solution de gradient linéaire de Harry (répondu le 14 octobre 15 à 9:55), il est dit que le fond d'opacité n'est pas possible, j'ai essayé et oui, il ne l'est pas.

Mais j'ai trouvé une solution de contournement. Non, ce n'est pas super optimisé, mais ça a marché. Voici donc ma solution. Comme Harry n'utilise pas de pseudo-élément, nous pouvons y parvenir en en créant un.

Définissez la position par rapport au conteneur et créez un pseudo-élément avec les mêmes propriétés de dégradé linéaire. En d'autres termes, il suffit de le cloner. Ensuite, mettez un fond transparent pour le conteneur, et disons un fond noir pour le clone. Attribuez-lui une position absolue, un z-index de -1 et une valeur d'opacité (par exemple, 50 %). Cela fera l'affaire. Encore une fois, il s'agit d'une solution de contournement et elle n'est pas parfaite, mais elle fonctionne parfaitement.

.cut-corner {
    position: relative;
    color: white;
    background-repeat: no-repeat;
    background-image: linear-gradient(white, white), linear-gradient(white, white), linear-gradient(white, white), linear-gradient(white, white), linear-gradient(to bottom left, transparent calc(50% - 1px), white calc(50% - 1px), white calc(50% + 1px), transparent calc(50% + 1px)), linear-gradient(transparent, transparent), linear-gradient(transparent, transparent);
    background-size: 2px 100%, 2px 100%, 100% 2px, 100% 2px, 25px 25px, 100% 100%, 100% 100%;
    background-position: 0% 0%, 100% 25px, -25px 0%, 0px 100%, 100% 0%, -25px 0%, 100% 25px;
}
.cut-corner:after {
    content: "";
    position: absolute;
    left: 0;
    bottom: 0;
    right: 0;
    top: 0;
    z-index: -1;
    opacity: 0.5;
    background-repeat: no-repeat;
    background-image: linear-gradient(white, white), linear-gradient(white, white), linear-gradient(white, white), linear-gradient(white, white), linear-gradient(to bottom left, transparent calc(50% - 1px), white calc(50% - 1px), white calc(50% + 1px), black calc(50% + 1px)), linear-gradient(black, black), linear-gradient(black, black);
    background-size: 2px 100%, 2px 100%, 100% 2px, 100% 2px, 25px 25px, 100% 100%, 100% 100%;
    background-position: 0% 0%, 100% 25px, -25px 0%, 0px 100%, 100% 0%, -25px 0%, 100% 25px;
}

/* Just for demo */

div {
  padding: 10px;
}
body{
 background-image: radial-gradient(circle, #3F9CBA 0%, #153346 100%);
}

<div class="cut-corner">
  Some content<br>
  Some content<br>
  Some content<br>
  Some content  
</div>

2voto

Gagan Gami Points 9

Par une petite modification du code de Joshep... Vous pouvez utiliser ce code qui semble être le coin droit rabattu selon vos besoins.

div {
    height: 300px;
    background: red;
    position: relative;
}

div:before {
    content: '';
    position: absolute;
    top: 0; right: 0;
    border-top: 80px solid white;
    border-left: 80px solid blue;
    width: 0;
}

2voto

Alex Gurin Points 21

Une autre solution : le html :

<div class="background">
  <div class="container">Hello world!</div>
</div>

css :

.background {
  position: relative;
  width: 50px;
  height: 50px;
  border-right: 150px solid lightgreen;
  border-bottom: 150px solid lightgreen;
  border-radius: 10px;
}
.background::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  width: 0;
  height: 0;
  border: 25px solid lightgreen;
  border-top-color: transparent;
  border-left-color: transparent;
}
.container {
  position: absolute;
  padding-left: 25px;
  padding-top: 25px;
  font-size: 38px;
  font-weight: bolder;
}

https://codepen.io/eggofevil/pen/KYaMjV

1voto

Xenxen Points 11

J'ai récemment coupé le coin supérieur droit et superposé les onglets comme des dossiers. Je ne suis pas du tout doué pour le code, alors ne tenez pas compte de mon code de merde, mais j'ai fait ça en combinant un carré, un triangle et un rectangle... Cette approche n'est peut-être pas nouvelle, mais j'espère que quelqu'un la trouvera utile.

https://i.stack.imgur.com/qFMRz.png

Voici le HTML :

<!DOCTYPE html>
<html lang ="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" type="text/css" href="style.css"> 
    </head>
    <body>
        <div class="folders">
            <div class="container">
                <div class="triangleOne">
                    <p class="folderNames">Home</p>
                </div>
                <div class="triangleOneCut">
                </div>
                <div class="triangleOneFill">
                </div>
            </div>

            <div class="container2">
                <div class="triangleOne blue">
                    <p class="folderNames">About</p>
                </div>
                <div class="triangleOneCut blueCut">
                </div>
                <div class="triangleOneFill blue">
                </div>
            </div>

            <div class="container3">
                <div class="triangleOne green">
                    <p class="folderNames">Contact</p>
                </div>
                <div class="triangleOneCut greenCut">
                </div>
                <div class="triangleOneFill green">
                </div>
            </div>
        </div>
    </body>
</html>

Voici le CSS :

.triangleOne {
    height: 50px;
    width: 40px;
    background: red;
    border-radius: 5px 0px 0px 5px;
    position: absolute;
}

.triangleOneCut {
    content: '';
    position: absolute;
    top: 0; left: 40px;
    border-top: 10px solid transparent;
    border-left: 10px solid red;
    width: 0;
}

.triangleOneFill {
    content: '';
    position: absolute;
    top: 10px; left: 40px;
    width: 10px;
    height: 40px;
    background-color: red;
    border-radius: 0px 0px 5px 0px;
}

.container {
    position: relative;
    height: 50px;
    width: 50px;
    display: inline-block;
    z-index: 3;
}

.container2 {
    position: relative;
    height: 50px;
    width: 50px;
    display: inline-block;
    left: -10px;
    z-index: 2;
}

.container3 {
    position: relative;
    height: 50px;
    width: 50px;
    display: inline-block;
    left: -20px;
    z-index: 1;
}

.blue {
    background-color: blue;
}

.green {
    background-color: green;
}

.blueCut {
    border-left: 10px solid blue;
}

.greenCut {
    border-left: 10px solid green;
}

.folders {
    width: 160px;
    height: 50px;
    /* border: 10px solid white; */
    margin: auto;
    padding-left: 25px;
    margin-top: 100px;
}

.folderNames {
    text-align: right;
    padding-left: 2px;
    color: white;
    margin-top: 1.5px;
    font-family: monospace;
    font-size: 6.5px;
    border-bottom: double 1.5px white;
}

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