如何使用CSS制作带有对角网格的响应式菜单?

3
我正在为一个网站创建模板。我想要创建一个类似于这样的菜单: enter image description here 我找到了以下代码作为解决方案,但是我无法将div分成4个部分并以响应式的方式添加文本。可以使用position:absolute来实现,但它不是响应式的。如何使用CSS以响应式的方式实现?

.background {
  background-color: #BCBCBC;
  width: 100px;
  height: 50px;
  padding: 0;
  margin: 0
}

.line1 {
  width: 112px;
  height: 47px;
  border-bottom: 1px solid red;
  -webkit-transform: translateY(-20px) translateX(5px) rotate(27deg);
  position: absolute;
  /* top: -20px; */
}

.line2 {
  width: 112px;
  height: 47px;
  border-bottom: 1px solid green;
  -webkit-transform: translateY(20px) translateX(5px) rotate(-26deg);
  position: absolute;
  top: -33px;
  left: -13px;
}
<div class="background">
  <div class="line1"></div>
  <div class="line2"></div>
</div>


1
您可以将其视为一个普通的2*2网格盒子,只有内部边框连接着这4个div,并将它们旋转45度。 - Awsme Sandy
在移动端视图中,是否有必要使设计与桌面端相同?我们不能在移动端将其更改为列表视图吗? - Saurav Rastogi
3个回答

4
您可以使用CSS弹性盒子和CSS转换属性来实现此功能。请查看下面的片段:

body {
  padding: 20px;
}

.menu-cover {
  width: 360px;
  height: 360px;
  overflow: hidden;
  background: #eee;
}

.menu {
  list-style: none;
  margin: -70px 0 0 -70px;
  padding: 80px;
  display: flex;
  flex-wrap: wrap;
  width: calc(600px - 100px);
  height: calc(600px - 100px);
  position: relative;
  transform: rotate(45deg);
  transform-origin: center;
}

.menu:before {
  content: '';
  position: absolute;
  top: 0;
  left: 50%;
  transform: translateX(-50%);
  width: 1px;
  height: 100%;
  background-color: #aaa;
}

.menu:after {
  content: '';
  position: absolute;
  top: 50%;
  left: 0;
  transform: translateY(-50%);
  width: 100%;
  height: 1px;
  background-color: #aaa;
}

.item {
  width: 50%;
}

.item a {
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  transform: rotate(-45deg);
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-beta/css/bootstrap.min.css" rel="stylesheet"/>
<div class="menu-cover">
  <ul class="menu">
    <li class="item">
      <a href="#">Bussiness</a>
    </li>
    <li class="item">
      <a href="#">Team</a>
    </li>
    <li class="item">
      <a href="#">Talent</a>
    </li>
    <li class="item">
      <a href="#">Group</a>
    </li>
  </ul>
</div>

希望这有所帮助!

不错的解决方案,但不够响应。 - roberrrt-s
谢谢。这个可以用了。但是不够响应。我会处理的。 - pavithra rox

0
请检查以下代码。您可以以同样的方式实现您的要求。我已添加 <span> 标签显示文本。

.background {
  background-color: #BCBCBC;
  width: 100px;
  height: 50px;
  padding: 0;
  margin: 0
}

.line1 {
  width: 112px;
  height: 47px;
  border-bottom: 1px solid red;
  -webkit-transform: translateY(-20px) translateX(5px) rotate(27deg);
  position: absolute;
  /* top: -20px; */
}

.line2 {
  width: 112px;
  height: 47px;
  border-bottom: 1px solid green;
  -webkit-transform: translateY(20px) translateX(5px) rotate(-26deg);
  position: absolute;
  top: -33px;
  left: -13px;
}
<div class="background">
  <span style="float:left;padding-left:20%">Business
  </span>
    <span style="float:left;padding-left:5%">Team
  </span>
    <span style="float:right;padding-left:5%">Talent
  </span>
    <span style="float:left;padding-left:20%">Group
  </span>
  <div class="line1"></div>
  <div class="line2"></div>
</div>

https://jsfiddle.net/t3z8q2k4/


请不要使用仅链接的答案,因为链接可能会失效,您的答案也将毫无意义。此外,这也不是响应式的。 - roberrrt-s

0

您可以使用伪元素,例如beforeafter。请查看更新后的答案。希望对您有所帮助。

.background {
  background-color: #BCBCBC;
  width: 100px;
  height: 100px;
  padding: 0;
  margin: 0;
  position: relative;
  overflow: hidden;
}

.background:before {
  width: 1px;
  height: 500px;
  background :red;
  -webkit-transform: rotate(45deg);
  position: absolute;
  content:'';
  left: 0;
  right: 0;
  margin:-200px auto 0;
}

.background:after {
  width: 1px;
  height: 500px;
  background :green;
  -webkit-transform: rotate(-45deg);
  position: absolute;
  content:'';
  left: 0;
  right: 0;
  margin:-200px auto 0;
}
<div class="background">
</div>


这个不是响应式的。 - roberrrt-s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接