【问题标题】:What is the difference between margin-block-start and margin-top?margin-block-start 和 margin-top 有什么区别?
【发布时间】:2020-05-11 13:39:07
【问题描述】:

试图了解两者在用法上的核心区别,但我找不到详细说明此类比较的文章或文档。以here提供的例子为例,假设如下:

div {
  background-color: yellow;
  width: 120px;
  height: 120px;
}

.exampleText {
  writing-mode: vertical-lr;
  margin-block-start: 20px;
  background-color: #c8c800;
}
<div>
  <p class="exampleText">Example text</p>
</div>

this instance 和margin-top is used 之间的区别非常小(但可见)。

specifications 表示margin-block-start 取决于布局模型,而margin-top 指的是包含块的宽度。如果有人能用外行的话来解释它会很高兴。

【问题讨论】:

  • 指的是包含块的宽度。这仅适用于您使用百分比作为边距值的情况。值的百分比几乎总是使用父块的宽度计算。因此,如果您有一个 margin-top 或 10% 并且您增加了包含块的宽度,则它将是 10% 相对于包含块的计算宽度。

标签: html css margin


【解决方案1】:

来自官方1specification你可以阅读:

这些属性对应于 margin-top、margin-bottom、margin-left 和 margin-right 属性。映射取决于元素的书写模式、方向和文本方向。

默认情况下,您将拥有以下映射:

margin-block-start = margin-top
margin-block-end = margin-bottom
margin-inline-start = margin-left
margin-inline-end = margin-right

例子:

.margin {
  margin-top:50px;
  margin-bottom:10px;
  margin-left:100px;
  margin-right:200px;
}

.margin-alt {
  margin-block-start:50px;
  margin-block-end:10px;
  margin-inline-start:100px; 
  margin-inline-end:200px; 
}

div {
  border:2px solid;
  padding:20px;
}
<div class="margin">
A
</div>
<hr>
<div class="margin-alt">
A
</div>

现在如果我们改变书写模式,你会看到我们会有不同的映射。

.margin {
  margin-top:50px;
  margin-bottom:10px;
  margin-left:100px;
  margin-right:200px;
}

.margin-alt {
  margin-block-start:50px;
  margin-block-end:10px;
  margin-inline-start:100px; 
  margin-inline-end:200px; 
}

div {
  border:2px solid;
  padding:20px;
  writing-mode: vertical-lr;
}
<div class="margin">
A
</div>
<hr>
<div class="margin-alt">
A
</div>
<div class="margin-alt" style="writing-mode: vertical-rl;">
A
</div>

在上面,你会注意到当使用vertical-lr 时,映射等于

margin-block-start = margin-left
margin-block-end = margin-right
margin-inline-start = margin-top 
margin-inline-end = margin-bottom 

当使用vertical-rl时

margin-block-start = margin-right
margin-block-end = margin-left
margin-inline-start = margin-top 
margin-inline-end = margin-bottom

我不会详细说明所有情况,但基本上每个margin-*-* 属性都会根据writing-mode、direction 和text-orientation 的值映射到margin-* 属性。

您可以使用不同的值来查看不同的情况。


您的示例有点复杂,因为您有边距折叠并且默认边距应用于p,因此很难理解。

这里有一个更好的:

div:not([class]) {
  background-color: yellow;
  width: 120px;
  height: 120px;
  border:1px solid;
}

.exampleText {
  writing-mode: vertical-lr;
  margin-block-start: 20px; /* we will end with a margin-left */
  background-color: #c8c800;
}
.exampleText2 {
  writing-mode: vertical-lr;
  margin-top: 20px; /* this will remain a margin-top */
  background-color: #c8c800;
}
<div>
  <div class="exampleText">Example text</div>
</div>

<div>
  <div class="exampleText2">Example text</div>
</div>

1:您使用的链接是 MDN 页面,这是一个很好的参考,但不是官方规范。

【讨论】:

    【解决方案2】:

    margin-block-start CSS 属性定义逻辑块开始 元素的边距,根据元素映射到物理边距 元素的书写方式、方向性和文本方向。

    请运行 sn-p 以查看实际行为:

    document.addEventListener('DOMContentLoaded', event => {
    const choice = document.querySelectorAll('.choice');
    const target = document.querySelectorAll('.row-target')[0];
    
    choice.forEach(el => el.addEventListener('click', event => {
      choice.forEach(el => el.classList.remove('selected'));
      event.target.classList.add('selected');
      target.setAttribute('style', event.target.innerText);
    }));
    })
    * {
        box-sizing: border-box;
    }
    
    #container {
        width: 300px;
        height: 200px;
        display: flex;
        align-content: flex-start;
        flex-direction: column;
        justify-content: flex-start;
        margin-left: 20px;
    }
    
    .row {
        height: 33.33%;
        display: inline-block;
        border: solid #5b6dcd 10px;
        background-color: rgba(229,232,252,.6);
        flex-shrink: 0;
    }
    
    .row-target {
        border: solid 10px #ffc129;
        background-color: rgba(255,244,219,.6);
    }
    
    .transition-all {
        transition: all .3s ease-in;
    }
    
    .choice {
    background-color: #fff;
        display: flex;
        align-items: center;
        flex-grow: 1;
        position: relative;
        z-index: 1;
        display: block;
        margin: .2em 0;
        width: 100%;
        border: 2px solid #d6dee0;
        border-left: 5px solid #d6dee0;
        font-size: 14px;
        cursor: pointer;
        transition: background-color .2s ease-out,border .2s ease-out;
    }
    
    .choice.selected:before {
        opacity: 1;
        right: -1.5em;
    }
    .choice:before {
        content: '';
        position: absolute;
        top: 50%;
        right: -10px;
        z-index: 1;
        opacity: 0;
        transition: all .2s ease-out;
        transform: translateY(-50%);
        border-left: 10px solid #1b76c4;
        border-top: 10px solid transparent;
        border-bottom: 10px solid transparent;
    }
    
    .selected {
        border-color: #1b76c4;
        border-left-color: #1b76c4;
        box-shadow: inset 0 2px 2px -2px rgb(0 0 0 / 20%);
        transition: height .5s;
        cursor: text;
    }
    <table>
    <tr>
    <td>
        <div class="choice selected">
            margin-block-start: 20px; <br>
            writing-mode: horizontal-tb;
        </div>
        
        <div class="choice">
            margin-block-start: 20px;  <br>
            writing-mode: vertical-rl;
        </div>
        
        <div class="choice">
            margin-block-start: 20%; <br>
            writing-mode: horizontal-tb;
        </div>
        
        <div class="choice">
            margin-block-start: auto; <br>
            writing-mode: vertical-lr;
        </div>
    </td>
    <td valign="top">
    <div id="container">
                <div class="row">One</div>
                <div class="row row-target transition-all" id="example-element" style="margin-block-start: 20px; writing-mode: horizontal-tb;">Two</div>
                <div class="row">Three</div>
            </div>
            
    </td></tr>
    </table>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-23
      • 2021-07-04
      • 2011-09-19
      • 1970-01-01
      • 2010-09-22
      • 2011-11-28
      相关资源
      最近更新 更多