【问题标题】:How to create a corset like effect with CSS?如何使用 CSS 创建类似紧身胸衣的效果?
【发布时间】:2018-12-24 03:50:14
【问题描述】:

我想用CSS创建如下效果,最初,我想合并两个带圆角的矩形,但我不能用那种方式,因为它是一个尖角,不是圆的,看看里面的区域圈子,这是最难的部分。

所以我这样做:
1. 创建一个圆角矩形作为轮廓。边框颜色为灰色。
2. 在矩形左侧的中心创建一个灰色三角形。
3. 创建另一个白色三角形覆盖步骤 2 中的灰色三角形,稍微偏移,使其显示为矩形的边框。

效果如下:

我的问题是:
1.如何添加正确的部分?看来我只能在 CSS 选择器中同时绘制一个 shap :before 或 :after。
2.如果我想添加边框阴影效果怎么办?如果我添加矩形的阴影,白色三角形会出现,它很难看。
3. 或者有什么其他的方法可以产生这种效果?

代码如下:

.triangle_left {
  width: 600px;
  height: 600px;
  position: relative;
  margin: 20px auto;
  border: 2px solid #cccccc;
  /* box-shadow: 0px 0px 8px 1px darkgrey; */
  border-radius: 20px;
}

.triangle_left:before {
  content: '';
  width: 0;
  height: 0;
  border: 20px solid transparent;
  border-left-color: #cccccc;
  position: absolute;
  left: 0;
  top: 50%;
  margin-top: -20px;
}

.triangle_left:after {
  content: '';
  width: 0;
  height: 0;
  border: 18px solid transparent;
  border-left-color: white;
  position: absolute;
  left: -2px;
  top: 50%;
  margin-top: -18px;
}
<div class="triangle_left">

</div>

Try it here in JSFiddle

【问题讨论】:

  • 我经常使用这个网站来寻找我需要创建的形状:css-tricks.com/examples/ShapesOfCSS
  • 谢谢,我知道那个链接,但这还不是全部。
  • 1.诚然,伪元素大部分可以被视为实际元素,但它们是一个元素,因此基本上是一个形状。但是通过大量的努力,有些人可以制作出非常棒的效果。如果你能用::before 做左边,你可以用::after 做右边。 2. 也是。您正在使用叠加层隐藏部分边框。也许你可以给它一个内在的阴影。 3. SVG。一个可缩放的矢量图形,为您提供更多可能性。
  • 所以对于 1. 这并不完美,但也许您可以对其进行微调,直到您满意为止。我正在使用一个旋转的伪元素,并给它一个嵌入阴影,该阴影显示在两侧(不幸的是,其他侧也有一点)。伪元素本身有一个白色背景,这使它隐藏了一些现有的阴影。如果您可以根据需要对其进行微调,则可以镜像::after 伪元素的效果并将其用于右侧。 jsfiddle.net/v21xek78/1
  • 您可以使用包含元素 jsfiddle.net/7tun48es/65 来做到这一点,该元素位于标记重复的答案之一中

标签: html css css-shapes


【解决方案1】:

在我看来,您要么必须使用边框(就像您所做的那样),要么必须使用 SVG。对于阴影,它不适用于边框和常规 css 阴影,因此您希望将阴影应用为过滤器(或者您可以使用 SVG 作为阴影)。

这是我想出来的

.triangle_left {
  width: 600px;
  height: 600px;
  position: relative;
  margin: 20px auto;
  border: 2px solid #cccccc;
  /* box-shadow: 0px 0px 8px 1px darkgrey; */
  border-radius: 20px;
}

.triangle_left:before {
  content: '';
  width: 0;
  height: 0;
  border-top: 30px solid transparent;
  border-left: 30px solid white;
  border-bottom: 30px solid transparent;
  filter: drop-shadow(4px 0px 0px #ccc);
  position: absolute;
  left: -6px;
  top: 50%;
}

.triangle_left:after {
  content: '';
  width: 0;
  height: 0;
  border-top: 30px solid transparent;
  border-right: 30px solid white;
  border-bottom: 30px solid transparent;
  filter: drop-shadow(-4px 0px 0px #ccc);
  position: absolute;
  right: -6px;
  top: 50%;
}
<div class="triangle_left">

</div>

【讨论】:

    【解决方案2】:

    一个想法是使用渐变构建形状并依赖drop-shadow过滤器

    .box {
      margin-top:50px;
      border-radius:10px;
      width:200px;
      height:200px;
      background:
      /*the middle line */
        repeating-linear-gradient(to right,gold 0px,gold 5px,transparent 5px,transparent 10px) center/calc(100% - 40px) 2px,
        /*The background*/
        linear-gradient(to bottom right,#fff 49%,transparent 50%) 100% calc(50% - 10px) / 20px 20px,
        linear-gradient(to top    right,#fff 49%,transparent 50%) 100% calc(50% + 10px) / 20px 20px,
        linear-gradient(to bottom left ,#fff 49%,transparent 50%) 0    calc(50% - 10px) / 20px 20px,
        linear-gradient(to top    left ,#fff 49%,transparent 50%) 0    calc(50% + 10px) / 20px 20px,
        
        linear-gradient(#fff,#fff) top    right / 20px calc(50% - 20px),
        linear-gradient(#fff,#fff) bottom right / 20px calc(50% - 20px),
        
        linear-gradient(#fff,#fff) top    left / 20px calc(50% - 20px),
        linear-gradient(#fff,#fff) bottom left / 20px calc(50% - 20px),
        
        linear-gradient(#fff,#fff) center/calc(100% - 40px) 100%;
       background-repeat:no-repeat;
       filter:drop-shadow(0 0 5px #000); 
    }
    
    body {
      background:pink;
    }
    <div class="box">
    </div>

    您也可以使用 clip-path 执行此操作,但您需要一个额外的包装器来应用 drop-shadow 过滤器

    .box {
      margin-top: 50px;
      border-radius: 10px;
      width: 200px;
      height: 200px;
      background: 
       repeating-linear-gradient(to right, gold 0px, gold 5px, transparent 5px, transparent 10px) center/100% 2px no-repeat,
       #fff;
      clip-path:polygon(
      0 0,100% 0,
      100% calc(50% - 20px),calc(100% - 20px) 50%,100% calc(50% + 20px),
      100% 100%, 0 100%,
      0 calc(50% + 20px),20px 50%,0 calc(50% - 20px)
      );
    }
    
    .drop {
      filter: drop-shadow(0 0 5px #000);
    }
    
    body {
      background: pink;
    }
    <div class="drop">
      <div class="box">
      </div>
    </div>

    【讨论】:

      猜你喜欢
      • 2019-08-21
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 2012-07-17
      • 1970-01-01
      • 2013-06-10
      • 2018-02-19
      • 2016-07-30
      相关资源
      最近更新 更多