单击以将样式应用于元素,同时从其他元素中删除

马丁内利

我正在React(Gatsby)中创建一个简单的计算器,我想为我单击的任何操作按钮提供背景颜色,同时从以前单击的其他按钮中删除所有样式。

我知道我可以为每个按钮分配一个状态,然后编写条件删除它们的样式,但这听起来很笨拙。我想知道是否有一种更有机和可扩展的方式来实现这一目标。

预先感谢您的合作。

import React, {useState} from "react";

export default () => {
  const [ input1, setInput1 ] = useState();
  const [ input2, setInput2 ] = useState();
  const [ operation, setOperation ] = useState("add");
  const [ bg, setBg] = useState("");

  const handleInput1 = (event) => {
    const newInput = event.target.value;

    setInput1(prevResult => newInput);
  };

  const handleInput2 = (event) => {
    const newInput = event.target.value;

    setInput2(prevResult => newInput);
  };

  const operationSwitch = () => {
    switch (operation) {
      case "add":
        return parseInt(input1) + parseInt(input2);
        break;
      case "subtract":
        return parseInt(input1) - parseInt(input2);
        break;
      case "multiply":
        return parseInt(input1) * parseInt(input2);
        break;
      case "divide":
        return parseInt(input1) / parseInt(input2);
        break;
    }
  };

  const handleBackground = (event) => {
    event.currentTarget.style.backgroundColor === "red" ? event.currentTarget.style.backgroundColor = "" : event.currentTarget.style.backgroundColor = "red";
  };

  const buttonOperation = {
    add: (event) => {
      event.preventDefault();
      setOperation(newOperation => newOperation = "add");
      handleBackground(event);
    },
    subtract: (event) => {
      event.preventDefault();
      setOperation(newOperation => newOperation = "subtract");
      handleBackground(event);
    },
    multiply: (event) => {
      event.preventDefault();
      setOperation(newOperation => newOperation = "multiply");
      handleBackground(event);
    },
    divide: (event) => {
      event.preventDefault();
      setOperation(newOperation => newOperation = "divide");
      handleBackground(event);
    }
  };

  return (
    <div id="main-grid">
      <main>
        <div id="main-content">
          <input id="input1" type="number" name="input1" value={input1} onChange={handleInput1} />
          <div id="opBtns">
            <button id="add" onClick={buttonOperation.add}>+</button>
            <button id="subtract" onClick={buttonOperation.subtract}>-</button>
            <button id="multiply" onClick={buttonOperation.multiply}>*</button>
            <button id="divide" onClick={buttonOperation.divide}>/</button>
          </div>
          <input id="input2" type="number" name="input2" value={input2} onChange={handleInput2} />
          <h1>=</h1>
          <input id="result" type="number" name="result" value={operationSwitch()}  />
        </div>
      </main>
      <footer>
        Footer
      </footer>
    </div>
  );  
};
/* CSS Reset */
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed, 
figure, figcaption, footer, header, hgroup, 
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
	margin: 0;
	padding: 0;
	border: 0;
	font-size: 100%;
	font: inherit;
	vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure, 
footer, header, hgroup, menu, nav, section {
	display: block;
}
body {
	line-height: 1;
}
ol, ul {
	list-style: none;
}
blockquote, q {
	quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
	content: '';
	content: none;
}
table {
	border-collapse: collapse;
	border-spacing: 0;
}

/* Global CSS */
* {
  box-sizing: border-box;
}

body {
  background: #114357;  /* fallback for old browsers */
  background: -webkit-radial-gradient(circle, #98c064, #576829);  /* Chrome 10-25, Safari 5.1-6 */
  background: radial-gradient(circle, #98c064, #576829); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
  font-family: 'Roboto Mono', monospace;
}

#main-grid {
  display: grid;
  grid-template-columns: repeat(12, 1fr);
  grid-template-rows: repeat(9, 10vh) 10vh;
  grid-template-areas: 
    "main main main main main main main main main main main main"
    "main main main main main main main main main main main main"
    "main main main main main main main main main main main main"
    "main main main main main main main main main main main main"
    "main main main main main main main main main main main main"
    "main main main main main main main main main main main main"
    "main main main main main main main main main main main main"
    "main main main main main main main main main main main main"
    "main main main main main main main main main main main main"
    "footer footer footer footer footer footer footer footer footer footer footer footer";
}

main {
  grid-area: main;
  display: grid;
  grid-template-columns: repeat(12, minmax(1fr, 2fr));
  grid-template-rows: repeat(12, 1fr);
  grid-template-areas:
    ". . . . . . . . . . . ."
    ". . . . . . . . . . . ."
    ". . . . . . . . . . . ."
    ". . . . . . . . . . . ."
    ". . . . . main-content main-content . . . . ."
    ". . . . . main-content main-content . . . . ."
    ". . . . . main-content main-content . . . . ."
    ". . . . . main-content main-content . . . . ."
    ". . . . . . . . . . . ."
    ". . . . . . . . . . . ."
    ". . . . . . . . . . . ."
    ". . . . . . . . . . . .";
}

#main-content {
  /* background-color: royalblue; */
  grid-area: main-content;
  display: flex;
  flex-direction: column;
  justify-content: space-evenly;
}

#input1 {
  grid-area: input1;
  display: block;
  margin: 0 auto;
  border: none;
  border-radius: 5px;
  padding: 5px;
  outline: none;
}

#opBtns {
  grid-area: opBtns;
}

#add {
  grid-area: add;
  width: 25%;
  height: 100%;
}

#subtract {
  grid-area: subtract;
  width: 25%;
  height: 100%;
}

#multiply {
  grid-area: multiply;
  width: 25%;
  height: 100%;
}

#divide {
  grid-area: divide;
  width: 25%;
  height: 100%;
}

#input2 {
  grid-area: input2;
  display: block;
  margin: 0 auto;
  border: none;
  border-radius: 5px;
  padding: 5px;
  outline: none;
}

h1 {
  display: block;
  font-size: 2rem;
  margin: 0 auto;
}

#result {
  grid-area: result;
  display: block;
  margin: 0 auto;
  border: none;
  border-radius: 5px;
  padding: 5px;
  outline: none;
}

footer {
  background-color: rgb(128, 19, 0);
  grid-area: footer;
}

我无法在代码段中设置Gatsby应用,因此我只提供了JavaScript和CSS。如果需要,这里是Github存储库生产环境中部署的站点

千变万化的波

我要做的是添加一个仅显示在所选按钮上的条件属性。

<div id="opBtns">
    <button id="add" onClick={buttonOperation.add} data-selected={operation === "add"}>+</button>
    <button id="subtract" onClick={buttonOperation.subtract} data-selected={operation === "subtract"}>-</button>
    <button id="multiply" onClick={buttonOperation.multiply} data-selected={operation === "multiply"}>*</button>
    <button id="divide" onClick={buttonOperation.divide} data-selected={operation === "divide"}>/</button>
</div>

然后您可以使用CSS定位该按钮

button[data-selected] {
    color: red;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将样式应用于所有元素

来自分类Dev

将CSS中的样式应用于新添加的元素

来自分类Dev

如何避免将CSS样式应用于特定元素

来自分类Dev

将CSS样式应用于其他CSS样式

来自分类Dev

如何将样式应用于类的单个元素,同时从同一类的上一个元素中删除样式?

来自分类Dev

将样式应用于id的<p>元素

来自分类Dev

如何将CSS应用于除悬停元素之外的其他元素?

来自分类Dev

jQuery:同时将功能应用于元素

来自分类Dev

Common Lisp-将功能应用于列表中的所有其他元素

来自分类Dev

将样式应用于新创建的元素的脚本

来自分类Dev

在Angular中的指令属性元素外部单击时,将样式应用于元素

来自分类Dev

将onHover样式应用于MuiButton中的元素

来自分类Dev

无法通过JavaScript将样式应用于HTML元素

来自分类Dev

无法将样式应用于React.js中的样式组件元素

来自分类Dev

仅将CSS样式应用于特定的li元素

来自分类Dev

MakeStyles(材料UI)将样式应用于子元素

来自分类Dev

将样式应用于所有元素

来自分类Dev

无法将样式应用于动态添加的元素

来自分类Dev

将CSS中的样式应用于新添加的元素

来自分类Dev

如何避免将CSS样式应用于特定元素

来自分类Dev

浮动元素也将背景应用于其他div

来自分类Dev

将CSS样式应用于父类的子元素

来自分类Dev

将样式应用于id的<p>元素

来自分类Dev

CSS将样式元素应用于部分孩子

来自分类Dev

无法将样式应用于基于DependencyProperty的RichTextBox元素

来自分类Dev

是否可以将 CSS 样式应用于容器元素?

来自分类Dev

如何使用 Adobe Muse 将其他 CSS 样式应用于特定元素?

来自分类Dev

将 jquery 仅应用于单击的元素子元素

来自分类Dev

根据以下元素将样式应用于 CSS 中的元素

Related 相关文章

  1. 1

    将样式应用于所有元素

  2. 2

    将CSS中的样式应用于新添加的元素

  3. 3

    如何避免将CSS样式应用于特定元素

  4. 4

    将CSS样式应用于其他CSS样式

  5. 5

    如何将样式应用于类的单个元素,同时从同一类的上一个元素中删除样式?

  6. 6

    将样式应用于id的<p>元素

  7. 7

    如何将CSS应用于除悬停元素之外的其他元素?

  8. 8

    jQuery:同时将功能应用于元素

  9. 9

    Common Lisp-将功能应用于列表中的所有其他元素

  10. 10

    将样式应用于新创建的元素的脚本

  11. 11

    在Angular中的指令属性元素外部单击时,将样式应用于元素

  12. 12

    将onHover样式应用于MuiButton中的元素

  13. 13

    无法通过JavaScript将样式应用于HTML元素

  14. 14

    无法将样式应用于React.js中的样式组件元素

  15. 15

    仅将CSS样式应用于特定的li元素

  16. 16

    MakeStyles(材料UI)将样式应用于子元素

  17. 17

    将样式应用于所有元素

  18. 18

    无法将样式应用于动态添加的元素

  19. 19

    将CSS中的样式应用于新添加的元素

  20. 20

    如何避免将CSS样式应用于特定元素

  21. 21

    浮动元素也将背景应用于其他div

  22. 22

    将CSS样式应用于父类的子元素

  23. 23

    将样式应用于id的<p>元素

  24. 24

    CSS将样式元素应用于部分孩子

  25. 25

    无法将样式应用于基于DependencyProperty的RichTextBox元素

  26. 26

    是否可以将 CSS 样式应用于容器元素?

  27. 27

    如何使用 Adobe Muse 将其他 CSS 样式应用于特定元素?

  28. 28

    将 jquery 仅应用于单击的元素子元素

  29. 29

    根据以下元素将样式应用于 CSS 中的元素

热门标签

归档