[英]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.