0

I wanted to divide a landing page into three vertical parts. But I am failing to do so.

Here is my code:

const left = document.querySelector(".left");
const middle = document.querySelector(".middle");
const right = document.querySelector(".right");
const container = document.querySelector(".container");

left.addEventListener("mouseenter", () => {
  container.classList.add("hover-left");
});

left.addEventListener("mouseleave", () => {
  container.classList.remove("hover-left");
});

middle.addEventListener("mouseenter", () => {
  container.classList.add("hover-middle");
});

middle.addEventListener("mouseleave", () => {
  container.classList.remove("hover-middle");
});

right.addEventListener("mouseenter", () => {
  container.classList.add("hover-right");
});

right.addEventListener("mouseleave", () => {
  container.classList.remove("hover-right");
});
:root {
  --container-bg-color: #333;
  --left-bg-color: rgba(223, 39, 39, 0.7);
  --left-button-hover-color: rgba(161, 11, 11, 0.3);
  --middle-bg-color: rgba(39, 217, 223, 0.7);
  --middle-button-hover-color: rgba(14, 32, 196, 0.151);
  --right-bg-color: rgba(43, 43, 43, 0.8);
  --right-button-hover-color: rgba(92, 92, 92, 0.3);
  --hover-width: 70%;
  --other-width: 15%;
  --speed: 1000ms;
}

html,
body {
  padding: 0;
  margin: 0;
  font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;
  width: 100%;
  height: 100%;
  overflow-x: hidden;
}

h1 {
  font-size: 3rem;
  color: #fff;
  position: absolute;
  left: 50%;
  top: 20%;
  transform: translateX(-50%);
  white-space: nowrap;
}

.button {
  display: block;
  position: absolute;
  left: 50%;
  top: 40%;
  height: 2.5rem;
  padding-top: 1.3rem;
  width: 15rem;
  text-align: center;
  color: #fff;
  border: #fff solid 0.2rem;
  font-size: 1rem;
  font-weight: bold;
  text-transform: uppercase;
  text-decoration: none;
  transform: translateX(-50%);
}

.split.left .button:hover {
  background-color: var(--left-button-hover-color);
  border-color: var(--left-button-hover-color);
}

.split.middle .button:hover {
  background-color: var(--middle-button-hover-color);
  border-color: var(--middle-button-hover-color);
}

.split.right .button:hover {
  background-color: var(--right-button-hover-color);
  border-color: var(--right-button-hover-color);
}

.container {
  position: relative;
  width: 100%;
  height: 100%;
  background: var(--container-bg-color);
}

.split {
  position: absolute;
  width: 33.33%;
  height: 100%;
  overflow: hidden;
}

.split.left {
  left: 0;
  background: url('https://image.ibb.co/m56Czw/designer.jpg') center center no-repeat;
  background-size: cover;
}

.split.left:before {
  position: absolute;
  content: "";
  width: 100%;
  height: 100%;
  background: var(--left-bg-color);
}

.split.middle {
  display: inline-block;
  background: url('https://image.ibb.co/m56Czw/designer.jpg') center center no-repeat;
  background-size: cover;
}

.split.middle:before {
  position: absolute;
  content: "";
  width: 100%;
  height: 100%;
  background: var(--middle-bg-color);
}

.split.right {
  right: 0;
  background: url('https://image.ibb.co/m3ZbRb/programmer.png') center center no-repeat;
  background-size: cover;
}

.split.right:before {
  position: absolute;
  content: "";
  width: 100%;
  height: 100%;
  background: var(--right-bg-color);
}

.split.left,
.split.middle,
.split.right,
.split.right:before,
.split.left:before,
.split.middle:before {
  transition: var(--speed) all ease-in-out;
}

.hover-left .left {
  width: var(--hover-width);
}

.hover-left .middle {
  width: var(--other-width);
}

.hover-left .right {
  width: var(--other-width);
}

.hover-left .middle:before {
  z-index: 2;
}

.hover-middle .middle {
  width: var(--hover-width);
}

.hover-middle .left {
  width: var(--other-width);
}

.hover-middle .right {
  width: var(--other-width);
}

.hover-middle .right:before {
  z-index: 2;
}

.hover-right .right {
  width: var(--hover-width);
}

.hover-right .middle {
  width: var(--other-width);
}

.hover-right .left {
  width: var(--other-width);
}

.hover-right .middle:before .left:before {
  z-index: 2;
}

@media(max-width: 800px) {
  h1 {
    font-size: 2rem;
  }
  .button {
    width: 12rem;
  }
}

@media(max-height: 700px) {
  .button {
    top: 70%;
  }
}
<body>
  <div class="container">
    <div class="split left">
      <h1>The Designer</h1>
      <a href="#" class="button">Read More</a>
    </div>

    <div class="split middle">
      <h1>The Middle</h1>
      <a href="#" class="button">Read More</a>
    </div>

    <div class="split right">
      <h1>The Programmer</h1>
      <a href="#" class="button">Read More</a>
    </div>
  </div>
  <script src="js/main.js"></script>
</body>

I am getting an output like this: output of the current code

I wanted to insert .middle into the center part of the page? Where am I making a mistake? Transitions are also overlapping onto each other.

Rajesh
  • 24,354
  • 5
  • 48
  • 79
  • Welcome to `Stack Overflow`, Please consider using a [**MCVE** (**M**inimal **C**omplete **V**erifiable **E**xample)](https://stackoverflow.com/help/mcve).. – Hille Jan 04 '18 at 11:53
  • I have done some changes in your css. Check below solution. – Bhuwan Jan 04 '18 at 12:14

3 Answers3

0

you could try adding in your css:

..essentialy moving the middle container 33.3% to the left (where the first container ends)

.split.middle {
 left: 33.3%
}

although the best way would be to use display:flex https://css-tricks.com/snippets/css/a-guide-to-flexbox/

Jimmy H.
  • 121
  • 1
  • 4
0

Did some changes in your CSS code. You have to set the position of the middle section on hover like below

.split.middle {
  left: 33.333%;
}

.hover-left .middle {
  left: 70%;
}

.hover-middle .middle {
  left: 15%;
}

.hover-right .middle {
  left: 13%;
}

const left = document.querySelector(".left");
const middle = document.querySelector(".middle");
const right = document.querySelector(".right");
const container = document.querySelector(".container");

left.addEventListener("mouseenter", () => {
  container.classList.add("hover-left");
});

left.addEventListener("mouseleave", () => {
  container.classList.remove("hover-left");
});

middle.addEventListener("mouseenter", () => {
  container.classList.add("hover-middle");
});

middle.addEventListener("mouseleave", () => {
  container.classList.remove("hover-middle");
});

right.addEventListener("mouseenter", () => {
  container.classList.add("hover-right");
});

right.addEventListener("mouseleave", () => {
  container.classList.remove("hover-right");
});
:root {
  --container-bg-color: #333;
  --left-bg-color: rgba(223, 39, 39, 0.7);
  --left-button-hover-color: rgba(161, 11, 11, 0.3);
  --middle-bg-color: rgba(39, 217, 223, 0.7);
  --middle-button-hover-color: rgba(14, 32, 196, 0.151);
  --right-bg-color: rgba(43, 43, 43, 0.8);
  --right-button-hover-color: rgba(92, 92, 92, 0.3);
  --hover-width: 70%;
  --other-width: 15%;
  --speed: 1000ms;
}

html,
body {
  padding: 0;
  margin: 0;
  font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;
  width: 100%;
  height: 100%;
  overflow-x: hidden;
}

h1 {
  font-size: 3rem;
  color: #fff;
  position: absolute;
  left: 50%;
  top: 20%;
  transform: translateX(-50%);
  white-space: nowrap;
}

.button {
  display: block;
  position: absolute;
  left: 50%;
  top: 40%;
  height: 2.5rem;
  padding-top: 1.3rem;
  width: 15rem;
  text-align: center;
  color: #fff;
  border: #fff solid 0.2rem;
  font-size: 1rem;
  font-weight: bold;
  text-transform: uppercase;
  text-decoration: none;
  transform: translateX(-50%);
}

.split.left .button:hover {
  background-color: var(--left-button-hover-color);
  border-color: var(--left-button-hover-color);
}

.split.middle .button:hover {
  background-color: var(--middle-button-hover-color);
  border-color: var(--middle-button-hover-color);
}

.split.right .button:hover {
  background-color: var(--right-button-hover-color);
  border-color: var(--right-button-hover-color);
}

.container {
  position: relative;
  width: 100%;
  height: 100%;
  background: var(--container-bg-color);
}

.split {
  position: absolute;
  width: 33.33%;
  height: 100%;
  overflow: hidden;
}

.split.left {
  left: 0;
  background: url('https://image.ibb.co/m56Czw/designer.jpg') center center no-repeat;
  background-size: cover;
}

.split.left:before {
  position: absolute;
  content: "";
  width: 100%;
  height: 100%;
  background: var(--left-bg-color);
}

.split.middle {
  left: 33.333%;
  display: inline-block;
  background: url('https://image.ibb.co/m56Czw/designer.jpg') center center no-repeat;
  background-size: cover;
}

.split.middle:before {
  position: absolute;
  content: "";
  width: 100%;
  height: 100%;
  background: var(--middle-bg-color);
}

.split.right {
  right: 0;
  background: url('https://image.ibb.co/m3ZbRb/programmer.png') center center no-repeat;
  background-size: cover;
}

.split.right:before {
  position: absolute;
  content: "";
  width: 100%;
  height: 100%;
  background: var(--right-bg-color);
}

.split.left,
.split.middle,
.split.right,
.split.right:before,
.split.left:before,
.split.middle:before {
  transition: var(--speed) all ease-in-out;
}

.hover-left .left {
  width: var(--hover-width);
}

.hover-left .middle {
  width: var(--other-width);
  left: 70%;
}

.hover-left .right {
  width: var(--other-width);
}

.hover-left .middle:before {
  z-index: 2;
}

.hover-middle .middle {
  width: var(--hover-width);
  left: 15%;
}

.hover-middle .left {
  width: var(--other-width);
}

.hover-middle .right {
  width: var(--other-width);
}

.hover-middle .right:before {
  z-index: 2;
}

.hover-right .right {
  width: var(--hover-width);
}

.hover-right .middle {
  width: var(--other-width);
  left: 15%;
}

.hover-right .left {
  width: var(--other-width);
}

.hover-right .middle:before .left:before {
  z-index: 2;
}

@media(max-width: 800px) {
  h1 {
    font-size: 2rem;
  }
  .button {
    width: 12rem;
  }
}

@media(max-height: 700px) {
  .button {
    top: 70%;
  }
}
<body>
  <div class="container">
    <div class="split left">
      <h1>The Designer</h1>
      <a href="#" class="button">Read More</a>
    </div>

    <div class="split middle">
      <h1>The Middle</h1>
      <a href="#" class="button">Read More</a>
    </div>

    <div class="split right">
      <h1>The Programmer</h1>
      <a href="#" class="button">Read More</a>
    </div>
  </div>
  <script src="js/main.js"></script>
</body>
Bhuwan
  • 16,525
  • 5
  • 34
  • 57
0

You can do this entirely in CSS with Flexbox. Make the container <div> a flex container:

.container {
  display: flex;
}

And the split <div>s flex items:

.split {
  flex: 15 1 0;
}

15 (flex-grow): each flex item will take 15 "shares" of extra horizontal space
1 (flex-shrink): flex items will shrink evenly, each giving up 1 "share" of horizontal space
0 (flex-basis): base width of each flex item is 0 instead of being based on its content

And for the widening effect, make the hovered <div> greedy:

.split:hover {
  flex-grow: 70;
}

You can avoid the extra ::before pseudo-elements with gradient backgrounds:

.split.middle {
  background:
    linear-gradient(var(--middle-bg-color), var(--middle-bg-color)),
    url('https://image.ibb.co/m56Czw/designer.jpg') center center no-repeat;
  background-size: cover;
}

This creates a background image with a gradient that fades from one semitransparent color to the same semitransparent color, and puts it on top of your JPEG background image.

Remove all the positioning code on the <div>s, and you're set.

:root {
  --container-bg-color: #333;
  --left-bg-color: rgba(223, 39, 39, 0.7);
  --left-button-hover-color: rgba(161, 11, 11, 0.3);
  --middle-bg-color: rgba(39, 217, 223, 0.7);
  --middle-button-hover-color: rgba(14, 32, 196, 0.151);
  --right-bg-color: rgba(43, 43, 43, 0.8);
  --right-button-hover-color: rgba(92, 92, 92, 0.3);
  --hover-width: 70;
  --other-width: 15;
  --speed: 1000ms;
}

html,
body {
  padding: 0;
  margin: 0;
  font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;
  width: 100%;
  height: 100%;
  overflow-x: hidden;
}

h1 {
  font-size: 3rem;
  color: #fff;
  position: absolute;
  left: 50%;
  top: 20%;
  transform: translateX(-50%);
  white-space: nowrap;
}

.button {
  display: block;
  position: absolute;
  left: 50%;
  top: 40%;
  height: 2.5rem;
  padding-top: 1.3rem;
  width: 15rem;
  text-align: center;
  color: #fff;
  border: #fff solid 0.2rem;
  font-size: 1rem;
  font-weight: bold;
  text-transform: uppercase;
  text-decoration: none;
  transform: translateX(-50%);
}

.split.left .button:hover {
  background-color: var(--left-button-hover-color);
  border-color: var(--left-button-hover-color);
}

.split.middle .button:hover {
  background-color: var(--middle-button-hover-color);
  border-color: var(--middle-button-hover-color);
}

.split.right .button:hover {
  background-color: var(--right-button-hover-color);
  border-color: var(--right-button-hover-color);
}

.container {
  position: relative;
  width: 100%;
  height: 100%;
  background: var(--container-bg-color);
  display: flex;
}

.split {
  position: relative;
  height: 100%;
  overflow: hidden;
  flex: var(--other-width) 1 0;
  transition: var(--speed) all ease-in-out;
}

.split.left {
  background:
    linear-gradient(var(--left-bg-color), var(--left-bg-color)),
    url('https://image.ibb.co/m56Czw/designer.jpg') center center no-repeat;
  background-size: cover;
}

.split.middle {
  background:
    linear-gradient(var(--middle-bg-color), var(--middle-bg-color)),
    url('https://image.ibb.co/m56Czw/designer.jpg') center center no-repeat;
  background-size: cover;
}

.split.right {
  background:
    linear-gradient(var(--right-bg-color), var(--right-bg-color)),
    url('https://image.ibb.co/m3ZbRb/programmer.png') center center no-repeat;
  background-size: cover;
}

.split:hover {
  flex-grow: var(--hover-width);
}

@media(max-width: 800px) {
  h1 {
    font-size: 2rem;
  }
  .button {
    width: 12rem;
  }
}

@media(max-height: 700px) {
  .button {
    top: 70%;
  }
}
<body>
  <div class="container">
    <div class="split left">
      <h1>The Designer</h1>
      <a href="#" class="button">Read More</a>
    </div>

    <div class="split middle">
      <h1>The Middle</h1>
      <a href="#" class="button">Read More</a>
    </div>

    <div class="split right">
      <h1>The Programmer</h1>
      <a href="#" class="button">Read More</a>
    </div>
  </div>
</body>
AuxTaco
  • 4,883
  • 1
  • 12
  • 27