javascript - 有没有办法重写这个基本函数,这样我就不会重复相同的行两次?

标签 javascript html css function loops

const body = document.querySelector( `body` );

function getRandomNumber( max ) {
  return Math.floor( Math.random() * max )
}
function getRandomRGB() {
  const colors = [];
  
  for( let i = 0; i < 3; i++ ) {
    const  n = getRandomNumber( 100 + 1 );
    
    colors.push( n );
  }
  return `rgb(${ colors.join( '%,' )}%)`; 
}
function changeRGB() {
  const divs = body.querySelectorAll( `div` );
  
  for( let i = 0; i < divs.length; i++ ) {
    divs[ i ].style.backgroundColor = getRandomRGB();
    divs[ i ].style.transitionDuration = `${ getRandomNumber( 10 ) + 1 }s`;
  }
}

for( let i = 0; i < 25; i++ ) {
  const div = document.createElement( `div` );
  
  div.style.backgroundColor = getRandomRGB();
  div.style.transitionDuration = `${ getRandomNumber( 10 ) + 1 }s`;
  body.appendChild( div ); 
}

setInterval( changeRGB, 1000 );
* {
  box-sizing: border-box; margin: 0; padding: 0;
}
html, body {
  height: 100%;
}
body {
  display: flex; flex-wrap: wrap;
  filter: saturate( 200% );
}
section {
  position: absolute;
  top: 0; right: 0; bottom: 0; left: 0;
  backdrop-filter: blur( 5rem );
  -webkit-backdrop-filter: blur( 5rem );
}
div {
  flex-grow: 1;
  min-width: 25%; min-height: 10%; background-color: #222;
  transition-property: background-color;
  transition-duration: 2s;
}
<section></section>

函数changeRGB():

function changeRGB() {
  const divs = body.querySelectorAll( `div` );
  
  for( let i = 0; i < divs.length; i++ ) {
    divs[ i ].style.backgroundColor = getRandomRGB();
    divs[ i ].style.transitionDuration = `${ getRandomNumber( 10 ) + 1 }s`;
  }
}

以及其后的for循环:

for( let i = 0; i < 25; i++ ) {
  const div = document.createElement( `div` );
  
  div.style.backgroundColor = getRandomRGB();
  div.style.transitionDuration = `${ getRandomNumber( 10 ) + 1 }s`;
  body.appendChild( div ); 
}

包含几乎相同的代码行:

divs[ i ].style.backgroundColor = getRandomRGB();
divs[ i ].style.transitionDuration = `${ getRandomNumber( 10 ) + 1 }s`;

div.style.backgroundColor = getRandomRGB();
div.style.transitionDuration = `${ getRandomNumber( 10 ) + 1 }s`;

分别。

changeRGB() 中,我们操作已经存在的 div,在 for 循环中,我们首先创建这些 div 然后以相同的方式操作它们。我的目标是重构此代码以减少重复性。

我需要用动态的东西替换 divdivs[ i ] ,这样我就可以只调用一个函数并在此处输入正确的值。我不确定循环是否使事情变得更加复杂,但我尝试过 window[variable].style.backgroundColor 等,其中 variable 是动态变量,但没有运气。可能实现错误。

如何使 changeRGB() 函数和 for 循环更少重复且更简洁?

最佳答案

你可以编写另一个像这样的函数:

function applyChange(element) {
    element.style.backgroundColor = getRandomRGB();
    element.style.transitionDuration = `${ getRandomNumber( 10 ) + 1 }s`;
}

你只需这样调用它:

function changeRGB() {
  const divs = body.querySelectorAll( `div` );
  
  for( let i = 0; i < divs.length; i++ ) {
    applyChanges(divs[i]); // <- Call it here
  }
}

for( let i = 0; i < 25; i++ ) {
  const div = document.createElement( `div` );
  
  applyChanges(div); // <- Call it here
  body.appendChild( div ); 
}

这样,您只需传递 div 元素作为提示即可动态使用它。

关于javascript - 有没有办法重写这个基本函数,这样我就不会重复相同的行两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68338877/

相关文章:

css - 如何更改 bulma 占位符颜色?

javascript - 语法错误 : Token '' is unexpected, 期望 [:] 在表达式 [] 从 [}}] 开始的第 4 列

javascript - 从函数体参数获取值

javascript - consolidate javascript - 用于显示内容的悬停导航

html - 嵌入式 Flash 媒体播放器未在网页加载时自动启动

html - CSS - 可以使用一些关于正确定位的指针

javascript - 如何在显示主要内容之前抓取运行 Javascript 且带有 cookie 检查的网页

javascript - 如何使用 Twitter Bootstrap 在图像上获取 div

html - 如何在图像旁边对齐多行文本而不将其换行?

javascript - 当我将鼠标悬停在链接上时,下拉菜单会关闭