Please check the following example in codepen. I want the page to fit exactly in the viewport but the page is bigger than the viewport and the browser is showing scrollbars. How can I fit the page exactly in the viewport?
https://codepen.io/manuchadha/pen/PBKYBJ
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<base href="/">
<title>Example</title>
<!--meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"-->
<link rel="stylesheet" media="screen" href="./fiddle.css">
</head>
<body>
<div class="css-grid-container"> <!-- 3 rows, 1 column-->
<div id="app-nav-component" class=" common-styles-div--white">NAV</div> <!-- 1st row of css-grid-containerr-->
<div id="homepage-top-div" class="body__div--background homepage-component-css-grid-container"> <!-- 2nd row of css-grid-containerr-->
<p id="homepage-p"><span>Welcome </span> to my page. </p>
<div id="create-component-top-div" class="css-grid-container__create-div common-styles-div--white"> <!-- 4 rows, 1 column-->
<p class="css-grid-item__create-para1-div"> Para1 </p>
<p class="css-grid-item__create-para2-div"> Para2 </p>
<p class="css-grid-item__create-para3-div"> Para3 </p>
<button id="get-question-list-button" class="btn content-div__button--blue css-grid-item__create-button-div btn-sm">Button</button>
</div>
<div id="practice-component-top-div" class="css-grid-container__practice-div common-styles-div--white"> <!-- 4 rows, 1 column-->
<!-- this container item is also a container -->
<!-- this is a container -->
<p class="css-grid-item__practice-para1-div"> Para 4 </p>
<p class="css-grid-item__practice-para2-div"> Para 5 </p>
<p class="css-grid-item__practice-para3-div"> Para 6 </p>
<!-- clicking the button will bring up a new component on the page - NewPracticeQuestionComponent. Check the app-routing.module-->
<button id="new-question-button" class="btn content-div__button--blue css-grid-item__practice-button-div btn-sm">Button2</button>
<!--button type="button" class="content-div__button--blue css-grid-item__practice-button-div"> Practice! </button-->
</div>
</div>
<div id="app-footer-component" class="common-styles-div--white">FOOTER</div> <!-- 3rd row of css-grid-containerr-->
<!-- grid child -->
</div>
</body>
CSS
.css-grid-container{
height:100vh; /*height of the container is same ahs height of the view port.*/
display: grid;
grid-gap:20px;
grid-template-columns: 1fr; /* 1 columns*/
grid-template-rows: auto 15fr 1fr; /* 3 rows. Auto takes height of navigation, remaining is divided into 2 rows, middle row is 15 times larger than the 3rd row.*/
}
div#app-nav-component{ /*1st row, all columns*/
grid-column:1/-1;
grid-row:1/2;
}
div#homepage-top-div{ /*2nd row, all columns*/
grid-column:1/-1;
grid-row:2/3;
}
div#app-footer-component{ /*3rd row, all columns*/
grid-column:1/-1;
grid-row:3/4;
}
.body__div--background {
background: linear-gradient(45deg,#33b1f8 37%,#6e90f6 100%); /*syntax linear-gradient(direction, color1 limit, color2 limit)*/
color:#555555;
font-family: Helvetica;
line-height:1.5;
font-size: 11px;
letter-spacing: 0.25px;
}
.homepage-component-css-grid-container{
display: grid;
grid-gap:20px;
grid-template-rows: 50px 1fr; /*1st row size to fit<p>, remaining for practice-component and create-component both will be in same row but different columns*/
grid-template-columns: 1fr 1fr; /* 2 columns*/
/* height:100%; /*added `height:100%` rule as otherwise, the height of the grid was only up to the height of its children*/
}
div#app-content-component{
grid-column:1/-1;
grid-row:2/3;
}
.css-grid-container__create-div{
display:grid;
grid-template-rows:1fr 1fr 1fr 1fr;
grid-template-columns: 1fr;
/*grid-template-rows: auto auto auto auto;*/
/*height:300px; /* couldn't make it %*/
/*width:250px;*/
}
.css-grid-item__create-para1-div{
margin-left:40px;
margin-top:30px;
grid-column: 1 / -1;
grid-row: 1 / 2;
}
.css-grid-item__create-para2-div{
margin-left:40px;
margin-top:30px;
grid-column: 1 / -1;
grid-row: 2 / 3;
}
.css-grid-item__create-para3-div{
margin-left:40px;
margin-top:30px;
grid-column: 1 / -1;
grid-row: 3 / 4;
}
.css-grid-item__create-button-div{
align-self: center;
justify-self:center;
grid-column: 1 / -1;
grid-row: 4 / 5;
}
p#homepage-p {
/*font-style font-variant font-weight font-size/line-height font-family*/
font: 300 1.5em 'Raleway', sans-serif;
color: rgba(0,0,0,.5);
grid-row: 1/2;
grid-column: 1/-1;
}
.css-grid-container__practice-div{
display:grid;
grid-template-columns: 1fr;
grid-template-rows: 1fr 1fr 1fr 1fr;
/*height:300px; /* could it be made % ?*/
/*width:250px;
line-height:2em;
font-size: 1em;*/
}
.css-grid-item__practice-para1-div{
margin-left:40px;
margin-top:30px;
grid-column: 1 / -1;
grid-row: 1 / 2;
}
.css-grid-item__practice-para2-div{
margin-left:40px;
margin-top:30px;
grid-column: 1 / -1;
grid-row: 2 / 3;
}
.css-grid-item__practice-para3-div{
margin-left:40px;
margin-top:30px;
grid-column: 1 / -1;
grid-row: 3 / 4;
}
.css-grid-item__practice-button-div{
align-self: center;
justify-self:center;
grid-column: 1 / -1;
grid-row: 4 / 5;
}
div#create-component-top-div{
grid-row: 2/3;
grid-column: 1 / 2;
height:90%;
width:70%;
align-self: center;
justify-self:center;
}
div#practice-component-top-div{
grid-row: 2/3;
grid-column: 2 / 3;
height:90%;
width:70%;
align-self: center;
justify-self:center;
}
You're not using any sort of reset CSS, so your issue is the browser's default CSS. body has a default margin, so if you add body { margin: 0; } to your stylesheet, your scrollbar will disappear.
Related
I'm working on a website and I have 4 grid cells which take up a section of my webpage. The issue is that all of my text is in random places, I want it to be centered within each grid item (one is gray, one is blue, one is black, one is yellow).
I've tried every combination of justify, align, self, any idea how I can do this? Any help would be very much appreciated.
Here's my jsfiddle documenting the problem: https://jsfiddle.net/RomelF/jd8L7a6n/3/
And here's my HTML:
<div class="container">
<section id="welcome-section"><h1 id="name">My name's Romel, here are some of my projects:</h1>
</section>
<section id="projects">
<div class="project-tile" id="p1"><p class="ptext"><a href="#">Tribute Page<a></p></div>
<div class="project-tile" id="p2"><p class="ptext"><a href="#">Political Questionnaire<a></p></div>
<div class="project-tile" id="p3"><p class="ptext"><a href="#">Landing Page<a></p></div>
<div class="project-tile" id="p4"><p class="ptext"><a href="#">Technical Documentation<a></p></div>
</section>
And here's my CSS:
#projects {
width: 70%;
display: grid;
}
...
.project-tile {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 1fr 1fr;
place-items: stretch;
height: 50vh
}
#p1 {
background: rgb(255,253,254);
background: radial-gradient(circle, rgba(255,253,254,1) 0%, rgba(74,75,75,0.4) 100%);
grid-column: 1 / 2;
grid-row: 1 / 2;
}
#p2 {
background-color: black;
grid-column: 1 / 2;
grid-row: 2 / 3;
}
#p3 {
background-color: blue;
grid-column: 2 / 3;
grid-row: 1 / 2;
}
#p4 {
background-color: yellow;
grid-column: 2 / 3;
grid-row: 2 / 3;
}
.project-tile a {
text-decoration: none;
}
.ptext {
align-self: center;
}
your .project-tile doesn't need to be a grid itself. Using flexbox gives you all the tools you need to center an element.
.project-tile {
display: flex;
place-items: center;
height: 50vh;
}
.ptext {
margin: auto
}
This will give you centred text as long as the text fits inside the boundaries of the parent.
Please remove this style
.project-tile{
grid-template-columns: 1fr 1fr;
grid-template-rows: 1fr 1fr;
}
If you look at the nested grid in Firefox and look at the grid display you will see the four separate nested grids each with 1 row and 12 columns. However, if you look at the CSS file you can only assign the element "main-services-text", "main-banner-text", etc., by treating it as a single 4 row grid.
So my question is, is this the way it should work or is it a bug. Also should I use it?
.main-grid {
display: grid;
grid-template-columns: repeat(12, 1fr);
grid-template-rows: 100px 100px 100px 100px;
}
/* Step 1a assign the main elements "" to the MAIN Grid*/
.main-banner {
grid-column: 1 /13;
grid-row: 1 / 2;
background-color: cornflowerblue;
}
.main-services {
grid-column: 1 /13;
grid-row: 2 / 3;
background-color: lightcyan;
}
.main-why-us {
grid-column: 1 /13;
grid-row: 3 / 4;
background-color: orange;
}
.main-who-are-we {
grid-column: 1 /13;
grid-row: 4 / 5;
background-color: chocolate;
}
/* Step 2: Set up individual nested GRIDS*/
main section {
display: grid;
color: olive;
grid-template-columns: repeat(12, 1fr);
grid-template-rows: 100px;
}
/* Step 2 assign elements to the nested grids */
.main-banner-text {
grid-column: 3 / 5;
grid-row: 1 / 2;
}
.main-services-text {
grid-column: 6 / 9;
grid-row: 2 / 3;
}
.main-why-us-text {
grid-column: 10 / 13;
grid-row: 3 / 4;
}
.main-who-are-we-text {
grid-column: 9 / 10;
grid-row: 4 / 5;
}
<main class="main-grid">
<section class="main-banner">Banner</section>
<p class="main-banner-text">Main banner text</p>
<section class="main-services">Services</section>
<p class="main-services-text">Main services text</p>
<section class="main-why-us">Why Us</section>
<p class="main-why-us-text">Main Why us text</p>
<section class="main-who-are-we">Who are we</section>
<p class="main-who-are-we-text">Main who are we text</p>
</main>
I am struggling to get what I want and I am not sure if its even possible.
Tried everything I got, showing some code below
section {
display: grid;
grid-template-columns: auto auto auto auto;
}
section > *{
border: 1px solid red;
}
section > h1{
grid-row: 1;
grid-column: 2 / 3;
}
section > h2{
grid-row: 2;
grid-column: 2 / 3;
}
section > img{
grid-row: 1/2;
grid-column: 1 / 3;
width: 20%;
}
section > span{
grid-row: 1;
grid-column: 3 / 3;
}
<div>
<section>
<h1>HEADING</h1>
<img src=img.png alt="">
<h2>HEADING 2</h2>
<span>11:44</span>
</section>
<section>
<h1>HEADING</h1>
<img src=img.png alt="">
<h2>HEADING 2</h2>
<span>11:44</span>
</section>
...
</div>
I want the image to appear left, using the upper and lower cell, so full height.
I want the h1 to use the upper center space.
I want the h2 to use the lower center space.
i want the span to use the upper right space.
The lower right space should be combined with the lowercenter in case the content of lowercenter overflows.
You were almost there but there were some issues.
You defined a four column grid but your description only requires three.
grid-template-columns: auto 1fr 1fr; /* (seems more appropriate) /*
* {
margin: 0 !important;
}
section {
display: grid;
grid-template-columns: auto 1fr 1fr;
}
section>* {
border: 1px solid red;
}
section>h1 {
grid-row: 1;
grid-column: 2 / 3;
}
section>h2 {
grid-row: 2;
grid-column: 2 / 4;
/* span 2 columns*/
}
section>img {
grid-row: 1 / 3;
/* span 2 rows */
}
section>span {
grid-row: 1;
}
<section>
<h1>HEADING</h1>
<img src="https://placekitten.com/200/200" alt="">
<h2>HEADING 2</h2>
<span>11:44</span>
</section>
I want the h2 to use the lower center space.
I want the span to use the upper right space.
The lower right space should be combined with the lowercenter in case the content of lowercenter overflows.
The h2 area is supposed to span 2 columns so we extend it out into column 3.
I am currently working on a page using the CSS grid layouts, however I ran into a problem with div elements in which they automatically insert a line break into the output above and below the text.
Is there any way to easily remove these with CSS?
I tried changing the div element to span, but nothing changed. I also set the div elements to display: inline; but that didn't work either.
html {
background-color: black;
}
.grid-container {
display: grid;
width: 1200px;
height: 600px;
grid-template-columns: 300px 1fr 1fr;
grid-template-rows: 110px 200fr 200fr 80px;
grid-gap: 1rem;
background-color: #2196F3;
padding: 10px;
margin: auto;
}
.grid-item {
background-color: rgba(255, 255, 255, 0.8);
padding: 20px;
display: inline-block;
}
.grid-heading {
grid-row: 1 / 2;
grid-column: 1 / 4;
font-size: 40px;
padding: 5px;
}
.grid-sidebar {
grid-row: 2 / 4;
grid-column: 1 / 2;
}
.grid-content1 {
grid-row: 2 / 3;
grid-column: 2 / 4;
}
.grid-content2 {
grid-row: 3 / 4;
grid-column: 2 / 4;
}
.grid-footer {
grid-row: 4 / 5;
grid-column: 1 / 4;
}
<!DOCTYPE html>
<title>
Home
</title>
<head>
</head>
<html>
<br>
<br>
<br>
<div class="grid-container">
<div class="grid-item grid-heading">
<h1>Heading</h1>
</div>
<div class="grid-item grid-sidebar">
<p>2</p>
</div>
<div class="grid-item grid-content1">3</div>
<div class="grid-item grid-content2">4</div>
<div class="grid-item grid-footer">5</div>
</div>
</html>
Try
div{
display:inline-block;
}
Display:inline; should have worked
you might need to include a screenshot... but try removing the padding on the grid-item class as well as adjusting the grid-gap. also keep in mind that default styling for most browsers includes margin and padding on most items.
i thing it's grid-gap remove this style
.grid-container {
grid-gap: 0;
}
h1, p {
margin: 0;
}
than working fine https://jsfiddle.net/z7y2qaa7/
I am trying to get the content of item to be in the middle column, but it does not seem to be moving.
.home-grid-container {
display: grid;
grid-template-columns: auto;
grid-template-rows: 0.10fr 0.98fr auto;
height: 100vh;
}
.home-header {
grid-column: 1 / span 3;
grid-row: 1 / span 1;
background: #3f51b5;
}
.home-main {
grid-column: 1 / span 3;
grid-row: 2 / span 3;
background: #81d4fa;
}
.item {
grid-column: 2 / span 1;
grid-row: 2 / span 3;
}
.home-footer {
grid-column: 1 / span 3;
grid-row: 5 / span 1;
background: #3f51b5;
div {
text-align: center;
margin: 2vh;
}
}
<div class="home-grid-container">
<div class="home-header">
<h1>
<img src="/src/imgs/sitelogo.png" />
</h1>
</div>
<div class="home-main">
<div class="item">
Simple, Fast, Powerful
<input type="button" value="100% Free" />
</div>
</div>
<div class="home-footer">
<div>All Rights Reserved</div>
</div>
</div>
https://css-tricks.com/snippets/css/complete-guide-grid/
The elements you want to center are descendants, but not children, of the grid container.
Because grid layout only extends between parent and child elements, the .item element is out of scope and will not accept grid properties.
But these elements are inline-level children of a block container, which means that text-align: center will work.
.home-grid-container {
display: grid;
grid-template-columns: auto;
grid-template-rows: 0.10fr 0.98fr auto;
height: 100vh;
}
.home-header {
grid-column: 1 / span 3;
grid-row: 1 / span 1;
background: #3f51b5;
}
.home-main {
grid-column: 1 / span 3;
grid-row: 2 / span 3;
background: #81d4fa;
}
.item {
grid-column: 2 / span 1;
grid-row: 2 / span 3;
text-align: center; /* NEW */
}
.home-footer {
grid-column: 1 / span 3;
grid-row: 5 / span 1;
background: #3f51b5;
}
<div class="home-grid-container">
<div class="home-header">
<h1>
<img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt="">
</h1>
</div>
<div class="home-main">
<div class="item">
Simple, Fast, Powerful
<input type="button" value="100% Free" />
</div>
</div>
<div class="home-footer">
<div>All Rights Reserved</div>
</div>
</div>
jsFiddle demo
If you want to use the grid for a child of your container, you can always just inherit the same properties.
.home-grid-container {
display: grid;
grid-template-columns: auto;
grid-template-rows: 0.10fr 0.98fr auto;
height: 100vh;
}
.home-header {
grid-column: 1 / span 3;
grid-row: 1 / span 1;
background: #3f51b5;
}
.home-main {
grid-column: 1 / span 3;
grid-row: 2 / span 3;
background: #81d4fa;
/* inherit the container-grid setup */
display: grid;
grid-template-columns: inherit;
grid-template-rows: inherit;
}
.item {
grid-column: 2 / span 1;
grid-row: 2 / span 3;
}
.home-footer {
grid-column: 1 / span 3;
grid-row: 5 / span 1;
background: #3f51b5;
div {
text-align: center;
margin: 2vh;
}
}
<div class="home-grid-container">
<div class="home-header">
<h1>
<img src="https://dummyimage.com/200x50/cccccc/ffffff.png" />
</h1>
</div>
<div class="home-main">
<div class="item">
Simple, Fast, Powerful
<input type="button" value="100% Free" />
</div>
</div>
<div class="home-footer">
<div>All Rights Reserved</div>
</div>
</div>
As others have pointed out, since the item element isn't a direct child of the grid container - you can't apply grid properties to it.
Obviously, to fix this you could pull the item out of the home-main div and make it a direct child of the grid - but I'm guessing that that's not a viable solution here :)
Grid Layout Module Level 2 - Subgrids are supposed to solve this problem.
Subgrid is currently only a draft spec, but fwiw, in your case you would do something like:
.home-main {
display: subgrid;
grid-column: span 3;
}
Nevertheless, there actually is a way to pull this off:
display: contents (caniuse)
From Caniuse:
display: contents causes an element's children to appear as if they
were direct children of the element's parent, ignoring the element
itself. This can be useful when a wrapper element should be ignored
when using CSS grid or similar layout techniques.
So in order for the grid placement properties to work on the item, you could simply add display: contents; to home-main (currently working in Firefox)
(NB: This will obviously render the grid properties on home-main useless - but then again - they aren't necessary to place the item)
.home-main {
display: contents;
...
}
.home-grid-container {
display: grid;
grid-template-columns: auto;
grid-template-rows: 0.10fr 0.98fr auto;
height: 100vh;
}
.home-header {
grid-column: 1 / span 3;
grid-row: 1 / span 1;
background: #3f51b5;
}
.home-main {
/*grid-column: 1 / span 3;
grid-row: 2 / span 3; */
display: contents;
background: #81d4fa;
}
.item {
grid-column: 2 / span 1;
grid-row: 2 / span 3;
background: salmon;
}
.home-footer {
grid-column: 1 / span 3;
grid-row: 5 / span 1;
background: #3f51b5;
}
.home-footer div {
text-align: center;
margin: 2vh;
}
<div class="home-grid-container">
<div class="home-header">
<h1>
<img src="/src/imgs/sitelogo.png" />
</h1>
</div>
<div class="home-main">
<div class="item">
Simple, Fast, Powerful
<input type="button" value="100% Free" />
</div>
</div>
<div class="home-footer">
<div>All Rights Reserved</div>
</div>
</div>