html - 将行布局折叠到较小宽度的列,而不会丢失前一个元素的边距顶部

标签 html css sass

目标
我正在尝试完成以下任务:

  • 当屏幕足够宽时,.firstItem (红色)和 .lastItem (蓝色)元素,其宽度事先未知 , 位于父项的左右部分 .layout分别。


  • 当屏幕变窄并且元素之间的水平间距减小到 $minimalHorizontalSpaceBetweenItems 时,布局折叠为列,但 .firstItem仍然有理由向左和.lastItem向右:


  • 元素之间的垂直空间 $verticalSpaceBetweenItems不得影响单行配置中的布局。
  • 下面是黄色的 CSS 规则 .preceedingElement块上方.firstItem.lastItem必须工作:

  • .preceedingElement + .layout {
       margin-top: Npx;
    }
    
    基本 MWE
    <div class="preceedingElement"></div>
    <div class="layout">
      <div class="firstItem"></div>
      <div class="lastItem"></div>
    </div>
    
    社会保障:
    .preceedingElement{
      width: 100%;
      height: 30px;
      background: #FAD7A0;
    }
    
    @mixin TwoSpacedItemsComposition(
      $minimalHorizontalSpaceBetweenItems: 0,
      $verticalSpaceBetweenItems: 0
    ) {
      
      display: flex;
      flex-wrap: wrap;
      justify-content: space-between;
      
      margin-top: -$verticalSpaceBetweenItems;
      margin-right: -$minimalHorizontalSpaceBetweenItems;
      
      
      > *{
        margin-top: $verticalSpaceBetweenItems;
        margin-right: $minimalHorizontalSpaceBetweenItems;
        
        &:last-child {
          margin-left: auto;
        }
      }
    }
      
    .layout {
      @include TwoSpacedItemsComposition(
        $minimalHorizontalSpaceBetweenItems: 12px,
        $verticalSpaceBetweenItems: 24px
      )
    }
    
    .firstItem {
      width: 200px;
      height: 34px;
      background: #EC7063;
    }
    
    .lastItem {
      width: 400px;
      height: 24px;
      background: #7FB3D5;
    }
    
    Flex 解决方案尝试
    在SASS mixin下面实现了除第四个之外的所有目标:
    @mixin TwoSpacedItemsComposition(
      $minimalHorizontalSpaceBetweenItems: 0,
      $verticalSpaceBetweenItems: 0
    ) {
      
      display: flex;
      flex-wrap: wrap;
      justify-content: space-between;
      
      margin-top: -$verticalSpaceBetweenItems;
      margin-right: -$minimalHorizontalSpaceBetweenItems;
      
      
      > *{
        margin-top: $verticalSpaceBetweenItems;
        margin-right: $minimalHorizontalSpaceBetweenItems;
        
        &:last-child {
          margin-left: auto;
        }
      }
    }
    
    干扰是margin-top: -$verticalSpaceBetweenItems;对于 parent 和 margin-top: $verticalSpaceBetweenItems;给 child 。
    🌎 JS Fiddle
    网格解决方案尝试
    网格始终呈现 2 行。
    @mixin TwoSpacedItemsComposition(
      $minimalHorizontalSpaceBetweenItems: 0,
      $verticalSpaceBetweenItems: 0
    ) {
    
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(0, auto));
      grid-gap: $verticalSpaceBetweenItems $verticalSpaceBetweenItems;
    
      align-items: center;
    
    
      >* {
    
        &:first-child {
          justify-self: start;
        }
    
        &:last-child {
          justify-self: end;
        }
     }
    

    最佳答案

    您的 flexbox 方法似乎工作得很好...正在更改 margin-top: $verticalSpaceBetweenItems;margin-bottom: $verticalSpaceBetweenItems;应该解决要求 #4,并且您的原始 flexbox 代码已经解决了前三个问题。
    JSFiddle:https://jsfiddle.net/yx689sh4/

    关于html - 将行布局折叠到较小宽度的列,而不会丢失前一个元素的边距顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64588075/

    相关文章:

    javascript - 如何获取各种 VAR 并将它们放入 HTML 创建的容器中?

    css - Grails Bootstrap 插件找不到 Bootstrap 资源

    css - 在css中的伪选择器之后添加类选择器

    javascript - 如何使用 Bootstrap Modals 和按钮制作可重用的确认控件?

    javascript - 如何销毁 ReactJs 中的 React cropper 方法?

    javascript - request.args.get()返回None类型值(None)

    css - 风格 Joomla!使用 Bootstrap 4.3 模板,将引导样式添加到自定义样式

    c# - 动态添加控件不会显示在 asp.net Web 窗体的面板内

    css - webkit 转换旋转不适用于 Safari

    Sass, Compass, 将所有 CSS 文件编译为一个