diff --git a/src/BootstrapBlazor.Server/Components/Samples/Scrolls.razor b/src/BootstrapBlazor.Server/Components/Samples/Scrolls.razor
index bb0a0e4d497..9667be9c71f 100644
--- a/src/BootstrapBlazor.Server/Components/Samples/Scrolls.razor
+++ b/src/BootstrapBlazor.Server/Components/Samples/Scrolls.razor
@@ -9,10 +9,19 @@
diff --git a/src/BootstrapBlazor.Server/Components/Samples/Scrolls.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/Scrolls.razor.cs
index bb9955d848a..c1367d65615 100644
--- a/src/BootstrapBlazor.Server/Components/Samples/Scrolls.razor.cs
+++ b/src/BootstrapBlazor.Server/Components/Samples/Scrolls.razor.cs
@@ -33,4 +33,9 @@ private AttributeItem[] GetAttributes() =>
DefaultValue = " — "
}
];
+
+ [NotNull]
+ private Scroll? _scroll = null;
+
+ private Task ScrollToBottom() => _scroll.ScrollToBottom();
}
diff --git a/src/BootstrapBlazor.Server/Locales/en-US.json b/src/BootstrapBlazor.Server/Locales/en-US.json
index b0a740221e1..2cce97820e4 100644
--- a/src/BootstrapBlazor.Server/Locales/en-US.json
+++ b/src/BootstrapBlazor.Server/Locales/en-US.json
@@ -1335,8 +1335,9 @@
"ScrollTitle": "Scroll",
"ScrollDescription": "Add scroll bars to components whose height or width exceeds the standard",
"ScrollTips": "The scroll bar can be rendered only when its element has a fixed height. Its height attribute can be set through the coat element",
+ "ScrollToBottom": "Scroll to bottom",
"ScrollNormalTitle": "Common usage",
- "ScrollNormalIntro": "Add a scroll bar to the component. By setting the height of Height to 200px, the scroll bar appears when the height of the inner child element is 400px",
+ "ScrollNormalIntro": "Add a scroll bar to the component. By setting the height of Height to 200px, the scroll bar appears when the height of the inner child element is 500px",
"Desc1": "Subassembly",
"Desc2": "Component height",
"ScrollNormalDescription": "Please scroll the scroll bar on the right",
diff --git a/src/BootstrapBlazor.Server/Locales/zh-CN.json b/src/BootstrapBlazor.Server/Locales/zh-CN.json
index 2fc69848e37..28692348b43 100644
--- a/src/BootstrapBlazor.Server/Locales/zh-CN.json
+++ b/src/BootstrapBlazor.Server/Locales/zh-CN.json
@@ -1335,8 +1335,9 @@
"ScrollTitle": "Scroll 滚动条",
"ScrollDescription": "给高度或者宽度超标的组件增加滚动条",
"ScrollTips": "其元素必须拥有固定高度时才可呈现滚动条,可以通过外套元素设置其 height 属性",
+ "ScrollToBottom": "滚动到底部",
"ScrollNormalTitle": "普通用法",
- "ScrollNormalIntro": "给组件增加滚动条,通过设置 Height 高度值为 200px 使内部子元素高度为 400px 时出现滚动条",
+ "ScrollNormalIntro": "给组件增加滚动条,通过设置 Height 高度值为 200px 使内部子元素高度为 500px 时出现滚动条",
"Desc1": "子组件",
"Desc2": "组件高度",
"ScrollNormalDescription": "请滚动右侧滚动条",
diff --git a/src/BootstrapBlazor/Components/Scroll/Scroll.razor b/src/BootstrapBlazor/Components/Scroll/Scroll.razor
index 470a443dc9e..48aa041b72e 100644
--- a/src/BootstrapBlazor/Components/Scroll/Scroll.razor
+++ b/src/BootstrapBlazor/Components/Scroll/Scroll.razor
@@ -1,6 +1,7 @@
@namespace BootstrapBlazor.Components
-@inherits BootstrapComponentBase
+@inherits BootstrapModuleComponentBase
+@attribute [BootstrapModuleAutoLoader(AutoInvokeInit = false, AutoInvokeDispose = false)]
-
+
@ChildContent
diff --git a/src/BootstrapBlazor/Components/Scroll/Scroll.razor.cs b/src/BootstrapBlazor/Components/Scroll/Scroll.razor.cs
index 38270b46b62..c460d02ca27 100644
--- a/src/BootstrapBlazor/Components/Scroll/Scroll.razor.cs
+++ b/src/BootstrapBlazor/Components/Scroll/Scroll.razor.cs
@@ -59,4 +59,9 @@ public partial class Scroll
[Inject]
[NotNull]
private IOptionsMonitor
? Options { get; set; }
+
+ ///
+ /// 滚动到底部
+ ///
+ public Task ScrollToBottom() => InvokeVoidAsync("scrollToBottom", Id);
}
diff --git a/src/BootstrapBlazor/Components/Scroll/Scroll.razor.js b/src/BootstrapBlazor/Components/Scroll/Scroll.razor.js
new file mode 100644
index 00000000000..652aac0461e
--- /dev/null
+++ b/src/BootstrapBlazor/Components/Scroll/Scroll.razor.js
@@ -0,0 +1,9 @@
+export function scrollToBottom(id) {
+ const el = document.getElementById(id);
+ const top = el.scrollHeight;
+ el.scrollTo({
+ top,
+ left: 0,
+ behavior: "smooth"
+ });
+}
diff --git a/test/UnitTest/Components/ScrollTest.cs b/test/UnitTest/Components/ScrollTest.cs
index 9a25ad512ac..d7f05bc549f 100644
--- a/test/UnitTest/Components/ScrollTest.cs
+++ b/test/UnitTest/Components/ScrollTest.cs
@@ -5,7 +5,7 @@
namespace UnitTest.Components;
-public class ScrollTest : TestBase
+public class ScrollTest : BootstrapBlazorTestBase
{
[Fact]
public void Height_Ok()
@@ -31,20 +31,20 @@ public void ScrollWidth_Ok()
builder.Add(a => a.Width, "500px");
});
- Assert.Equal("", cut.Markup);
+ Assert.Contains("style=\"width: 500px; --bb-scroll-width: 5px; --bb-scroll-hover-width: 5px;\"", cut.Markup);
cut.SetParametersAndRender(builder =>
{
builder.Add(a => a.ScrollWidth, 6);
});
- Assert.Equal("", cut.Markup);
+ Assert.Contains("style=\"width: 500px; --bb-scroll-width: 6px; --bb-scroll-hover-width: 5px;\"", cut.Markup);
cut.SetParametersAndRender(builder =>
{
builder.Add(a => a.ScrollWidth, 6);
builder.Add(a => a.ScrollHoverWidth, 12);
});
- Assert.Equal("", cut.Markup);
+ Assert.Contains("style=\"width: 500px; --bb-scroll-width: 6px; --bb-scroll-hover-width: 12px;\"", cut.Markup);
}
[Fact]
@@ -59,4 +59,17 @@ public void ChildContent_Ok()
Assert.Contains("I am scroll", cut.Markup);
}
+
+ [Fact]
+ public async Task ScrollToBottom_Ok()
+ {
+ var cut = Context.RenderComponent(builder => builder.Add(a => a.ChildContent, r =>
+ {
+ r.OpenElement(0, "div");
+ r.AddContent(1, "I am scroll");
+ r.CloseComponent();
+ }));
+
+ await cut.InvokeAsync(() => cut.Instance.ScrollToBottom());
+ }
}