0

Not sure if this can be done or not, but I'm banging my head trying to figure it out. So I have a pure CSS modal that utilizes :target to fire. However, I would like to use Javascript to add/remove a class to my Body when it is fired so I can prevent page scrolling behind the modal.

[data-am-modal] {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  overflow-x: hidden;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  z-index: 999;
  width: 0;
  height: 0;
  opacity: 0;
}
[data-am-modal]:target {
  width: auto;
  height: auto;
  opacity: 1;
  -webkit-transition: opacity 400ms ease;
  transition: opacity 400ms ease;
}
[data-am-modal]:target .modal-overlay {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  cursor: default;
  background-color: rgba(0, 0, 0, 0.4);
  z-index: 1;
}
[data-am-modal] .modal-dialog {
  position: relative;
  width: calc(100% - 30px);
  max-width: 600px;
  margin: 15px auto;
  z-index: 2;
}
[data-am-modal] .modal-content {
  background-color: white;
  padding: 30px;
}
[data-am-modal] .modal-close {
  position: absolute;
  top: 15px;
  right: 15px;
}

/* Base Styling */
body {
  margin: 0;
  font-family: 'Open Sans', sans-serif;
}

.link {
  display: inline-block;
  padding: 15px;
  background-color: #1e91c7;
  color: #fff;
  border-radius: 5px;
  text-decoration: none;
}

<a href="#modal-1" class="link">Open Modal</a>

<p>
filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>
</p>


<div data-am-modal id="modal-1">
    <a href="#!" class="modal-overlay"></a>
    <div class="modal-dialog">
        <div class="modal-content">
            <a href="#!" class="modal-close">Close</a>
            <h1>CSS Modal</h1>
            <p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p> <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p> <p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p> <p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p> <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p> <p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p> <p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p> <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p> <p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
        </div>
    </div>
</div>

https://jsfiddle.net/gpjcauye/6/

1 Answer 1

2

You can listen to the hashchange event:

window.addEventListener('hashchange', (evt) =>
  document.body.classList.toggle('modal-on', location.hash === "#modal-1")
);
.modal-on {
  color: green;
}

[data-am-modal] {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  overflow-x: hidden;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  z-index: 999;
  width: 0;
  height: 0;
  opacity: 0;
}

[data-am-modal]:target {
  width: auto;
  height: auto;
  opacity: 1;
  -webkit-transition: opacity 400ms ease;
  transition: opacity 400ms ease;
}

[data-am-modal]:target .modal-overlay {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  cursor: default;
  background-color: rgba(0, 0, 0, 0.4);
  z-index: 1;
}

[data-am-modal] .modal-dialog {
  position: relative;
  width: calc(100% - 30px);
  max-width: 600px;
  margin: 15px auto;
  z-index: 2;
}

[data-am-modal] .modal-content {
  background-color: white;
  padding: 30px;
}

[data-am-modal] .modal-close {
  position: absolute;
  top: 15px;
  right: 15px;
}


/* Base Styling */

body {
  margin: 0;
  font-family: 'Open Sans', sans-serif;
}

.link {
  display: inline-block;
  padding: 15px;
  background-color: #1e91c7;
  color: #fff;
  border-radius: 5px;
  text-decoration: none;
}
<a href="#modal-1" class="link">Open Modal</a>

<p>
  filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler
  text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>filler text<br>
</p>


<div data-am-modal id="modal-1">
  <a href="#!" class="modal-overlay"></a>
  <div class="modal-dialog">
    <div class="modal-content">
      <a href="#!" class="modal-close">Close</a>
      <h1>CSS Modal</h1>
      <p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
      <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
      <p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
      <p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
      <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
      <p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
      <p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
      <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
      <p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
    </div>
  </div>
</div>

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.