草庐IT

css - 语义 HTML5 结构与 CSS 布局需求

coder 2023-08-03 原文

我有一个像下面这样的网页:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Title</title>
    </head>
    <body>
        <header>
            <span>Logo</span>
            <nav>Navigation</nav>
        </header>
        <main>
            <h1>Page heading</h1>
            <div>
                Page content
            </div>
        </main>
        <footer>
            Content information
        </footer>
    </body>
</html>

页面结构类似于当前 HTML5 草案中的一个示例:http://www.w3.org/html/wg/drafts/html/master/grouping-content.html#the-main-element我认为它在语义上是正确的。

现在我想使用 CSS 来设置这个文档的样式。我想成为顶部的页眉和底部的页脚,这当然很容易实现。在标题内,我想将 Logo 放在右侧,将导航放在中间,这也可以(例如,通过使用灵活的框布局模型,现代浏览器以一种或另一种方式支持,或者通过使用 float )。

当我想将主要的内容标题(h1 元素)直观地放在标题的左侧时,我的问题就开始了。我可以使用 position: absolute ,但这样的布局不是很灵活,一旦标题或标题的大小发生变化就会中断。建议的 CSS 网格布局 http://www.w3.org/TR/css3-grid-layout/也许能够完全按照我的意愿去做,但据我所知,它仅在 IE 10 中(以某种方式)受支持。

一种简单而有效的解决方案是简单地重组我的页面:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Title</title>
    </head>
    <body>
        <div>
            <h1 id="heading">Page heading</h1>
            <header>
                <span>Logo</span>
                <nav>Navigation</nav>
            </header>
        </div>
        <main aria-labelledby="heading">
            <div>
                Page content
            </div>
        </main>
        <footer>
            Content information
        </footer>
    </body>
</html>

这种解决方案虽然易于布局,但其完整语义仅通过 aria-* 属性表达,似乎违背了 HTML5 语义(尤其是主元素)的精神。

虽然我的示例页面可能很简单,但您可以轻松想象一个更复杂的页面,其中更多元素的视觉位置与 HTML5 标记的流顺序不同(并且嵌套以便灵活框布局顺序属性获胜不够)。你会如何解决这个问题?用非语义元素(例如 div)重写 HTML5 标记,使其更多地对应于视觉布局,然后在可能的情况下使用新结构通过语义元素(例如页脚或主要)交换非语义元素?

最佳答案

我遇到了和你一样的难题,我很感激你的挫败​​感。我将尝试否定答案,因为我觉得这两个积极的答案(即您可以实现两个目的)都没有捕获要点。

首先,在我看来,您的主要困难在于 CSS 无法将元素移动到新容器。这两个答案分为两类:

  • 有些是超特定的 hack(主观地说),涉及 float 、负边距和/或绝对定位,可以将元素从其容器中移出。这些可能是有效的,但仅限于非常特殊的情况。随着您的需求的增长,它变得难以维护,并且需要设置一个相当大的思维上限来解决您之前错过的每个新需求或边缘情况。 @jennifit 的回答试图让你朝这个方向前进。我相信,这是那些努力遵循语义HTML5精神的人所采取的正常路线,令人钦佩。但这可能是一个泥潭,让您开始问到底是为谁维护您的语义纯度?是为了搜索引擎、屏幕阅读器还是易于维护?我会在下一次分类后回到这一点。
  • 有些是语用合理化,声称在语义上是等效的,但实际上是不同的语义。在我看来,这些确实是语义黑客。 @volker-e 的回答就是一个例子。他是对的,这是一个可以工作的替代标记——但是,它不等于相同的语义。 h2属于 main作为 h1 -- 在页面的标题中移动它是没有意义的。事实上,您是说您的标题与您的主要内容无关。在某些方面,这比使用您想要使用的那个 div 更糟糕,因为您通过将页面标题和站点标题分组到相同的语义上来建立错误的语义关系 header .语义上无意义的容器,例如 div , 用于 headermain ,在我看来实际上不那么反常。

  • 所以,回到我所说的关于你为谁维护语义纯度的问题上,这是真正的哲学问题。通常有一个明显的、有效的和可维护的解决方案,而不会对现有语义元素或 CSS '技巧' 进行合理化的误用。在你的情况下,有一个元素在语义上是一个 child 但目前不是一个 child ,答案是你已经提出的问题:

    Rewrite the HTML5 markup with non-semantic elements (e.g. divs) so that it corresponds more to the visual layout and then exchange the non-semantic elements by[sic] semantic ones (e.g. footer or main) wherever possible with the new structure.



    无论您的语义纯度是为了什么,这都是正确的做法
  • 可访问性:在这种情况下,您可以使用 ARIA Angular 色以非分层方式实现这一点。
  • 搜索引擎:搜索引擎仍然理解旧的做事方式,所以如果你遵循旧的语义方法,你就不会陷入搜索引擎优化的麻烦。
  • 维护:这就是大多数人被吸引的原因——但问题是,可维护的 HTML 但不可维护的 CSS 有什么意义,或者相反?您别无选择,只能将您的维护视为 CSS 和 HTML 的组合,并且您必须找到中间立场,当您遇到困难的表示问题时,它们都将同样困惑。

  • 如果您认为 HTML 语义很重要,那么唯一可能的答案是 接受分层 HTML 语义对布局的限制 .问题是,CSS 无法重新创建布局层次结构。在此之前,您必须接受 HTML 既是一种表现语言又是一种语义语言 ,因此,语义永远是“更好”和“更坏”的问题。真正漂亮、丰富或完美的语义在许多(如果不是大多数)布局中是无法实现的。

    关于css - 语义 HTML5 结构与 CSS 布局需求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16767617/

    有关css - 语义 HTML5 结构与 CSS 布局需求的更多相关文章

    1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

      我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

    2. ruby - capybara field.has_css?匹配器 - 2

      我在MiniTest::Spec和Capybara中使用以下规范:find_field('Email').must_have_css('[autofocus]')检查名为“电子邮件”的字段是否具有autofocus属性。doc说如下:has_css?(path,options={})ChecksifagivenCSSselectorisonthepageorcurrentnode.据我了解,字段“Email”是一个节点,因此调用must_have_css绝对有效!我做错了什么? 最佳答案 通过JonasNicklas得到了答案:No

    3. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

      在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

    4. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

      所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

    5. ruby-on-rails - Ruby url 到 html 链接转换 - 2

      我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

    6. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

      给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

    7. ruby - nanoc 和多种布局 - 2

      是否可以为特定(或所有)项目使用多个布局?例如,我有几个项目,我想对其应用两种不同的布局。一个是绿色的,一个是蓝色的(但是)。我想将它们编译到我的输出目录中的两个不同文件夹中(例如v1和v2)。我一直在玩弄规则和编译block,但我不知道这是怎么回事。因为,每个项目在编译过程中只编译一次,我不能告诉nanoc第一次用layout1编译,第二次用layout2编译。我试过这样的东西,但它导致输出文件损坏。compile'*'doifitem.binary?#don’tfilterbinaryitemselsefilter:erblayout'layout1'layout'layout2'

    8. ruby-on-rails - capybara ::ElementNotFound:无法找到 xpath "/html" - 2

      我正在学习http://ruby.railstutorial.org/chapters/static-pages上的RubyonRails教程并遇到以下错误StaticPagesHomepageshouldhavethecontent'SampleApp'Failure/Error:page.shouldhave_content('SampleApp')Capybara::ElementNotFound:Unabletofindxpath"/html"#(eval):2:in`text'#./spec/requests/static_pages_spec.rb:7:in`(root)'

    9. css - 用 watir 检查标签类? - 2

      我有一个div,它根据表单是否正确提交而改变。我想知道是否可以检查类的特定元素?开始元素看起来像这样。如果输入不正确,添加错误类。 最佳答案 试试这个:browser.div(:id=>"myerrortest").class_name更多信息:http://watir.github.com/watir-webdriver/doc/Watir/HTMLElement.html#class_name-instance_method另一种选择是只查看具有您期望的类的div是否存在browser.div((:id=>"myerrortes

    10. ruby - 如何使用 Ruby 将 CSV 文件读入 HTML 表格? - 2

      我正在尝试将一个简单的CSV文件读入HTML表格以在浏览器中显示,但我遇到了麻烦。这就是我正在尝试的:Controller:defshow@csv=CSV.open("file.csv",:headers=>true)end查看:输出:NameStartDateEndDateQuantityPostalCode基本上我只获取标题,而不会读取和呈现CSV正文。 最佳答案 这最终成为最终解决方案:Controller:defshow#OpenaCSVfile,andthenreaditintoaCSV::Tableobjectforda

    随机推荐