【问题标题】:How to implement dynamic layout columns by using the `content_for?` method?如何使用 `content_for?` 方法实现动态布局列?
【发布时间】:2012-09-17 21:03:59
【问题描述】:

我正在使用 Ruby on Rails 3。我想使用 content_for? 方法呈现布局,以便“有条件地”生成具有适当 CSS 属性的 HTML 代码。也就是说,我想实现一个具有以下功能的布局:

  • 如果content_for存在左列,则布局有2列(左列具有固定宽度,内容列具有剩余宽度);
  • 如果 content_for 左列存在,则布局有 1 列(内容列全宽)。

如何在/app/views/layouts/application.html.erb 文件中实现它?你有什么建议吗?

注意:希望我正在寻找布局的示例实现(还包括 Ruby on Rails 方法、HTML 和 CSS 代码)。


奖励内容列块内我想“有条件地”显示一个右列如果content_for 右栏存在。

【问题讨论】:

    标签: html css ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    您可以使用相邻的 (+) 或后续的 (~) 同级选择器,根据左列是否可见,有条件地对内容列应用边距。

    对于你的额外问题,你应该将内容列的内容放在一个内层 div 中,然后使用:nth-last-child 检查右列是否可见并有条件地在那里应用边距:

    CSS

    .page {
      position: relative;
    }
    
    .page .left-column {
      background: lavender;
      left: 0;
      position: absolute;
      top: 0;
      width: 180px;
    }
    
    .page .content-column { background: orange; }
    
    .page .content-column > .inner-wrap { background: rgba(255,255,255,0.3); }
    
    .page .left-column + .content-column {
      margin-left: 200px;
    }
    
    .page .content-column .right-column {
      background: lime; 
      position: absolute;
      right: 0;
      top: 0;
      width: 90px;
    }
    
    .page .content-column > .inner-wrap:nth-last-child(2) {
      margin-right: 100px;
    }
    

    HTML

    <div class="page">
    
      <% if content_for?(:left_column) %>
        <div class="left-column">
          <%= yield(:left_column) %>
        </div>
      <% end %>
    
      <div class="content-column">
        <div class="inner-wrap">
          <%= yield(:content_column) %>
        </div>
    
        <% if content_for?(:right_column) %>
          <div class="right-column">
            <%= yield(:right_column) %>
          </div> 
        <% end %>          
      </div>
    
    </div>
    

    渲染布局预览:http://jsbin.com/icurey/8/edit

    【讨论】:

    • 谢谢,但 HTML 代码是否“被黑”了很多?也就是说,有没有更“正确”的方法来做同样的事情?
    • 实际上,在最后一个 CSS 规则集中使用 +(或 ~)组合符,不需要在 if-else 中包含内容列的开始标签 - 您可以在 if-else 之外放置一个单独的开始标签,并依靠 CSS 来应用边距,如果有左列。我只使用 if-else 来展示如果您想为全宽/部分宽度提供不同的类,您可以做什么。尝试取出 jsbin 中的 full-widthpartial-width 类,看看它仍然有效!
    • 我已经删除了我的答案中的 if-else 东西,因为无论如何它似乎对你想要的东西是多余的。因此,您可以跳过“hacky”标记并完全使用 CSS。
    • 你为什么使用 CSS position: relative, position: absolute, left: 0, top: 0, ... 和 CSS 兄弟? 是否可以简化 CSS 语句? 例如,同样可以不使用“严格”兄弟,但使用 float 和类似属性来完成?
    • 因为我更喜欢拥有更多的控制权,但你当然也可以使用 float。
    【解决方案2】:

    您可能想检查content_for?,如果给定参数产生了内容,它会返回true。见content_for?

    【讨论】:

    • 我知道content_for? 方法。我正在寻找与 HTML 和 CSS 相关的“工作”代码
    • 经过一个半小时的尝试(没有成功),我得出的结论是最好寻求帮助(否则,Stackoverflow 存在的原因是什么?!)。我认为 Web 上的某些专家很容易实现该布局(在我的情况下,这对某人来说是一件非常简单的事情)... P.S.:“基本上”说,我总是希望有很多慷慨的灵魂
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 2015-06-20
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    相关资源
    最近更新 更多