javascript - 2 列布局,直到第一个列高度完成,然后是一列布局

标签 javascript html css svelte sveltekit

我的网页有 2 栏布局,左侧是过滤器,右侧是文章,如下所示: 2 column layout

目标:

  • 固定宽度过滤器(左侧)@大视口(viewport)
  • 文章上方的全宽过滤器(一列布局)@小视口(viewport)
  • @ 大视口(viewport)在右侧堆叠文章,直到到达第一列的高度末端,然后是全宽文章,如下所示:

End of 2 column layout

我目前正在使用 JS getBoundingClientRect() 执行此操作,但很想知道是否有 CSS 解决方案?!

根据要求,通过 SvelteKit 提供当前 JS 解决方案:

import {
  onMount
} from 'svelte';
import type {
  PageData
} from './$types'
import Source from '$lib/components/Source.svelte'
import type {
  QuoteCategory
} from '$lib/util/types'
import AuthorChips from '$lib/components/chips/AuthorChips.svelte'
import QuoteCategoryChips from '$lib/components/chips/QuoteCategoryChips.svelte'

export let data: PageData
let categories: QuoteCategory[]
if (data.categories) categories = data.categories

onMount(fullSizeSources)

function fullSizeSources() {
  let wideDone = false
  const scrollTop = document.documentElement.scrollTop
  const authors = document.getElementById('author-chips')
  const sources = document.getElementsByClassName('source')
  const authorBottom = (authors ? .getBoundingClientRect() ? .bottom || 0) + scrollTop

  for (let source of sources) {
    if (wideDone || (source.getBoundingClientRect().top + scrollTop) > authorBottom) {
      wideDone = true
      source.classList.add('full')
    } else {
      source.classList.remove('full')
    }
  }
}
.wrapper {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  .left {
    max-width: 36rem;
    margin-right: 1.8rem;
    display: flex;
    flex-direction: column;
  }
   :global(.source.full) {
    margin-left: -37rem;
    width: calc(100% + 37rem);
  }
}
<div class="wrapper">
  <div class="left">
    { #if data.categories }
    <QuoteCategoryChips categories={ data.categories } location="nav" /> { /if } { #if data.authors }
    <AuthorChips authors={ data.authors } /> { /if }
  </div>

  <div>
    { #if data.sources } { #each data.sources as source }
    <Source { source } /> { /each } { /if }
  </div>
</div>

最佳答案

如果我理解正确的话,你可以通过使用 float 和 @media 来解决这个问题。对于小视口(viewport),请使用一列的正常布局。对于大视口(viewport),您可以使用 float: left; ,这样您的文章就位于右侧,并且在达到左列的高度后,它们的宽度变为 100%。

/* Just some styles to visualise. Notice the use of flex, it makes it easier to work with the content of these elements */

.left,
.right-article {
  display: flex;
  flex-direction: column;
  padding: 1rem;
  margin: 1rem;
  border: 1px solid blue;
}


/* Replace 600px with whatever you need */

@media (min-width: 600px) {
  .left {
    /* Replace the width with whatever you need */
    width: 300px;
    float: left;
  }
}
<div>
  <div class="left">
    <p>Lorem ipsum dolor sit amet consectetur, adipisicing elit.</p>
    <p>Exercitationem et qui fuga non illo nemo, harum ab, vero in illum maxime, dolore dignissimos velit provident id iure accusantium fugiat amet!</p>
  </div>

  <div class="right-article">Lorem ipsum, dolor sit amet consectetur adipisicing elit.</div>

  <div class="right-article">Lorem ipsum, dolor sit amet consectetur adipisicing elit..</div>

  <div class="right-article">Lorem ipsum, dolor sit amet consectetur adipisicing elit.</div>
  <div class="right-article">Lorem ipsum, dolor sit amet consectetur adipisicing elit.</div>

  <div class="right-article">Lorem ipsum, dolor sit amet consectetur adipisicing elit..</div>

  <div class="right-article">Lorem ipsum, dolor sit amet consectetur adipisicing elit.</div>
  <div class="right-article">Lorem ipsum, dolor sit amet consectetur adipisicing elit.</div>

  <div class="right-article">Lorem ipsum, dolor sit amet consectetur adipisicing elit..</div>

  <div class="right-article">Lorem ipsum, dolor sit amet consectetur adipisicing elit.</div>
</div>

关于javascript - 2 列布局,直到第一个列高度完成,然后是一列布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75214654/

相关文章:

javascript - 对 Canvas 中的图像进行像素精确的命中检测?

html - Chrome 嵌入式 PDF 下载文件名

jQuery toggleClass 不更改已设置字体大小的后代选择器的字体大小

javascript - 使用js/jquery扩展和缩回div

html - 带有高度和最小高度 100% 的左侧菜单

javascript - 使用 AngularJS 在超快速 keyup 和 keydown 事件上调用函数

javascript - 从使用 ajax 的函数获取返回值

javascript - 我如何知道 V8 中有哪些功能?

javascript - 有没有办法使用与我的 JSON 中的属性名称不同的属性名称?

css - 将 CSS 更改添加到 SCSS 文件