Blazorアプリで、sectionタグを指定して画面ジャンプする

Blazorのクライアントアプリで、sectionタグを指定して、JavaScriptを使って画面ジャンプしてみます。

![3z4j0-gmdwm.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110304/695f41ec-6801-c039-a2aa-ef80a0148fe1.gif)

#### 開発環境
Windows10 
Visual Studio 2019
.Net Core 3.0 
Blazor template Version: 3.0.0-preview9.19465.2


## index.htmlにJavaScriptを書く

`wwwroot\index.html`に、JavaScriptを書きます。画面上からはこのScriptの処理が呼ばれます。

```html:index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title>BlazorApp9</title>
    <base href="/" />
    <link href="css/bootstrap/bootstrap.min.css" rel="stylesheet" />
    <link href="css/site.css" rel="stylesheet" />
    
    <!--scrollIntoViewを行う処理-->
    <script>
        window.scrollToElementId = (elementId) => {
            console.info('scrolling to element', elementId);
            var element = document.getElementById(elementId);
            if (!element) {
                console.warn('element was not found', elementId);
                return false;
            }
            element.scrollIntoView();
            return true;
        }
    </script>

</head>
<body>
    <app>Loading...</app>

    <script src="_framework/blazor.webassembly.js"></script>
</body>
</html>
```

##呼び出し側の処理

razorページから、JavaScriptの処理を呼び出します。例では、デフォルトプロジェクトの`Pages\FetchData.razor`に処理を書いています。

```html:FetchData.razor
@page "/fetchdata"
@inject HttpClient Http
@inject IJSRuntime JSRuntime      @*追加*@

@*Topのsection*@
<section id="top" />

<h1>Weather forecast</h1>

<p>This component demonstrates fetching data from the server.</p>

@*下へジャンプするボタン*@
<button class="btn btn-primary" @onclick="onbottom">下へ</button>

@if (forecasts == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <table class="table">
        <thead>
            <tr>
                <th>Date</th>
                <th>Temp. (C)</th>
                <th>Temp. (F)</th>
                <th>Summary</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var forecast in forecasts)
            {
                <tr>
                    <td>@forecast.Date.ToShortDateString()</td>
                    <td>@forecast.TemperatureC</td>
                    <td>@forecast.TemperatureF</td>
                    <td>@forecast.Summary</td>
                </tr>
            }
        </tbody>
    </table>
}
@*bottomのsection*@
<section id="bottom" />
@*上へジャンプするボタン*@
<button class="btn btn-primary" @onclick="ontop">上へ</button>

@code {

    /// <summary>
    /// 下へジャンプ
    /// </summary>
    void onbottom()
    {
        JSRuntime.InvokeAsync<bool>("scrollToElementId", "bottom");
    }

    /// <summary>
    /// 上へジャンプ
    /// </summary>
    void ontop()
    {
        JSRuntime.InvokeAsync<bool>("scrollToElementId", "top");
    }


 
    WeatherForecast[] forecasts;


    protected override async Task OnInitializedAsync()
    {
        var tmp = await Http.GetJsonAsync<WeatherForecast[]>("sample-data/weather.json");

        var l = new List<WeatherForecast>();

        for (int i = 0; i < 5; i++)
        {
            l.AddRange(tmp);
        }

        forecasts = l.ToArray();

    }

    public class WeatherForecast
    {
        public DateTime Date { get; set; }

        public int TemperatureC { get; set; }

        public string Summary { get; set; }

        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
    }
}



```

動きのあるページを作ろうとすると、まだまだJavaScriptが必要と感じます。

### 参考記事
[Scroll to specified part of page when clicking top navigation link in Blazor](https://stackoverflow.com/questions/55186784/scroll-to-specified-part-of-page-when-clicking-top-navigation-link-in-blazor)
[BlazorにおけるJavaScript相互運用機能をちょっとだけコードリーディング](https://qiita.com/RyotaMurohoshi/items/5c8d7082e54adf9a9e4c)