草庐IT

html - CSS 流体列,固定边距; chalice 的 chalice

coder 2023-07-30 原文

更新与总结

我觉得有义务让这个问题更清楚,现在有悬赏。

(另外,我很确定当 calc() CSS3 单位值被支持时,这将是 child 的游戏,做类似 width: calc(25% - 5px) 的事情;尽管到那时我们可能会在我们的脑海中浏览互联网)

我正在为一些共享设计要求的元素开发 CSS 框架;即流畅的 12 列布局。使用 float .column百分比宽度为 (100% / 12) x col_size 的元素,这相当容易。但是,问题在于在列之间添加了固定边距(或任何形式的间距)。

我最初的尝试使用了描述的流体柱,带有 .panel子嵌套在每个。 HTML/CSS 片段如下(为简洁起见已减少):

.column{
    float: left;
    display: inline-block;
}

.width-01{ width:  8.3333%; }
.width-02{ width: 16.6666%; }
.width-03{ width:      25%; }
/* etc */

.panel{
    width: 100%;
    padding: 5px;
    box-sizing: border-box; /* so padding doesn't increase width */
}

<div class="column width-02">
    <div class="panel">Width-02</div>
</div>
<div class="column width-03">
    <div class="panel">Width-03</div>
</div>
<div class="column width-02">
    <div class="panel">Width-02</div>
</div>
<div class="column width-05">
    <div class="panel">Width-05</div>
</div>

此代码段将生成类似于下图的布局,但是所有 .panel元素有 5px四面八方填充。 我试图使外列的内容边缘与视口(viewport)(或父容器)的边缘齐平 .另一种方法是消除 .panel完全类,只需使用列:

.column{
    float: left;
    display: inline-block;
    padding-left: 10px;
    box-sizing: border-box;
}

.column:first-child{ padding-left: 0px; }

.width-01{ width:  8.3333%; }
.width-02{ width: 16.6666%; }
.width-03{ width:      25%; }
/* etc */

<div class="column width-02">Width-02</div>
<div class="column width-03">Width-03</div>
<div class="column width-02">Width-02</div>
<div class="column width-05">Width-05</div>

同样,这很有效,产生的结果更接近下图的结果,但是现在(实际)问题是填充占用了列的宽度,弄乱了宽度分布。 :first-child列的内容区域宽度比它的兄弟列大 10 个像素(或任何边距大小)。

这可能看起来无害,甚至不引人注意;但是也有少数情况下有 精确 (尽可能准确)元素之间的宽度分布要么是必要的,要么会让事情变得更容易。

所以,是否使用填充、边距或它们的某种组合;是否有针对流体列、固定边距、均匀分布的装订线空间不会从相邻列中抢夺“边际”(***哈哈* )内容区域的解决方案?**

原始问题

由于在我的搜索和尝试中简单地缺乏结果,我得出结论这是不可能的。如果有任何地方可以产生答案,我肯定它就在这里。

有什么方法可以使用纯 CSS 来实现具有固定宽度边距的流体宽度列式布局?

重要提示 :这个图只是一个例子,并不是我想要实现的具体布局。给定的解决方案应允许相邻列的任意组合,总宽度分布总计 12 或更少。考虑流行的 960 grid以供引用。)


备注 :在12列布局中,图像中列的宽度分布分别为2、3、2、5。

到目前为止,我已经求助于使用百分比的网格,几乎可以实现这一点。问题是,为了实现边距,每列都需要一个额外的子项(我称它们为 .panel ):

width: 100%;
box-sizing: border-box;
padding: 10px;

这再次几乎没问题;这种方法的问题在于第一列和最后一列有外部“边距”( 10px ),并且每列之间的“边距”加倍( 2 x 10px )

当然,包含新的 CSS3 calc()值类型,这可以更容易地解决。朝着以下方向的东西:

.width-12 > .panel{ width: 100%; }
.width-09 > .panel{
    width: calc(75% - 10px);
    margin: ...;
}

我有一些 Javascript 修复程序,我已经破解了一些“有效”的东西,但我正在寻找。希望最神圣的 chalice 存在。

不幸的是,以下解决方案和@avall 提供的解决方案(尽管在简化方面确实是一个不错的选择)并不是我想要的。主要问题是,边距在列之间分布不均匀。

我能看到这个工作的唯一方法是减少 .panel填充到 5px和类似的东西:

.column:first-child > .panel {
    padding-left: 0px;
}

.column:last-child > .panel {
    padding-right: 0px;
}

/* not necessary? in any case, haven't tested */
.column:only-child > .panel {
    padding-right: 0px;
    padding-left: 0px;
}

这个解决方案是不能接受的,只是因为IE8无法识别:last-child (就此而言 :only-child )伪选择器。

最佳答案

我终于想通了。在过去十年中断断续续地浪费了数百个小时之后(尽管我依赖于一些一年前无论如何都行不通的 css)。我在没有任何问题的情况下解决了它。并在 IE8+ 中。

请准备 2001: A Space Odyssey 音乐,因为我要登上这艘船。

这种方法的天才和技巧是使用内联块元素,然后使用字间距来平衡使用负右边距。负的右边距本身会将元素拉到一起,允许您设置 100% 的宽度并仍然适合它们之间的内容,但让元素重叠。在父级上设置负边距只会撤销子级边距对与总宽度交互的影响(我们试图达到的神奇“100% 宽度”标记)。填充仅用于增加其元素的大小在反作用余量方面并且是无用的。它通常在陪审团操纵解决这个问题的解决方案中与 box-sizing 一起使用,代价是完全失去使用填充的能力(和余量)并且可能需要更多包装元素。

word-spacing 提供了神奇的“第三种方式”来添加或删除两个元素之间的水平距离,前提是它们是内联块,因为在这种情况下它们将被视为单个“单词”,并且它们之间的任何空格都将折叠为单一可控的“字间距”属性。除了这个技巧,我不知道另一种方法来获得这个 100% 结果。

我谦虚地提出了固定排水沟 flex-columns 问题的最终答案。我在此将我的解决方案命名为“欧米茄机动”。它具有处理任意混合宽度列的能力(添加最多 100% 的总宽度以进行四舍五入)、任何装订线大小、任何预定义的宽度列数、使用自动换行处理任意数量的行,以及使用 inline-block 元素,因此提供了 inline-block 附带的垂直对齐选项,并且它不需要任何额外的标记,只需要容器上的单个类声明(不包括定义列宽)。我认为代码不言自明。这是 2-6 列的代码实现,使用 10px 装订线和百分比的奖金助手类。

编辑:有趣的难题。我设法得到了两个略有不同的版本;一个用于 mozilla 和 ie8+,另一个用于 webkit。似乎单词间距技巧在 webkit 中不起作用,我不知道为什么其他版本在 webkit 中有效,但在 ie8+/mozilla 中无效。将两者结合起来可以让您涵盖所有内容,我愿意打赌有一种方法可以统一这种策略或非常相似的方法来解决这个问题。

EDIT2:大部分都明白了!神奇text-align: justify使用字间距使 WebKit 几乎就在那里。间距似乎有点偏离,就像右边的像素问题,也许是排水沟中的一个额外像素。但它是可用的,而且与我以前使用过的任何东西相比,保留列似乎更可靠。它永远不会减少到更少的列,它会压缩直到浏览器获得水平滚动条。

Edit3:让它有点接近完美。将 font-size 设置为 0 可以使大多数剩余的间距问题正常化。现在只需要修复 IE9,如果它的字体大小为 0,它就会折叠它。

EDIT4:从其他一些流体宽度的帖子中得到了 IE 的答案:-ms-text-justify: distribute-all-lines .在 IE8-10 中测试。

/* The Omega Maneuver */
[class*=cols] { text-align: justify; padding-left: 10px; font-size: 0;
             -ms-text-justify: distribute-all-lines; } 

 [class*=cols]>* { display: inline-block; text-align: left; font-size: 13px;
                word-spacing: normal; vertical-align: top;
                -webkit-box-sizing: border-box;
                   -moz-box-sizing: border-box;
                        box-sizing: border-box; }

.cols2 { word-spacing: 20px; padding-right: 20px; }
.cols3 { word-spacing: 30px; padding-right: 30px; }
.cols4 { word-spacing: 40px; padding-right: 40px; }
.cols5 { word-spacing: 50px; padding-right: 50px; }
.cols6 { word-spacing: 60px; padding-right: 60px; }

  .cols2 > * { margin-right: -10px; }
  .cols3 > * { margin-right: -20px; }
  .cols4 > * { margin-right: -30px; }
  .cols5 > * { margin-right: -40px; }
  .cols6 > * { margin-right: -50px; }

一些 helper :
.⅛, .⅛s >* { width: 12.50%; }
.⅙, .⅙s >* { width: 16.66%; }
.⅕, .⅕s >* { width: 20.00%; }
.¼, .¼s >* { width: 25.00%; }
.⅓, .⅓s >* { width: 33.00%; }
.⅜, .⅜s >* { width: 37.50%; }
.⅖, .⅖s >* { width: 40.00%; }
.½, .½s >* { width: 50.00%; }
.⅗, .⅗s >* { width: 60.00%; }
.⅝, .⅝s >* { width: 62.50%; }
.⅔, .⅔s >* { width: 66.00%; }
.¾, .¾s >* { width: 75.00%; }
.⅘, .⅘s >* { width: 80.00%; }
.⅚, .⅚s >* { width: 83.33%; }
.⅞, .⅞s >* { width: 87.50%; }
.blarg-five-twelfs { width: 41.66%; }

你可以在这里见证我的杰作在荣耀的领域中发挥作用:http://jsfiddle.net/xg7nB/15/
<div class="cols4">
    <div class="⅙">This is my magnum opus</div>
    <div class="¼">I finally beat css</div>
    <div class="⅙">⚉ ☺ ☻ ♾ ☢</div>
    <div class="blarg-five-twelfs">I BEAT IT FOREVER</div>
</div>

绝对最小的实现,例如使用 4 个等宽 (25%) 宽度的列和 10px 的排水沟是这样的:
.fourEqualCols { word-spacing: 40px; padding: 0 40px 0 10px;
                 text-align: justify; font-size: 0;
                 -ms-text-justify: distribute-all-lines; }

.fourEqualCols>* { margin-right: -30px; width: 25%;
                   display: inline-block; word-spacing: normal;
                   text-align: left; font-size: 13px; }


<div class="fourEqualCols ">
  <div>GLORIOUSLY CLEAN MARKUP</div>
  <div>I hate extra markup and excessive class props</div>
  <div>Naked code</div>
  <div>get intimate</div>
</div>

Soooo 这段代码基本上取代了几乎所有现有的网格框架,对吗?如果您可以任意设置装订线,然后只制作一组达到 100% 宽度的列,那实际上绝对优于大多数/所有网格框架,不是吗?如果您不再像我们很多人一样为 IE7 开发,那么结合 box-sizing:border-box 渲染填充和边框也不是问题。

编辑:哦,对了,您想与容器的侧面齐平。没问题,我必须专门添加侧边沟,这样我们就可以将一些值更改 10 并摆脱填充和瞧。 http://jsfiddle.net/bTty3/
[class^=cols] { text-align: justify; font-size: 0;
             -ms-text-justify: distribute-all-lines; } 

 [class^=cols] >* { display: inline-block; text-align: left; font-size: 13px;
                word-spacing: normal; vertical-align: top;
                -webkit-box-sizing: border-box;
                   -moz-box-sizing: border-box;
                        box-sizing: border-box; }

.cols2 { word-spacing: 20px; padding-right: 10px; }
.cols3 { word-spacing: 30px; padding-right: 20px; }
.cols4 { word-spacing: 40px; padding-right: 30px; }
.cols5 { word-spacing: 50px; padding-right: 40px; }
.cols6 { word-spacing: 60px; padding-right: 50px; }
 .cols2 >* { margin-right: 0 }
 .cols2 >* { margin-right: -10px; }
 .cols3 >* { margin-right: -20px; }
 .cols4 >* { margin-right: -30px; }
 .cols5 >* { margin-right: -40px; }
 .cols6 >* { margin-right: -50px; }

相同的 html
<div class="cols4">
    <div class="⅙">This is my magnum opus</div>
    <div class="¼">I finally beat css</div>
    <div class="⅙">⚉ ☺ ☻ ♾ ☢</div>
    <div class="blarg-five-twelfs">I BEAT IT FOREVER</div>
</div>

关于html - CSS 流体列,固定边距; chalice 的 chalice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7190768/

有关html - CSS 流体列,固定边距; chalice 的 chalice的更多相关文章

  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-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)'

  7. 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

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

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

  9. ruby - 如何使用 Nokogiri 解析纯 HTML 表格? - 2

    我想用Nokogiri解析HTML页面。页面的一部分有一个表,它没有使用任何特定的ID。是否可以提取如下内容:Today,3,455,34Today,1,1300,3664Today,10,100000,3444,Yesterday,3454,5656,3Yesterday,3545,1000,10Yesterday,3411,36223,15来自这个HTML:TodayYesterdayQntySizeLengthLengthSizeQnty345534345456563113003664354510001010100000344434113622315

  10. ruby-on-rails - 连接字符串时如何在 <%=%> block 内输出 html_safe? - 2

    考虑一下:现在这些情况:#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2我需要用其他字符串输出URL。我如何保证&符号不会被转义?由于我无法控制的原因,我无法发送&。求助!把我的头发拉到这里:\编辑:为了澄清,我实际上有一个像这样的数组:@images=[{:id=>"fooid",:url=>"http://

随机推荐