问题描述
我希望能够编写 <div class="inlined">content</div>
左右,并将其转换为其他一些 html,使用内容,并按照 inlined
的定义。我想在纯 CSS 中执行此操作,即没有 javascript。
<div data-descr="content"/> -> <div class="container"><div class="topright">content</div></div>
一些实现“喜欢”:
div[data-descr] {
content: <div class="container"><div class="topright">attr(data-descr)</div></div>;
}
如果不能使用纯 CSS,less/sass/js 的解决方案是什么?
解决方法
由于您的数据属性包含 HTML,因此您不能为此使用 CSS
内容属性,因为您的 HTML 将被视为字符串 - 它不会被解析。
无论如何,您还应该避免将 HTML 添加到数据属性中。
不过,您可以通过 replaceWith 使用 JavaScript 来实现。
尝试为要添加的标记创建一个 object。然后你可以引用它来获取 HTML
// helper function to handle new element creation
const createNewElement = content => {
const container = document.createElement("div");
container.classList.add("container");
const inner = document.createElement("div");
inner.classList.add("top-right");
inner.innerHTML = dataObject[content];
container.append(inner);
return container;
}
// create an object to get the HTML for a specific describtion attribute
const dataObject = {
content: `<div class="red">red text</div>`,content2: `<div class="green">green text</div>`,content3: `<div class="blue">blue text</div>`,}
// get the elements you want to change
const targetElements = document.querySelectorAll("[data-descr]");
// loop through them and swap them
targetElements.forEach(element => {
const content = element.dataset.descr;
const newElement = createNewElement(content)
element.replaceWith(newElement)
})
.red {
color: red;
}
.green {
color: green;
}
.blue {
color: blue
}
<div data-descr="content"></div>
<div data-descr="content2"></div>
<div data-descr="content3"></div>
正如@ErikMartino 在此答案中所述:https://stackoverflow.com/a/5865996/8106583
内容不支持 HTML,只支持文本。你可能应该使用 javascript、jQuery 或类似的东西。
如果内容确实支持 HTML,您可能会陷入无限循环,其中 内容添加到内容中。