JavaScript addEventListener "click" for button that moves while clicking

Chewie The Chorkie :

I have a button styled to move when clicking. If the button is not in position with the mouse cursor when releasing, the click function is not triggered. How can I still make the click function trigger as expected?

Here is a fiddle with the HTML, CSS and JavaScript. Notice if you hold a click and release in a place where the button does not exist under your mouse pointer, it will not trigger the function. https://jsfiddle.net/du1eL8gc/1/

Just a note: I know that it makes sense this does not trigger because the button is actually moving out of place, I just want to have it work as a user would expect.

HTML:

    <div class="buttons-dialog" style="position:absolute; bottom:20px; left:33%">
        <a class="button" id="saveButton">Save</a>
    </div>

CSS:

@import url('https://fonts.googleapis.com/css?family=IBM+Plex+Mono');

:root {
  --blueColor: #0028aa;
  --darkBlueColor: #022693;
  --errorColor: rgb(255, 130, 0);
  --grayColor: #bcbdaa;
  --darkgrayColor: #525252;
  --cyanColor: #59ffff;
  --yellowColor: #fffa51;
  --emeraldColor: #184343;
  --lightEmeraldColor: #38a6a6;
  --redColor: #9c0b07;
  --badTextColor: #fe6666;
  --highlightTextColor: #ffffff;
  --fontName: 'IBM Plex Mono', monospaced;

  font-family: var(--fontName);
  font-size: 16px;
}

body {
  background: var(--blueColor);  
}

.button-panel {
  margin-bottom: 1.5em;
}

.button {
  background: var(--darkgrayColor);
  border: 0;
  font-family: var(--fontName);
  font-size: 1rem;
  color: var(--grayColor);
  outline: 0;
  padding: 2px;
  margin-right: 1em;
  box-shadow: 10px 8px 0 black;
  text-decoration: none;
}

.buttonNoShadow {
  background: var(--darkgrayColor);
  border: 0;
  font-family: var(--fontName);
  font-size: 1rem;
  color: var(--grayColor);
  outline: 0;
  padding: 2px;
  margin-right: 1em;
  text-decoration: none;
}

.button:active {
    color: var(--highlightColor);
    position: relative;
    left: 10px;
    top: 8px;
    box-shadow: none;
  }

.button::before {
    content: "▯ ";
    color: var(--highlightColor);
  }

.button::after {
    content: " ▯";
    color: var(--highlightColor);
  }

JavaScript:

document.getElementById("saveButton").addEventListener("click", function () {
    console.log('clicked')
});
Ed Lucas :

You can use your JavaScript with the "mouseup" event and have it work by wrapping your button content and moving that content instead of your button.

Working example: https://jsfiddle.net/8a5upveg/3/

For instance you can wrap the text in a <span>:

<a class="button" id="saveButton"><span>Save</span></a>

Then change your CSS to target the <span>:

.button {
  // Seems necessary to catch top pixel of button click
  padding: 1px;
}

.button span {
  background: var(--darkgrayColor);
  border: 0;
  font-family: var(--fontName);
  font-size: 1rem;
  color: var(--grayColor);
  outline: 0;
  padding: 2px;
  margin-right: 1em;
  box-shadow: 10px 8px 0 black;
  text-decoration: none;
}

.buttonNoShadow span {
  background: var(--darkgrayColor);
  border: 0;
  font-family: var(--fontName);
  font-size: 1rem;
  color: var(--grayColor);
  outline: 0;
  padding: 2px;
  margin-right: 1em;
  text-decoration: none;
}

.button:active span {
    color: var(--highlightColor);
    position: relative;
    left: 10px;
    top: 8px;
    box-shadow: none;
  }

.button span::before {
    content: "▯ ";
    color: var(--highlightColor);
  }

.button span::after {
    content: " ▯";
    color: var(--highlightColor);
  }

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=12346&siteId=1