【问题标题】:Swap DIV position with CSS only仅使用 CSS 交换 DIV 位置
【发布时间】:2013-07-01 14:30:44
【问题描述】:

我正在尝试将两个 divs 的位置交换为响应式设计(网站看起来会因浏览器的宽度而异/适合移动设备)。

现在我有这样的东西:

<div id="first_div"></div>
<div id="second_div"></div>

但是是否可以交换它们的展示位置以使其看起来像 second_div 是第一个,仅使用 CSS? HTML 保持不变。我试过使用花车之类的东西,但它似乎没有按照我想要的方式工作。我不想使用绝对定位,因为divs 的高度总是在变化。是否有任何解决方案,或者没有办法做到这一点?

【问题讨论】:

标签: css responsive-design


【解决方案1】:

你不需要任何花哨的东西。制作第二个 div 的副本,并将其放在顶部。像这样

<div id="second_div_copy"></div>
<div id="first_div"></div>
<div id="second_div"></div>

当您希望第一个 div 出现在顶部时,给 second_div_copy display: none 。当您希望第二个 div 出现在顶部时,给 second_div_copy display: block 和 second_div display: none。

真的就这么简单。还是我错过了什么?

【讨论】:

  • 这是一个 8 岁的帖子,所以从那时起有些事情发生了变化。另外,他不想用js添加新的div,而是在css中做所有事情
  • 很多东西都变了,但你还没明白我的意思。
【解决方案2】:

昨天遇到了同样的问题。就我而言,网格区域效果很好:

.content-body {
    display: grid;
    grid-template-areas: " left right ";
    grid-template-columns: 1fr 1fr;
}
.first_div {
    grid-area: right;
}
.second {
    grid-area: left;
}

【讨论】:

    【解决方案3】:

    假设两个元素都有 50% 的宽度,这是我使用的:

    css:

      .parent {
        width: 100%;
        display: flex;
      }  
      .child-1 {
        width: 50%;
        margin-right: -50%;
        margin-left: 50%;
        background: #ff0;
      }
      .child-2 {
        width: 50%;
        margin-right: 50%;
        margin-left: -50%;
        background: #0f0;
      }
    

    html:

    <div class="parent">
      <div class="child-1">child1</div>
      <div class="child-2">child2</div>
    </div>
    

    示例:https://jsfiddle.net/gzveri/o6umhj53/

    顺便说一句,这种方法适用于一长串元素中的任意 2 个附近元素。例如,我有一个长长的元素列表,每行有 2 个项目,我希望交换列表中的每个第 3 和第 4 个元素,以便它以国际象棋风格呈现元素,然后我使用这些规则:

      .parent > div:nth-child(4n+3) {
        margin-right: -50%;
        margin-left: 50%;
      }
      .parent > div:nth-child(4n+4) {
        margin-right: 50%;
        margin-left: -50%;
      }
    

    【讨论】:

      【解决方案4】:

      这个解决方案对我有用:

      使用像这样的父元素:

      .parent-div {
          display:flex;
          flex-direction: column-reverse;
      }
      

      就我而言,我不必更改需要切换的元素的 css。

      【讨论】:

        【解决方案5】:

        在某些情况下,您可以只使用flex-box 属性order

        很简单:

        .flex-item {
            order: 2;
        }
        

        见:https://css-tricks.com/almanac/properties/o/order/

        【讨论】:

        • @Sarfaraj 确保您的 flex: display 处于活动状态,并且命令是 ORDER 而不是 Flex-order。我犯了那个错误
        【解决方案6】:

        仅使用 CSS:

        #blockContainer {
        display: -webkit-box;
        display: -moz-box;
        display: box;
        
        -webkit-box-orient: vertical;
        -moz-box-orient: vertical;
        box-orient: vertical;
        }
        #blockA {
        -webkit-box-ordinal-group: 2;
        -moz-box-ordinal-group: 2;
        box-ordinal-group: 2;
        }
        #blockB {
        -webkit-box-ordinal-group: 3;
        -moz-box-ordinal-group: 3;
        box-ordinal-group: 3;
        

        }

        <div id="blockContainer">
         <div id="blockA">Block A</div>
         <div id="blockB">Block B</div>
         <div id="blockC">Block C</div>
        </div>
        

        http://jsfiddle.net/thirtydot/hLUHL/

        【讨论】:

          【解决方案7】:

          这个问题已经有了很好的答案,但是本着探索所有可能性的精神,这里是另一种重新排序 dom 元素的技术,同时仍然允许它们占据空间,这与绝对定位方法不同。

          此方法适用于所有现代浏览器和 IE9+(基本上任何支持 display:table 的浏览器),但它的缺点是它最多只能用于 3 个兄弟姐妹。

          //the html    
          <div class='container'>
              <div class='div1'>1</div>
              <div class='div2'>2</div>
              <div class='div3'>3</div>
          </div>
          
          //the css
          .container {
             display:table;    
          }
          .div1 {
              display:table-footer-group;
          }
          .div2 {
              display:table-header-group;
          }
          .div3 {
              display:table-row-group;
          }
          

          这会将元素从 1,2,3 重新排序为 2,3,1。基本上,显示设置为 table-header-group 的任何内容都将位于顶部,而 table-footer-group 位于底部。自然 table-row-group 将一个元素放在中间。

          此方法速度快,支持良好,并且比 flexbox 方法所需的 css 少得多,因此,如果您只是想为移动布局交换一些项目,那么不要排除这种技术。

          您可以在 codepen 上查看现场演示:http://codepen.io/thepixelninja/pen/eZVgLx

          【讨论】:

          • width: 100% 行没用:你不能给display: table 元素指定宽度。
          • 我的错。它不在我做的例子中,一定是不小心爬到这里的。不管它是否在那里,该方法仍然有效。 :)
          • 在处理表单输入时,通常在其上方有标签,但在 DOM 中位于之前(因此我们可以根据输入的状态定位标签),这非常有用!也非常适合浮动标签。
          • 这是一种非常棒的非弹性方式。即使在 2019 年,我们也能获得 4% 的 IE9 流量。
          【解决方案8】:

          已接受的答案适用于大多数浏览器,但由于某种原因,在 iOS Chrome 和 Safari 浏览器上,应该显示第二个的内容被隐藏了。我尝试了其他一些强制内容堆叠的步骤,最终我尝试了以下解决方案,它给了我预期的效果(在移动屏幕上切换内容显示顺序),没有堆叠或隐藏内容的错误:

          .container {
            display:flex;
            flex-direction: column-reverse;
          }
          
          .section1,
          .section2 {
            height: auto;
          }
          

          【讨论】:

            【解决方案9】:

            有人给我链接了这个:What is the best way to move an element that's on the top to the bottom in Responsive design

            其中的解决方案非常有效。虽然它不支持旧的 IE,但这对我来说并不重要,因为我正在使用移动响应式设计。它适用于大多数移动浏览器。

            基本上,我有这个:

            @media (max-width: 30em) {
              .container {
                display: -webkit-box;
                display: -moz-box;
                display: -ms-flexbox;
                display: -webkit-flex;
                display: flex;
                -webkit-box-orient: vertical;
                -moz-box-orient: vertical;
                -webkit-flex-direction: column;
                -ms-flex-direction: column;
                flex-direction: column;
                /* optional */
                -webkit-box-align: start;
                -moz-box-align: start;
                -ms-flex-align: start;
                -webkit-align-items: flex-start;
                align-items: flex-start;
              }
            
              .container .first_div {
                -webkit-box-ordinal-group: 2;
                -moz-box-ordinal-group: 2;
                -ms-flex-order: 2;
                -webkit-order: 2;
                order: 2;
              }
            
              .container .second_div {
                -webkit-box-ordinal-group: 1;
                -moz-box-ordinal-group: 1;
                -ms-flex-order: 1;
                -webkit-order: 1;
                order: 1;
              }
            }
            

            这对我来说比浮动效果更好,因为我需要将它们堆叠在一起,而且我有大约五个不同的 div 必须围绕其位置进行交换。

            【讨论】:

            • 这里是an example,介绍如何使用 flexbox 方法。
            • 谢谢你的例子。我能够对其进行编辑以实现我的目标:jsfiddle.net/5rd9xwsc/73
            • jsfiddle.net/5rd9xwsc/75 是我尝试做的一个更好的例子,即:图像始终与文本交替显示,即使您调整窗口大小。
            • 我非常喜欢 StackOverflow,我能够搜索我的活动并再次找到这篇文章。我更新了小提琴,因为jsfiddle.net/5rd9xwsc/82 更接近我想要做的(在 WordPress 中)。
            • 提醒一下 - 这个解决方案乍一看可能看起来很复杂或脆弱,但实际上非常简单。供应商特定的样式使它看起来“笨重”。在我的用例中,我什至不需要供应商特定的样式。感谢蜻蜓的救命稻草!
            【解决方案10】:

            假设没有什么跟随他们

            如果这两个div 元素基本上是您的主要布局元素,并且在 html 中没有跟随它们,那么有一个纯 HMTL/CSS 解决方案,takes the normal order shown in this fiddle 并且能够使用一个额外的包装器flip it vertically as shown in this fiddle 987654326@像这样:

            HTML

            <div class="wrapper flipit">
               <div id="first_div">first div</div>
               <div id="second_div">second div</div>
            </div>
            

            CSS

            .flipit {
                position: relative;
            }
            .flipit #first_div {
                position: absolute;
                top: 100%;
                width: 100%;
            }
            

            如果元素跟随这些 div,这将不起作用,如 this fiddle illustrates the issue if the following elements are not wrapped(它们与 #first_div 重叠)和 this fiddle illustrates the issue if the following elements are also wrapped#first_divboth @987654331 改变位置@ 和以下元素)。这就是为什么,根据您的用例,此方法可能有效,也可能无效。

            对于一个整体布局方案,其他元素都存在于两个div里面的情况下,它可以工作。对于其他场景,就不行了。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-11-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多