Quantcast
Channel: Active questions tagged blazor - Stack Overflow
Viewing all articles
Browse latest Browse all 4839

Using On Scroll Events in Blazor to Add or Remove Classes

$
0
0

I need help creating a script to work in a Blazor project running Web Assembly and the latest version of .NET. The script should add or remove classes on a menu element based on the amount the browser window has been scrolled(Y).

See demo of what I am trying to achieve for Blazor (scrolling up and down should show/hide the topbar):

(function() {"use strict";  /**   * Easy selector helper function   */  const select = (el, all = false) => {    el = el.trim()    if (all) {      return [...document.querySelectorAll(el)]    } else {      return document.querySelector(el)    }  }  /**   * Easy on scroll event listener    */  const onscroll = (el, listener) => {    el.addEventListener('scroll', listener)  }  /**   * Hide topbar on scroll   */  let selectTopbar = select('.topbar')  let selectMenubar = select('.menubar')  if (selectMenubar) {    const menuScrolled = () => {      if (window.scrollY > 100) {        selectMenubar.classList.add('menu-scrolled')        if (selectTopbar) {          selectTopbar.classList.add('topbar-scrolled')        }      } else {        selectMenubar.classList.remove('menu-scrolled')        if (selectTopbar) {          selectTopbar.classList.remove('topbar-scrolled')        }      }    }    window.addEventListener('load', menuScrolled)    onscroll(document, menuScrolled)  }})()
/* Default Theme Overrides */:root {  --mdc-theme-primary: #00a0af !important;  --mdc-theme-secondary: #f68e1e !important;}/* Main Nav Desktop */body:has(.mdc-tab--active:not(:first-of-type)), body:has(.mdc-drawer-app-content .nav-btn-hide) {  overflow-y: hidden; /* prevent double scroll bars */}.topbar {  background-color: #eee;  color: #069;  display: flex;  justify-content: start;  height: 40px;  width: 100%;  font-size: 0.9em;  padding: 0.5em 1em;  margin: 0 auto;}.menubar {  display: flex;  height: 60px;  min-width: auto;  position: relative;}.mdc-tab-scroller {  flex: 1;}.mdc-tab-scroller__scroll-content {  flex-wrap: wrap;  width: 100%;}.nav-drawer-container:has(.topbar-scrolled) {  top: -40px;}.nav-drawer-container {  background-color: #fff;  font-family: "Open Sans", arial, helvetica, sans-serif !important;  position: fixed !important;  top: 0;  transition: all 0.3s;  z-index: 100;}.nav-drawer-container:has(.mdc-tab--active:not(:first-of-type)) .nav-tabgroup-container {  min-height: 100%;  overflow-y: auto;  overflow-x: hidden;  position: fixed;  top: 0;}.nav-drawer-container, .nav-drawer-container .nav-tabgroup-container, .nav-drawer-container .nav-tabgroup-container .mat-tab-group-content, #hero {  width: 100%;}.mdc-tab-bar .mdc-tab, .mdc-drawer-app-content > div {  height: 60px;}.nav-drawer-container a.flhc {  content: "";  background-image: none;  background-position: center;  background-repeat: no-repeat;  background-size: 167px;  cursor: pointer;  display: flex;  align-self: center;  width: 170px;  height: 50px;  margin-right: 0.75em;  margin-left: 0.75em;  outline: none;  text-decoration: none;}.nav-drawer-container .mdc-tab-bar {  background-color: #fff;  display: flex;  flex-wrap: nowrap;  justify-content: start;}.nav-drawer-container .mdc-tab-bar .mdc-tab {  max-width: max-content;}.nav-drawer-container .mdc-tab-bar, .mdc-drawer-app-content > div {  box-shadow: 0 1px 5px rgba(0, 102, 153, .25);}.nav-tabgroup-container span.mdc-tab__text-label {  color: #006699;  font-family: "Open Sans", sans-serif;  font-size: 0.99em;  font-weight: 500;  letter-spacing: normal;  text-transform: capitalize;  -webkit-text-stroke: 0.01em #006699;  z-index: initial;}.nav-tabgroup-container .mdc-tab-indicator .mdc-tab-indicator__content--underline {  border: none;}.nav-tabgroup-container .mdc-tab-indicator .mdc-tab-indicator__content--underline::after {  content: "";  background-color: #ffa927;  display: block;  position: absolute;  bottom: 0;  left: 0;  width: 0;  height: 0.2em;  transition: 0.2s all ease;  visibility: hidden;}.nav-tabgroup-container .mdc-tab-indicator--active .mdc-tab-indicator__content--underline::after {  width: 100%;  transition-delay: 0.1s;  visibility: visible;}.nav-tabgroup-container .nav-list {  margin-top: 2em;}.nav-tabgroup-container .nav-list h4, .nav-tabgroup-container .nav-list ul {  margin-left: 0.75em !important;}.nav-tabgroup-container .mdc-tab-bar .mdc-tab {  flex: 1;  min-width: 100px;}/* Close Active Tab - Default Tab Over Active Tab */.nav-tabgroup-container .mdc-tab:first-of-type {  display: flex;  margin: 0;  position: absolute;  top: 0;  left: 0;  min-width: 100px;  z-index: 100;}.nav-tabgroup-container .mdc-tab--active:first-of-type {  display: none;}.nav-tabgroup-container .mdc-tab-bar:has(.mdc-tab--active:nth-child(3)) .mdc-tab:first-of-type {  left: 195px;}.nav-tabgroup-container .mdc-tab-bar:has(.mdc-tab--active:nth-child(4)) .mdc-tab:first-of-type {  left: 295px;  min-width: 160px;}.nav-tabgroup-container .mdc-tab-bar:has(.mdc-tab--active:nth-child(5)) .mdc-tab:first-of-type {  left: 455px;  min-width: 150px;}.nav-tabgroup-container .mdc-tab-bar:has(.mdc-tab--active:nth-child(6)) .mdc-tab:first-of-type {  left: 605px;  min-width: 115px;}/* Main Nav Mobile */.nav-drawer-container >:not(.nav-tabgroup-container) a.flhc {  position: absolute;  top: 0.15em;  right:0;  bottom:0;  left: 1em;}.nav-drawer-container button {  background-color: #fff;  color: #006699 !important;  letter-spacing: 0.01em !important;  margin-top: 0.75em;  margin-left: 0.75em;  text-transform: capitalize !important;  transition: 0.5s all ease;}.nav-drawer-container button:hover {  background-color: #ecf1f7 !important;}.nav-drawer-container button:focus, .nav-drawer-container button:focus-visible {  outline: none;}.nav-btn-hide, .nav-btn-open {  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23006699' stroke='%23006699' stroke-linecap='round' stroke-miterlimit='10' stroke-width='.8' viewBox='0 0 16 16'%3E%3Cpath d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E");  background-size: 20px;  background-repeat: no-repeat;  background-position: top left;  height: 20px;  padding-left: 1.35rem;}.nav-btn-open {  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23006699' stroke='%23006699' stroke-linecap='round' stroke-miterlimit='10' stroke-width='.6' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M2.5 12a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E") !important;  padding-left: 1.5rem !important;}.nav-drawer-container .mdc-drawer-app-content:has(button.mdc-button) > div {  display: flex;  justify-content: flex-end;  padding-right: 1.75em;}.nav-drawer-container:has(.nav-btn-hide) button {  background-color: #ecf1f7 !important;  z-index: 100;}.mat-drawer.mdc-drawer--open:not(.mdc-drawer--closing)+.mdc-drawer-app-content, .mdc-drawer.mdc-drawer--open:not(.mdc-drawer--closing)+.mdc-drawer-app-content {  margin: initial !important;}.nav-drawer-container > aside, .nav-tabgroup-container .nav-list {  background-color: #006699;  color: #fff;}.nav-drawer-container > aside.mat-drawer, .nav-tabgroup-container .nav-list {  width: 100%;}.nav-drawer-container > aside .nav-description, .nav-drawer-container > aside .nav-list, .nav-tabgroup-container .nav-list .nav-description, .nav-tabgroup-container .nav-list {  padding: 0.7em;}.nav-drawer-container > aside .nav-description, .nav-tabgroup-container .nav-list .nav-description {  background-color: rgba(0,0,0,.1);  border-radius: 4px;  grid-column: 1/-1;  width: 100%;}.nav-drawer-container .nav-description {  font-size: 0.8em;  font-weight: 600;  letter-spacing: 0.01em;  line-height: 1.4em;}.nav-drawer-container .nav-description small {  font-size: 1em;  font-weight: normal;}.nav-drawer-container > aside .nav-list, .nav-tabgroup-container .nav-list {  display: grid;  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));  grid-gap: 1.3em;  margin: 0 auto;}.nav-drawer-container > aside .nav-list ul li, .nav-tabgroup-container .nav-list ul li {  margin: 0.7em 0;}.nav-drawer-container > aside .nav-list h4, .nav-tabgroup-container .nav-list h4 {  border-bottom: 2px solid #fff6;  display: inline-block;  font-weight: 600;  font-size: 0.9em;}.nav-drawer-container > aside .nav-list ul, .nav-tabgroup-container .nav-list ul {  font-size: 0.9em;  font-weight: normal;  list-style: none;  margin-left: 0;  padding-left: 0;}.nav-drawer-container > aside .nav-list ul li a, .nav-tabgroup-container .nav-list ul li a {  color: #fff;  text-decoration: underline;  text-decoration-color: transparent;  transition: 0.2s all ease;}.nav-drawer-container > aside .nav-list ul li a:hover, .nav-tabgroup-container .nav-list ul li a:hover {  text-decoration-color: #fff;}/* Main Nav Mobile Accordion */.mat-accordion:has(.nav-list) {  border-top: 1px solid rgba(0,0,0,.2);  margin-top: 3.5em;}.mat-accordion .mat-expansion-panel:has(.nav-list) {  background-color: transparent;  border-bottom: 1px solid rgba(0,0,0,.2);  box-shadow: none;}.mat-expansion-panel__content:has(.nav-list) {  background-color: #005580;}.mat-accordion:has(.nav-list) .mat-expansion-panel__summary .after {  font-size: 1.85em !important;  -webkit-text-stroke: 0.02em #006699;}/* Default Accordion Overrides */.mat-accordion .mat-expansion-panel.mat-expansion-panel--expanded {  margin-top: 0 !important;  margin-bottom: 0 !important;}.mat-accordion .mat-expansion-panel__summary {  height: 60px !important;}.mat-expansion-panel__header {  flex-basis: 50% !important;  font-size: 1em !important;}/* Hero */#hero {  display: flex;  align-items: center;  justify-content: center;  background-color: #00a0af !important;  background: url("https://www.flhealthcharts.gov/charts/images/hero-bg1.png") center;  background-position: top center;  background-size: 2000px;  background-repeat: no-repeat;  overflow: hidden;  position: relative;  padding: 1em 0;  margin: 50px 0 200px 0;  z-index: 99;  transition: 0.3s;}#hero:before {  content: "";  background-color: #008ca0;  background: rgb(0,140,160);  background: -moz-radial-gradient(circle, rgba(0,140,160,0.7) 0%, rgba(0,140,160,1) 60%, rgba(0,140,160,1) 90%);  background: -webkit-radial-gradient(circle, rgba(0,140,160,0.7) 0%, rgba(0,140,160,1) 60%, rgba(0,140,160,1) 90%);  background: radial-gradient(circle, rgba(0,140,160,0.7) 0%, rgba(0,140,160,1) 60%, rgba(0,140,160,1) 90%);  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#00b4cc",endColorstr="#008ca0",GradientType=1);  position: absolute;  bottom: 0;  top: 0;  left: 0;  right: 0;  opacity: .5;  mix-blend-mode: overlay;}#hero h1 {  color: #fff;  font-family: "Raleway", sans-serif;  font-size: 48px;  font-variant: lining-nums;  font-weight: 700;  text-align: center;}#hero p {  font-family: "Open Sans", sans-serif;  width: 80%;  -webkit-animation-delay: 0.4s;  animation-delay: 0.4s;  margin: 0 auto 30px auto;  color: #fff;}#hero .btn-get-started {  font-family: "Raleway", sans-serif;  font-weight: 600;  font-size: 14px;  font-variant: lining-nums;  letter-spacing: 1px;  display: inline-block;  padding: 12px 32px;  border-radius: 50px;  transition: 0.5s;  line-height: 1;  margin: 10px;  color: #fff;  -webkit-animation-delay: 0.8s;  animation-delay: 0.8s;  border: 2px solid #ffa927;}#hero .btn-get-started:hover {  background: #ffa927;  color: #fff;  text-decoration: none;}/* Hero Inner */#hero.inner {  min-height: 200px;}#hero.inner h1 {  margin-top: 100px;  margin-bottom: -30px;  font-size: 1.85em;  font-weight: bold;  text-shadow: 0px 2px 20px rgba(0, 102, 153, 0.75);  text-align: center;}/* Hero Search Bar */#hero .herosearch {  width: 840px;  margin: 0 auto;  text-align: center;  padding-top: 40px;}#hero .herosearch div {  color: #fff;  position: relative;  padding: 30px;}#hero .herosearch div h1 {  text-shadow: 0px 2px 20px rgba(0, 102, 153, 0.75);  font-size: 2em;  font-weight: bold;}#hero .herosearch div p {  text-shadow: 0px 1px 10px rgba(0, 102, 153, 1);  font-size: 1.15em;  font-weight: 600;  line-height: 1.2em;  width: 60%;}#hero .herosearch form {  box-shadow: 0px 2px 10px 8px rgba(0, 102, 153, 0.15);  margin-top: 30px;}#hero .herosearch form input[type=search] {  width: 100%;}/* Breakpoint and Down - Hero Styles */@media (min-width: 1024px) {  #hero p {    width: 60%;  }}@media screen and (max-width: 991px) {  #hero .herosearch div {    padding: 30px 70px;  }  #hero .herosearch div h1 {    font-size: 1.8em;  }  #hero .herosearch div p {    font-size: 1em;  }}@media screen and (max-width: 768px) {  #hero .herosearch div h1 {    font-size: 1.7em;  }  #hero .herosearch div p {    width: 90%;  }}@media screen and (max-width: 414px) {  #hero .herosearch div h1 {    font-size: 1.5em;    width: 100%;  }  #hero .herosearch div p {    width: 100%;  }  #hero .herosearch form.roundsearchbar input[type=submit] {    background-image: url("data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 8 8' style='enable-background:new 0 0 8 8;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:none;stroke:%23FFFFFF;stroke-width:0.6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;%7D .st1%7Bfill:none;stroke:%23FFFFFF;stroke-width:0.9;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;%7D%0A%3C/style%3E%3Ccircle class='st0' cx='3.5' cy='3.5' r='2'/%3E%3Cline class='st1' x1='5.1' y1='5.1' x2='6.5' y2='6.5'/%3E%3C/svg%3E");    background-position: center center;    background-repeat: no-repeat;    background-size: 1.9em;    padding: 0 2em;    text-indent: -999em;    }}/* Round Search Bar */form.roundsearchbar {  background: #fff;  border-radius: 50px;  height: 45px;  position: relative;  overflow: hidden;}form.roundsearchbar input[type=search] {  border: 0;  border-radius: 50px;  height: 45px;  padding-left: 1.3em;  text-align: left;}form.roundsearchbar input[type=submit] {  position: absolute;  top: 0;  right: 0;  bottom: 0;  border: 0;  background: none;  font-size: 16px;  font-weight: 600;  padding: 0 25px;  margin: 3px;  background: #ffa927;  color: #fff;  transition: 0.3s;  border-radius: 50px;}form.roundsearchbar input[type=submit]:hover {  background: #f68e1e;}form.roundsearchbar:has(input.form-control:focus) {  outline: 5px solid #fff4 !important;  transition: all 0.1s ease;}/* Add some breathing room to mobile search bar */form.form-inline.roundsearchbar {  width: 85% !important;}/* Switch Placeholder Text */form.roundsearchbar input[type=search]:focus + .switch-text {  display: none;}.switch-text {  background-color: #fff;  border: none;  border-radius: 50px;  color: #6c757d;  display: flex;  pointer-events: none;  position: absolute;  top: 0;  left: 0;  height: 45px;  width: 100%;}.switch {  display: flex;  flex-direction: column;  font-style: normal;  justify-content: center;  padding-left: 1.3em;  position: absolute;  top: 0;  bottom: 0;  left: 0;  opacity: 0;  animation: changeword 12s ease infinite;}.switch:nth-child(1) {  animation-delay: 0s;}.switch:nth-child(2) {  animation-delay: 3s;}.switch:nth-child(3) {  animation-delay: 6s;}.switch:nth-child(4) {  animation-delay: 9s;}@keyframes changeword {  0% {    transform: translateY(-40px);    opacity: 0;  }  2% {    opacity: 0.8;    transform: translateY(0);  }  20% {    opacity: 1;    transform: translateY(0);  }  30% {    opacity: 0;    transform: translateY(0);  }  80% {    opacity: 0;    transform: translateY(0);  }}
<section class="nav-drawer-container"><div class="nav-tabgroup-container"><div class="topbar">Top Bar</div><div class="menubar"><a class="flhc" href="#" aria-label="home">Menu Bar</a></div></div></section><section id="hero"><div class="herosearch"><div><h1>Test Title</h1><p>Some information about the tests results.</p><form class="roundsearchbar" role="search"><input class="form-control" type="search" placeholder="Start typing to search" aria-label="Search"><span class="switch-text"><em class="switch">Type a test word</em><em class="switch">Find a specific test</em><em class="switch">Search for tests</em><em class="switch">Find more tests</em></span><input type="submit" value="Search"></form></div></div></section>

I have read articles about calling javascript from blazor (such as here), but I am not knowledgeable enough to have the script work on the app index page.

I also made a demo using blazorfiddle. Any help is much appreciated!


Viewing all articles
Browse latest Browse all 4839

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>