简体   繁体   English

我可以使用CSS更改此HTML结构吗?

[英]Can I use CSS to change this HTML structure?

I have a very rigid html structure which is displaying a gallery of images. 我有一个非常僵化的html结构,用于显示图像库。 Images are grouped alphabetically. 图像按字母顺序分组。

Demo: http://codepen.io/sol_b/pen/aBpbxz 演示: http//codepen.io/sol_b/pen/aBpbxz

HTML for each panel: 每个面板的HTML:

<div class="item">
      <h2>A</h2>
      <div class="image">
          <img src="image.jpg">
      </div>
</div>

What I'd like to do is separate each alphabetical group. 我想做的是将每个字母组分开。

Like this: http://codepen.io/sol_b/pen/LbxVRr 像这样: http : //codepen.io/sol_b/pen/LbxVRr

Unfortunately I can't alter the HTML, only CSS (or JavaScript if that's necessary). 不幸的是,我无法更改HTML,只能更改CSS(或JavaScript)(如果需要的话)。

I've tried positioning, floats, widths. 我尝试过定位,浮动,宽度。 What makes it more difficult is that each item gets a heading, whether it displays content or not. 更难的是每个项目都有一个标题,无论它是否显示内容。

Is this even possible with CSS? CSS甚至有可能吗?

One thing I considered was adding a <br> tag before each heading that has content. 我考虑的一件事是在每个包含内容的标题之前添加一个<br>标记。 Example: 例:

var breakTag = document.createElement('br');
var element = document.getElementsByTagName('h2');

if(element.innerHTML == ""){
  element.insertBefore(breakTag);
} 

However I would need to target before the item, and not before the h2 , which I'm not sure how to do. 但是我需要在该项目之前而不是在h2之前定位,我不确定该怎么做。

Any help much appreciated. 任何帮助,不胜感激。

 var breakTag = document.createElement('br'), elems = document.getElementsByTagName('h2'), parentDiv = document.getElementsByClassName('content')[0]; for (var i = 0; i < elems.length; i++) { if (elems[i].innerText !== '') { parentDiv.insertBefore(breakTag.cloneNode(true), elems[i].parentNode); } } 
 .wrapper { width: 800px; margin: 0 auto; } h2 { font-size: 16px; font-family: sans-serif; } br { display: block; content: ""; } .item { display: inline-block; width: 33%; position: relative; } .image { width: 240px; height: 120px; position: relative; } .name { position: absolute; left: 0; right: 0; top: 0; margin: 0 auto; text-align: center; background-color: #1a1a1a; color: #fff; font-size: 16px; font-weight: bold; opacity: 0; transition: 0.1s ease-in-out; width: 240px; height: 120px; display: table; box-sizing: border-box; padding: 20px; } .name:hover { opacity: 1; } .name span { display: table-cell; vertical-align: middle; cursor: default; font-family: sans-serif; letter-spacing: 3px; } 
 <div class="wrapper"> <div class="content"> <div class="item"> <h2>A</h2> <div class="image"> <img src="http://placehold.it/240x120"> <div class="name"> <span>Title</span> </div> </div> </div> <div class="item"> <h2></h2> <div class="image"> <img src="http://placehold.it/240x120"> <div class="name"> <span>Title</span> </div> </div> </div> <div class="item"> <h2></h2> <div class="image"> <img src="http://placehold.it/240x120"> <div class="name"> <span>Title</span> </div> </div> </div> <div class="item"> <h2></h2> <div class="image"> <img src="http://placehold.it/240x120"> <div class="name"> <span>Title</span> </div> </div> </div> <div class="item"> <h2>B</h2> <div class="image"> <img src="http://placehold.it/240x120"> <div class="name"> <span>Title</span> </div> </div> </div> <div class="item"> <h2></h2> <div class="image"> <img src="http://placehold.it/240x120"> <div class="name"> <span>Title</span> </div> </div> </div> <div class="item"> <h2>C</h2> <div class="image"> <img src="http://placehold.it/240x120"> <div class="name"> <span>Title</span> </div> </div> </div> <div class="item"> <h2></h2> <div class="image"> <img src="http://placehold.it/240x120"> <div class="name"> <span>Title</span> </div> </div> </div> <div class="item"> <h2>D</h2> <div class="image"> <img src="http://placehold.it/240x120"> <div class="name"> <span>Title</span> </div> </div> </div> </div> </div> 

To add a break before each element with the class 'item' that has a non-blank h2 you'd do something like 要在具有非空白h2的类“ item”的每个元素前添加一个分隔符,您可以执行以下操作

var sections = document.getElementsByClassName('item');
for (var section of sections) {
    let heading = section.getElementsByTagName('h2')[0];
    if (!heading || !heading.innerHtml) { continue; }
    section.parent.insertBefore(document.createElement('br'), section);
}

If you want to get more complicated, you could get fancier and create a container every time you find an item with a heading and add them to the container: 如果您想变得更复杂,那么每次找到带有标题的项目并将其添加到容器中时,您都可以变得更加幻想并创建一个容器:

var sections = document.getElementsByClassName('item');
var currentContainer = null;
for (var section of sections) {
    let heading = section.getElementsByTagName('h2')[0];
    if (heading && heading.innerHtml) { 
        currentContainer = document.createElement('div');
        currentContainer.className = 'generated-section';
        section.parent.insertBefore(currentContainer, section);
    }
    section.parent.remove(section);
    currentContainer.appendChild(section);
}

Those are both untested, so they might require some work. 这些都未经测试,因此可能需要一些工作。 The second also assumes they're in order, which it sounds like they are. 第二个也假设它们是有序的,听起来像是。

var breakTag = document.createElement('br');
var elements = document.getElementsByTagName('h2');

for(var element of elements){
  if(element.innerHTML){
      element.parentNode.parentNode.insertBefore(breakTag.cloneNode(true), element.parentNode);
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM