如何将Flex项目的宽度设置为100%?

4

我正在练习响应式网页设计,使用flex布局。

问题是,当屏幕小于768像素时,我想让.menu li的宽度为100%,所以我尝试给.menu ul和.menu li设置width:100%。但是它不起作用。我还尝试了flex:0 0 100%,但什么也没有发生。

如何使.menu li达到100%宽度?

* {
  box-sizing: border-box;
}

nav ul,
.outline ul {
  list-style-type: none;
  margin: 0;
  padding: 0;
}


/*common*/


/*layout*/

.container {
  max-width: 900px;
  margin: 0;
}

.outline {
  flex: 2;
}

section {
  flex: 7;
}


/*header*/

header {
  display: flex;
}

.login ul,
.menu ul {
  display: flex;
}

.login ul {
  justify-content: flex-end;
}

.toparea {
  margin-left: auto;
}


/*section*/

.contents {
  display: flex;
}


/*media query*/

@media only screen and (max-width: 768px) {
  body {
    background-color: #EAC0F0;
  }
  header {
    flex-direction: column;
  }
  .logo {
    justify-content: center;
  }
  .login {
    display: none;
  }
  .menu ul {
    flex-direction: column;
  }
  .contents {
    flex-direction: column;
  }
  .outline ul {
    display: flex;
  }
  .outline li {
    flex: 1;
  }
}


/*footer*/


/*temp*/

img,
.login ul,
.menu ul,
.outline li {
  border: 1px solid black;
}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>RWD</title>
  <link rel="stylesheet" href="./rwd.css">
</head>

<body>
  <div class="container">
    <header>
      <img src="" alt="logo">
      <div class="toparea">
        <nav class="login">
          <ul>
            <li>Login</li>
            <li>Help</li>
          </ul>
        </nav>
        <nav class="menu">
          <ul>
            <li>Menu1</li>
            <li>Menu2</li>
            <li>Menu3</li>
            <li>Menu4</li>
          </ul>
        </nav>
      </div>
    </header>
    <div class="contents">
      <div class="outline">
        <ul>
          <li>Outline1-1</li>
          <li>Outline1-2</li>
        </ul>
      </div>
      <section>
        <h1>heading</h1>
        <p>paragraph</p>
      </section>
    </div>
    <footer>
      <address>Contact : email@email.com</address>
    </footer>
  </div>
</body>

</html>


嗨,当设备的宽度小于768像素时,您需要逐个显示“li”内容吗? - Satheesh Kumar
你能提供一个 jsfiddle 或者类似的东西吗? - KCarnaille
5个回答

3
这里的主要问题是toparea规则中的margin-left: auto。如果你想保持项目垂直堆叠,可以像这样更新你的媒体查询,并重置边距margin-left: 0
@media only screen and (max-width: 768px ) { 
    body { background-color: #EAC0F0; }
    header { flex-direction: column; }
    .logo { justify-content: center; }
    .login { display: none; }
    .menu ul { flex-direction: column; }
    .contents { flex-direction: column; }
    .outline ul { display: flex; }
    .outline li {  flex: 1; }
    .toparea { margin-left: 0; }                    /*  added  */
}

代码片段

* { box-sizing: border-box; }
nav ul, .outline ul { list-style-type: none; margin: 0; padding: 0; }

/*common*/

/*layout*/
.container { max-width: 900px; margin: 0; }
.outline { flex: 2; }
section { flex: 7; }

/*header*/ 
header { display: flex; }
.login ul, .menu ul { display: flex; }
.login ul { justify-content: flex-end; }
.toparea { margin-left: auto; }

/*section*/
.contents { display: flex; }


/*media query*/

@media only screen and (max-width: 768px ) { 
    body { background-color: #EAC0F0; }
    header { flex-direction: column; }
    .logo { justify-content: center; }
    .login { display: none; }
    .menu ul { flex-direction: column; }
    .contents { flex-direction: column; }
    .outline ul { display: flex; }
    .outline li {  flex: 1; }
    .toparea { margin-left: 0; }               /*  added  */
}


/*footer*/

/*temp*/
img, .login ul, .menu ul, .outline li { border: 1px solid black; }
<header>
  <img src="" alt="logo">
  <div class="toparea">
    <nav class="login">
      <ul>
        <li>Login</li>
        <li>Help</li>
      </ul>
    </nav>
    <nav class="menu">
      <ul>
        <li>Menu1</li>
        <li>Menu2</li>
        <li>Menu3</li>
        <li>Menu4</li>
      </ul>
    </nav>
  </div>
</header>
<div class="contents">
  <div class="outline">
    <ul>
      <li>Outline1-1</li>
      <li>Outline1-2</li>
    </ul>
  </div>
  <section>
    <h1>heading</h1>
    <p>paragraph</p>
  </section>
</div>
<footer>
  <address>Contact : email@email.com</address>
</footer>
</div>

如果你想让它们水平堆叠,你需要像这样更新你的媒体查询,在其中让li增长。
@media only screen and (max-width: 768px ) { 
    body { background-color: #EAC0F0; }
    header { flex-direction: column; }
    .logo { justify-content: center; }
    .login { display: none; }
    .menu li { flex-grow: 1; }                    /*  changed  */
    .contents { flex-direction: column; }
    .outline ul { display: flex; }
    .outline li {  flex: 1; }
    .toparea { margin-left: 0; }                  /*  added  */
}

堆栈片段

* { box-sizing: border-box; }
nav ul, .outline ul { list-style-type: none; margin: 0; padding: 0; }

/*common*/

/*layout*/
.container { max-width: 900px; margin: 0; }
.outline { flex: 2; }
section { flex: 7; }

/*header*/ 
header { display: flex; }
.login ul, .menu ul { display: flex; }
.login ul { justify-content: flex-end; }
.toparea { margin-left: auto; }

/*section*/
.contents { display: flex; }


/*media query*/

@media only screen and (max-width: 768px ) { 
    body { background-color: #EAC0F0; }
    header { flex-direction: column; }
    .logo { justify-content: center; }
    .login { display: none; }
    .menu li { flex-grow: 1; }
    .contents { flex-direction: column; }
    .outline ul { display: flex; }
    .outline li {  flex: 1; }
    .toparea { margin-left: 0; }
}


/*footer*/

/*temp*/
img, .login ul, .menu ul, .outline li { border: 1px solid black; }
<header>
  <img src="" alt="logo">
  <div class="toparea">
    <nav class="login">
      <ul>
        <li>Login</li>
        <li>Help</li>
      </ul>
    </nav>
    <nav class="menu">
      <ul>
        <li>Menu1</li>
        <li>Menu2</li>
        <li>Menu3</li>
        <li>Menu4</li>
      </ul>
    </nav>
  </div>
</header>
<div class="contents">
  <div class="outline">
    <ul>
      <li>Outline1-1</li>
      <li>Outline1-2</li>
    </ul>
  </div>
  <section>
    <h1>heading</h1>
    <p>paragraph</p>
  </section>
</div>
<footer>
  <address>Contact : email@email.com</address>
</footer>
</div>


1
只需在媒体查询中设置.toparea{ margin-left:0 },您就可以轻松完成。
@media only screen and (max-width: 768px ) { 
    body { background-color: #EAC0F0; }
    header { flex-direction: column; }
    .logo { justify-content: center; }
    .login { display: none; }
    .menu ul { flex-direction: column; }
     .toparea{margin-left:0;}
    .contents { flex-direction: column; }
    .outline ul { display: flex; }
    .outline li {  flex: 1; }
}

* { box-sizing: border-box; }
nav ul, .outline ul { list-style-type: none; margin: 0; padding: 0; }

/*common*/

/*layout*/
.container { max-width: 900px; margin: 0; }
.outline { flex: 2; }
section { flex: 7; }

/*header*/ 
header { display: flex; }
.login ul, .menu ul { display: flex; }
.login ul { justify-content: flex-end; }
.toparea { margin-left: auto; }

/*section*/
.contents { display: flex; }


/*media query*/

@media only screen and (max-width: 768px ) { 
    body { background-color: #EAC0F0; }
    header { flex-direction: column; }
    .logo { justify-content: center; }
    .login { display: none; }
    .menu ul { flex-direction: column; }
  .toparea{margin-left:0;}
    .contents { flex-direction: column; }
    .outline ul { display: flex; }
    .outline li {  flex: 1; }
}


/*footer*/

/*temp*/
img, .login ul, .menu ul, .outline li { border: 1px solid black; }
<div class="container">
        <header>
           <img src="" alt="logo">
           <div class="toparea">
            <nav class="login">
                <ul>
                    <li>Login</li>
                    <li>Help</li>
                </ul>
            </nav>
            <nav class="menu">
                <ul>
                    <li>Menu1</li>
                    <li>Menu2</li>
                    <li>Menu3</li>
                    <li>Menu4</li>
                </ul>
            </nav>
           </div>
        </header>
        <div class="contents">
            <div class="outline">
                <ul>
                    <li>Outline1-1</li>
                    <li>Outline1-2</li>
                </ul>
            </div>
            <section>
                <h1>heading</h1>
                <p>paragraph</p>
            </section>
        </div>
        <footer>
            <address>Contact : email@email.com</address>
        </footer>
    </div>


1

我建议在小屏幕上覆盖 flexbox 并将其改为普通的 display block,查看此 CodePen... https://codepen.io/anon/pen/mBrmaM

* { box-sizing: border-box; }
nav ul, .outline ul { list-style-type: none; margin: 0; padding: 0; }

/*common*/

/*layout*/
.container { max-width: 900px; margin: 0; }
.outline { flex: 2; }
section { flex: 7; }

/*header*/ 
header { display: flex; }
.login ul, .menu ul { display: flex; }
.login ul { justify-content: flex-end; }
.toparea { margin-left: auto; }

/*section*/
.contents { display: flex; }


/*media query*/

@media only screen and (max-width: 768px ) { 
    body { background-color: #EAC0F0; }
    header { flex-direction: column; }
    .logo { justify-content: center; }
    .login { display: none; }
  .toparea{margin-left:0;}
    .menu ul { display: block;}
  .menu ul li{ display: block;}
    .contents { flex-direction: column; }
    .outline ul { display: flex; }
    .outline li {  flex: 1; }
}


/*footer*/

/*temp*/
img, .login ul, .menu ul, .outline li { border: 1px solid black; }
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>RWD</title>
    <link rel="stylesheet" href="./rwd.css">
</head>
<body>
    <div class="container">
        <header>
           <img src="" alt="logo">
           <div class="toparea">
            <nav class="login">
                <ul>
                    <li>Login</li>
                    <li>Help</li>
                </ul>
            </nav>
            <nav class="menu">
                <ul>
                    <li>Menu1</li>
                    <li>Menu2</li>
                    <li>Menu3</li>
                    <li>Menu4</li>
                </ul>
            </nav>
           </div>
        </header>
        <div class="contents">
            <div class="outline">
                <ul>
                    <li>Outline1-1</li>
                    <li>Outline1-2</li>
                </ul>
            </div>
            <section>
                <h1>heading</h1>
                <p>paragraph</p>
            </section>
        </div>
        <footer>
            <address>Contact : email@email.com</address>
        </footer>
    </div>
</body>
</html>


0

只需在CSS中添加以下内容(在媒体查询部分):

.toparea {
   width: 100%;
}

在Chrome、FF和Edge上对我有效 :)


0

在较小的屏幕上将flex更改为block,如下所示:

@media only screen and (max-width: 768px ) { 
    .menu ul {
        display: block;
    }
}

从这个CSS中,UL将像块一样行事,并且将具有完整的100%宽度,因此您所有的子LI也将具有相同的100%宽度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接