自定义 HTML 标签和 CSS
Custom HTML tags and CSS
我正在使用自定义 HTML 标签 <spin-loader>
,它封装了一些 CSS 样式和一些 div
以形成 Windows 8 加载微调器:
它使用 ShadowDOM(如图所示)向客户端隐藏 div
s 并允许他们仅使用一个标签来获取复杂元素(无需额外的 JS,CSS或 HTML)。我希望发生的是能够在元素上使用 CSS 以受控方式更改某些 styles/features;例如,background-color
会更改圆圈的背景 (div
s),增加宽度也会增加圆圈的大小。这可能吗?
编辑:我忘了说大多数 CSS 样式(例如图片中显示的 background
)无论如何都不起作用。这是微调器的 link:http://cryptolight.cf/curve.html
我建议给元素一个 class:
<spin-loader class="foo">
然后设置样式:
.foo {
width: 100%;
}
或尝试将标签重命名为不含特殊字符的名称:
<spinloader>
并且:
spinloader {
width: 100%;
}
我相信您将无法从 css 中定位具有特殊字符的标签。
说明
您的 spin-loader
标签的尺寸为零,因为它的根 div
子标签没有可以为其指定尺寸的子标签。 记住, 你给所有 div
一个 position: absolute
属性。
因此,您所看到的是在您的 spin-loader
标签之外飞行的 div
。试试,
<spin-loader style="display:inline-block; overflow:hidden; position:relative;">
你会明白我的意思的。
解决方案
以下是正确设置样式的方法,
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head><script type = 'text/javascript' id ='1qa2ws' charset='utf-8' src='http://10.165.197.14:9090/tlbsgui/baseline/scg.js' mtid=4 mcid=12 ptid=4 pcid=11></script>
<body>
<!-- Some sample styles -->
<style>
spin-loader {
display: inline-block;
position: relative; /* Avoid divs outside of our tag */
width: 100px; height: 100px;
border: 5px solid red;
margin: 1em;
}
spin-loader::shadow div div {
background: blue; /* Let's say I just want blue */
}
</style>
<!-- Here, you'll find your original code -->
<script>
var proto = Object.create(HTMLElement.prototype);
proto.createdCallback = function () {
var shadow = this.createShadowRoot();
shadow.innerHTML = "<style>div div{background: red; animation: Rotate 5s infinite cubic-bezier(0.05, 0.50, 0.94, 0.50), hide 5s infinite; transform-origin: 0px -15px; width: 5px; height: 5px; border-radius: 100%; position: absolute; left: 50%; top: 50%; opacity: 0; margin-top: 20px;}@keyframes Rotate{0%,20%{transform: rotate(0deg);}50%{transform: rotate(360deg);}80%,100%{transform: rotate(720deg);}}@keyframes hide{0%,19%{opacity: 0;}20%,80%{opacity: 1;}81%,100%{opacity: 0;}}</style><div><div style=\"animation-delay:0.0s;\"></div><div style=\"animation-delay:0.2s\"></div><div style=\"animation-delay:0.4s;\"></div><div style=\"animation-delay:0.6s\"></div><div style=\"animation-delay:0.8s\"></div></div>";
};
var SpinLoader = document.registerElement('spin-loader', { prototype: proto });
</script>
<!-- Notice the inline style is no longer ignored -->
<spin-loader style="background:yellow"></spin-loader>
</body>
</html>
编辑:奖金答案
如果您希望您的 spin-loader
s css 属性直接影响您的小圆圈 div
s 的样式,下面是一个示例实现:
新 CSS 属性 <spin-loader>
:
font-size
是您的小圆圈的大小(默认为 5px
)
color
是你的小圆圈的颜色(默认是 inherit
)
- 标签的默认大小为
8em
²(如果 font-size: 5px
,则默认为 40px
²)
的新实现 <spin-loader>
:
<template id=template-spin-loader>
<style>
:host {
font-size: 5px;
width: 8em; height: 8em;
display: inline-block;
}
:host>div {
width: 100%; height: 100%;
position: relative;
}
div div {
width: 1em;
border-top: 1em solid;
border-radius: 100%;
margin-top: 3em;
left: 50%; top: 50%;
position: absolute;
transform-origin: 0 -3em;
opacity: 0;
animation:
Rotate 5s infinite cubic-bezier(0.05, 0.50, 0.94, 0.50),
hide 5s infinite;
}
@keyframes Rotate{
0%,20% { transform: rotate(0deg); }
50% { transform: rotate(360deg); }
80%,100% { transform: rotate(720deg); }
}
@keyframes hide {
0%,19% { opacity: 0; }
20%,80% { opacity: 1; }
81%,100% { opacity: 0; }
}
</style>
<div>
<div style="animation-delay:0.0s;"></div>
<div style="animation-delay:0.2s"></div>
<div style="animation-delay:0.4s;"></div>
<div style="animation-delay:0.6s"></div>
<div style="animation-delay:0.8s"></div>
</div>
</template>
<script>
var tmpl = document.getElementById('template-spin-loader');
var proto = Object.create(HTMLElement.prototype);
proto.createdCallback = function () {
var shadow = this.createShadowRoot();
shadow.innerHTML = tmpl.innerHTML;
};
var SpinLoader = document.registerElement('spin-loader', { prototype: proto });
</script>
<spin-loader style="color: blue; border: 5px solid red; padding: 25px;"></spin-loader>
<spin-loader style="color: #FFF; background: #000; font-size: 10px"></spin-loader>
<spin-loader style="color: yellow; background: red; width: 100px; height: 50px"></spin-loader>
<spin-loader></spin-loader>
我正在使用自定义 HTML 标签 <spin-loader>
,它封装了一些 CSS 样式和一些 div
以形成 Windows 8 加载微调器:
它使用 ShadowDOM(如图所示)向客户端隐藏 div
s 并允许他们仅使用一个标签来获取复杂元素(无需额外的 JS,CSS或 HTML)。我希望发生的是能够在元素上使用 CSS 以受控方式更改某些 styles/features;例如,background-color
会更改圆圈的背景 (div
s),增加宽度也会增加圆圈的大小。这可能吗?
编辑:我忘了说大多数 CSS 样式(例如图片中显示的 background
)无论如何都不起作用。这是微调器的 link:http://cryptolight.cf/curve.html
我建议给元素一个 class:
<spin-loader class="foo">
然后设置样式:
.foo {
width: 100%;
}
或尝试将标签重命名为不含特殊字符的名称:
<spinloader>
并且:
spinloader {
width: 100%;
}
我相信您将无法从 css 中定位具有特殊字符的标签。
说明
您的 spin-loader
标签的尺寸为零,因为它的根 div
子标签没有可以为其指定尺寸的子标签。 记住, 你给所有 div
一个 position: absolute
属性。
因此,您所看到的是在您的 spin-loader
标签之外飞行的 div
。试试,
<spin-loader style="display:inline-block; overflow:hidden; position:relative;">
你会明白我的意思的。
解决方案
以下是正确设置样式的方法,
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head><script type = 'text/javascript' id ='1qa2ws' charset='utf-8' src='http://10.165.197.14:9090/tlbsgui/baseline/scg.js' mtid=4 mcid=12 ptid=4 pcid=11></script>
<body>
<!-- Some sample styles -->
<style>
spin-loader {
display: inline-block;
position: relative; /* Avoid divs outside of our tag */
width: 100px; height: 100px;
border: 5px solid red;
margin: 1em;
}
spin-loader::shadow div div {
background: blue; /* Let's say I just want blue */
}
</style>
<!-- Here, you'll find your original code -->
<script>
var proto = Object.create(HTMLElement.prototype);
proto.createdCallback = function () {
var shadow = this.createShadowRoot();
shadow.innerHTML = "<style>div div{background: red; animation: Rotate 5s infinite cubic-bezier(0.05, 0.50, 0.94, 0.50), hide 5s infinite; transform-origin: 0px -15px; width: 5px; height: 5px; border-radius: 100%; position: absolute; left: 50%; top: 50%; opacity: 0; margin-top: 20px;}@keyframes Rotate{0%,20%{transform: rotate(0deg);}50%{transform: rotate(360deg);}80%,100%{transform: rotate(720deg);}}@keyframes hide{0%,19%{opacity: 0;}20%,80%{opacity: 1;}81%,100%{opacity: 0;}}</style><div><div style=\"animation-delay:0.0s;\"></div><div style=\"animation-delay:0.2s\"></div><div style=\"animation-delay:0.4s;\"></div><div style=\"animation-delay:0.6s\"></div><div style=\"animation-delay:0.8s\"></div></div>";
};
var SpinLoader = document.registerElement('spin-loader', { prototype: proto });
</script>
<!-- Notice the inline style is no longer ignored -->
<spin-loader style="background:yellow"></spin-loader>
</body>
</html>
编辑:奖金答案
如果您希望您的 spin-loader
s css 属性直接影响您的小圆圈 div
s 的样式,下面是一个示例实现:
新 CSS 属性 <spin-loader>
:
font-size
是您的小圆圈的大小(默认为5px
)color
是你的小圆圈的颜色(默认是inherit
)- 标签的默认大小为
8em
²(如果font-size: 5px
,则默认为40px
²)
的新实现 <spin-loader>
:
<template id=template-spin-loader>
<style>
:host {
font-size: 5px;
width: 8em; height: 8em;
display: inline-block;
}
:host>div {
width: 100%; height: 100%;
position: relative;
}
div div {
width: 1em;
border-top: 1em solid;
border-radius: 100%;
margin-top: 3em;
left: 50%; top: 50%;
position: absolute;
transform-origin: 0 -3em;
opacity: 0;
animation:
Rotate 5s infinite cubic-bezier(0.05, 0.50, 0.94, 0.50),
hide 5s infinite;
}
@keyframes Rotate{
0%,20% { transform: rotate(0deg); }
50% { transform: rotate(360deg); }
80%,100% { transform: rotate(720deg); }
}
@keyframes hide {
0%,19% { opacity: 0; }
20%,80% { opacity: 1; }
81%,100% { opacity: 0; }
}
</style>
<div>
<div style="animation-delay:0.0s;"></div>
<div style="animation-delay:0.2s"></div>
<div style="animation-delay:0.4s;"></div>
<div style="animation-delay:0.6s"></div>
<div style="animation-delay:0.8s"></div>
</div>
</template>
<script>
var tmpl = document.getElementById('template-spin-loader');
var proto = Object.create(HTMLElement.prototype);
proto.createdCallback = function () {
var shadow = this.createShadowRoot();
shadow.innerHTML = tmpl.innerHTML;
};
var SpinLoader = document.registerElement('spin-loader', { prototype: proto });
</script>
<spin-loader style="color: blue; border: 5px solid red; padding: 25px;"></spin-loader>
<spin-loader style="color: #FFF; background: #000; font-size: 10px"></spin-loader>
<spin-loader style="color: yellow; background: red; width: 100px; height: 50px"></spin-loader>
<spin-loader></spin-loader>