Bootstrap 4 Equal height columns not working - html

I have two columns next to each other but the content inside them is different but the columns are different I was lead to believe this was default it bootstrap 4 or it was in one of the alphas at one point.
Currently I have tried.
.equal {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
flex-wrap: wrap;
}
.equal > [class*='col-'] {
display: flex;
flex-direction: column;
}
and added that to my css.
and my html looks like.
<div class="row equal">
<div class="col-md-8"></div>
<div class="col-md-4"></div>
</div>
but it doesnt seem to affect it in any way.
edit seems like its not the column but the content inside said column that isnt 100% of its parent.
but if i do height: 100% it makes it 100vh for some reason and not 100% of the column height.
https://codepen.io/anon/pen/KBEegO
in this i have made divs inside it i need them divs 100% of the parent column
that is the current view of the row and column the border is on the inner div of the column.
I need it so if there is more content in the left column the right column is the same height as it and if the right column is as it is on the image the left column gets its height.

For div inside that, you can use position absolute with CSS transform and translate property.
.innerdiv {
top: 50%;
position:absolute;
left: 50%;
transform: translate(-50%, -50%);
}
This will make your inner div verticle and horizontal center.

I have updated the codepen please check https://codepen.io/anon/pen/KBEejz?editors=1100
.equal div div {
border: 1px solid green;
height: 100%;
display: flex;
flex: 1;
}
.equal>[class*='col-'] {
display: flex;
flex-direction: column;
}
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css" rel="stylesheet" />
<div class="row equal">
<div class="col-md-8">
<div>
<p style="background-color:pink;">Lorem ipsum, dolor sit amet consectetur adipisicing elit. Quis quibusdam nobis praesentium hic vero quo quia error sed commodi cumque, illo porro eaque ad ipsa. Error maxime consequatur officiis alias fuga mollitia quas, magnam delectus necessitatibus
illum, quos aperiam doloremque eaque explicabo architecto dolor? Placeat quos nemo natus velit aliquam?</p>
</div>
</div>
<div class="col-md-4">
<div>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Adipisci blanditiis commodi sapiente totam sequi consectetur provident. Voluptatibus corrupti odit reiciendis, aliquid temporibus dolores tempore optio delectus nesciunt ipsam veritatis quisquam
facilis voluptatem voluptates inventore aliquam, praesentium, assumenda ducimus ratione quasi nisi sunt consequatur corporis soluta. Deleniti quam harum soluta alias minima voluptas iusto voluptates, iure necessitatibus assumenda ex. Minus numquam
beatae vero aperiam cupiditate assumenda ipsam hic ad corporis placeat facere consequuntur consectetur sint, aspernatur mollitia optio odit eos officia nostrum? Totam asperiores quia sequi autem. Ex nostrum fuga, et, illo iusto inventore officiis
facere minima hic sint obcaecati consectetur.</p>
</div>
</div>
</div>

Related

CSS: left to right newspaper-style columns with differently sized boxes [duplicate]

This question already has answers here:
CSS-only masonry layout
(4 answers)
Closed 5 months ago.
I want to arrange differently sized boxes in a "newspaper-style", but with elements arranged left-to-right first, and then top-to-bottom. So the goal is to get something that looks like this:
I know that the column module was built for news-paper-style layouts, but it arranges the elements top-to-bottom first, and then left-to-right:
Here's the most important CSS, a full example is in this Codepen:
.container {
column-count: 3;
max-width: 960px;
width: 100%;
}
.box {
width: 300px;
break-inside: avoid;
height: fit-content;
}
Using a flexbox with wrapping will arrange the elements left-to-right first, but it will create gaps below the shorter elements (Codepen):
.container {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
max-width: 960px;
width: 100%;
}
Is there a way to achieve the desired layout using plain CSS?
The idea is quite simple. flex-flow: column with wrap can do precisely what column-count does. You'll need two conditions to make it work: 1. The flexbox container needs to have a fixed height and it needs to be taller than your tallest column. 2. Flex children need width, 50% for 2-column layout, 33% for 3-column layout, etc.
This approach has the same problem as column-count: the elements are ordered by column, top-down. But since we're using flexbox, now we get access to the order property.
Using :nth-child() and order we can override the default order.
Items with order: 1 will go in the first column, order: 2 will go in the second column, and order: 3 in the third column.
In (an + b) formula a represents a cycle size, n is a counter (starts at 0), and b is an offset value. So (3n+1) selects every third item starting with the first one. (3n+2) selects every third item but starting with the second item. And (3n) selects every third item starting with the third item, since there's nothing at index 0.
In certain layouts, columns might merge. To solve this issue,insert pseudo-elements between columns:
Read more about the method
This is Another Post about Horizontal Line Masonry
I have also changed margin-bottom: 0px; on .box & used gap:5px on the flex-container/your .container
.container {
display: flex;
flex-flow: column wrap;
gap:5px;
height: 600px;
max-width: 960px;
width: 100%;
}
.box {
width: 300px;
break-inside: avoid;
height: fit-content;
padding: 7px;
border-radius: 15px;
margin-bottom: 0px;
cursor: pointer;
border: 1px solid grey;
text-align: justify;
}
.box:nth-child(3n+1) {
order: 1;
}
.box:nth-child(3n+2) {
order: 2;
}
.box:nth-child(3n) {
order: 3;
}
.container::before,
.container::after {
content: "";
flex-basis: 100%;
width: 0;
order: 2;
}
.header {
font-size: 1.5rem;
font-weight: bold;
}
body {
font-family: monospace;
}
<div class="container">
<div class="box">
<div class="header">1 Heading</div>
<div class="content">Lorem ipsum dolor sit amet consectetur adipisicing elit. Rerum sint praesentium accusantium quidem magnam laborum atque harum, distinctio facilis amet. Quidem nulla beatae fugiat modi repellat laborum, animi natus quaerat?
</a>
</div>
</div>
<div class="box">
<div class="header">2 Another heading</div>
<div class="content">Lorem ipsum dolor sit amet consectetur adipisicing elit. Odit quos optio doloribus eaque ex. Nesciunt harum vel maxime eaque vero, ipsum nihil at ipsam numquam blanditiis esse voluptate, iste aspernatur! Earum asperiores praesentium ipsam illo eius
sed ut autem velit consequatur adipisci voluptate, expedita voluptatem mollitia saepe, rem amet maiores dolorem et quos. Nulla temporibus necessitatibus inventore assumenda consequatur optio!</div>
</div>
<div class="box">
<div class="header">3 Another heading</div>
<div class="content">Lorem ipsum dolor sit amet consectetur adipisicing elit. Sequi dolores doloribus, soluta dicta cumque rem iusto quibusdam! Quae earum, consequuntur impedit adipisci culpa vero amet minima, modi laboriosam asperiores illum! Doloremque pariatur repudiandae
aspernatur quidem ad voluptates vero! Commodi perspiciatis enim porro possimus quidem! Veritatis cumque repellat neque laborum commodi assumenda, vitae in saepe quae quibusdam officia corrupti, adipisci tempora.</div>
</div>
<div class="box">
<div class="header">4 Heading</div>
<div class="content">Lorem ipsum dolor sit amet consectetur adipisicing elit. Rerum sint praesentium accusantium quidem magnam laborum atque harum, distinctio facilis amet. Quidem nulla beatae fugiat modi repellat laborum, animi natus quaerat?</div>
</div>
<div class="box">
<div class="header">5 Heading</div>
<div class="content">Lorem ipsum dolor sit amet consectetur adipisicing elit. Reprehenderit, voluptate. Fugiat labore tenetur quidem cum! Consectetur mollitia quas, veritatis nulla maiores, neque ullam fugiat ea explicabo tenetur perspiciatis enim sit. Ipsum tempora sunt
delectus repellendus sed, quisquam error quos rem, ipsa aspernatur unde inventore culpa saepe est iusto. Eaque doloremque illum incidunt, quo vel magni libero rem sunt natus alias. Fuga vitae consectetur cumque repellat id fugit et molestiae unde
facilis eos. Dolore accusantium id fugiat debitis quod iusto odit, quam, illum corporis minima eius. Eum quam numquam exercitationem sed.
</div>
</div>
<div class="box">
<div class="header">6 Heading</div>
<div class="content">Lorem ipsum dolor sit amet consectetur adipisicing elit. Rerum sint praesentium accusantium quidem magnam laborum atque harum, distinctio facilis amet. Quidem nulla beatae fugiat modi repellat laborum, animi natus quaerat?</div>
</div>
</div>

Text Div and Image Div side by side in Parallax website

I'm making a parallax website and at the top of the page I want the left to be text and the right to be an image. At this moment in time the image only shows up under the text div.
.section {
width: 100%;
text-align: center;
padding: 50px 80px;
}
.sub-section {
margin: 0;
padding: 0;
width: auto;
}
<section class="section section-light">
<div class="sub-section">
<h2>Section 1</h2>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Distinctio neque quam quis minima, rerum consequatur ex porro alias iure ducimus ipsam eligendi ullam mollitia delectus id magnam numquam, excepturi beatae laudantium voluptatibus accusantium quia?
Omnis quia harum ab provident, dolor earum itaque maiores quasi iusto soluta fugiat eos cumque dignissimos sint laudantium reprehenderit quod excepturi voluptate reiciendis ipsum laborum architecto vitae! Modi nobis ipsum laudantium fugit reiciendis
alias corrupti laboriosam quasi voluptates necessitatibus distinctio cum pariatur dolorum labore qui, ad sed saepe, nam porro sequi eaque officiis quod minus sint? Provident modi dolores recusandae laboriosam a cumque doloribus nisi repudiandae.
</p>
</div>
<img src="resources/img/scene1image.png" alt="scene1image.png">
</section>
If you want your text to be on the left and image on the right, you need to create one div containing the text and one div containing the image. Then you can put both of it into 1 div to contain both of them (nested divs) and set inline-block to both the inner divs.
You can then set both the inner divs to 50% , so they make up 100% of the width. But since you have a padding (left and right) of 80px, use calc(50%-80px) so that you create a width of 50% - 8px.
Try this:
* {
padding: 0;
margin: 0;
}
.section {
width: 100%;
text-align: center;
padding: 50px 0 50px 80px;
}
.sub-section {
margin: 0;
padding: 0;
width: auto;
display: inline-block;
width: calc(50% - 80px);
}
.sub-section-img {
display: inline-block;
width: calc(50% - 80px);
}
.sub-section-img img {
width: 100%;
height: 80vh;
}
<section class="section section-light">
<div class="sub-section">
<h2>Section 1</h2>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Distinctio neque quam quis minima, rerum consequatur ex porro alias iure ducimus ipsam eligendi ullam mollitia delectus id magnam numquam, excepturi beatae laudantium voluptatibus accusantium quia?
Omnis quia harum ab provident, dolor earum itaque maiores quasi iusto soluta fugiat eos cumque dignissimos sint laudantium reprehenderit quod excepturi voluptate reiciendis ipsum laborum architecto vitae! Modi nobis ipsum laudantium fugit reiciendis
alias corrupti laboriosam quasi voluptates necessitatibus distinctio cum pariatur dolorum labore qui, ad sed saepe, nam porro sequi eaque officiis quod minus sint? Provident modi dolores recusandae laboriosam a cumque doloribus nisi repudiandae.
</p>
</div>
<div class="sub-section-img">
<img src="http://lorempixel.com/200/200/" alt="scene1image.png">
</div>
</section>
Edit:
1) Added a new CSS rule with vh. Now, you can set the image height to the exact height. You got to do trial and error to suit your exact height desired, just increase / decrease the value in height: 80vh.
2) Removed the padding on the right since you want the image to the edge. Changed the values in .section css.
3) If you want absolutely no gap to right of the image, then add the CSS reset (removal of the default padding and margin).
* {
padding: 0;
margin: 0;
}

Want to make contentless div responsive to height of adjacent div

Making a Reactjs app. Referring to the code, I would like to make the height of the colorTab div, equal and responsive to that of the content div. The height of content must be dynamic given that I would like it to be defined by the amount of text in tile + description, which is variable, and the width of the window.
Currently, when I omit min-height from colorTab's CSS and simply have height: 100%; defining colorTab's height, colorTab disappears. Adding the min-height gives it that height but then it becomes unresponsive to the height of content which is the goal. How do I solve this issue?
JSX:
<div className="wrapper">
<div className="colorTab" style={color}>
</div>
<div className="content">
<tr>
<td className="title">
<a href={link}>{title}</a>
</td>
</tr>
<tr>
<td className="description">
{description}
</td>
</tr>
</div>
</div>
CSS:
.wrapper {
min-height: 48px;
overflow: hidden;
}
.colorTab {
float: left;
position: relative;
width: 5px;
min-height: 48px;
height: 100%;
border-radius: 5px;
margin-left: 15px;
}
.title {
padding-top: 0 !important;
padding-bottom: 0 !important;
}
.description {
padding-top: 0 !important;
padding-bottom: 0 !important;
}
Flexbox will offer the functionality you need.
Put display: flex on your container class. And flex: 1 on your content div. No matter how much content you place in the content div the colorTab div will match its height.
Example in pure HTML/CSS (no React):
.wrapper {
overflow: hidden;
display: flex;
}
.colorTab {
position: relative;
width: 5px;
border-radius: 5px;
background: red;
}
.content {
flex: 1;
}
<div class="wrapper">
<div class="colorTab">
</div>
<div class="content">
<div class="title">
<a>Your Title</a>
</div>
<div class="description">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rem nam perspiciatis aperiam mollitia obcaecati molestiae, consequuntur saepe repellendus cumque aliquid. Ullam reiciendis praesentium repellendus ipsam, qui illum. At, aliquid quidem. Reprehenderit eligendi voluptatem maiores deleniti id nulla, pariatur ipsa ducimus accusantium! Unde ea nostrum eligendi suscipit impedit, laborum adipisci accusamus ducimus temporibus eius inventore optio officia reiciendis porro eos assumenda numquam velit obcaecati. Perferendis, ipsum! Facilis fuga dolorum nobis nihil illo nam, voluptate suscipit excepturi sunt non. Modi perferendis ex illum eaque pariatur laudantium saepe accusantium vel, blanditiis, aperiam odit! Suscipit ullam, necessitatibus est distinctio obcaecati, odio ipsa blanditiis consequatur.
</div>
</div>
Now, I would absolutely recommend the flexbox mentioned in the other answer but...
but for some other outdated browsers which do not support it (cough
cough looking at you, grandpa, using that same old version of IE)... it
might be good idea to provide extra version support.
So, for answer's completion sake:
The other option is to utilize the tables.
.wrapper {
display: table;
}
.description {
display: table-cell;
}
.colorTab {
display: table-cell;
width: 5px;
border-radius: 5px;
background: red;
}
// not necessary, but for esthetic reasons
.content {
position: relative;
left: 10px;
}
<div class="wrapper">
<div class="colorTab">
</div>
<div class="content">
<div class="title">
<a>Your Title</a>
</div>
<div class="description">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rem nam perspiciatis aperiam mollitia obcaecati molestiae, consequuntur saepe repellendus cumque aliquid. Ullam reiciendis praesentium repellendus ipsam, qui illum. At, aliquid quidem. Reprehenderit eligendi voluptatem maiores deleniti id nulla, pariatur ipsa ducimus accusantium! Unde ea nostrum eligendi suscipit impedit, laborum adipisci accusamus ducimus temporibus eius inventore optio officia reiciendis porro eos assumenda numquam velit obcaecati. Perferendis, ipsum! Facilis fuga dolorum nobis nihil illo nam, voluptate suscipit excepturi sunt non. Modi perferendis ex illum eaque pariatur laudantium saepe accusantium vel, blanditiis, aperiam odit! Suscipit ullam, necessitatibus est distinctio obcaecati, odio ipsa blanditiis consequatur.
</div>
</div>

Shrink second child to always fit a parent [duplicate]

This question already has answers here:
Make div (height) occupy parent remaining height
(9 answers)
Closed 6 years ago.
Assume we have following markup
<div id="parent">
<div id="header">
</div>
<div id="content">
</div>
</div>
header div is variable-sized, so we don't know what exact offset gets the second one. We want to accomplish two following objectives:
The second div should never overflow its parent. If overflow occurs, the scrollbar appears.
It should be done in pure-CSS manner, for IE9+ if possible.
I have been thinking that this task is pretty easy, really, I just want my div to be non-overflowing, that's all, but I found that it's not possible even with flexbox.
When i say overflow I mean vertical overflow, because they all are of the same width.
It's very simple to do this with Flexbox, just set flex-direction: column on parent and overflow-y: auto on content.
#parent {
height: 300px;
border: 1px solid black;
display: flex;
flex-direction: column;
width: 200px;
}
#header {
background: lightblue;
}
#content {
flex: 1;
overflow-y: auto;
background: lightgreen;
}
<div id="parent">
<div id="header"><br><br><br></div>
<div id="content">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque culpa consequuntur repellat ex, ut cumque fugit minus, itaque omnis, cum quidem in debitis. Consequuntur perspiciatis corporis nostrum similique eveniet voluptates cumque molestias rerum, distinctio accusamus? Quas explicabo, ea praesentium ad velit rem accusamus officia quibusdam ut accusantium possimus dignissimos dolores ipsum quia placeat tenetur omnis veritatis molestias voluptatibus consequuntur odit consectetur vero, voluptas corporis laudantium! Rem laborum excepturi quia temporibus, veniam blanditiis tempore eaque nostrum suscipit, quam laboriosam ratione provident obcaecati iste magni molestiae explicabo quibusdam expedita veritatis officia, debitis officiis sed. Neque veniam eius saepe. Quo doloremque, repellat mollitia!</div>
</div>

adjust margin in just 1 div [duplicate]

This question already has answers here:
Margin on child element moves parent element
(18 answers)
Closed 6 years ago.
Well, now I've this problem, I want to adjust just the margin on the "c2" but when I set it to X, it changes the "c1" div margin :S
Here's the code I'm using:
<header>
<div class="jumbotron">
<center><h1>Bienvenidos a JVasconcelos.me</h1></center>
</div>
</header>
<div class="container">
<div class="row">
<div class="col-md-12 col-centered">
<div class="c1">
<div class="c2">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quis inventore illum quaerat laboriosam eos, vel sed suscipit cumque laborum est animi aliquid tempora iusto beatae quam quisquam porro dolore! Ullam tenetur doloribus ducimus, totam voluptatum, deleniti vero voluptatem eius architecto velit neque voluptas aliquam quidem sed eveniet! Nobis ex eos iste dolorum tempora doloremque non deleniti, aperiam quibusdam corrupti officia consequatur, impedit. Exercitationem debitis iste voluptatum, illo nulla iure culpa ex fugit, aliquid dolorem excepturi, impedit voluptates quae quidem error earum natus, provident eum vitae. Tempore ducimus laborum voluptates, qui aspernatur odit dolorum modi quas cupiditate unde quam earum amet!
</p>
</div>
</div>
</div>
</div>
</div>
CSS
div.c1 { height: 100vh; background: #417ba1; margin-top: -30px; padding: 0px 30px; }
div.c2 { height: 90%; background: #fff; margin-top: 0px; padding: 60px 30px; }
.jumbotron { background: url("../img/header_bg.png") no-repeat; height: 100%; }
Ah. You're looking for
.c1 {
overflow: auto; // or hidden or overlay
}
This behavior is due to the collapsing margins part of the box model spec. Putting overflow: auto|hidden|overlay on the parent will establish a new block formatting context and stop the margins from collapsing.
This is because the border of the c1 and c2 are collapsing. You have to hide the overflow (with overflow: hidden or any overflow different that default, which is visible) of the container to avoid that the c1 also get the margin of c2.
div.c1 { height: 100vh; background: #417ba1; overflow: hidden; margin-top: -30px; padding: 0px 30px; }
div.c2 { height: 90%; background: #fff; margin-top: 20px; padding: 60px 30px; }
.jumbotron { background: url("../img/header_bg.png") no-repeat; height: 100%; }
<header>
<div class="jumbotron">
<center><h1>Bienvenidos a JVasconcelos.me</h1></center>
</div>
</header>
<div class="container">
<div class="row">
<div class="col-md-12 col-centered">
<div class="c1">
<div class="c2">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quis inventore illum quaerat laboriosam eos, vel sed suscipit cumque laborum est animi aliquid tempora iusto beatae quam quisquam porro dolore! Ullam tenetur doloribus ducimus, totam voluptatum, deleniti vero voluptatem eius architecto velit neque voluptas aliquam quidem sed eveniet! Nobis ex eos iste dolorum tempora doloremque non deleniti, aperiam quibusdam corrupti officia consequatur, impedit. Exercitationem debitis iste voluptatum, illo nulla iure culpa ex fugit, aliquid dolorem excepturi, impedit voluptates quae quidem error earum natus, provident eum vitae. Tempore ducimus laborum voluptates, qui aspernatur odit dolorum modi quas cupiditate unde quam earum amet!
</p>
</div>
</div>
</div>
</div>
</div>
I assume you mean when you change the margin-top on the div.c2 your div.c1 also shifts down. This is due to the default definition of a div+div construct.
To achieve what you want you will need to create the following extra css definition on your div.c1:
display: inline-block;
Have a look at this codepen: http://codepen.io/anon/pen/beNjbW
Difference of or greater margin of c1 or c2 will be rendered due to collapsible margins.
In this case your total distance will be 0 (they cancel each other):
div.c1 {
margin-top: -30px;
}
div.c2 {
margin-top: 30px;
}
In this case your distance will be 10px from the top:
div.c1 {
margin-top: -30px;
}
div.c2 {
margin-top: 40px;
}
One of top margins can be omitted in this case. You can control the distance to header by adjusting margin-top of either one
codePen example