【问题标题】:Having trouble getting hang of flex难以掌握 flex
【发布时间】:2022-01-26 01:10:25
【问题描述】:

新手尝试学习 flex。根据谷歌检查工具,我正试图在所有设备上响应一些刚刚在其他设备上丢失的设备。遵循我看到的一篇帖子的建议,它让我走到了这一步。附件是我的html和css。我尝试了不同的 flex x x x 组合,但到目前为止,在我的笔记本电脑屏幕上看起来都没有运气。

  <!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="index.css">
  </head>
  <body>

    <div class="header">
      <h1>Sci-Fi Blog</h1>
      <h3>dedicated to the Star Trek series</h3>
      <div class="menu">
        <ul>
          <li>About</li>
          <li>Resources</li>
          <li>Other Sci-Fi series</li>
        </ul>
      </div>
  </div>    
    
      
  <div class="container1">
      <div class="row1">
        <div class="STtos">
          <h2>Star Trek TOS</h2>
          <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSTPdHkIFqZgTABvQtjcCnKr6mbWNfKBVDRRw&usqp=CAU" alt = "Pic of space ship">
          <p>Turpis egestas pretium aenean pharetra magna. Tristique risus nec feugiat in fermentum posuere urna. In nibh mauris cursus mattis molestie a. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Sed pulvinar proin gravida hendrerit lectus a. In dictum non consectetur a erat nam. </p><a href="#"> <button>Read More</button></a>  <a href="#"><button>Comment</button></a>
          
        </div> <!--div STtos-->
        
        <div class="STTNG">
          <h2>Star Trek TNG</h2>
          <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQueIPqKDTgGH9_SaYzT7u9cfpvKs2P48l5dg&usqp=CAU" alt="pic of space ship">
          <p>Mauris ultrices eros in cursus. At imperdiet dui accumsan sit amet nulla facilisi. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Sem integer vitae justo eget magna fermentum iaculis eu non. Faucibus vitae aliquet nec ullamcorper. Convallis aenean et tortor at risus viverra adipiscing at in. Fermentum dui faucibus in ornare quam viverra orci. Sagittis id consectetur purus ut faucibus pulvinar elementum integer. </p><a href="#"><button>Read More</button></a>  <a href="#"><button>Comment</button></a>

        </div> <!--end of STTNG-->
        
        <div class="DS9">
          
          <h2>Deep Space Nine</h2>
          <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRKvwoJTvGIl2Nq2RzDKkf7OrgfVoHwrXP82A&usqp=CAU" alt="pic">
          <p>Mauris ultrices eros in cursus. At imperdiet dui accumsan sit amet nulla facilisi. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Sem integer vitae justo eget magna fermentum iaculis eu non. Faucibus vitae aliquet nec ullamcorper. Convallis aenean et tortor at risus viverra adipiscing at in. Fermentum dui faucibus in ornare quam viverra orci. Sagittis id consectetur purus ut faucibus pulvinar elementum integer. </p><a href="#"><button>Read More</button></a> <a href="#"><button>Comment</button></a>
          
        </div> <!--DS9 -->
        
      </div> <!--row1 -->
  </div> <!--container1-->

  <div class="container2">
      <div class="row2">
          <div class="StarTrekTAS">
          <h2>Star Trek TAS</h2>
          <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQwdlJfrFrcj7KJRdTADDtsfjGa0SQweeu0fQ&usqp=CAU" width="259" height="194" alt="pic">
          <p>Mauris ultrices eros in cursus. At imperdiet dui accumsan sit amet nulla facilisi. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Sem integer vitae justo eget magna fermentum iaculis eu non. Faucibus vitae aliquet nec ullamcorper. Convallis aenean et tortor at risus viverra adipiscing at in. Fermentum dui faucibus in ornare quam viverra orci. Sagittis id consectetur purus ut faucibus pulvinar elementum integer. </p><a href="#"><button>Read More</button></a> <a href="#"><button>Comment</button></a>
                    
          </div> <!--end of TAS-->

          <div class="voyager">
          <h2>Voyager</h2>
          <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRiV6QTXDR7lD9uvx8S-IuTClS-CV6COgSh1g&usqp=CAU" width="259" height="194" alt="pic">
          <p>Mauris ultrices eros in cursus. At imperdiet dui accumsan sit amet nulla facilisi. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras. Sem integer vitae justo eget magna fermentum iaculis eu non. Faucibus vitae aliquet nec ullamcorper. Convallis aenean et tortor at risus viverra adipiscing at in. Fermentum dui faucibus in ornare quam viverra orci. Sagittis id consectetur purus ut faucibus pulvinar elementum integer. </p><a href="#"><button>Read More</button></a>  <a href="#"><button>Comment</button></a>
    
          </div> <!--end of Voyager-->
        <div class="Enterprise">
          <h2>Enterprise</h2>
          <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTa4Iz2D0_InBOZg4Wi_PWAT-1lEqxI0AExPg&usqp=CAU" width="259" height="194" alt="pic">
          <p>Turpis egestas pretium aenean pharetra magna. Tristique risus nec feugiat in fermentum posuere urna. In nibh mauris cursus mattis molestie a. Venenatis urna cursus eget nunc scelerisque viverra mauris in aliquam. Sed pulvinar proin gravida hendrerit lectus a. In dictum non consectetur a erat nam. </p><a href="#"><button>Read More</button></a>  <a href="#"><button>Comment</button></a>
          </div>
      </div> <!--end of row2-->


      </div> <!--end of container2-->


    
  </body>
  </html>

    body {
      margin: 0;
      padding:0;
      box-sizing:border-box;
    }


    .header {
      background: url('https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQSzBDemswC2Gg3mbDR7t8mQ53jByPChDtA5w&usqp=CAU');

    text-align:center;
    background-size:no repeat;
    background-size:cover;
    height:310px;
    color:white;
    margin-bottom: 150px;
    margin-left: 5px;
    margin-right:5px;

    }

    .header h1 {
      margin:0;
    }

    li {
      list-style-type:none;
      display:inline-block;
      padding: 10px;
    }

    .menu ul {
      text-align:center;
      display:inline-block;
      padding: 0px;
      background: rgba(197, 228, 183, 0.8);
      
      
    }

    .menu {
      display: inline-block;
      margin-left: 10px;
      
    }


    p a {
      display:inline;
    }







    @media screen and (min-width:640px) {

      

      
      .row1 {
        display:flex;
        justify-content:space-evenly;
        grid-gap:10px;
        
        
            
      }

      .STtos {
        flex: 0;
      }

      .STTNG {
        flex:0;
      }

      .DS9 {
        flex:0;
      }

      .row2 {
        display:flex;
        justify-content:space-evenly;
        grid-gap:10px;
        
            
      }

      .StarTrekTAS {
        flex: 0 0;
      }

      .voyager {
        flex:0 0;
      }

      .Enterprise {
        flex:0 0;
      }
    }

【问题讨论】:

  • 欢迎来到 Stack Overflow!请澄清您的具体问题或添加其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: html css flexbox


【解决方案1】:

我们经常谈论响应式的东西,就好像它是一个二进制条件(好像它是或不是),但实际上有很多方法可以让您的网站适应不同的屏幕分辨率或设备类别。

目前,如果我们忽略您的标题/菜单(似乎与问题无关),您的网站包含 6 块类似类型的内容。您已将它们包装在 2 个 .rows 中,每个包含 3 个,我怀疑这是一个错误(稍后会详细介绍),但如果您通过笔记本电脑浏览器的镜头查看该站点,这是有道理的。

当站点并排显示所有 3 个项目时,它在全尺寸台式机(我猜包括您的笔记本电脑)上看起来很棒,因为您的 CSS 中的 @media { ... } 块有效。该块内的样式启用了 flexbox 并使其看起来可能或多或少与您的想法相似。 但是,当您缩小站点时,超出(唯一)@media { ... } 块的截止点,该块中的所有样式都将被停用,并且浏览器会回退到呈现它们,就好像您没有 CSS一点也不。现在,这种默认样式实际上对于手机来说并不算太糟糕,但这并不是大多数设计师(包括您)可能想要的。

可能期望的结果(我怀疑)是您的网站看起来或多或少像现在在桌面上的样子(2 行 3 列),但是一旦屏幕变小,它应该会响应地变成 2 列并且最后是 1 列布局。

主要问题在于 CSS,而不是将所有样式都放在一个 @media { ... } 块中并像电灯开关一样轻弹它,而是希望大多数样式是通用的,然后数量最少@media { ... } 块内的特定样式,用于不同的情况。

让我们先消除大部分问题,然后重新创建它们;让我们在您的 CSS 中删除以下行以及其中的所有内容:

@media screen and (min-width:640px) {

接下来,我们来看看 HTML。虽然不是严格错误的本身; container1、container2、row1 和 row2 这 4 个名称不像 classnames 那样有用。 ids 用于唯一命名事物,类用于标记与其他事物相似的事物。后一种情况对我们来说是目前最重要的。

让我们将两个容器类更改为container,将两行更改为row(例如:删除数字)。 接下来,6 个 startrek &lt;div&gt;s 都有唯一的类名(如 class="STtos")将这 6 个更改为 ids(如 id="STtos")并分配所有 6 个 &lt;div&gt;sa 共享类 class="contentitem"(所以现在它们看起来像:&lt;div id="STtos" class="contentitem"&gt;)。

现在,HTML 中还有一个问题,但我们稍后会回到这个问题,现在让我们重新创建一些 CSS。

我们希望.rows 是弹性框(包含.contentitems):

.row {
    display: flex;
    flex-flow: row wrap;
    justify-content: space-evenly;
}

然后是 6 个.contentitems 本身,为了简单起见,让我们将每个定义为需要 200 像素的宽度,当有足够的空间时不允许它们增长(首先是 0),也不允许它们缩小如果空间不大(第二个0):

.contentitem {
    flex: 0 0 200px;
}

现在在您的笔记本电脑上进行测试,这应该与之前的 3 列几乎相同。 现在将屏幕缩小到非常低的宽度 -> 它将wrap 缩小到只有 1 列。 现在缩小一点,将wraps 缩小到 2 列。

在这里,您将看到我之前忽略的最后一个问题的效果。您已将内容包装到 2 个.rows 中,因为您在创建内容时并排考虑了 3 个项目。 在这种情况下,根本没有理由拥有多个 .rows。

在 HTML 源代码中,就在 &lt;div class="contentitem" id="StarTrekTAS"&gt; 上方,让我们删除这 4 行:

        </div>
    </div>
    <div class="container">
        <div class="row">
        

现在您的内容会完全动态地调整屏幕尺寸,如果屏幕足够宽,您甚至可以将所有 6 个并排显示(或 5 个、4 个或 ...)。同样没有手动.rowsplitting,当您并排缩小到 2 列的正确宽度时,它实际上将是 3 行 2,而不是 4 行,其中 2 列是半空的。


所有这些更改之后的全部内容(并且我自己将 CSS 移至 &lt;style&gt;):

<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <style type="text/css">
            /* untouched css */
            body {
                margin: 0;
                padding: 0;
                box-sizing: border-box;
            }
            .header {
                background: url('https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQSzBDemswC2Gg3mbDR7t8mQ53jByPChDtA5w&usqp=CAU');
                text-align: center;
                background-size: no repeat;
                background-size: cover;
                height: 310px;
                color: white;
                margin-bottom: 150px;
                margin-left: 5px;
                margin-right: 5px;
            }
            .header h1 {
                margin: 0;
            }
            li {
                list-style-type: none;
                display: inline-block;
                padding: 10px;
            }
            .menu ul {
                text-align: center;
                display: inline-block;
                padding: 0px;
                background: rgba(197, 228, 183, 0.8);


            }
            .menu {
                display: inline-block;
                margin-left: 10px;

            }
            p a {
                display: inline;
            }
            /* the css under here is changed */

            .row {
                display: flex;
                flex-flow: row wrap;
                justify-content: space-evenly;
            }
            .contentitem {
                flex: 0 0 200px;
            }
        </style>
    </head>
    <body>
        <div class="header">
            <h1>Sci-Fi Blog</h1>
            <h3>dedicated to the Star Trek series</h3>
            <div class="menu">
                <ul>
                    <li>About</li>
                    <li>Resources</li>
                    <li>Other Sci-Fi series</li>
                </ul>
            </div>
        </div>
        <div class="container">
            <div class="row">

                <div class="contentitem" id="STtos">
                    <h2>Star Trek TOS</h2>
                    <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSTPdHkIFqZgTABvQtjcCnKr6mbWNfKBVDRRw&usqp=CAU"
                        alt="Pic of space ship">
                    <p>Turpis egestas pretium aenean pharetra magna. Tristique risus nec feugiat in fermentum posuere urna.
                        In nibh mauris cursus mattis molestie a. Venenatis urna cursus eget nunc scelerisque viverra mauris
                        in aliquam. Sed pulvinar proin gravida hendrerit lectus a. In dictum non consectetur a erat nam.
                    </p>
                    <a href="#"> <button>Read More</button></a>
                    <a href="#"><button>Comment</button></a>
                </div>
                <!--div STtos-->

                <div class="contentitem" id="STTNG">
                    <h2>Star Trek TNG</h2>
                    <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQueIPqKDTgGH9_SaYzT7u9cfpvKs2P48l5dg&usqp=CAU"
                        alt="pic of space ship">
                    <p>Mauris ultrices eros in cursus. At imperdiet dui accumsan sit amet nulla facilisi. Pellentesque eu
                        tincidunt tortor aliquam nulla facilisi cras. Sem integer vitae justo eget magna fermentum iaculis
                        eu non. Faucibus vitae aliquet nec ullamcorper. Convallis aenean et tortor at risus viverra
                        adipiscing at in. Fermentum dui faucibus in ornare quam viverra orci. Sagittis id consectetur purus
                        ut faucibus pulvinar elementum integer. </p>
                    <a href="#"><button>Read More</button></a>
                    <a href="#"><button>Comment</button></a>
                </div>
                <!--end of STTNG-->

                <div class="contentitem" id="DS9">
                    <h2>Deep Space Nine</h2>
                    <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRKvwoJTvGIl2Nq2RzDKkf7OrgfVoHwrXP82A&usqp=CAU"
                        alt="pic">
                    <p>Mauris ultrices eros in cursus. At imperdiet dui accumsan sit amet nulla facilisi. Pellentesque eu
                        tincidunt tortor aliquam nulla facilisi cras. Sem integer vitae justo eget magna fermentum iaculis
                        eu non. Faucibus vitae aliquet nec ullamcorper. Convallis aenean et tortor at risus viverra
                        adipiscing at in. Fermentum dui faucibus in ornare quam viverra orci. Sagittis id consectetur purus
                        ut faucibus pulvinar elementum integer. </p>
                    <a href="#"><button>Read More</button></a>
                    <a href="#"><button>Comment</button></a>
                </div>
                <!--DS9 -->

                <div class="contentitem" id="StarTrekTAS">
                    <h2>Star Trek TAS</h2>
                    <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQwdlJfrFrcj7KJRdTADDtsfjGa0SQweeu0fQ&usqp=CAU"
                        width="259" height="194" alt="pic">
                    <p>Mauris ultrices eros in cursus. At imperdiet dui accumsan sit amet nulla facilisi. Pellentesque eu
                        tincidunt tortor aliquam nulla facilisi cras. Sem integer vitae justo eget magna fermentum iaculis
                        eu non. Faucibus vitae aliquet nec ullamcorper. Convallis aenean et tortor at risus viverra
                        adipiscing at in. Fermentum dui faucibus in ornare quam viverra orci. Sagittis id consectetur purus
                        ut faucibus pulvinar elementum integer. </p>
                    <a href="#"><button>Read More</button></a>
                    <a href="#"><button>Comment</button></a>
                </div>
                <!--end of TAS-->

                <div class="contentitem" id="voyager">
                    <h2>Voyager</h2>
                    <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRiV6QTXDR7lD9uvx8S-IuTClS-CV6COgSh1g&usqp=CAU"
                        width="259" height="194" alt="pic">
                    <p>Mauris ultrices eros in cursus. At imperdiet dui accumsan sit amet nulla facilisi. Pellentesque eu
                        tincidunt tortor aliquam nulla facilisi cras. Sem integer vitae justo eget magna fermentum iaculis
                        eu non. Faucibus vitae aliquet nec ullamcorper. Convallis aenean et tortor at risus viverra
                        adipiscing at in. Fermentum dui faucibus in ornare quam viverra orci. Sagittis id consectetur purus
                        ut faucibus pulvinar elementum integer. </p>
                    <a href="#"><button>Read More</button></a>
                    <a href="#"><button>Comment</button></a>
                </div>
                <!--end of Voyager-->

                <div class="contentitem" id="Enterprise">
                    <h2>Enterprise</h2>
                    <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTa4Iz2D0_InBOZg4Wi_PWAT-1lEqxI0AExPg&usqp=CAU"
                        width="259" height="194" alt="pic">
                    <p>Turpis egestas pretium aenean pharetra magna. Tristique risus nec feugiat in fermentum posuere urna.
                        In nibh mauris cursus mattis molestie a. Venenatis urna cursus eget nunc scelerisque viverra mauris
                        in aliquam. Sed pulvinar proin gravida hendrerit lectus a. In dictum non consectetur a erat nam.
                    </p>
                    <a href="#"><button>Read More</button></a>
                    <a href="#"><button>Comment</button></a>
                </div>
                <!--end of Enterprise-->

            </div>
        </div>
    </body>
</html>

现在,如果您确实想重新引入媒体查询,以便在不同分辨率之间进行一些其他更明确的更改,那么您可以(例如)将其添加到您的 CSS,以下全部你的其他风格:

        @media screen {
            /* (S) what you write in here, applies to any resolution (Small, Medium and Large) */
        }
        @media screen and (min-width:590px) {
            /* (M) what you write in here, only applies to 590px or wider (Medium and Large screens) */
        }
        @media screen and (min-width:1000px) { 
            /* (L) applies to 1000px or wider (Large screens only) */
        }

这里有两点需要注意:

  1. 我基本上选择识别 3 种不同的屏幕尺寸(小/中/大),它们之间的分界点是 590 像素和 1000 像素(这只是任意示例数字)。
  2. 3 个不同的@media 块不特定于小/中/大,每个块也影响其更大变体。所以这 3 个@media 块可能应该被标记为 SML、ML 和 L 块。

如果您只想将最小 (S) 屏幕的背景颜色更改为黄色,那么您应该:

  • 把background-color: yellow;放在S块中
  • 将background-color: white;放在M块中,防止M和L尺寸的屏幕受到黄色的影响。

或者更具体到您的网站,如果您不想并排显示超过 3 个内容项,您可以将其添加到大 (L) 块中:

            .contentitem {
                flex-basis: 30%;
            }

这将用30% 覆盖我们之前定义的200px(在flex 属性中)。

【讨论】:

  • 非常、非常彻底和令人印象深刻。
  • 实际上您所做的更改并没有使页面达到我的预期。而不是 2 行,我现在有 1 行并且没有响应。我什至复制/粘贴了更新的代码,但仍然只看到一行而不是两行。
  • 这是 1 行是故意的(就我而言);不响应是指即使缩小浏览器屏幕,它仍保持为 1 行?因为不应该是这样。响应性(在这种情况下)通常意味着某些东西动态地处理变化(或不同的场景)。在这个特定的示例中,这意味着我们不是定义一些确切数量的列,而是使用响应式布局来调整自身以适应可用空间。如果有人使用足够宽的屏幕/浏览器,这可能意味着在小型手机上只有 1 列甚至 40 列。
  • 如果您想对此类效果进行微观管理,您可以使用我回答末尾的那些媒体查询来执行此操作;但这是使网站不那么响应的行为。
  • 您还必须考虑最终结果的外观,有许多简单的方法可以强制执行 3 列布局,但这是否意味着您想要所有“额外的空间” “用于在 3 个项目之间或周围进行填充?或者您是否希望项目本身变得更宽,或者...;你明白了。此外,由于您确实将其作为 flexbox 问题专门提出,因此它有点超出范围,但在这种情况下,grid 可能比 flexbox 更适合您的实际需求(它们非常相似)。
【解决方案2】:

如果您想让您的 div 具有响应性,即在 PC 上时在行方向上,在移动设备上时在列方向上。您首先必须将display: flex 定义为父div,以便其中的所有div 将按行顺序排列,并且在@media 查询中只需添加一个属性flex-direction: column 这将更改flex-direction 的默认值这是row 到column。

This link from w3schools might help

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多