动态改变 :after pseudo background-color
Dynamically change :after pseudo background-color
我正在这样的中继器中创建按钮(简单):
<asp:Repeater runat="server" OnItemDataBound="Repeater_Buttons_ItemDataBound">
<ItemTemplate>
<telerik:RadButton runat="server" CssClass="myButton" ID="MyButton">
<ContentTemplate>
<...>
</ContentTemplate>
</telerik:RadButton>
</ItemTemplate>
</asp:Repeater>
这些按钮的样式为 :after pseudo 以在该按钮的背景中创建彩色背景滑动
.myButton {
...
}
.myButton::after {
content: "";
display: block;
width: 45px;
height: 45px;
background-color: var(--myColor);
position: absolute;
left: 0;
top: 0;
transition: 400ms all;
z-index: 1;
}
结果如下所示:
我的问题是,我需要更改此 :after content 的颜色,基于项目的边界动态地更改内容。
我可以访问 ItemDataBound 上的 RadButton,我试图通过属性更改它但没有成功。
protected void Repeater_Buttons_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
var currentItem = (e.Item.DataItem as MyItem);
var radButton = (e.Item.FindControl("MyButton") as RadButton);
// whishful function I need:
radButton.After.BackgroundColor = currentItem.BackColor;
// or something like
radButton.Attributes.Add("style:after", $"background-color: {currentItem.BackColor}");
}
}
也通过 javascript 方法,但不成功。我无法创建 diffrente css 类 硬编码,因为可以为不同的项目选择任何颜色
也许您可以只向按钮添加 extra/different class 而不是尝试添加内联样式?请参阅下面的示例(没有 telerik 控件)
<asp:Repeater ID="Repeater_Buttons" runat="server" OnItemDataBound="Repeater_Buttons_ItemDataBound">
<ItemTemplate>
<div>
<asp:LinkButton ID="MyButton" runat="server" CssClass="myButton">LinkButton</asp:LinkButton>
</div>
</ItemTemplate>
</asp:Repeater>
<style>
.myButton,
.myButtonDynamic {
background-color: red;
}
.myButton::after {
content: "after";
background-color: yellow;
}
.myButtonDynamic::after {
content: "after";
background-color: green;
}
</style>
然后在ItemDataBound
protected void Repeater_Buttons_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.AlternatingItem)
{
var radButton = (LinkButton)e.Item.FindControl("MyButton");
radButton.CssClass = "myButtonDynamic";
}
}
恕我直言,您不必覆盖现有的 CSS。您的 CSS 已经有
.myButton::after {
...
background-color: var(--myColor);
...
}
因此您只需更改此 --myColor
CSS 变量即可。即使没有服务器调用。全部在客户端上。
举个快速的例子,纯JS就可以做到。这样的 JS 动作可以内置到点击处理程序中。
const root = document.documentElement; //get the root element
...
root.style.setProperty('--myColor', someColorForThisMoment);
或者此类代码可以是 EventListener 的一部分(每次点击时随机更改 --myColor
):
function random(min,max) {
const num = Math.floor(Math.random()*(max-min)) + min;
return num;
}
function getRandomColor() {
return 'rgb(' + random(0,255) + ', ' + random(0,255) + ', ' + random(0,255) + ')';
}
const root = document.documentElement;
root.addEventListener('click', e => {
const newRandomColor = getRandomColor();
root.style.setProperty('--myColor', newRandomColor);
});
UI 造型是客户的工作。不要让您的服务器因冗余调用而超载。
假设 currentItem.BackColor
已经格式化为 CSS 颜色字符串,这应该有效:
var radButton = (e.Item.FindControl("MyButton") as RadButton);
radButton.Style["--myColor"] = currentItem.BackColor;
如果是 System.Drawing.Color
,那么 the ColorTranslator.ToHtml
method 应该会给你所需的字符串。
您可以只写信给自定义 属性
protected void Repeater_Buttons_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
var currentItem = (e.Item.DataItem as MyItem);
var radButton = (e.Item.FindControl("MyButton") as RadButton);
radButton.Attributes.Add("style", $"--myColor: {currentItem.BackColor}");
}
}
我正在这样的中继器中创建按钮(简单):
<asp:Repeater runat="server" OnItemDataBound="Repeater_Buttons_ItemDataBound">
<ItemTemplate>
<telerik:RadButton runat="server" CssClass="myButton" ID="MyButton">
<ContentTemplate>
<...>
</ContentTemplate>
</telerik:RadButton>
</ItemTemplate>
</asp:Repeater>
这些按钮的样式为 :after pseudo 以在该按钮的背景中创建彩色背景滑动
.myButton {
...
}
.myButton::after {
content: "";
display: block;
width: 45px;
height: 45px;
background-color: var(--myColor);
position: absolute;
left: 0;
top: 0;
transition: 400ms all;
z-index: 1;
}
结果如下所示:
我的问题是,我需要更改此 :after content 的颜色,基于项目的边界动态地更改内容。
我可以访问 ItemDataBound 上的 RadButton,我试图通过属性更改它但没有成功。
protected void Repeater_Buttons_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
var currentItem = (e.Item.DataItem as MyItem);
var radButton = (e.Item.FindControl("MyButton") as RadButton);
// whishful function I need:
radButton.After.BackgroundColor = currentItem.BackColor;
// or something like
radButton.Attributes.Add("style:after", $"background-color: {currentItem.BackColor}");
}
}
也通过 javascript 方法,但不成功。我无法创建 diffrente css 类 硬编码,因为可以为不同的项目选择任何颜色
也许您可以只向按钮添加 extra/different class 而不是尝试添加内联样式?请参阅下面的示例(没有 telerik 控件)
<asp:Repeater ID="Repeater_Buttons" runat="server" OnItemDataBound="Repeater_Buttons_ItemDataBound">
<ItemTemplate>
<div>
<asp:LinkButton ID="MyButton" runat="server" CssClass="myButton">LinkButton</asp:LinkButton>
</div>
</ItemTemplate>
</asp:Repeater>
<style>
.myButton,
.myButtonDynamic {
background-color: red;
}
.myButton::after {
content: "after";
background-color: yellow;
}
.myButtonDynamic::after {
content: "after";
background-color: green;
}
</style>
然后在ItemDataBound
protected void Repeater_Buttons_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.AlternatingItem)
{
var radButton = (LinkButton)e.Item.FindControl("MyButton");
radButton.CssClass = "myButtonDynamic";
}
}
恕我直言,您不必覆盖现有的 CSS。您的 CSS 已经有
.myButton::after {
...
background-color: var(--myColor);
...
}
因此您只需更改此 --myColor
CSS 变量即可。即使没有服务器调用。全部在客户端上。
举个快速的例子,纯JS就可以做到。这样的 JS 动作可以内置到点击处理程序中。
const root = document.documentElement; //get the root element
...
root.style.setProperty('--myColor', someColorForThisMoment);
或者此类代码可以是 EventListener 的一部分(每次点击时随机更改 --myColor
):
function random(min,max) {
const num = Math.floor(Math.random()*(max-min)) + min;
return num;
}
function getRandomColor() {
return 'rgb(' + random(0,255) + ', ' + random(0,255) + ', ' + random(0,255) + ')';
}
const root = document.documentElement;
root.addEventListener('click', e => {
const newRandomColor = getRandomColor();
root.style.setProperty('--myColor', newRandomColor);
});
UI 造型是客户的工作。不要让您的服务器因冗余调用而超载。
假设 currentItem.BackColor
已经格式化为 CSS 颜色字符串,这应该有效:
var radButton = (e.Item.FindControl("MyButton") as RadButton);
radButton.Style["--myColor"] = currentItem.BackColor;
如果是 System.Drawing.Color
,那么 the ColorTranslator.ToHtml
method 应该会给你所需的字符串。
您可以只写信给自定义 属性
protected void Repeater_Buttons_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
var currentItem = (e.Item.DataItem as MyItem);
var radButton = (e.Item.FindControl("MyButton") as RadButton);
radButton.Attributes.Add("style", $"--myColor: {currentItem.BackColor}");
}
}