【问题标题】:How to get tiles centered and left-justified at the same time如何同时使瓷砖居中和左对齐
【发布时间】:2014-02-04 11:28:48
【问题描述】:

我有一个图块(或 div)容器,我希望容器居中,而图块在容器中左对齐。

所以如果窗口很小:

..[s][s][s]..
..[s][s].....

如果窗口扩大一点:

...[s][s][s]...
...[s][s]......

进一步:

.[s][s][s][s].
.[s]..........

我试过了:

#container's-parent: { display: block; text-align: center; }
#parent: { display: inline-block; text-align: left; }
.tiles: { display: inline-block }

但这似乎不起作用。

我希望它至少可以在 Chrome 中工作,但我还需要最终支持最新的 FF、Safari 和 IE 10+

【问题讨论】:

  • 感谢您提供更多信息。很高兴知道存在 calc 函数。但是它仍然不能解决我的问题,除非我对列数的每个可能的迭代都使用媒体查询。
  • 我认为迄今为止,媒体查询是唯一的选择。关于必须使用“所有可能的迭代”——嗯,没错,这有点乱,但典型的屏幕分辨率通常只能达到 2000 像素左右——所以它是可行的
  • True Danield,您的 less 解决方案实际上非常紧凑。我真的需要少用多用。现在我唯一的问题是我应该给谁赏金;)。 Skadi 提供了 CSS 解决方案,让我意识到不手动添加媒体查询是不可能的,但 Danield 提供了最不难看的解决方案和最好的答案,因为它也引用了 Skadi 的。

标签: html css


【解决方案1】:

FWIW:现在是 2017 年,grid layout module 开箱即用 (codepen demo)。如果browser support 适合您 - 然后使用网格。如果没有,请继续阅读......


正如@Skadi2k3 的回答中提到的,你可以用 CSS 做的最好的事情是使用一系列媒体查询。

话虽如此,如果您使用的是 LESS 等预处理器 - 这并不是一项困难或容易出错的任务。 (虽然,是的,CSS 仍然会很长而且很丑)

FIDDLECODEPEN (Supports LESS)

以下是利用 LESS 设置媒体查询的方法:

像这样设置一个迭代混合:(您可以将此代码粘贴到http://less2css.org

@item-width:100px;
@item-height:100px;
@margin: 5px;
@min-cols:2;
@max-cols:12; //set an upper limit of how may columns you want to write the media queries for


.loopingClass (@index-width) when (@index-width <= @item-width * @max-cols) {
    @media (min-width:@index-width) {
        #content{
            width: @index-width;
        }
    }

    .loopingClass(@index-width + @item-width);
}

.loopingClass (@item-width * @min-cols);

上面的mixin会以表格形式吐出一系列媒体查询:

@media (min-width: 200px) {
  #content {
    width: 200px;
  }
}
@media (min-width: 300px) {
  #content {
    width: 300px;
  }
}
@media (min-width: 400px) {
  #content {
    width: 400px;
  }
}
...
@media (min-width: 1200px) {
  #content {
    width: 1200px;
  }
}

所以用一个简单的标记,比如:

<ul id="content">
    <li class="box"></li>
    <li class="box"></li>
    ...
    <li class="box"></li>
</ul>

剩余的 CSS (LESS):

 #content {
    margin:0 auto;
    overflow: auto;
    min-width: @min-cols * @item-width;
    max-width: @max-cols * @item-width;
    display: block;
    list-style:none;
    background: aqua;
}
.box {
    float: left;
    height: @item-height - 2 *@margin;
    width: @item-width - 2*@margin;
    margin:@margin;
    background-color:blue;
}

... 你会得到想要的结果。

...自定义布局非常容易:

我需要做的就是根据我的需要更改我在 LESS 混合中使用的变量 - 我得到了我想要的确切布局。

假设我有 300px X 100px 的项目,最少 2 列,最多 6 列,边距为 15px - 我只是像这样修改变量:

@item-width:300px;
@item-height:100px;
@margin: 15px;
@min-cols:2;
@max-cols:6;

...瞧,我明白了CODEPEN

【讨论】:

  • +1 很好!不过,为每个宽度使用规则的必要性是最后一个弱点。
  • @KarolSelak - 我用关于 css 网格的注释更新了答案(现在这样做更容易) - 有关详细信息,您可以查看我的帖子 here
【解决方案2】:

这个怎么样?

http://jsfiddle.net/cHTVd/1/

您也必须为容器设置display: inline-block

body { text-align: center; }

#container { 
    width: 250px; 
    border: solid green 3px; 
    display: inline-block; 
    text-align: left; 
}

.tile { width: 100px; 
    border: solid red 3px;
    display: inline-block;
    margin: 8px;
}

编辑: 提供容器相对宽度很容易 - http://jsfiddle.net/cHTVd/3/

恐怕必须用JS来完成“反向对齐”。 CSS text-align 只有四个值:left |对 |中心 |证明合法。将其更改为证明是微不足道的 - http://jsfiddle.net/cHTVd/4/。对于“反向对齐”,您可能需要一些类似于此的 javascript 工作:http://jsfiddle.net/yjcr7/2/

【讨论】:

  • @Mr.Mayers 如你所见,我没有(宽度为 250 像素)并且它有效。
  • 很奇怪。我在 chrome 中运行小提琴,无论窗口大小,它都保持在 250 像素。
  • @Mr.Mayers 当我在 Chrome 中运行 jsfiddle 时,它​​看起来与屏幕截图中的完全相同(在 FF 中拍摄)。它有效。
  • 我想我误读了这个问题,然后 - 我以为他希望 #container 随窗口调整大小,以便当窗口足够宽时红色 .tiles 会重新对齐。
  • @Mr.Mayers 有什么问题吗? jsfiddle.net/cHTVd/3你似乎很困惑:-)
【解决方案3】:

除非您想使用 Javascript,否则您可以使用媒体查询(很多):

#parent{ width: 100px; margin: 0 auto;padding:0;}
.tile{width: 80px; float:left;padding:10px;outline:2px dashed red;}
@media screen and (max-width:200px)
@media screen and (min-width:201px) and (max-width:300px){
    #parent{ width: 200px;}
}
@media screen and (min-width:301px) and (max-width:400px){
    #parent{ width: 300px;}
}
@media screen and (min-width:401px){
    #parent{ width: 400px;}
}

问题是您需要知道有多少瓷砖适合容器以设置容器的紧密配合宽度,但这是自下而上的信息,而不是级联的工作原理。如果你想要一个更优雅的解决方案,你需要在调整大小事件上使用 JS,计算一行中有多少个框并设置容器的宽度。

【讨论】:

  • 嗯,谢谢你的回答。您可能是对的,动态地执行此操作是不可能的。不幸的是 CSS 没有这个能力。如果您愿意为每一列编写自定义 CSS,那么您的解决方案也是一个很好的解决方案。这令人沮丧,因为我想要的是非常接近“证明”,而不是瓷砖之间的空间,它会在左侧和右侧。有人需要发明一种类型设置,例如 center-justify 之类的 =P 编辑:哦,顺便说一句,您发布了错误的 JSFiddle ;)
  • 在成为规范的一部分并且浏览器必须自己处理之前,大多数功能可能都是黑客行为。根据我的阅读,这些媒体查询是当前响应式网页设计的 css 工具之一。在这本书link 中,他们使用它来定制设计以适应常见智能手机、平板电脑和桌面分辨率的分辨率。 P.S.:没有注意到错误的 JSFiddle,谢谢 :-)
  • 关于大多数功能的优点是在它们成为规范的一部分之前都是 hack。问题是这个 hack 需要大量的硬编码,但我想这没关系。
【解决方案4】:

我在自己的项目中以一种快速而肮脏的方式解决了这个问题,方法是简单地在末尾添加几个与常规内容图块宽度相同但高度可以忽略不计的空“图块”。这些空磁贴用于将最后一行的内容磁贴“推”到它们所属的左侧。 (“真正的”最后一行通常只包含用户不可见的空图块。)因此,例如,如果页面上有一些图块,并且我希望浏览器的宽度能够容纳从 1 到 4 个(例如)宽度的瓦片,我将在末尾添加 3 个额外的空瓦片(指定为“e”):

..[s][s][s]..
..[s][s][e]..
...[e][e]....  // this row isn't visible because [e] has no content

如果窗口扩大一点:

...[s][s][s]...
...[s][s][e]...
....[e][e].....

进一步:

.[s][s][s][s].
.[s][e][e][e].

或更窄:

.[s][s].
.[s][s].
.[s][e].
.[e][e].

或者真的很窄

..[s]..
..[s]..
..[s]..
..[s]..
..[s]..
..[e]..
..[e]..
..[e]..

空的瓷砖可能会堆积在底部,但由于它们的高度很小,它们不会产生很多额外的空白。

肯定是一个骇人听闻的解决方案,但它确实有效,在不同的浏览器上可靠,并且不需要大量代码。

【讨论】:

  • 聪明,运作良好。就我而言,我允许从 3 块到 10 块不等,所以在我的普通图块末尾添加了我的 &lt;div class="tile-hack"&gt;&lt;/div&gt; 9 次,并使用 visibility: hidden; height: 0; width: &lt;tile width&gt;; margin: 0 &lt;tile left/right margin&gt;;
【解决方案5】:

答案与Danield's 相同,但在 SCSS 中:

*
{
    margin:0;padding:0;
}

$item-width:200px;
$item-height:100px;
$margin: 15px;
$min-cols:2;
$max-cols:6; //set an upper limit of how may columns you want
             //to write the media queries forss to css

@for $i from $min-cols to $max-cols + 1 {
  $index-width: $i*$item-width;
  @media (min-width:$index-width) {
    #content {
      width: $index-width;
    }
  }
}


#content {
    margin:0 auto;
    overflow: auto;
    min-width: $min-cols * $item-width;
    max-width: $max-cols * $item-width;
    display: block;
    list-style:none;
    background: aqua;
}
.box {
    float: left;
    height: $item-height - 2 *$margin;
    width: $item-width - 2*$margin;
    margin:$margin;
    background-color:blue;
}

它会生成与他的解决方案相同的 CSS。

工作代码笔示例here

【讨论】:

    【解决方案6】:

    试试这个:

    .tiles: { 
      display: inline-block;
      margin: 0 auto;
      max-width: 90%;
    }
    

    没有垂直边距,水平边的自动边距!

    【讨论】:

    • 不。如果您认为自己有解决方案,也许可以在 JSfiddle 中尝试一下。如果你能证明它在那里工作,那么我知道我可以让它同样工作。不过感谢您的建议。
    【解决方案7】:

    使用 flexbox 很容易。

    .container { 显示:弯曲; 弹性包装:换行; }

    您也可以自定义图块的适合方式,例如给它们一个起点(flex-basis)或图块可以增长或缩小多少

    .tile { 弹性增长:0; 弹性收缩:0; 弹性基础:3em;

    查看代码笔:http://codepen.io/anon/pen/uexbf

    【讨论】:

    • 感谢您的建议,但这仍然无法完成我想要的。事实上,我尝试了 flexbox,它真的很酷,但即使它提供了如此强大的功能,它仍然无法让我做我想做的事情。
    【解决方案8】:

    好像有solution(虽然它是用俄语描述的,我还没有找到翻译)。
    Demo可以看here

    【讨论】:

      【解决方案9】:

      不知道如何使用 CSS 来实现,如果可能的话。但是使用 jQuery it's 相当简单:

      $('button').click(function(){
      
        $('nav ul').each(function(){
          
          $parent = $(this).parent();
          
          $parent.width( $(this).width() );
          
        });
      });
      nav {
        display: inline-block;
        text-align: left; /* doesn't do anything, unlike some might guess */
      }
      ul {
        display: inline;
      }
      
      /* needed style */
      ul {
        padding: 0;
      }
      body {
        width: 420px;
      }
      
      /* just style */
      body {
        background: #ddd;
        margin: 1em auto;
      }
      button {
        display: block;
      }
      nav {
        background: #bbb;
        margin: 1rem auto;
        padding: 0.5rem;
      }
      li {
        display: inline-block;
        width: 40px;
        height: 20px;
        border: solid thin #777;
        margin: 4px;
        background: #999;
        text-align: center;
      }
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      
      <button>fix</button>
      
      <nav>
        <ul>
          <li>3</li>
          <li>.</li>
          <li>1</li>
          <li>4</li>
        </ul>
      </nav>
      
      <nav>
        <ul>
          <li>3</li>
          <li>.</li>
          <li>1</li>
          <li>4</li>
          <li>1</li>
          <li>5</li>
          <li>9</li>
          <li>2</li>
          <li>6</li>
          <li>5</li>
          <li>3</li>
          <li>5</li>
        </ul>
      </nav>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-18
        • 2018-05-21
        • 1970-01-01
        • 2019-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多