Bootstrap Chameleon Logo

Padding and Margin

在上一篇文章006_slate_02_layout-1_directional.md中,我们用"Padding": 16指定控件占用的空间。

在这篇文章中,我们来看下具体的Padding指的是什么,并一并解释几个相似的关键字直接的yi'tong

Padding of Content

如下图,我们创建了一个没有Content(子控件尺寸为0),Padding值为16的SBorder,所以SbBorder的实际尺寸为 32X32 px。

    ...
    "Root":{
        "SVerticalBox":
        {
            "Slots": [
                {
                    "AutoHeight": true,
                    "SHorizontalBox":
                    {
                        "Slots": [
                            {
                                "AutoWidth": true,
                                "SBorder": {
                                    "BorderBackgroundColor": [0, 1, 0, 1], "BorderImage": { "Style": "FEditorStyle", "Brush": "DashedBorder"},
                                    "Padding": 16
                                }
                            }
                        ]
                    }
                }
            ]
        }
    }

A SBorder snapshot with 'padding: 16'

注意

  • 此时的Padding是在"SBorder"内,实在内部的子控件(空)的外围添加了空白的空间

Padding of Slot

当我们将"Padding"加在SBorder的外面,这时候"Padding"修饰的是"SHorizontalBox"中的第一个Slot,所以此时空白空间被添加到了"SBorder"的外围

    ...
    "AutoHeight": true,
    "SHorizontalBox":
    {
        "Slots": [
            {
                "AutoWidth": true,
                "Padding": 10,
                "SBorder": {
                    "BorderBackgroundColor": [0, 1, 0, 1], "BorderImage": { "Style": "FEditorStyle", "Brush": "DashedBorder"},
                    "Padding": 16
                }
            }
        ]
    }

A snapshot illustrating the 'slot padding'

对比没有添加Slot Padding的 "SBorder", 绿框周围是这新增的10px的空白空间:

    ...
    "SHorizontalBox":
    {
        "Slots": [
            {
                "AutoWidth": true,
                "Padding": 10,
                "SBorder": {
                    "BorderBackgroundColor": [0, 1, 0, 1], "BorderImage": { "Style": "FEditorStyle", "Brush": "DashedBorder"},
                    "Padding": 16
                }
            },
            {
                "AutoWidth": true,
                "SBorder": {
                    "BorderBackgroundColor": [1, 1, 1, 1], "BorderImage": { "Style": "FEditorStyle", "Brush": "DashedBorder"},
                    "Padding": 16
                }
            }
        ]
    }

Comparison of widget padding and slot padding

如果我们在其中的Content中添加一个按钮:

    ...
    "AutoWidth": true,
    "SBorder": {
        "BorderBackgroundColor": [0, 1, 0, 1], "BorderImage": { "Style": "FEditorStyle", "Brush": "DashedBorder"},
        "Padding": 16,
        "Content":{
            "SButton": { 
                "Text": "A Button" 
            }
        }
    }
    ...

"SButton"就占据了"SBorder"中之前“空控件”所在的位置,它的外围是"Padding:16", 绿框外围是Slot的"Padding:10"

Snapshot showing the padding between the SButton and the SBorder

所以,SBorder的尺寸变成了内部按钮的尺寸,加上Padding的尺寸

ContentPadding of Button

如果我们觉得按钮显得太过拥挤了,想要制作一个“更为重要”的按钮,我们可以用SButton中的“ContentPadding”来调整按钮的尺寸:

    ...
    "SButton": {
        "ContentPadding": [16, 8],
        "Text": "A Button"
    }
    ...

在按钮内部,水平方向和垂直方向的两侧分别添加了16px 和 8px的空白空间 Snapshot of 'ContentPadding' defining the space within the SButton

Padding of Text

部分的文本控件也可设置Padding值, 在下图的"SEditableTextBox"中

Snapshot of SEditableTextBox without padding value

    ...
    "SBorder": {
        "BorderBackgroundColor": [0, 1, 0, 1], "BorderImage": { "Style": "FEditorStyle", "Brush": "DashedBorder"},
        "Content":{
                "SEditableTextBox": {
                "Padding": 20,
                "Text": "Text Input"
            }
        }
    }

加入"Padding": 20后,文本"Text Input"四周就分别添加了20px的空白区域。

注意

~~这些空白区域依然属于文本控件的有效范围,在空白处点击后,会会变成文本输入模式。(为什么要特殊说明,因为后续就有属性是占用空间,但不捕获焦点的)~~

Snapshot of SEditableTextBox with 'Padding' values

Margin of Text

下面的例子是一个"SMultiLineEditableTextBox", 它除了"Padding" 属性以外,还有一个"Margin"

SMultiLineEditableTextBox without padding field, only margin

    "SBorder": {
        "BorderBackgroundColor": [0, 1, 0, 1], "BorderImage": { "Style": "FEditorStyle", "Brush": "DashedBorder"},
        "Padding": 16,
        "Content":{
                "SMultiLineEditableTextBox": {
                    "Padding": 10,
                    "Text": "SMultiLineEditableTextBox"
            }
        }
    }

加上"Padding": 10后的表现和上文中的其他控件一样,在文本四周,添加了10px的空白:

Snapshot of SMultiLineEditableTextBox with 'Margin' effect

加上"Margin": 30

    "SBorder": {
        "BorderBackgroundColor": [0, 1, 0, 1], "BorderImage": { "Style": "FEditorStyle", "Brush": "DashedBorder"},
        "Padding": 16,
        "Content":{
                "SMultiLineEditableTextBox": {
                    "Padding": 10,
                    "Margin": 30
                    "Text": "SMultiLineEditableTextBox"
            }
        }
    }

现在,周围的空白区域变成了10px 的"Padding" + 30px 的 "Margin"。注意下面动图中鼠标的显示状态,当鼠标在内测的30px时,鼠标是"I"字输入样式。打开绿色实体Debug框,可以看到,"Margin": 30位于控件内侧,"Padding": 10 位于

GIF demonstrating the difference between margin and padding clickable areas

Displaying the margin and padding of the widget

注意

  • 这里的Magin位于最内侧,与Html网页控件中,margin位于最外侧是不同的

Padding值的填写

在JSON中,我们在填写Padding,Margin等数值的时候,会有以下3种写法

  1. Padding值是一个数值。例如下面,将表示上下左右4个方向的Padding`值均为16
    "Padding": 16,
  1. Padding值是一个长度为2的数组。如下,将表示水平方向的Padding值均为16,垂直方向的Padding值为12
    "Padding": [16, 12],
  1. Padding值是一个长度为4的数组。如下,将表示左侧,上方,右侧,下方(顺时针)的Padding值分布为:10,20,30和40
    "Padding": [10, 20, 30, 40],

小结

  • SHorizontalBoxSVerticalBox等Layout控件,都用"Padding"
  • "ContentPadding" 是SButton组件专用
  • 大部分文字控件都有Margin属性,有边框的文字控件有"Padding"属性
  • Margin在内会捕获鼠标,"Padding"不会

Cheat Sheet

Slate Description 有效
Slot Padding ok
SBorder Padding
SButton ContentPadding ok
SBox Padding
SEditableText - 没有padding也没有margin
STextBlock Margin
SEditableTextBox Padding new
SMultiLineEditableText Margin 只有margin
SMultiLineEditableTextBox Padding + Margin --
SRichTextBlock Margin

Padding 和margin的总结

Padding Margin
Slot
SBorder Yes
SButton
SBox
STextBlock No Yes
SEditableText No No
SEditableTextBox Yes No -- > : public SBorder
SMultiLineEditableText No Yes
SMultiLineEditableTextBox Yes Yes -- > : public SBorder
SRichTextBlock No Yes

todo, 上面的表格,需要验证