【问题标题】:How to create cube window with css?如何用css创建立方体窗口?
【发布时间】:2020-05-31 06:21:04
【问题描述】:

我在网上找到了这张图片,并尝试用 css 创建这些盒子。我失败了。有谁知道如何解决这个问题?

这是我的代码。问题出在左边栏:

.box {
  position: relative;
  margin: 10px;
  display: inline-block;
}

.content {
  border-top: 2px solid red;
  border-right: 2px solid red;
  padding: 5px;
}

.box:before {
  content: '';
  position: absolute;
  top: 0;
  left: -10px;
  height: 100%;
  width: 10px;
  background-color: red;
  transform: skew(-45deg) rotate(-45deg);
}

.box:after {
  content: '';
  position: absolute;
  bottom: -10px;
  left: -5px;
  height: 10px;
  width: 100%;
  background-color: red;
  transform: skew(-45deg);
}
<div class="box">
  <div class="content">
  CONTENT<br />
  Some more content
  </div>
</div>

【问题讨论】:

    标签: css responsive-design css-shapes


    【解决方案1】:

    border-imagelinear-gradient 可以做到:

    .box {
      margin: 10px;
      display: inline-block;
      border-style:solid;
      border-width:2px 2px 15px 15px;
      border-image-slice:2 2 15 15; /* same as border-width*/
      border-image-source:linear-gradient(-45deg,transparent 9px,red 0 calc(100% - 9px),transparent 0);
    }
    
    .content {
      padding: 5px;
    }
    <div class="box">
      <div class="content">
        CONTENT<br> Some more Content
      </div>
    </div>
    
    <div class="box">
      <div class="content">
        CONTENT<br> more Content
      </div>
    </div>
    
    <div class="box">
      <div class="content">
        AA BB
      </div>
    </div>

    用CSS变量有更好的控制:

    .box {
      --b:2;   /* border length (without unit!!)*/
      --c:15;  /* the cube perspective (without unit!!)*/
      
      --g:calc((var(--c) - var(--b))*0.707px); /* 0.707 = cos(45deg) = sin(45deg) */
      margin: 10px;
      display: inline-block;
      border-style:solid;
      border-width:calc(var(--b)*1px) calc(var(--b)*1px) calc(var(--c)*1px) calc(var(--c)*1px);
      border-image-slice:var(--b) var(--b) var(--c) var(--c);
      border-image-source:linear-gradient(-45deg,transparent var(--g),red 0 calc(100% - var(--g)),transparent 0);
    }
    
    .content {
      padding: 5px;
    }
    <div class="box">
      <div class="content">
        CONTENT<br> Some more Content
      </div>
    </div>
    
    <div class="box" style="--b:3;--c:10">
      <div class="content">
        CONTENT<br> more Content
      </div>
    </div>
    
    <div class="box" style="--b:1;--c:20">
      <div class="content">
        AA BB
      </div>
    </div>
    <div class="box" style="--b:1;--c:5">
      <div class="content">
        AA BB
      </div>
    </div>

    你也可以把它放在你想要的任何方向:

    .box {
      --b:2;   /* border length (without unit!!)*/
      --c:15;  /* the cube perspective (without unit!!)*/
      
      --g:calc((var(--c) - var(--b))*0.707px); /* 0.707 = cos(45deg) = sin(45deg) */
      margin: 10px;
      display: inline-block;
      border-style:solid;
    }
    
    .bottom-left {
      border-width:calc(var(--b)*1px) calc(var(--b)*1px) calc(var(--c)*1px) calc(var(--c)*1px);
      border-image-slice:var(--b) var(--b) var(--c) var(--c);
      border-image-source:linear-gradient(-45deg,transparent var(--g),red 0 calc(100% - var(--g)),transparent 0);
    }
    .top-right {
      border-width:calc(var(--c)*1px) calc(var(--c)*1px) calc(var(--b)*1px) calc(var(--b)*1px) ;
      border-image-slice: var(--c) var(--c) var(--b) var(--b);
      border-image-source:linear-gradient(-45deg,transparent var(--g),red 0 calc(100% - var(--g)),transparent 0);
    }
    .top-left {
      border-width:calc(var(--c)*1px) calc(var(--b)*1px) calc(var(--b)*1px) calc(var(--c)*1px) ;
      border-image-slice:var(--c) var(--b) var(--b) var(--c);
      border-image-source:linear-gradient(45deg,transparent var(--g),red 0 calc(100% - var(--g)),transparent 0);
    }
    .bottom-right {
      border-width:calc(var(--b)*1px) calc(var(--c)*1px) calc(var(--c)*1px) calc(var(--b)*1px) ;
      border-image-slice:var(--b) var(--c) var(--c) var(--b);
      border-image-source:linear-gradient(45deg,transparent var(--g),red 0 calc(100% - var(--g)),transparent 0);
    }
    
    .content {
      padding: 5px;
    }
    <div class="box bottom-left">
      <div class="content">
        CONTENT<br> Some more Content
      </div>
    </div>
    
    <div class="box top-right" style="--b:3;--c:10">
      <div class="content">
        CONTENT<br> more Content
      </div>
    </div>
    
    <div class="box bottom-right" style="--b:1;--c:20">
      <div class="content">
        AA BB
      </div>
    </div>
    <div class="box top-left" style="--b:1;--c:5">
      <div class="content">
        AA BB
      </div>
    </div>

    我们还可以通过clip-pathclip-path调整颜色和使用不同的技术来添加更多的 3D 效果

    .box {
      --b:2px;   /* border length*/
      --c:15px;  /* the cube perspective */
      
      --g:calc(var(--c)*0.707); /* 0.707 = cos(45deg) = sin(45deg) */
      margin: 10px;
      display: inline-block;
      padding:var(--b) var(--b) var(--c) var(--c);
      background:
        linear-gradient(-45deg,transparent var(--g),#cc0404 0) left   /var(--c) 100%,
        linear-gradient(135deg,transparent var(--g),red 0)     bottom /100% var(--c),
        linear-gradient(red,red)                               top    /100% var(--b),
        linear-gradient(red,red)                               right  /var(--b) 100%;
      background-repeat:no-repeat;
      clip-path: 
        polygon(0% calc(var(--c) - var(--b)), calc(var(--c) - var(--b)) 0%, 
        100% 0%, 
        100% calc(100% - var(--c) + var(--b)), calc(100% - var(--c) + var(--b)) 100%, 
        0% 100%);
        
    }
    
    .content {
      padding: 5px;
    }
    <div class="box">
      <div class="content">
        CONTENT<br> Some more Content
      </div>
    </div>
    
    <div class="box" style="--b:3px;--c:10px">
      <div class="content">
        CONTENT<br> more Content
      </div>
    </div>
    
    <div class="box" style="--b:1px;--c:20px">
      <div class="content">
        AA BB
      </div>
    </div>
    <div class="box" style="--b:1px;--c:5px">
      <div class="content">
        AA BB
      </div>
    </div>

    一个Codepen demo玩代码

    【讨论】:

    • 为什么在border-image-source中有9 px:linear-gradient(-45deg,transparent 9px,red 0 calc(100% - 9px),transparent 0);
    • @Svenwas3f 添加了一个更新,我将在其中使用 CSS 变量和计算
    【解决方案2】:

    实现此效果的一种方法是使用::before 伪元素并对其应用clip-path

    在下面的示例中,我反复使用了值 10px2px,尽管这些值可以直接替换为 CSS 自定义属性,例如:

    :root {
      --cube-depth: 10px;
      --cube-border: 2px;
    }
    

    然后在整个样式表中用作var(--cube-depth)var(--cube-border)


    工作示例:

    .cube {
      position: relative;
      float: left;
      margin: 0 4px 8px 4px;
      padding: 2px 2px calc(2px + 10px) calc(2px + 10px);
      color: rgb(237, 62, 68);
      box-sizing: border-box;
    }
    
    .cube::before {
      content: '';
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background-color: rgb(237, 62, 68);
      clip-path: polygon(10px 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%, 0 10px, 10px 0, 10px calc(100% - 10px), calc(100% - 2px) calc(100% - 10px), calc(100% - 2px) 2px, 10px 2px);
    }
    
    .size-80x100 {
      width: calc(100px + 10px);
      height: calc(80px + 10px);
    }
    
    .size-80x200 {
      width: calc(200px + 10px);
      height: calc(80px + 10px);
    }
    
    .size-80x360 {
      width: calc(360px + 10px);
      height: calc(80px + 10px);
    }
    
    .size-80x440 {
      width: calc(440px + 10px);
      height: calc(80px + 10px);
    }
    <div class="cube size-80x100">80 x 100</div>
    <div class="cube size-80x440">80 x 440</div>
    <div class="cube size-80x360">80 x 360</div>
    <div class="cube size-80x200">80 x 200</div>

    【讨论】:

      猜你喜欢
      • 2016-07-19
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多