向“body”添加一个类

Posted

技术标签:

【中文标题】向“body”添加一个类【英文标题】:Adding a class to "body" 【发布时间】:2011-12-03 18:58:02 【问题描述】:

如何修改或预处理<body> 标签以添加类主体?我不想创建一个完整的 html.tpl.php 只是为了添加一个类。

【问题讨论】:

【参考方案1】:

这是一种基于 URL 添加类的简单方法,Drupal 9。 无需启用模块。

/**
 * Implements hook_preprocess_html().
 */
function THEME_NAME_preprocess_html(&$variables) 
  // Get the current path
  $current_path = \Drupal::service('path.current')->getPath();
  $internal_path = \Drupal::service('path_alias.manager')->getAliasByPath($current_path);

  // Assign it to body class 
  $variables['attributes']['class'][] = str_replace("/", "", $internal_path);

参考:http://www.thirstysix.com/how-can-i-add-body-class-based-path-page-specific-class-drupal-9

【讨论】:

【参考方案2】:

您可以勾选“https://www.drupal.org/project/page_specific_class”为任何页面的body标签添加class

【讨论】:

有时最好写下你的答案(从任何地方)而不是外部链接。【参考方案3】:

对于 Drupal 7 安装 http://drupal.org/project/body_class。它将帮助您为 body 标签中的每个节点添加单独的类

【讨论】:

【参考方案4】:

Common Body Class 模块提供用户通过一个接口向任何页面添加类。 该界面具有选择多个用户角色以及可以呈现类的页面的选项。

【讨论】:

【参考方案5】:

Context 模块还允许您向 body 标记添加一个类。

如果您需要在特定条件下添加类,这会很有用。

您可以在反应“主题 HTML”下找到此选项:

【讨论】:

【参考方案6】:

答案似乎取决于上下文。这是我通过反复试验发现的:

如果您的 hook_preprocess_html() 位于 模块 中,请使用 $vars['classes_array'][]。

如果它在 主题 中,请使用 $vars['attributes_array']['class'][]。

【讨论】:

不完全 - attributes_array 是由 Omega 主题专门定义的。对于“正常”主题,它将是 classes_array【参考方案7】:

我在别人建立的网站上应用了这种技术。起初它不起作用,但后来深入挖掘,发现 $classes 变量没有在 tpl 文件中输出。因此,如果它不起作用,请检查。

【讨论】:

【参考方案8】:

我必须在同一个钩子中使用不同的数组键才能使其工作:

function THEME_preprocess_html(&$vars) 
  $vars['attributes_array']['class'][] = 'foo2';

【讨论】:

【参考方案9】:

The documentation for the html.tpl.php template 将$classes 变量记录为类字符串,可用于通过 CSS 设置上下文样式。。如果你看一下模板的代码,这个变量用于生成的 body 元素的类属性中:

<body class="<?php print $classes; ?>" <?php print $attributes;?>>

$classes 变量实际上已经由template_process() 为任何模板文件设置,并根据$classes_array 变量的内容构建。

因此,要将类添加到页面主体,您应该将此类添加到主题(或模块)的 hook_preprocess_html() 实现中的 $classes_array 值:

function THEME_preprocess_html(&$variables) 
  $variables['classes_array'][] = 'new-class';

由于这是核心定义的模板和流程函数,任何表现良好的主题都应该重复使用相同的变量。

【讨论】:

【参考方案10】:

在您主题的 template.php 文件中使用 preprocess_html 挂钩:

function mytheme_preprocess_html(&$vars) 
  $vars['classes_array'][] = 'new-class';

记得在实现钩子后清除缓存,否则 Drupal 将无法拾取它。

【讨论】:

它是如何知道添加到body的? html.tpl.php 中只有一个元素添加了任何类,即&lt;body&gt; 元素;上面的预处理函数是针对那个文件的,所以你添加的任何类都只会被添加到&lt;body&gt;元素中。 顺便说一句,如果您还没有安装Devel module 并在整个代码中的任何变量上使用dpm 函数;它将呈现放置在通常消息区域中的类和数组的良好表示......这是调试的绝对必要条件。您可以在上面的函数中使用它,例如:dpm($vars); 它会将数组打印到屏幕上,以便您可以检查它 我已经尝试过了(清除缓存、检查拼写等),但没有成功。是否存在受其他模块影响的情况?我正在使用上下文和欧米茄主题,顺便说一句。 @nikan 现在可能有点晚了,但是对于 Omega,您想实现 mytheme_alpha_preprocess_html 并将类添加到 $vars['attributes_array']['class'] 数组中

以上是关于向“body”添加一个类的主要内容,如果未能解决你的问题,请参考以下文章

php 向body类添加自定义分类术语

html HTML / JQUERY:将窗口宽度特定类设置为body标签。用于向旧版浏览器添加媒体查询支持或添加宽度指定

html HTML / JQUERY:将窗口宽度特定类设置为body标签。用于向旧版浏览器添加媒体查询支持或添加宽度指定

html HTML / JQUERY:将窗口宽度特定类设置为body标签。用于向旧版浏览器添加媒体查询支持或添加宽度指定

html HTML / JQUERY:将窗口宽度特定类设置为body标签。用于向旧版浏览器添加媒体查询支持或添加宽度指定

html HTML / JQUERY:将窗口宽度特定类设置为body标签。用于向旧版浏览器添加媒体查询支持或添加宽度指定