【问题标题】:How can I make octagon shape box?如何制作八角形盒子?
【发布时间】:2015-07-05 01:09:39
【问题描述】:

我想使用 CSS 创建下面给定的框。

我搜索了很多并阅读了非常好的文章,例如https://css-tricks.com/examples/ShapesOfCSS/,但我陷入了一个问题 - 紫色边框前沿。我试过八角形,但这不适用于这种情况。

我几乎做到了。这是我的sn-p:

.box-outer {
  width: 300px;
  height: 120px;
  padding: 15px 30px;
  background: rgba(237, 236, 236, 0.72);
  border: 3px solid rgb(89, 67, 128);
  position: relative;
  border-right: 20px solid rgb(89, 67, 128);
}
.box-outer:before {
  content: "";
  position: absolute;
  top: -3px;
  left: -4px;
  border-bottom: 29px solid rgb(255, 252, 252);
  border-right: 29px solid #594380;
  border-top: 28px solid #FFF;
  height: 66%;
  width: 0;
}
.box-outer:after {
  content: "";
  position: absolute;
  top: -3px;
  right: -13%;
  border-top: 29px solid white;
  border-left: 29px solid #594380;
  border-bottom: 28px solid #FFF;
  width: 0;
  height: 66%;
}
.box-outer .right-text {
  position: absolute;
  right: -22%;
  color: white;
  font-size: 20px;
  top: 40%;
  z-index: 10;
  transform: rotate(-90deg);
  -ms-transform: rotate(-90deg);
  -webkit-transform: rotate(-90deg);
}
<div class="box-outer">
  <span class="right-text">
           LEGISLATIVE
        </span>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
</div>
<!--box outer-->

当前作品截图

【问题讨论】:

  • 到目前为止请提供您自己的代码
  • 带边框、阴影等等???背景图片(立法的东西...)还是带有文字?无论如何……这几乎是不可能的。只需使用 .png 图像作为元素背景 :D 我的意思是,花点时间和朋友或家人一起玩吧;)
  • 感谢回复 tambo 我几乎实现了它再次重新编辑
  • @Abhi:创建一个 sn-p 非常简单。创建/编辑帖子时,单击工具栏中的 &lt;&gt; 图标以打开编辑器(如 JSFiddle 或 CodePen)。在编辑器窗口中,将您的 HTML、CSS 和 JS 代码放入相应的框中,然后单击“插入帖子”。就是这样:) 注意:点击“整理”按钮也可以正确格式化代码。
  • 另外,请通过单击答案附近的空心刻度线将其中一个答案标记为已接受。这通常是将问题标记为“已解决”的方式。

标签: html css css-shapes


【解决方案1】:

请检查一下这个解决方案,我终于做到了

我添加了 box-inner div 来实现这一点。

看看小提琴

`http://jsfiddle.net/maverickabhi/qfthejb2/`

.box-outer {
  width: 300px;
  height: 120px;
  padding: 15px 30px;
  background: rgba(237, 236, 236, 0.72);
  border: 3px solid rgb(89, 67, 128);
  position: relative;
  border-right: 20px solid rgb(89, 67, 128);
}
.box-outer:before {
  content: "";
  position: absolute;
  top: -3px;
  left: -4px;
  border-bottom: 29px solid rgb(255, 252, 252);
  border-right: 29px solid #594380;
  border-top: 28px solid #FFF;
  height: 66%;
  width: 0;
}
.box-outer:after {
  content: "";
  position: absolute;
  top: -3px;
  right: -13%;
  border-top: 29px solid white;
  border-left: 29px solid #594380;
  border-bottom: 28px solid #FFF;
  width: 0;
  height: 66%;
}
.box-outer .right-text {
  position: absolute;
  right: -22%;
  color: white;
  font-size: 20px;
  top: 40%;
  z-index: 10;
  transform: rotate(-90deg);
  -ms-transform: rotate(-90deg);
  -webkit-transform: rotate(-90deg);
}
.box-inner {
  content: "";
  position: absolute;
  top: -2px;
  left: -1px;
  border-bottom: 30px solid transparent;
  border-right: 29px solid #F1F0F0;
  border-top: 29px solid transparent;
  height: 63%;
  width: 0;
}
<div class="box-outer">
  <span class="right-text">
           LEGISLATIVE
        </span>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
  <div class="box-inner"></div>
</div>
<!--box outer-->

【讨论】:

  • 好答案!学习使用 sn-p 功能,如果你这样做了,你就不需要绕过“发布你的代码”警告。 (看看我是怎么做到的)
  • 很高兴看到您已经找到了答案。你也可以使用this 之类的东西。目前定位不准确,但如果你想使用它,我会进一步更新它。
  • 感谢 vals 和 harry,harry 你的代码更好,我正在学习一些好东西。
  • 嘿 vals 能否请你给我一个链接,我从那里学习这个添加 sn-p 在这里
【解决方案2】:

这是一个 svg 解决方案。

不幸的是,它使用了一些硬编码的数字来表示大小。

我发现垂直文本在 svg 中更容易实现,因为您只需将其旋转 90 度即可。

主要元素是两个多边形。考虑为元素背景使用渐变,但选择这个是因为它更容易理解形状的变化。

文本元素使用 div 完成,并将其设置为绝对大小和固定大小。 我发现这可以做得更好,但我想不出更好的解决方案。

.box div{
  position: absolute;
  margin-left: 70px;
  margin-right: 100px;
  margin-top: 5px;
  width: calc(600px - 70px - 100px);
}
.ticket .content {
  stroke: rgb(100, 0, 100);
  stroke-width: 2px;
  fill: #fff;
}
.ticket .end {
  stroke: rgb(100, 0, 100);
  stroke-width: 2px;
  fill: rgb(100, 0, 100);
}
.ticket #vertical {
  fill: #fff;
}
<div class="box">
  <div>lorem ipsum dolar si amet lorem ipsum dolar si ametlorem ipsum dolar si ametlorem ipsum dolar si ametlorem ipsum dolar si ametlorem ipsum dolar si ametlorem ipsum dolar si ametlorem ipsum dolar si ametlorem ipsum dolar si ametlorem ipsum dolar si ametlorem ipsum dolar si ametlorem ipsum dolar si ametlorem ipsum dolar si ametlorem ipsum dolar si ametlorem ipsum dolar si ametlorem ipsum dolar si ametlorem ipsum dolar si ametlorem ipsum dolar si ametlorem ipsum dolar si ametlorem ipsum dolar si ametlorem ipsum dolar si ametlorem ipsum dolar si ametlorem ipsum dolar si ametlorem ipsum dolar si amet</div>
  <svg class="ticket" height="300px" width="600px" viewbox="-1 -1 202 102">
    <polygon class="content" points=" 0 20, 20 0, 170 0, 170 100, 20 100, 0 80" />
    <polygon class="end" points="170 0, 180 0, 200 20, 200 80, 180 100, 170, 100" />
    <text id="vertical" transform="translate(185 93) rotate(-90)">Golden ticket</text>
  </svg>
</div>

【讨论】:

    【解决方案3】:

    这是一种使用 CSS3 变换来实现八边形形状并在其中具有透明度的替代方法。使用此方法时,背景不必是纯色。它可以是图像或渐变。

    形状主要由以下部分组成:

    • 一个具有顶部边框、底部边框和右侧插入框阴影的容器。 (下方截图中的绿色区域*
    • 左侧的伪元素与容器高度相同,使用变换进行透视旋转。 (下方截图中的蓝色区域*
    • 右侧的另一个伪元素,与左侧的元素反向旋转。 (下图红色区域*
    • 容器上的插入框阴影与右侧伪元素的背景相同(使其看起来好像只有一半是倾斜的)。
    • 父容器周围的额外阴影和右侧的伪元素为整个形状提供阴影。

    * - 不同的颜色仅用于说明形状是如何形成的。

    .shape {
      position: relative;
      height: 150px;
      width: 300px;
      margin: 40px;
      border-color: #594380;
      border-style: solid;
      border-width: 2px 0px;
      background: rgba(252, 252, 252, 0.5);
      box-shadow: inset -20px 0px 0px #594380, 2px 3px 3px rgba(0,0,0,0.3);
    }
    .shape:before,
    .shape:after {
      position: absolute;
      content: '';
      top: -2px;
      width: 30px;
      height: 100%;
      border: 2px solid #594380;
    }
    .shape:before {
      left: -32px;
      border-right: none;
      background: rgba(252, 252, 252, 0.5);
      -webkit-transform-origin: right 50%;
      -moz-transform-origin: right 50%;
      transform-origin: right 50%;
      -webkit-transform: perspective(15px) rotateY(-10deg);
      -moz-transform: perspective(15px) rotateY(-10deg);
      transform: perspective(15px) rotateY(-10deg);
      box-shadow: inset 2px 0px 0px #594380, inset 0px -1px 0px #594380, inset 0px 1px 0px #594380;
    }
    .shape:after {
      right: -34px;
      background: #594380;
      -webkit-transform-origin: left 50%;
      -moz-transform-origin: left 50%;
      transform-origin: left 50%;
      -webkit-transform: perspective(15px) rotateY(10deg);
      -moz-transform: perspective(15px) rotateY(10deg);
      transform: perspective(15px) rotateY(10deg);
      box-shadow: inset -2px 0px 0px #594380, inset 0px -1px 0px #594380, inset 0px 1px 0px #594380, 6px 2px 5px 3px rgba(0,0,0,0.3);
    }
    span {
      position: absolute;
      right: 0px;
      top: 12px;
      display: block;
      height: 20px;
      width: 100px;
      text-align: center;
      text-transform: uppercase;
      color: white;
      -webkit-transform-origin: right;
      -moz-transform-origin: right;
      transform-origin: right;
      -webkit-transform: rotate(-90deg);
      -moz-transform: rotate(-90deg);
      transform: rotate(-90deg);
      z-index: 2;
    }
    body {
      background: url(http://lorempixel.com/500/500);
    }
    <div class="shape">
      Lorem ipsum dolor sit amet...
      <span>legislative</span>
    </div>

    注意:当我们仔细观察时,左侧的边框会有轻微的错位,但这是一个几乎不明显的故障。发布此答案的想法是为未来的读者提供一个想法。


    其他获取八边形的方法:

    • jbutler483 贡献的这个CodePen 有一个使用不同方法获得的样本。与上面的 sn-p 一样,这也有一个非常小的故障,其中左侧的有角度的边框有点薄,因为使用了倾斜变换。
    • 如果需要透明的正八边形,可以采用下面sn-p的方法。在处理半透明形状时,这并不是那么有用(如第二个示例所示)。请注意,形状内的定位文本需要单独处理。

    .shape,
    .octagon,
    .shape:before,
    .shape:after {
      border-top: 2px solid steelblue;
      border-bottom: 2px solid steelblue;
    }
    
    .shape {
      height: -webkit-calc(141.44px + 100px); /* width * sin(135) * 2 + width */
      height: -moz-calc(141.44px + 100px);
      height: calc(141.44px + 100px);
      width: 100px;
      position: relative;
      margin: 40px 80px;
    }
    
    .shape:after,
    .shape:before,
    .octagon {
      position: absolute;
      height: 100%;
      width: -webkit-calc(100% + 2px);
      width: -moz-calc(100% + 2px);
      width: calc(100% + 2px);
    }
    
    .shape:before,
    .shape:after {
      content: '';
      top: -2px;
      left: -2px;
    }
    
    .octagon {
      top: -2px;
      left: -2px;
      -webkit-transform: rotate(90deg);
      -moz-transform: rotate(90deg);
      transform: rotate(90deg);
    }
    
    .shape:before {
      -webkit-transform: rotate(135deg);
      -moz-transform: rotate(135deg);
      transform: rotate(135deg);
    }
    
    .shape:after {
      -webkit-transform: rotate(-135deg);
      -moz-transform: rotate(-135deg);
      transform: rotate(-135deg);
    }
    
    .semi-transparent, .semi-transparent .octagon, .semi-transparent.shape:after, .semi-transparent.shape:before{
      background: rgba(1, 1, 1, 0.5);  
    }
    
    body {
      background: -webkit-linear-gradient(90deg, crimson, indianred, purple);
      background: -moz-linear-gradient(90deg, crimson, indianred, purple);
      background: linear-gradient(90deg, crimson, indianred, purple)
    }
    body > div{
      display: inline-block;
    }
    <div class="shape">
        <div class="octagon"></div>
    </div>
    
    <div class="shape  semi-transparent">
        <div class="octagon"></div>
    </div>

    【讨论】:

      猜你喜欢
      • 2015-03-20
      • 1970-01-01
      • 2021-03-16
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多