带边距和不同嵌套的宽度百分比

Width percentage with margin and different nestings

在我的网页中,我有左右两部分,但它们不在同一个嵌套中。我希望左侧部分占页面的 25%,右侧部分占页面的其余部分。
简单地设置 75% 对我来说并不合适,因为右边的部分也需要 30px 的右边 margin。正确的 padding 将不起作用,因为我的内容和 background-color 会溢出。
你知道如何解决这个问题吗?
.left(蓝色)和 .right(黄色)div 应该始终完美地相互相遇,并且 .right 需要保持 30px 正确 margin.

body {
  display: block;
  position: absolute;
  width: 100%;
  height: 100%;
  top: 0;
  bottom: 0;
  overflow: hidden;
}

.main {
  position: absolute;
  top: 0;
  bottom: 0;
  width: 100%;
  overflow: hidden;
  background-color: grey;
}

.left {
  position: absolute;
  top: 0;
  bottom: 0;
  padding-top: 0;
  padding-bottom: 0;
  left: 0;
  width: 25%;
  border-right: 1px solid #eeeeee;
  background-color: lightblue;
}

.right {
  position: absolute;
  width: 75%;
  right: 0px;
  top: 45px;
  bottom: 0;
  /*padding-right: 30px;*/
  margin-right: 30px;
  background-color: yellow;
}
<body>
  <div class="main">
    <div class="left">TEST</div>
  </div>
  <div class="right">TEST</div>
</body>

只使用 绝对位置创建布局不是一个好主意。例如,您可能更好地依赖 flexbox:

body {
  height: 100vh;
  margin: 0;
  display: flex;
  background: grey;
}

.left {
  flex: 1;
  border-right: 1px solid #eeeeee;
  background-color: lightblue;
}

.right {
  flex: 4;
  margin-top: 45px;
  margin-right: 30px;
  background-color: yellow;
}
<div class="left">TEST</div>
<div class="right">TEST</div>

但是如果你想保留你的代码,你需要在计算宽度时考虑边距:

body {
  display: block;
  position: absolute;
  width: 100%;
  height: 100%;
  top: 0;
  bottom: 0;
  overflow: hidden;
}

.main {
  position: absolute;
  top: 0;
  bottom: 0;
  width: 100%;
  overflow: hidden;
  background-color: grey;
}

.left {
  position: absolute;
  top: 0;
  bottom: 0;
  padding-top: 0;
  padding-bottom: 0;
  left: 0;
  width: 25%;
  border-right: 1px solid #eeeeee;
  background-color: lightblue;
}

.right {
  position: absolute;
  width: calc(75% - 30px);
  right: 0px;
  top: 45px;
  bottom: 0;
  /*padding-right: 30px;*/
  margin-right: 30px;
  background-color: yellow;
}
<body>
  <div class="main">
    <div class="left">TEST</div>
  </div>
  <div class="right">TEST</div>
</body>