简体   繁体   English

HTML 和 Javascript - 将灰度应用于表格中的图像,然后将鼠标悬停在图像上 go 返回彩色版本

[英]HTML with Javascript - Apply grayscale to images in a table, then mouseover images to go back to colored version

I had a question about using the mouseover / mouseout event in javascript along with applying grayscale to a table.我有一个关于在 javascript 中使用 mouseover / mouseout 事件以及将灰度应用于表格的问题。 The question says that I must first making an image grid (table) all gray in html. Then I need to add javascript to the html so that when I mouse over the image, the image turns into a colored image, and when I mouse out from the image, the image reverts back into a gray image.问题说我必须首先在 html 中制作一个全灰色的图像网格(表格)。然后我需要将 javascript 添加到 html 以便当我将鼠标悬停在图像上时,图像变成彩色图像,当我将鼠标移出时从图像中,图像恢复为灰色图像。 The problem said no CSS is allowed, so only using javascript and html, if possible.问题说不允许使用 CSS,所以如果可能的话,只使用 javascript 和 html。 Thank you so much in advance for the help, I really appreciate it!提前非常感谢您的帮助,我真的很感激!

Here is some of my code below (the table images need to start from grayscale, then apply/remove the grayscale when using the mouseover event. So far the mouseover effect only works on the first image. And I also don't know how to apply a grayscale filter over the whole table first).这是我下面的一些代码(表格图像需要从灰度开始,然后在使用鼠标悬停事件时应用/删除灰度。到目前为止,鼠标悬停效果仅适用于第一张图像。我也不知道如何首先在整个表格上应用灰度过滤器)。

 function image_grayscale() { document.getElementById("image").style.filter = "grayscale(100%)"; } function remove_grayscale() { document.getElementById("image").style.filter = "grayscale(0%)"; }
 <div class="table"> <table border="3" align=center width="600" height="200"> <tr style="width:1";style="height:10%"; bgcolor="white"> <td onmouseover="remove_grayscale()" onmouseout="image_grayscale()"> <img id="image" src="https://picsum.photos/id/1067/100/100" width="100" height="100" /> </td> <td onmouseover="remove_grayscale()" onmouseout="image_grayscale()"> <img id="image" style="grayscale" src="https://picsum.photos/id/1067/100/100" width="100" height="100" /> </td> <td onmouseover="remove_grayscale()" onmouseout="image_grayscale()"> <img id="image" src="https://picsum.photos/id/1067/100/100" width="100" height="100" /> </td> <td onmouseover="remove_grayscale()" onmouseout="image_grayscale()"> <img id="image" src="https://picsum.photos/id/1067/100/100" width="100" height="100" /> </td> <td onmouseover="remove_grayscale()" onmouseout="image_grayscale()"> <img id="image" src="https://picsum.photos/id/1067/100/100" width="100" height="100" /> </td> <td onmouseover="remove_grayscale()" onmouseout="image_grayscale()"> <img id="image" src="https://picsum.photos/id/1067/100/100" width="100" height="100" /> </td> </tr> </table>

I'd personally suggest the following:我个人建议如下:

 // define the function as a constant, using Arrow syntax; // here we take the Event Object ('evt', passed from the (later) // use of EventTarget.addEventListener(). From the Event-Object // we retrieve the element to which the function was bound // (evt.currentTarget), and update its CSSStyleDeclaration // for the filter() function. // We use a template-literal string (delimited with back-ticks // to interpolate the JavaScript into the string, using the // ${JavaScript here} notation. // Based on the event-type we return the arguments of either // 0 or 1; if the evt.type is exactly 'mouseenter' 0 is // returned from the conditional operator, otherwise 1 is // returned: const toggleGrayscale = (evt) => evt.currentTarget.style.filter = `grayscale( ${evt.type === 'mouseenter'? 0: 1} )`, // here we retrieve a NodeList of all <img> elements within the document: images = document.querySelectorAll('img'); // we iterate over the NodeList of images to set them to // grayscale(), initially: images.forEach( (img) => img.style.filter = "grayscale(1)" ); // we iterate again (as Array.prototype.forEach() has no // return value; here we use EventTarget.addEventListener() // to bind the toggleGrayscale function for both the // 'mouseenter' and 'mouseleave' events: images.forEach( (img) => { img.addEventListener('mouseenter', toggleGrayscale) img.addEventListener('mouseleave', toggleGrayscale) });
 *, ::before, ::after { box-sizing: border-box; margin: 0; padding: 0; } table { border-collapse: collapse; table-layout: fixed; }
 <div class="table"> <table> <tr> <td> <,-- I removed the size/width attributes since they don't seem to be useful; use CSS, also duplicate ids are invalid: an id must be unique within the document:--> <img src="https.//placeimg:com/200/200/animals"> </td> <td> <img src="https.//placeimg:com/200/200/architecture"> </td> <td> <img src="https.//placeimg:com/200/200/nature"> </td> <td> <img src="https.//placeimg:com/200/200/people"> </td> <td> <img src="https.//placeimg.com/200/200/tech"> </td> </table>

References:参考:

  1. An id attribute must be unique. id属性必须是唯一的。
  2. Don't clutter the HTML more than necessary.不要把 HTML 乱七八糟。 It should be really easy to read.它应该很容易阅读。
  3. Use addEventListener instead of onmouseover .使用 addEventListener 而不是onmouseover
  4. Method names are usually written with kebabCase (see the new method I added).方法名通常用 kebabCase 写法(看我新加的方法)。
  5. Don't repeat code.不要重复代码。 Instead, refactor similar code into a new method.相反,将类似代码重构为新方法。

 let table = document.getElementById('greyscaleTable') table.addEventListener('mouseover', remove_grayscale); table.addEventListener('mouseout', image_grayscale); function image_grayscale(event) { let element = event.target; changeGrayscale('100%', element); } function remove_grayscale(event) { let element = event.target; changeGrayscale('0%', element); } function changeGrayscale(amount, element) { let isGrayscaleImage = element.classList.contains('grayscale'); if (isGrayscaleImage) { element.style.filter = `grayscale(${amount})`; } }
 #greyscaleTable img { width: 100px; height: 100px; }
 <div id="greyscaleTable" class="table"> <table border="3" align=center width="600" height="200"> <tr> <td> <img class="grayscale" style="filter: grayscale(100%)" src="https://picsum.photos/id/1067/100/100" /> </td> <td> <img class="grayscale" style="filter: grayscale(100%)" src="https://picsum.photos/id/1067/100/100" /> </td> <td> <img class="grayscale" style="filter: grayscale(100%)" src="https://picsum.photos/id/1067/100/100"/> </td> <td> <img class="grayscale" style="filter: grayscale(100%)" src="https://picsum.photos/id/1067/100/100"/> </td> <td> <img class="grayscale" style="filter: grayscale(100%)" src="https://picsum.photos/id/1067/100/100" /> </td> <td> <img class="grayscale" style="filter: grayscale(100%)" src="https://picsum.photos/id/1067/100/100" /> </td> </tr> </table>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM