CSS 边距未按预期工作

CSS margins not working as expected

Angular 项目

我有一个可在特定条件下工作的可调整大小的按钮。我的问题是我觉得我的代码应该可以工作,我会解释我有什么以及期望什么。

app.component.ts

<button class="button button5"> </button>

app.component.css

.button {
    background-color: #0066ff;
    border: 1px solid #0066ff;
    color: white;
    height: 60%;
    width: 60%;
    margin-left: 20%;
    margin-right: auto;
    margin-top: 20%;
    padding: 0;
}

.button5 {
border-radius: 50%;
}

index.html

<body>
  <app-root>

  </app-root>
</body>

index.html css

<style>

body, html {
    height: 100%;
    width: 100%;
    margin: 0;
}

app-root {
    display: block;
    height: 100%;
    width: 100%;
    margin: 0;
}

</style>

我的目标是创建一个按钮,它始终是页面高度的 60%,距离顶部的 20%。此外,宽度为 60%,而距左侧为 20%。

这在某些条件下非常有效,例如。Here is my goal, unresized but when I resize it a little bit This happens。

如您所见,它不是 20%。我不知道为什么,我从来没有 hard code values 而我一直都是 strictly using percentages 所以我认为这是万无一失的。为什么上面看起来是5%,下面是35%

我认为你应该使用 vhvw 单位(称为 viewport units)。如果你总是想要屏幕的 20% 作为边距,那么它就是 20vh,其他 属性 也一样。 % 总是指宽度,所以如果你调整屏幕的大小,你会得到更小的宽度,从而减少边距。但是使用 20vh 意味着屏幕高度的 20%,所以它不受屏幕宽度的影响:

.button {
  background-color: #0066ff;
  border: 1px solid #0066ff;
  color: white;
  height: 60vh;
  width: 60vw; /*You can also keep 60% as % depend on width and here width of parent is equal to 100vw so you will have the same result*/
  margin-left: 20vw; /* You can also keep 20%*/
  margin-right: auto;
  margin-top: 20vh;
  padding: 0;
}

.button5 {
  border-radius: 50%;
}
<button class="button button5"> </button>

但你似乎想居中屏幕中间的按钮,所以你可以依靠 flex 并避免指定边距:

body {
  height:100vh;
  margin:0;
  display:flex;
  align-items:center;
  justify-content:center;
}

.button {
  background-color: #0066ff;
  border: 1px solid #0066ff;
  color: white;
  height: 60vh;
  width: 60vw;
  padding: 0;
}

.button5 {
  border-radius: 50%;
}
<button class="button button5"> </button>