`
hax
  • 浏览: 964930 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

webkit上multicolumn的bug和解决技巧一则

    博客分类:
  • CSS
阅读更多
webkit开始支持多栏属性。

如:

section {
	display: block;
	height: 300px;
	-webkit-column-width: 200px;
	-webkit-column-gap: 50px;
}


我们设定了固定高度,然后分栏,每栏200px宽,每两栏间隔50px。如果内容较多,则可出现横向scrollbar。

然而实际栏宽并非一定是200px,而是会根据横向可用空间平均分配。比如横向空间为650px时,会有2栏。每栏宽300px,加上2栏间的间隔50px正好等于650px。如果横向空间为700px时,就会变成3栏,每栏宽200px,加上3栏间的2个间隔100px,正好等于700px。所以其行为有点类似min-width,即column至少200px宽(除非可用空间小于200px)。

我们也可以不指定column-width而指定column-count,与上述类似,也会根据横向可用空间平均分配。

我们也可同时指定column-width和column-count。当横向空间超过指定栏数n所需的最小宽度时(即column-width * n + column-gap * (n - 1)),会保持column-width不变。而不足时则会退化为与只指定column-width时的效果一致。
【注:Firefox下的行为与此不一致,貌似是直接忽略column-count。】

我们也可设定width。之前描述的各种自伸缩的情形,其实源于used width的变化。若width固定下来,则column-width也就固定下来了。

道理上,最简单和易于理解的方式是,设定width和column-width为相同值。如下:

section {
	display: block;
	height: 300px;
	-webkit-column-width: 200px;
	-webkit-column-gap: 50px;

	width: 200px;
}


然而较老版本的webkit存在bug,当width小于 2 * column-width + column-gap 时,会变为只有一栏。也就是说,当不足以容纳两栏时,会退化为不存在分栏情况,因此也不会有横向scrollbar,而变成了纵向scrollbar。或者未设overflow:scroll情况下就是文字交叠在一起,这显然是很糟糕的。

如何解决这个问题呢?一种比较容易想到的方式是用脚本来遍历每个元素,然后看看它的scrollHeight是否超出height,如果超过的话,说明一栏是不足以容纳其内容的,就重置其样式,设定width为2栏所需宽度。

然而这个方式显然有很大的缺陷。如果元素的内容变化,或者样式变化(如字体变大变小)就需要将width设回column-width之后重新计算。

如果不用脚本,则width就必须设置为至少2栏宽。虽然一般并没有什么问题,在某些应用场景下会有问题。例如如果要计算该元素有几栏。本来用(scrollWidth + columnGap) / (columnWidth + columnGap) 即可得到。但是对于只需一栏的情况也会返回2。

这个问题困扰了我好一阵子。直到我突然灵光一现:

section {
	display: block;
	height: 300px;
	-webkit-column-width: 200px;
	-webkit-column-gap: 50px;

	width: 450px;
	margin-left: -250px;
}
section::before {
	content: '';
	display: block;
	width: 200px;
	height: 300px;
}


这里的要点是,原先问题是,对于一个只需一栏即可容纳的元素,设定2栏宽度实际造成了多了一个空白栏。要消除这个空白栏,此路不通。那么我们就反其道行之。我们不是消除空白栏,而是通过generated content来填充这个空白栏。这样原本只有一栏的内容都至少会占两栏。对于像计算栏数这样的需求,我们就可以按常规方法计算,把结果减去1,就是真正的结果了。




0
0
分享到:
评论
1 楼 ad4621 2011-08-18  
现在多栏布局遇到问题  在多栏布局下 标签怎样定位呢??

相关推荐

    Multicolumn Listbox.zip_labview列表框_labview多列框_listbox 多列_multi

    在LabVIEW编程环境中,列表框(Listbox)是用于显示一系列可选择项目的控件,而多列列表框(Multicolumn Listbox)则扩展了这一功能,允许在一个控件内显示多列数据,使得数据组织更加清晰,用户界面更加友好。...

    Easy-multicolumn-listbox-8.6.zip_Multicolumn-Listbo_labview_labv

    在LabVIEW编程环境中,多列列表控件(Multicolumn Listbox)是一种强大的用户界面元素,用于展示结构化的数据信息。这个"Easy-multicolumn-listbox-8.6.zip"文件提供了一个关于如何在LabVIEW中有效使用多列列表控件...

    MultiColumn_ComboBox

    标题 "MultiColumn_ComboBox" 指涉的是一个在VB.NET环境中实现的多列下拉框控件。这种控件通常用于在用户界面中显示大量数据,并通过分列展示来提高可读性和用户体验。在传统的单列下拉框中,如果选项过多,用户可能...

    Multicolumn Jcombobox_DEMO_multicolumncombobox_

    "Multicolumn JCombobox"则是JComboBox的一种扩展,它允许在下拉列表中展示多列数据,这对于处理大量或者宽数据时非常有用,可以提高用户的可读性和交互性。 在"Multicolumn JCombobox_DEMO_multicolumncombobox_...

    ASP.NET AJAX Extender for multicolumn drag and drop

    总的来说,"ASP.NET AJAX Extender for multicolumn drag and drop"是一个自定义的解决方案,它利用了ASP.NET AJAX的优势,通过JavaScript和服务器端代码实现了多列拖放功能。这个技术可以显著提升数据呈现的交互性...

    Multicolumn ListView in Android

    在Android开发中,ListView是一种常见的UI组件,用于展示大量数据列表。当数据具有多个分类或者需要展示多列信息时,单列的ListView可能无法满足需求,此时就需要使用到多列ListView。本文将深入探讨如何在Android中...

    QuickRpt Bug 尾页打印页脚错误修正

    QuickRpt Bug 尾页打印页脚错误修正 Quickreport Bug { ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: QuickReport 4.0 for Delphi and C++Builder :: :: :: :: QUICKRPT.PAS - MAIN UNIT...

    关于CListBox和CComboBox修改窗口Style的问题.doc

    修改CListBox和CComboBox窗口式样是一个复杂的问题,我们需要使用不同的方法来解决这个问题。我们可以使用ModifyStyle()或SetWindowLong()函数来修改窗口式样,但是这两个函数都不能在窗口创建后修改窗口式样。我们...

    multicolumn:Emacs 的多个并排窗口支持包

    multicolumn - 创建和管理多个并排窗口 添加一名作者版本: 0.1.1 网址: : 使用多个并排窗口时有用的命令。 概述 使用多个并排窗口是利用当今存在的大型高分辨率显示器的好方法。 这个包提供了 Emacs 的“缺失...

    论文写作注意事项、总结和技巧

    【论文写作注意事项、总结和技巧】 论文写作是学术交流的关键环节,旨在清晰、简洁地传达研究发现。在撰写论文时,关注以下几个方面的细节能够显著提高论文的质量和可读性: 1. **符号与公式**: - 在数学公式中...

    Column Not Found(解决方案).md

    Column Not Found(解决方案).md

    matlab开发-MultiColumnListbox

    在MATLAB编程环境中,`MultiColumnListbox`是一种控件,用于显示多列数据,用户可以从中选择一个或多个项。这种控件在GUI(图形用户界面)设计中非常常见,尤其是在需要展示和操作结构化数据时。在这个“matlab开发-...

    FastReport_VCL_v6.3.5_Professional_Full_Source_Code_D7-D10.3_Rio

    - Improved ToNRowMode and now works with multiColumn data band and subreport with PrintOnParent - Fixed bug in PDF export with transparency in Picture object and KeepAspectRatio property - Fixed ...

    VC之MFC高级编程技巧篇

    组合框(ComboBox)是另一个相关的控件,它的窗口类名为“COMBOBOX”,结合了编辑控件和一个关联的列表框。用户可以在编辑框中输入文本,或者从下拉列表中选择。CComboBox类是MFC为组合框提供的封装,同样通过Create...

    FastReport_VCL_Enterprise_v6.3.8_Full_Source_Retail_D7-10.3Rio

    Current version ---------------------------- - Fixed export of hyperlinks to protected PDF [6.3.5] - Fixed AV in the TfrxPreview - Fixed ParagraphGap for ...中文菜单显示异常的解决方法见压缩包里的说明

    多列列表框单选和多选Demo,表格怎么选择多选和单选,LabView

    1. **创建列表框**:在LabVIEW的前面板上添加一个多列列表框组件。通过属性节点可以配置其显示的列数、每列的宽度以及是否启用多选。 2. **数据绑定**:将数据源连接到列表框,可以是数组或簇形式的数据,包含要...

    Manual of Latex2e_中文

    10. **调试技巧**:了解错误消息的含义是解决问题的关键,学会使用`log`文件查找问题源头。 通过深入阅读《LaTeX2e_中文》,你可以逐步熟悉这些概念,并提升LaTeX排版技能。这本书不仅适合学术写作,也适用于各类...

    论文排版.zip

    《全国大学生数学建模Latex模板》是一份专为大学生数学建模竞赛设计的排版资源,其中包含中英文论文的模板,旨在帮助参赛者快速高效地完成论文的格式设定和内容呈现。Latex是一种基于TeX的文字处理系统,尤其适合...

    LaTeX数学试卷排版指南.pdf1

    localtexmf 是一个 TEX 的本地目录,用于存储用户的 TEX 文件和字体。 LATEX 排版技巧 LATEX 提供了多种排版技巧,包括: * 页眉和页脚排版:\pagestyle、\markright 等 * 章节和小节排版:\chapter、\section 等...

    FastReport_VCL_6.3.3

    - Improved ToNRowMode and now works with multiColumn data band and subreport with PrintOnParent - Fixed bug in PDF export with transparency in Picture object and KeepAspectRatio property - Fixed ...

Global site tag (gtag.js) - Google Analytics