【问题标题】:Masonry gallery with grid layout具有网格布局的砌体画廊
【发布时间】:2017-08-21 17:18:45
【问题描述】:

我一直在寻找一个网格布局的 Masonry 画廊,但我没有找到它,所以我决定自己做。我使用带有网格布局的 customElement,但是当我动态分配网格行时我被阻止了。
我希望得到您的反馈并帮助改进它。

我检测到的一些错误是:

  • 需要运行 2 次才能工作
  • 图像/容器高度不是 100 倍数时的空格

HTML

<masonry-gallery></masonry-gallery>

JS

 class MasonryGallery extends HTMLElement {

    items = [
    { image:'https://unsplash.it/200/100/' },
    { image:'https://unsplash.it/200/200/' },
    { image:'https://unsplash.it/200/300/' },
    { image:'https://unsplash.it/200/400/' },
    { image:'https://unsplash.it/200/300/' },
    { image:'https://unsplash.it/200/200/' },
    { image:'https://unsplash.it/200/100/' },
    { image:'https://unsplash.it/200/300/' },
    { image:'https://unsplash.it/200/700/' },
    { image:'https://unsplash.it/200/300/' },
    { image:'https://unsplash.it/200/200/' },
    { image:'https://unsplash.it/200/600/' },
    { image:'https://unsplash.it/200/100/' }
  ]

  constructor() {
    super()
    this.attachShadow({ mode: 'open'})
    this.create()
    this.append()
  }

  create() {
    this.style.display = 'grid'
    this.style.gridTemplateColumns = 'repeat(auto-fill, 200px)'
    this.style.gridTemplateRows = 'repeat(auto-fill, 1fr)'
    this.style.gridGap = '1rem'
    this.style.gridAutoFlow = 'row dense'
  }

  append() {

    this.items.map(item => {

        const div = document.createElement('DIV');
      const image = document.createElement('IMG')

      image.src = item.image
      div.appendChild(image)

      this.shadowRoot.appendChild(div)

      div.style.gridRow = 'auto / span ' + [...String(image.height)][0]
    })

  }

}

customElements.define('masonry-gallery', MasonryGallery)

小提琴 https://jsfiddle.net/znhybgb6/6/

【问题讨论】:

标签: javascript css grid-layout css-grid


【解决方案1】:

你的“bug”有以下原因:

  1. 您尝试在图像附加到组件后立即计算图像的高度,但此时它的高度是未知的,只有在图像加载后才知道。
  2. 网格行之间有 1rem (16px) 的间隙,因此每个 100px 高的图像都会在网格高度上增加 116px。

可以修复此行为,例如,通过以下编辑您的 append 方法:

append() {

    let gap = parseInt(getComputedStyle(this).gridRowGap)

    this.items.map(item => {

        const div = document.createElement('DIV');
      const image = document.createElement('IMG')
      image.style.display = 'block';

      image.src = item.image
      div.appendChild(image)
      image.onload = function() {
          this.parentNode.style.gridRow = 'auto / span ' + ((this.height + gap)/(100 + gap));
      }

      this.shadowRoot.appendChild(div)

    })

  }

并将gridRows替换为gridAutoRows = '100px',以使垂直节奏统一,并相应地调整图像的高度。

你可以看到结果in the edited Fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 2018-07-06
    相关资源
    最近更新 更多