settings.useRootPaddingAwareAlignments属性是theme.json文件中最容易让人困惑的设置之一。它既不与任何界面选项相关联,也不会用于注册预设值。实际上,它的作用是用来指定WordPress应将主题的横向内边距样式应用在何处。

这意味着它与theme.json中的styles.spacing.padding设置共同发挥作用。关于常规样式的更多信息,您可以查阅样式文档,而关于这一特定样式如何与上述设置协同工作的内容,则会在本节中为您讲解。

什么是根内边距?

在了解settings.useRootPaddingAwareAlignments属性的运作方式之前,您首先需要明白什么是根内边距。

根内边距是指应用于网页“根”元素的填充空间。在WordPress主题中,这个元素就是<body>。若要自定义根元素的间距,就必须操作theme.json中的styles.spacing.padding设置。

以以下theme.json代码片段为例,它设置了上下内边距为0,而左右内边距则为2rem:

{
	"version": 2,	
	"styles": {
		"spacing": {
			"padding": {
				"top": "0",
				"bottom": "0",
				"left": "2rem",
				"right": "2rem"
			}
		}
	}
}

默认情况下,这会在<body>(即根元素)的左右两侧各添加2rem的内边距。

如这张截图所示,根元素周围存在横向内边距,而全宽的Cover块则会延伸至该内边距的位置:

带有Cover块背景的WordPress站点头部,其左右两侧有内边距,因此不会占据屏幕的整个宽度。

这是WordPress根据上述theme.json代码生成的CSS代码:

body {
	padding-top: 0;
	padding-right: 2rem;
	padding-bottom: 0;
	padding-left: 2rem;
}

但是——这也是经验丰富的设计师可能会觉得奇怪的地方——当启用settings.useRootPaddingAwareAlignments后,原本应用于根元素的“根内边距”实际上不再作用于根元素本身,而是被应用到了Group之类的容器块上。

关于为何会出现这种情况,我们将在下一节中详细说明。目前的主要目标是让您明白:传统上根内边距是应用于<body>元素的,这也是大多数主题开发者所期望的。对于基于根内边距的对齐功能,WordPress只关注横向(左右)内边距,因此纵向(上下)内边距与本文档的内容无关。

启用基于根内边距的对齐功能

默认情况下,WordPress会将根内边距应用到<body>元素上。如果这符合您主题的设计需求,那么您无需做任何其他操作。

但是,如果您希望让全宽元素延伸至屏幕边缘,同时又希望根元素本身也带有内边距,那该怎么办呢?

与第一张截图相比,您可以发现Cover块虽然延伸到了屏幕边缘,但嵌套的块仍然具有内边距:

带有全宽Cover块背景的WordPress站点头部,该块占据了屏幕的整个宽度。

这是一种常见的设计模式,而在CSS中也有多种方法可以让元素超出其容器的范围。不过WordPress提供了一种适用于所有主题的标准解决方案。

这就是settings.useRootPaddingAwareAlignments设置的作用所在。当该属性被设置为true时,根内边距就会应用到容器元素上,而非<body>元素。同时,还必须配合styles.spacing.padding设置,尤其是横向内边距的设置。

请在您的theme.json文件中尝试使用以下代码:

{
	"version": 2,
	"settings": {
		"useRootPaddingAwareAlignments": true
	},	
	"styles": {
		"spacing": {
			"padding": {
				"top": "0",
				"bottom": "0",
				"left": "2rem",
				"right": "2rem"
			}
		}
	}
}

处理根内边距并没有所谓的对错之分,这属于一种根据具体情况决定的设置,您需要根据主题的设计需求来选择最合适的选项。

它是如何工作的?

虽然了解WordPress在底层是如何处理这些功能的并非至关重要,但有时您可能确实需要更深入地理解其运作原理。

当您启用settings.useRootPaddingAwareAlignments后,如最后一个theme.json示例所示,WordPress会生成两段新的CSS代码。第一段是用于定义根内边距的相关CSS自定义属性:

body {
	--wp--style--root--padding-top: 0;
	--wp--style--root--padding-right: 2rem;
	--wp--style--root--padding-bottom: 0;
	--wp--style--root--padding-left: 2rem;
}

第二段则是添加一个.has-global-padding类:

.has-global-padding {
	padding-right: var(--wp--style--root--padding-right);
	padding-left: var(--wp--style--root--padding-left);
}

随后,这个类会被应用到那些具有固定布局的容器块上(例如,开启了布局 > 内部块使用内容宽度选项的Group块):

<div class="wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained">
	<!-- 嵌套块... -->
</div>

除此之外,WordPress还会添加内联CSS,使得嵌套的宽块和全宽块能够超出其父块的宽度范围(包括因内边距而增加的宽度)。