How to get 'div' shaped as a flag with CSS

前端 未结 7 1690
旧巷少年郎
旧巷少年郎 2020-12-17 23:43

I want to add a label on some of my elements on a website and design for a label that is a flag with an inverted V-shaped cut at the bottom.

So far I have this:

相关标签:
7条回答
  • 2020-12-18 00:17

    With CSS:

    You can use CSS transforms on pseudo elements to create the background with a transparent inverted triangle at the bottom:

    body{background:url('http://lorempixel.com/image_output/food-q-c-640-480-1.jpg');background-size:cover;}
    p{
      position: relative;
      width: 150px; height: 150px;
      overflow: hidden;
      border-top:3px solid #EF0EFE;
    }
    p:before, p:after{
      content: '';
      position: absolute;
      top: -3px;
      height: 100%; width: 50%;
      z-index: -1;
      border:2px solid #EF0EFE;
      box-sizing:border-box;
    }
    p:before{
      left: 0;  
      transform-origin: 0 0;
      transform: skewY(-20deg);
      border-width:0 0 4px 3px;
    }
    p:after{
      right: 0;
      transform-origin: 100% 0;
      transform: skewY(20deg);
      border-width:0 3px 4px 0;
    }
    <p>Some text ... </p>

    Note that you will need to add vendor prefixes on the transform and transform-origin properties to maximize browser support. See canIuse for more information.


    With SVG

    Another approach is to use an inline SVG with the polygon element:

    body{background: url('http://lorempixel.com/image_output/food-q-c-640-480-1.jpg');background-size: cover;}
    div{position: relative;width: 100px; height: 150px;}
    svg{position: absolute;width: 100%;height: 100%;z-index: -1;}
    <div>
      <svg viewbox="-1.5 -1.5 103 153">
        <polygon points="100 0, 100 100, 50 85, 0 100, 0 0" fill="transparent" stroke-width="3" stroke="#ef0efe"/>
      </svg>
      <p>Some text ... </p>
    </div>

    0 讨论(0)
  • 2020-12-18 00:18

    Here is a slightly different method using pseudo-elements and transform rotations to create an outlined banner like this:

    Before overflow cut

    • This angled shape is created with position: absolute pseudo-elements, :before and :after:

    Before overflow cut

    • The excess is cut off with overflow: hidden on the parent to form our banner:

    After overflow cut

    • The outline is created with box-shadow and the two angles are prevented from overlapping by pulling / pushing the x-axis by 46px — box-shadow: 46px 0 0 3px #000

    Full Example

    div {
      height: 100px;
      width: 100px;
      margin: 100px auto;
      position: relative;
      overflow: hidden;
      border: solid 3px #000;
      border-bottom: none;
      text-align: center;
    }
    div:before,
    div:after {
      content: '';
      display: block;
      height: 100%;
      width: 200%;
      transform: rotate(20deg);
      box-shadow: 46px 0 0 3px #000;
      position: absolute;
      top: 1px;
      right: -120%;
    }
    div:after {
      transform: rotate(-20deg);
      left: -120%;
      box-shadow: -46px 0 0 3px #000;
    }
    <div>Text</div>

    0 讨论(0)
  • 2020-12-18 00:18

    STOLEN FROM CSS-SHAPES

    #flag {
      width: 110px;
      height: 56px;
      padding-top: 15px;
      position: relative;
      background: red;
      color: white;
      font-size: 11px;
      letter-spacing: 0.2em;
      text-align: center;
      text-transform: uppercase;
    }
    #flag:after {
      content: "";
      position: absolute;
      left: 0;
      bottom: 0;
      width: 0;
      height: 0;
      border-bottom: 13px solid #eee;
      border-left: 55px solid transparent;
      border-right: 55px solid transparent;
    }
    

    DEMO:

    #flag {
      width: 110px;
      height: 56px;
      padding-top: 15px;
      position: relative;
      background: red;
      color: white;
      font-size: 11px;
      letter-spacing: 0.2em;
      text-align: center;
      text-transform: uppercase;
    }
    #flag:after {
      content: "";
      position: absolute;
      left: 0;
      bottom: 0;
      width: 0;
      height: 0;
      border-bottom: 13px solid #eee;
      border-left: 55px solid transparent;
      border-right: 55px solid transparent;
    }
              
    <div id="flag"></div>


    My Approach

    My approach uses skewed elements, and allows you to quickly position them to your needs.

    div {
      height: 100px;
      width: 100px;
      position: relative;
      border-left: 10px solid tomato;
      border-top: 10px solid tomato;
      border-right: 10px solid tomato;
      text-align: center;
      line-height: 100px;
      font-size: 30px;
    }
    div:before {
      content: "";
      position: absolute;
      height: 50%;
      width: 50%;
      left: -10px; /*width of border*/
      bottom: -30px;
      z-index: -2;
      -webkit-transform: skewY(-20deg);
      transform: skewY(-20deg);
      border-bottom: 10px solid tomato;
      border-left: 10px solid tomato;
    }
    div:after {
      content: "";
      position: absolute;
      height: 50%;
      width: 50%;
      right: -10px; /*width of border*/
      bottom: -30px;
      z-index: -2;
      -webkit-transform: skewY(20deg);
      transform: skewY(20deg);
      border-bottom: 10px solid tomato;
      border-right: 10px solid tomato;
    }
    div:hover, div:hover:before, div:hover:after{
      background:lightgray;
      }
    <div>TEXT</div>

    0 讨论(0)
  • 2020-12-18 00:22

    A better solution with text easily positioned in the middle, using a rectangle background and a triangle at the bottom.

    .css-shapes{ 
      position: relative;
      height: 250px; 
      width: 150px; 
      background: #FFD05B;
      color: #fff;
      text-align: center;
      line-height:225px;
      font-size: 90px;
      box-sizing: border-box;
    }
    .css-shapes:after{
      content: '';
      position:absolute;
      left:0;
      bottom: 0;
      display: block;
      width: 100%;
      height:50px;
      border-bottom: 25px solid #fff;
      border-left: 75px solid transparent;
      border-right: 75px solid transparent;
      box-sizing: border-box;
    }
    <div class="css-shapes">1</div>

    0 讨论(0)
  • 2020-12-18 00:24

    A quick workaround is to rotate it:

     transform: rotate(90deg);
    

    Fiddle


    Another solution would be an SVG path, here's a fiddle!.

    0 讨论(0)
  • 2020-12-18 00:25

    I've had a go at updating your CSS to create the effect you want:

    .css-shapes {
      height: 250px;
      width: 0px;
      border-left: 99px solid #f00fff;
      border-right: 99px solid #f00fff;
      border-bottom: 39px solid transparent;
      position: relative
    }
    .n-shape {
      height: 248px;
      width: 0px;
      border-left: 95px solid #ffffff;
      border-right: 95px solid #ffffff;
      border-bottom: 39px solid transparent;
      position: absolute;
      top: -6px;
      right: -95px;
    }
    .top {
      position: absolute;
      top: 0px;
      width: 198px;
      height: 2px;
      background-color: #f00fff;
      left: -99px;
      border-bottom: 1px solid #f00fff;
    }
    <div class="css-shapes">
      <div class="n-shape"></div>
      <div class="top"></div>
    </div>

    Fiddle: http://jsfiddle.net/dywhjwna/

    0 讨论(0)
提交回复
热议问题