【问题标题】:Managing text columns in responsive layout在响应式布局中管理文本列
【发布时间】:2012-12-20 18:02:49
【问题描述】:

我正在开发一个使用响应式布局的网站,但我遇到了 解决较新的 CSS 多列属性的缺点的问题 (http://dev.w3.org/csswg/css3-multicol/)。

当浏览器窗口足够宽时,我将文本一分为二 带有侧边栏的列用于较小的图像。多列 css 属性效果很好,但它们不太聪明。

第一部分被平均分成两个等高的列,但是 他们太高了。对于有人阅读本节,他们必须 沿着第一列向下滚动,然后返回到开头 接下来阅读其余部分。

第二部分也被分成两个等高的列,但是 只有两句话,看起来很别扭;真的没有 足够的内容来证明用户必须阅读的第二列。

在我看来,解决方案是这样的:

  1. 将部分分成具有固定最大高度的子部分。那 方式,您可以在不滚动页面的情况下跨列阅读,并且看起来更多 喜欢一篇文章。
  2. 将短于最大高度的部分保留为单列。

问题在于 CSS3 多列不能以这种方式工作。我觉得 唯一的方法是某种涉及做的javascript解决方案 计算字符数、CSS 文本属性和元素 尺寸,然后拆分字符串/附加新的 html 元素以将内容分配到单独的部分以使列正确中断。

记住两点:

  1. 这些列是可变宽度的,因此无法选择幻数。
  2. 该过程必须是可逆的,因此响应式布局可以在更窄的浏览器宽度下切换回 1 列。

有点棘手,但我认为这可能足以尝试。有没有人听说过有人可能正在解决 这个问题已经?或者,如果没有,您对如何放置 算法一起做这个?

非常感谢您的帮助。


13 年 1 月 8 日:

为了澄清,这里有一些响应式设计的预期模式的图像。 (因为我是新来的,所以只有两个链接)

模式一:移动端的单列线性化

模式2。Single-column with sidebar for iPad / narrow browser windows

模式 3。Two-column for wide browser windows

模式 3 是问题所在。第一部分的内容太长而无法放在一个页面上,因此在这种情况下,我将其划分为适合浏览器高度的行。这就是我正在寻找的 JavaScript 解决方案。

【问题讨论】:

  • 您使用多列而不是三个浮动 div 是否有特定原因?
  • 主要原因是网站是响应式的,对于不同的浏览器宽度有不同的css规则,所以使用硬编码的列在语义上是不正确的,而且它会导致我的单列布局出现布局问题.这是浏览器变窄时的屏幕截图:i.imgur.com/91B1P.png
  • 您可以使用浮动 div 进行响应式布局。我的网站就是这样设置的。
  • 您的网站有一个带有侧边栏的主栏;两种不同的内容。我同意这是非常可行的。但我正在尝试做的是响应式地跨行和列分发一篇文本。
  • 为什么不在基于高度的媒体查询(也使用 em)中基于 EM 设置容器的最大高度?如果你想根据字符/字数来做事情,那么你就在 JS 领域,或者因为你控制了内容,为什么不对有足够内容的文章应用 .multiple 类,而对于那些没有的文章则不使用(或包含一个 .single,这是最不需要的)。 --- 我将在接下来的几个小时内开发 codepen.io。

标签: css text responsive-design fluid-layout paragraph


【解决方案1】:

您可以单独使用 CSS 来做到这一点:

.box {
    -o-text-overflow: ellipsis;   /* Opera */
    text-overflow:    ellipsis;   /* IE, Safari (WebKit) */
    overflow:hidden;              /* don't show excess chars */
    white-space:nowrap;           /* force single line */
    width: 300px;                 /* fixed width */
}

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我想你要的是这个 -> http://codepen.io/justincavery/full/KsjHa

    我在这里做的是使用 jquery 来检查内容 div 中的字符数。

    var $div = $( '#blah' );
    if($div.text().length >= 600) {
    $div.addClass('columns');
    }
    

    如果字符数等于或大于 600,则将“列”类添加到包含的 div。

    需要明确的是,这意味着任何少于 600 个字符的文章都不会应用“column”类,而任何超过或等于 600 个字符的文章都不会。

    现在我们已经对 DOM 进行了排序,接下来是 CSS(请注意,此 codepen 有一些与此答案无关的样式,因此请仅用作指导)。

    下一阶段是为超过 600 个字符的内容添加列,但我们仍然需要确保在较小的宽度上我们只有一列,否则它看起来很奇怪。

    @media screen and (min-width:48em) {
     /*     48.000em /*(ackkkkkk, device specific bad)768px*/
      .columns { 
      -webkit-column-count: 2; /* Saf3, Chrome*/
      -webkit-column-gap: 4%; /* Saf3, Chrome*/
      -moz-column-count: 2; /* FF3.5+ */
      -moz-column-gap: 4%; /* FF3.5+ */
      column-count: 2; /* Opera 11+*/
      column-gap: 4%; /* Opera 11+*/
    }
    }
    

    在这里,我选择了 48em 或更大(ipad 纵向及以上)作为定义列的点,允许任何较小的屏幕成为单列。

    我后来发现的一个问题是,如果文本太长,您希望它再次出现在单个列中。在这种情况下,您需要删除该类以获得更高的值,或者检查字符数是否在两个值之间。

    您可能还注意到,我开始研究将背景设置为粉红色并将内容设置为两列的垂直媒体查询,但它无法实现您所寻找的。​​p>


    问题正在研究的这种技术有几点。

    1. 直到我第三次阅读问题时,我才真正从图片中意识到它们是两个独立的部分。大多数人会假设左栏中的内容在移动到右栏(例如报纸和杂志)之前会继续到页面底部。您需要在每个部分之间进行某种中断来显示这一点。
    2. 这是一个设计问题,所以我认为它主要用于登陆/说明页面,您希望在这些页面中投入更多的工作来设置内容的样式。考虑到这一点,您应该通过手动添加类来定制它。
    3. 最后,网络不是印刷品,人们可以在一个页面上阅读内容,看看“The Great Discontent”阅读效果如何

    编辑

    更新问题后,我认为您正在寻找的实现是在这项出色的工作上完成的 - http://kaikkonendesign.fi/typesetting-responsive-css3-columns/

    【讨论】:

    • 嗨@justinavery,感谢您周到的回答。我已经实施了你的一些建议,但细节和解释非常有帮助。我的问题的要点实际上是在两列布局变得太长以至于用户必须滚动才能阅读全部内容的情况下;我想要一种将 2 列内容分成适合浏览器窗口的行的方法。我正在编辑原始问题,其中包含指向我要做什么的图片的链接。
    • 我想这将是你祈祷的答案;)kaikkonendesign.fi/typesetting-responsive-css3-columns
    • 多么棒的文章。非常感谢@justinavery 的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2018-03-19
    • 1970-01-01
    相关资源
    最近更新 更多