|
|

楼主 |
发表于 2024-1-2 22:53
|
显示全部楼层
本帖最后由 马黑黑 于 2024-1-2 23:50 编辑
代码:- <style>
- #ma { margin: 50px auto 0; padding: 8px; width: fit-content; max-width: 256px; box-sizing: border-box; height: fit-content; border-radius: 10px; background: linear-gradient(to right bottom, #666,tan); box-shadow: 2px 4px 8px black; }
- #calcMsg, #calcRes { padding: 6px; color: #eee; font-size: 18px; word-break: break-all; }
- #calcRes { text-align: right; color: #000; font-size: 20px; background: #eee; }
- #calc { display: grid; place-items: center; grid-template-columns: repeat(4, 60px); grid-template-rows: repeat(5, 50px); }
- .btn, .clear { width: 40px; height: 40px; border-radius: 50%; background: #aaa; box-shadow: inset 0 0 10px #000; font: normal 20px/40px sans-serif; text-align: center; user-select: none; cursor: pointer; }
- .btn:hover, .clear:hover { background: #ccc; }
- .num { color: darkred; font-weight: bold; }
- </style>
- <div id="ma">
- <div id="calcMsg">计算器</div>
- <div id="calcRes">0</div>
- <div id="calc">
- <div class="clear" id="clear">C</div>
- <div class="btn" data-idx="(">(</div>
- <div class="btn" data-idx=")">)</div>
- <div class="clear" id="del">←</div>
- <div class="btn num" data-idx="7">7</div>
- <div class="btn num" data-idx="8">8</div>
- <div class="btn num" data-idx="9">9</div>
- <div class="btn" data-idx="/">÷</div>
- <div class="btn num" data-idx="4">4</div>
- <div class="btn num" data-idx="5">5</div>
- <div class="btn num" data-idx="6">6</div>
- <div class="btn" data-idx="*">×</div>
- <div class="btn num" data-idx="1">1</div>
- <div class="btn num" data-idx="2">2</div>
- <div class="btn num" data-idx="3">3</div>
- <div class="btn num" data-idx="-">-</div>
- <div class="btn num" data-idx="0">0</div>
- <div class="btn" data-idx=".">.</div>
- <div class="btn" id="percent">%</div>
- <div class="btn" data-idx="+">+</div>
- <div class="clear" id="pow2">x²</div>
- <div class="clear" id="pow3">x³</div>
- <div class="clear" id="sqrt">√</div>
- <div class="clear" id="equal" data-idx="=">=</div>
- </div>
- </div>
-
- <script>
- let btns = document.querySelectorAll('.btn'); /* 非id运算类按钮 */
- /* 运算函数 */
- let _eval = (fn) => new Function('return ' + fn)();
- /* 处理运算结果 */
- let calc = (str) => {
- let res;
- try {
- res = _eval(str);
- res = res == Infinity ? '∞' : num2Fixed(res);
- } catch(err) {
- res = '算式非法';
- }
- return res;
- };
- /* 非id类按钮点击事件 */
- btns.forEach(item => {
- item.onclick = () => {
- if(calcRes.innerText === '0') {
- if(item.dataset.idx === '0') {
- calcRes.innerText = '0';
- }else{
- calcRes.innerText = isNaN(parseInt(item.dataset.idx)) ? '0' + item.dataset.idx : item.dataset.idx;
- }
- }else{
- calcRes.innerText += item.dataset.idx;
- }
- calcMsg.innerText = calcRes.innerText;
- }
- });
- /* C按钮点击事件 */
- clear.onclick = () => {
- calcMsg.innerText = '计算器';
- calcRes.innerText = '0';
- };
- /* =按钮点击事件 */
- equal.onclick = () => {
- let result = calc(calcRes.innerText);
- if(result === '算式非法') {
- calcMsg.innerText = result;
- }else{
- calcRes.innerText = result;
- }
- if(calcMsg.innerText.lastIndexOf('=') < 0) calcMsg.innerText += '=';
- };
- /* ←按钮点击事件 */
- del.onclick = () => {
- calcRes.innerText = calcRes.innerText.slice(0,-1) || 0;
- calcMsg.innerText = calcRes.innerText;
- };
- /* 开方&幂运算按钮点击事件 */
- [pow2,pow3,sqrt].forEach(elm => {
- elm.onclick = () => {
- let str = calcRes.innerText;
- switch (elm.id) {
- case 'pow2':
- calcRes.innerText = sq_pow(str,'pow','2');
- calcMsg.innerText = `${str}²`;
- break;
- case 'pow3':
- calcRes.innerText = sq_pow(str,'pow','3');
- calcMsg.innerText = `${str}³=`;
- break;
- default:
- calcRes.innerText = sq_pow(str,'sqrt');
- calcMsg.innerText = calcRes.innerText.replace('Math.sqrt','√');
- };
- };
- });
- /* %按钮点击事件*/
- percent.onclick = () => {
- let num = calcRes.innerText;
- calcRes.innerText = _eval(num/100);
- calcMsg.innerText = num + '/100=';
- };
- /* 处理JS浮点数运算bug问题 */
- let num2Fixed = (res) => {
- let str = typeof(res) === 'number' ? res.toString() : res;
- let ar = str.split('.');
- /* 如果有小数点,需要排除科学计数小数点 */
- if(ar.length <= 1 || str.indexOf('e') > -1) return res;
- if(ar[1].length >= 14) str = str.slice(0,-1);
- return parseFloat(str);
- };
- /* 幂&开方运算 */
- let sq_pow = (str,operator,arg='') => {
- operator = 'Math.' + operator;
- let regex = /(\([0-9\+\-\*\/]+\))$|(\d+(\.\d+)?)$/g;
- if(regex.test(str)) {
- strRes = str.match(regex)[0];
- str = str.replace(regex, arg ? `${operator}(${strRes},${arg})` : `${operator}(${strRes})`);
- }
- return str;
- };
- </script>
复制代码
|
评分
-
| 参与人数 1 | 威望 +50 |
金钱 +100 |
经验 +50 |
收起
理由
|
红影
| + 50 |
+ 100 |
+ 50 |
赞一个! |
查看全部评分
|