【问题标题】:Using iframe to apply CSS media queries to block elements使用 iframe 将 CSS 媒体查询应用于块元素
【发布时间】:2013-02-09 10:53:13
【问题描述】:

我只是坐在那里做一些网页设计,并在想“嘿,如果我们可以将 CSS 媒体查询应用于块元素(即div、section 等)不是很好吗?”

说真的,如果我们能够拥有这个功能,我们可以制作一些非常漂亮的流畅布局。在这篇文章中,我将使用一个简单的社交插件,我可以将它实现到我的任何页面上的侧边栏,它可以根据它的父 div 大小进行流动。这很方便,因此我可以调整小部件的大小,无论它是实现为 500px 列还是 300px 列,因此我不必为每个实现它的布局编写特定的样式表。

设计

            >=500px                          <500px
 _______________________________       ____________________
|                               |     |                    |
 ____________________    ______               ______
|                    |  |      |             |      |
|  LIKE ON FACEBOOK  |  | ICON |             | ICON |
|____________________|  |______|             |______|
 ____________________    ______        ____________________  
|                    |  |      |      |                    |
|  FOLLOW ON TWITTER |  | ICON |      |  LIKE ON FACEBOOK  |
|____________________|  |______|      |____________________|

                                              ______
                                             |      |
                                             | ICON |
                                             |______|
                                       ____________________  
                                      |                    |
                                      |  FOLLOW ON TWITTER |
                                      |____________________|

HTML 标记

<div class="widget clearfix">
  <div class="social">
    <div class="social-right">ICON</div>
    <div class="social-left">Like on Facebook</div>
  </div>
  <div class="social">
    <div class="social-right">ICON</div>
    <div class="social-left">Follow on Twitter</div>
  </div>
</div>

CSS

现在是 css 元素媒体查询部分。这不是有效的 css,但这是我想要实现的。本质上只是一个基于父元素而不是整个浏览器宽度的 CSS 媒体查询:

.widget {clear:both;}
[class*=social-] {text-align:center;}
.widget(min-width:500px) {
  .social-left {overflow:hidden;}
  .social-right {float:right;}
}

这将带来无限的好处,并使创建要在多个页面上实现的页面块变得轻而易举。既然我已经让你们都加快了这个问题的速度,那么我的问题来了:

通过 iframe 实现这一点是一个可行的解决方案吗?

我的意思是似是而非的:

  • 语义正确
  • 对 SEO 无害

iframe 能够拥有自己的样式表,并且 css 媒体查询基于 iframe 尺寸,而不是浏览器尺寸。

我的想法

语义

  • 由于 iframe 元素存在于 HTML5 中,甚至添加了属性,我认为 iframe 标记不会很快被弃用。
  • 无缝标记确实有助于使这个解决方案成为可行的解决方案,因为样式将从父文档继承。现在我们需要将这些样式重新包含(或注入)到页面中。
  • iframe 也可以在不触发整个页面重新加载的情况下重新加载,这意味着如果没有 XHR,自动更新小部件将非常容易。

搜索引擎优化

  • 我很确定 Google 并不讨厌使用 iframe 的人,但我可能错了。
  • 由于实际页面信息不会在 iframe 中并且只有这些打包块,我认为它们不会对 SEO 造成损害,因为其中的内容不是实际页面内容的一部分。
  • 由于侧边栏对整个页面内容没有影响,iframe 可以在运行时动态创建。这可能是实现它的最佳方式,但我想听听您的想法。

缺点

  • 每当向页面应用新布局时,都需要使用 JavaScript 将父 iframe 的大小调整为页面内容。

在回答之前,请注意,除了某些 3rd 方应用程序使用 iframe 之外,我从不提倡将 iframe 用于任何用途,但现在看这个,我看不出有什么理由不使用它们.我知道使用 css 元素媒体查询将是完美的,但我认为不会很快实现。

我希望听到大家的更多消息,因为我绝不是 SEO 专家,也不经常(实际上,我从不)使用 iframe。

【问题讨论】:

    标签: html css seo media-queries


    【解决方案1】:

    在 SEO 方面,内容为王。

    当搜索引擎抓取您的网站时,iFrame(及其来源)会被记录下来,但很可能它们不会与页面一起被抓取。如果您拥有绝对重要的内容,则将其归因于该特定页面,请将其置于 iFrame 之外。

    仍然会抓取 iFrame 的内容,但不会将其内容与抓取工具在页面上找到的信息混为一谈;这将是它自己的实体。它还会将该内容归因于提供内容的站点或页面。

    另外,不要让 HTML5 中引入的无缝属性欺骗了您。它不会改变 iFrame 的工作方式,只会改变它的表现形式。

    归结为数据有多重要?如果您只是想将 iFrame 用于文体目的来呈现社交媒体的链接,正如您在示例中所概述的那样,您应该能够在没有负面影响的情况下使用 iFrame。

    但是,如果您将 iFrame 用于风格目的并且有 重要 内容 需要 归因于您所在的页面,我会找到另一个呈现内容的方式。

    因此,在您的示例中,如果将 iFrame 专门用于社交媒体链接,我会说使用 iFrame 来获得媒体查询的好处是可以接受的。

    【讨论】:

      【解决方案2】:

      不幸的是,尚未验证的更好的解决方案是使用具有范围样式的媒体查询。 来源:http://davidwalsh.name/scoped-css

      【讨论】:

      • 在阅读了一些关于作用域 css 样式的内容后,似乎仍然没有办法让 css 媒体查询基于页面宽度以外的父宽度应用。它只允许我们只将该样式应用于范围内的元素,但仍基于页面宽度。
      【解决方案3】:

      CSS Container Queries (caniuse.com)

      将样式应用于指定容器的实验性媒体查询 元素而不是整个页面。目前使用 包含属性和@container at-rule。

      目前只能通过 Canary 上的 chrome:flags 获得。

      容器查询让我们不再只考虑视口,而是允许任何组件或元素响应定义的容器宽度。因此,尽管您仍然可以将响应式网格用于整体页面布局,但该网格中的组件可以通过查询其容器来定义自己的行为变化。然后,它可以根据显示在窄容器还是宽容器中来调整其样式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-24
        • 2012-08-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多