【问题标题】:How to make a rotated element height:100% of its parent?如何使旋转元素高度:其父元素的 100%?
【发布时间】:2021-01-12 06:39:04
【问题描述】:

我希望创建一个带有边框的分区,如下面的 PNG

我计划制作一个具有以下尺寸的 ::after 元素:

width=height of the parent division;
height=1.5em;

以下代码运行正常,但 ::after 元素的宽度不对...

body {
  display: flex;
  flex-direction: column;
  height: 93vh;
  justify-content: center;
  align-items: center;
  background: #222;
  color: #eee;
  font-family: "Dosis", sans-serif;
}

.side-text {
  position: relative;
  font-size: 4em;
  color: #eee;
  background: none;
  padding: 0.4em 0.5em 0.4em 0.3em;
  border: 5px solid #eee
}

.side-text::after {
  position: absolute;
  content: "Points Needed";
  font-size: 0.25em;
  color: #222;
  background: #eee;
  text-align: center;
  width: 100%;
  /*This takes the value of 100%(Parent's Width) but we need 100%(Parents Height)*/
  transform: rotate(-90deg);
  left: 45%;
  top: 42.5%;
  /*The values of left, top have been assigned by trial & error, and will change with the length of the text in the parent division. If the text contained in the parent changes to say, 5000, the values specified above won't work */
}
<link href="https://fonts.googleapis.com/css?family=Dosis:700" rel="stylesheet" />
<div class="side-text">
  50
</div>

left-margin、top-margin 的值是通过反复试验分配的,并且会随着父分区中文本的长度而变化。如果父项中包含的文本从 50 更改为 5000,则上面指定的值将不起作用。

【问题讨论】:

    标签: javascript html css


    【解决方案1】:

    可以考虑writing-mode

    body {
      display: flex;
      flex-direction: column;
      min-height: 93vh;
      align-items: center;
      background: #222;
      color: #eee;
      font-family: "Dosis", sans-serif;
    }
    
    .side-text {
      position: relative;
      font-size: 4em;
      color: #eee;
      background: none;
      padding: 0.4em 0.5em 0.4em 0.3em;
      border: 5px solid #eee;
      margin:5px;
    }
    
    .side-text::after {
      position: absolute;
      content: "Points Needed";
      font-size: 0.25em;
      color: #222;
      background: #eee;
      text-align: center;
      transform: rotate(-180deg);
      right: 0;
      top: -1px;
      bottom: -1px;
      writing-mode: vertical-lr;
    }
    <link href="https://fonts.googleapis.com/css?family=Dosis:700" rel="stylesheet" />
    <div class="side-text">
      50
    </div>
    <div class="side-text">
      5000
    </div>

    您可以通过调整transform-origin 使其更容易近似,然后只需更改 left 属性,但仍将是近似值。

    body {
      display: flex;
      flex-direction: column;
      height: 93vh;
      justify-content: center;
      align-items: center;
      background: #222;
      color: #eee;
      font-family: "Dosis", sans-serif;
    }
    
    .side-text {
      position: relative;
      font-size: 4em;
      color: #eee;
      background: none;
      padding: 0.4em 0.5em 0.4em 0.3em;
      border: 5px solid #eee
    }
    
    .side-text::after {
      position: absolute;
      content: "Points Needed";
      font-size: 0.25em;
      color: #222;
      background: #eee;
      text-align: center;
      transform: rotate(-90deg) translateY(-100%);
      transform-origin: top right;
      right: 0px;
      left: -15px; /*adjust this*/
      top: 0;
    }
    <link href="https://fonts.googleapis.com/css?family=Dosis:700" rel="stylesheet" />
    <div class="side-text">
      50
    </div>

    另一个想法是将内容与背景分开。我们将背景保留在元素内部,我们只需将文本放在右侧居中,无需担心它的宽度。

    这适用于所有情况,您可能会得到比writing-mode更好的支持:

    body {
      display: flex;
      flex-direction: column;
      min-height: 93vh;
      align-items: center;
      background: #222;
      color: #eee;
      font-family: "Dosis", sans-serif;
    }
    
    .side-text {
      position: relative;
      font-size: 4em;
      color: #eee;
      background: none;
      padding: 0.4em 0.5em 0.4em 0.3em;
      border: 5px solid #eee;
      background: linear-gradient(#eee, #eee) right/20px 100% no-repeat;
      margin:5px;
    }
    
    .side-text::after {
      position: absolute;
      content: "Points Needed";
      font-size: 0.25em;
      color: #222;
      text-align: center;
      top: 50%;
      right: 0;
      transform: translate(41%, -50%) rotate(-90deg);
    }
    <link href="https://fonts.googleapis.com/css?family=Dosis:700" rel="stylesheet" />
    <div class="side-text">
      50
    </div>
    <div class="side-text">
      5000
    </div>

    【讨论】:

    • 哇!!这比我预期的要简单得多...... ;)
    • 我仍然看到顶部和底部有一个小间隙。
    • @ScottMarcus 可能是一些渲染问题,通过使用 -1px 修复
    • @YourPalNurav 我添加了另一种方式
    【解决方案2】:

    您没有考虑需要重新添加的父元素的填充。这可以通过 CSS calc() 函数来完成。这个解决方案仍然有点静态。

    body {
      display: flex;
      flex-direction: column;
      height: 93vh;
      justify-content: center;
      align-items: center;
      background: #222;
      color: #eee;
      font-family: "Dosis", sans-serif;
    }
    
    .side-text {
      position: relative;
      font-size: 4em;
      color: #eee;
      background: none;
      padding: 0.4em 0.5em 0.4em 0.3em;
      border: 5px solid #eee
    }
    
    .side-text::after {
      position: absolute;
      content: "Points Needed";
      font-size: 0.25em;
      color: #222;
      background: #eee;
      text-align: center;
      
      /* Add back the top/bottom padding of the parent (plus .1em for rounding) */
      width: calc(100% + .9em);
      
      transform: rotate(-90deg);
      left: 39%;
      top: 42.1%;
      /*The values of left, top have been assigned by trial & error, and will change with the length of the text in the parent division. If the text contained in the parent changes to say, 5000, the values specified above won't work */
    }
    <link href="https://fonts.googleapis.com/css?family=Dosis:700" rel="stylesheet" />
    <div class="side-text">
      50
    </div>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多