One place for hosting & domains

      Elements

      How To Select HTML Elements to Style with CSS


      The author selected the Diversity in Tech Fund to receive a donation as part of the Write for DOnations program.

      Introduction

      The core functionality of CSS is performed by two features: cascade and specificity. Cascade deals with how CSS properties are read and applied to elements. Specificity directs a browser to find the correct element and apply the styles. The starting point of specificity is a selector, which tells the browser what element to find. When it comes to styling, the larger a web page or website, the greater the need for more specific, or higher specificity, selectors.

      Selecting the right element and providing the right visual styles is the basis of writing CSS code. Whenever you need to adjust how an element on a webpage looks, using selectors is key.

      This tutorial will build your skill set and help you develop visually rich websites by showing you how to select the right element in a given scenario. You will begin by using the type selector to select HTML elements to style. Then, you will combine selectors to identify and apply styles more precisely. Lastly, you will group several selectors to apply the same styles to different elements.

      Prerequisites

      Setting Up the HTML

      In this first step, you will set up the HTML that you will style throughout the rest of the tutorial. The purpose of the HTML in this tutorial is to provide various elements and situations to style.

      Open up the index.html file in your editor and add the following boilerplate HTML to give the file necessary baseline code:

      index.html

      <!doctype html>
      <html>
        <head>
          <link href="https://www.digitalocean.com/community/tutorials/styles.css" rel="stylesheet" />
        </head>
        <body>
        </body>
      </html>
      

      The <link /> element already loads in the styles.css file, so be sure to have that file ready as well.

      Now, you need some content. Start by adding in <header> and <article> elements inside the <body> element. In the following code block, highlighted sections will help you identify what is new or has changed:

      index.html

      <!doctype html>
      <html>
        ...
        <body>
          <header></header>
          <article></article>
        </body>
      </html>
      

      The relationship between the <body> and the <header> elements is referred to as parent and child, since the <header> element is nested inside the <body> tags. This also means the <header> and <article> tag have a sibling relationship, since they are at the same nesting level within the parent <body> tags.

      Next, you will add a child element within the <header> to give the page a title:

      index.html

      ...
      <header>
        <h1>About Coral Reefs</h1>
      </header>
      ...
      

      Inside <article>, add four children: one <header> element and three <section> elements. The <article> element provides what is called a landmark, a designation for a browser to aid those using assistive technologies. There should only be one <header> within a landmark. In this case the <header> will contain the title for this article of the page. The <section> elements will contain different information blocks:

      index.html

      ...
      <article>
        <header></header>
        <section></section>
        <section></section>
        <section></section>
      </article>
      ...
      

      Now, provide a title in the <header> for the <article>. Use an <h2> here since it logically works as a second-level heading beneath the <body>’s <header> with a top-level heading. Add in <strong> tags around the word “Biodiversity” to strongly emphasize the text. When you load index.html in your browser, this text won’t look any different due to the browser defaults. You will style this later to distinguish between the heading and the <strong> text.

      index.html

      ...
      <article>
        <header>
          <h2>Coral Reef <strong>Biodiversity</strong></h2>
        </header>
        ...
      </article>
      ...
      

      Next, add in the first section content. This will be two paragraphs, contained in <p> tags giving some details about coral reefs. In the first paragraph, add an <em> tag and a <strong> tag around some phrases to emphasize that content:

      index.html

      ...
      <article>
        <header>
          ...
        </header>
        <section>
          <p>Coral reefs are teeming with life. They are known as the <em>rainforests of the sea</em> with how many various speieces live within their waters. The defining feature of these ecosystems are the plant-like coral, which are really colonies of tiny invertabrates called <strong>polyps</strong>.</p>
          <p>Sadly, many reefs around the world are in danger due to rising ocean temperatures, pollution, and overfishing.</p>
        </section>
        ...
      </article>
      ...
      

      In the second section, add an <h3> tag for a heading for this section of the article. Like the <h2> before, this is set as an <h3> since it is a subset of content. In the <h3>, add a <strong> tag around a phrase in the heading like in the <h2>. Then write out an unordered list using the <ul> tag to define the list and <li> to define each item in the list. In one of the list items, wrap the content in a <strong> tag:

      index.html

      ...
      <article>
        <header>
          ...
        </header>
        <section>
          ...
        </section>
        <section>
          <h3><strong>Animal Life</strong> in a Coral Reef</h3>
          <ul>
            <li>Angelfish</li>
            <li>Clownfish</li>
            <li>Octopus</li>
            <li><strong>Sharks</strong></li>
            <li>Barracuda</li>
          </ul>
        </section>
        ...
      </article>
      ...
      

      With the last section, set up content similar to the second section with an <h3> section title and a <strong> element around a word in the title. Instead of an unordered list, make an ordered list with an <ol> tag to define the list, but still define each item with the <li> tag. Once again, in one of the list items, add a <strong> element around the content:

      index.html

      ...
      <article>
        <header>
          ...
        </header>
        <section>
          ...
        </section>
        <section>
          ...
        </section>
        <section>
          <h3>Sammy's <strong>Favorite</strong> Reef Food</h3>
          <ol>
            <li>Sea Grass</li>
            <li><strong>Kelp</strong></li>
            <li>Sea Grapes</li>
            <li>Sea Lettuce</li>
          </ol>
        </section>
      </article>
      ...
      

      Save your file.

      That covers the HTML for this tutorial and provides elements for which you can begin to write styles. Now that you have finished with index.html, leave it open in your editor for reference as needed. Then open index.html in your browser to see the default styles of your browser, which will appear similar to the following image:

      The content of the website in the browser default rendering with black serif font on a white background.

      Next, you’ll apply styles to the HTML page you created.

      Selecting Elements With the Type Selector

      In this section, you will work with the type selector, more commonly referred to as the element selector. The type selector finds elements on the page by tag name, making it broadest in terms of specificity. You will write several selectors to learn the breadth of this selector throughout the index.html page.

      First, take a look at index.html in the browser. This what the page looks like using browser defaults. These are predefined styles provided by the browser to give visual information to the content of the page. This is a helpful starting place for the styles; in the examples ahead you will only modify a couple of properties to customize the look of the page.

      Next, open the styles.css file in your editor. The default browser font is typically a serif font, a typography term referring to the decorative ends on the characters, like those found in Times New Roman. To change the font across the whole page, you can make a change in one place.

      Create a type selector for the HTML <body> element by typing out the word in the tag, body, followed by an opening and closing curly brace. Inside the curly braces, add a new line and then add the CSS property font-family with a value of sans-serif. This addition of the font-family will change the font for the whole document to a sans serif font. Unlike a serif font, a sans serif font lacks decorative ends on the characters, such as in Helvetica or Arial:

      styles.css

      body {
        font-family: sans-serif;
      }
      

      Once you have made these changes, save styles.css and refresh your browser to verify the text has all changed to the browser’s default sans-serif font. The reason the font changed throughout the whole page is due to a feature of CSS called inheritance. Inheritance is when a child element inherits property values from the parent element, unless otherwise specified. This feature does not affect all CSS properties or elements, but it is most notable among properties that affect text.

      Next, adjust the font-weight of the <h2> and <h3> elements on the page. By default, the browser applies styles to make these elements a bold font. Create an h2 and an h3 type selector and in each add the font-weight property with a value of normal. This will change the default from bold to a normal weight:

      styles.css

      body {
        font-family: sans-serif;
      }
      
      h2 {
        font-weight: normal;
      }
      
      h3 {
        font-weight: normal;
      }
      

      Save and return to your browser and refresh the index.html page. The content of the <h2> and <h3> elements have changed from a bold to a normal font weight, except for the text in the <strong> elements. This is a case where an explicit value is set for the font-weight in the browser defaults, so the <strong> element does not inherit the change to its parent element.

      The primary purpose with any design is to aid in communication. In this case, the design is working to emphasize a particular part of the content through contrasts in font weight. Next, you will apply color to help encourage this contrast. Start with an em type selector and apply a background-color of yellow to give it a highlighter effect. Next, to help draw further attention to the <strong> content, create a strong type selector with a color property set to red:

      styles.css

      ...
      h3 {
        font-weight: normal;
      }
      
      em {
        background-color: yellow;
      }
      
      strong {
        color: red;
      }
      

      Save styles.css and refresh index.html in your browser to find the changes you have made to the design of the website. As shown in the following image, the whole of the text on the page has changed to a sans-serif font, the <h2> and <h3> content headings are no longer bold, all the <strong> element content is now red, and the <em> element content has a yellow highlighter background:

      Content of website in a black sans-serif font, with bold content in red and italic content with a yellow background.

      In this step you worked with multiple type selectors to create specific styles for each selector. The type selector tells the browser to find an element by the element’s name and is the broadest in specificity. Next, you will learn about simplifying your CSS through the use of selector groups.

      Selecting Elements With the Combinator Selector

      In this section, you will work with the combinator selector to make more specific element selection. This selector uses the nested relationship of HTML elements to select the appropriate element. You will use this selector to make the same element type look different when contained in other element types.

      Open up index.html in the browser. As you look over the styles, there are pops of red every so often due to the strong selector that is applying color: red; to all instances of <strong> on the page. In this step you will work through to change the color value on <strong> elements when they meet certain criteria, based on their ancestry, a series of parent and child element relationships.

      A combinator selector is defined by a space character between selectors, with the HTML ancestry reading left to right. The right-most selector is the intended target. This can be as complex or as simple as necessary to scope, or provide sufficient specificity, to the intended element. To understand how combinator selectors work, open styles.css and add at the bottom of the file a p type selector followed by a space, then a strong type selector followed by an open and close curly bracket:

      styles.css

      ...
      p strong {
      }
      

      This is a combinator selector that is targeting <strong> elements that are ancestrally descendent of a <p> element. This means the <p> element does not have to be the direct parent of the <strong> element in order for this combinator selector to be true. Now change the color of <strong> elements that meet this criteria by placing a color property within the combinator selector:

      styles.css

      ...
      p strong {
        color: coral;
      }
      

      Save the changes and return to the browser to refresh index.html.

      Content of website in a black sans-serif font, with bold content in red and italic content with a yellow background, except the bold content in a paragraph, which is light orange.

      Next, add more variety of color to the <strong> elements throughout the file. Start with the <strong> element that is a descendant of an <h3> and turn those blue:

      styles.css

      ...
      p strong {
        color: coral;
      }
      
      h3 strong {
        color: blue;
      }
      

      Finally, to add some more color, change the color for <strong> elements in an unordered list to dodgerblue, which is a rich light blue, and the color for <strong> elements in an ordered list to green. Here is where it is helpful to understand ancestry requirements of a combinator selector. You may think you would need to write out ul li strong and ol li strong to target these elements correctly. But this can be simplified to ul strong and ol strong since the ul and ol are specific enough:

      styles.css

      ...
      h3 strong {
        color: blue;
      }
      
      ul strong {
        color: dodgerblue;
      }
      
      ol strong {
        color: green;
      }
      

      Return to your browser and hit refresh. The <strong> element in the unordered list is now a rich light blue color and the <strong> element in the ordered list is now a green, as seen in the following image:

      Content of website in a black sans-serif font, with bold content in the secondary heading red, bold content in paragraph content light orange, content in the third-level heading blue, bold content in an unordered list a light blue, and bold content in an ordered list green.

      In this section, you learned about the combinator selector. You used the selector with two type selectors multiple times to create custom colors for various instances of <strong> elements. The next section will look at how to simplify your CSS by applying similar styles to multiple element types with the selector group.

      Selecting Multiple Elements With the Selector Group

      In this section, you will select HTML elements using a selector group. There is a principle of programming called Don’t Repeat Yourself, or DRY. The purpose of DRY code is to write code that is more maintainable. Using the selector group is one of the quickest ways to put the DRY principle in practice when writing CSS.

      Open up styles.css in your editor. Earlier in the tutorial you wrote out two styles to change a browser default weight from bold to normal:

      styles.css

      ...
      h2 {
        font-weight: normal;
      }
      
      h3 {
        font-weight: normal;
      }
      ...
      
      

      Since the h2 and h3 type selectors have the same property and value in the selector block, this can be consolidated with a selector group. A selector group is done by putting a comma between selectors. In this case, you can remove the h3 selector block, then add a comma then the h3 type selector after the h2 type selector. It can be helpful to put each selector on a new line to help legibility of the list.

      styles.css

      ...
      h2,
      h3 {
        font-weight: normal;
      }
      ...
      

      Open up the browser and reload index.html to verify nothing has changed. Both the h2 and the h3 now share the same styles thanks to the selector block. However, you are not limited to keeping the styles looking the same. You can still have individual h2 and h3 type selectors to provide specific styles to each element. Create each of these type selectors, then add a different color to each selector block:

      styles.css

      ...
      h2,
      h3 {
        font-weight: normal;
      }
      
      h2 {
        color: maroon;
      }
      
      h3 {
        color: navy
      }
      ...
      

      Refresh index.html in your browser to find that the h2 and h3 still have the same shared style of a normal font-weight, yet have their individual color properties.

      Selector groups are not limited to a particular kind of selector and can bring together various kinds of selectors to have the same style. This feature of grouping could be used in any number of ways. To bring in the selectors discussed already, add one of the combinator selectors to the h2, h3 selector group.

      styles.css

      ...
      h2,
      h3,
      ol strong {
        font-weight: normal;
      }
      ...
      

      After refreshing index.html in your browser, the <strong> element in the ordered list will no longer be bold and instead will have a normal font-weight, as in the following image:

      The <strong> text in the ordered list is still green, but now is no longer bold like the base <h2> and <h3> elements.

      Note With the selector group, you can bring different styles together into one selector block. But there is a balance to be struck between DRY CSS and human-readable CSS, with a best practice that errs on the side of human-readable. As an extreme example, it is possible to write several large group selectors so no single property is repeated, but that will be harder for developers to understand. In this case, developer readability is preferred.

      In this section, you worked with the group selector and turned repetitive CSS properties into a single selector block. You also added in a combinator selector with a selector group to write reusable properties with high specificity.

      Conclusion

      In this tutorial, you learned about the baseline selectors needed to write CSS. You can now effectively find an element on a page with CSS that is nested deep in HTML and give it specific styles. You also learned about the DRY programming principle, which is helpful to write concise and manageable CSS. These selectors can be paired with many other CSS selectors to get to the exact element and situation you wish to style.

      If you would like to read more CSS tutorials, check out our CSS topic page.



      Source link

      Magazine-Style Shapes Around Floated Elements in CSS With shape-outside


      While this tutorial has content that we believe is of great benefit to our community, we have not yet tested or
      edited it to ensure you have an error-free learning experience. It’s on our list, and we’re working on it!
      You can help us out by using the “report an issue” button at the bottom of the tutorial.

      Introduction

      Part of CSS Shapes module 1, shape-outside is an interesting property that makes it easy to set a shape for the wrapping of text around a floated element. For example, if a floated element is an image with a lot of white-space or if it has a different border radius, the value of shape-outside comes into play to define how text around it will wrap.

      Using shape-outside allows to create page layouts that approach those that we’re used to see in magazines. It can be a nice progressive enhancement for supporting browsers and in non-supporting browsers the property is simply ignored.

      The value for shape-outside can be a keyword, a shape function or an URL to an image. Let’s explore each option briefly:

      Shape Keywords

      You can set shape-outside to a value like margin-box, padding-box, content-box or border-box. This makes it easy to have text that follows the border radius value applied to the floated element:

      Shape outside margin-box

      margin-box
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque faucibus euismod tempor. Ut ac condimentum neque. Vivamus vel tristique lacus. Aenean volutpat volutpat diam, eu volutpat mauris. Donec interdum tempor risus. Maecenas eu tincidunt tortor. Donec tincidunt turpis enim, ac bibendum lorem blandit at. Pellentesque ullamcorper ex sit amet mauris dictum varius.

      img.shape1 {
        float: left;
        margin-right: 2rem;
        border-radius: 0% 90%;
        -webkit-shape-outside: margin-box;
        shape-outside: margin-box;
      }
      

      The difference between the margin, padding, content and border keywords is in where the browser sets the “boundary” of the shape. For example, setting border-box will force text to flow exactly around the outside edge of the border of the element.

      Shape Functions

      shape-outside can also take one of four possible shape functions: circle(), polygon(), ellipse() or inset().

      Circle

      Here’s an example with an image that’s floated to the left and that has a border-radius of 50%:

      Shape outside circle

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non arcu nec lacus venenatis pulvinar. Cras lacinia turpis diam, at euismod velit auctor sed. Curabitur bibendum sodales tortor et lobortis. Cras vitae vulputate ex. Vivamus in faucibus mi. Aliquam auctor sem ac lobortis volutpat. Integer fringilla lacus suscipit nisl blandit, sed efficitur elit ultricies. Curabitur ac laoreet ligula. Nullam et enim ut risus commodo tempor. Vivamus dictum sit amet erat vitae dapibus.

      img.shape2 {
        float: left;
        margin-right: 2rem;
        border-radius: 50%;
        -webkit-shape-outside: circle();
        shape-outside: circle();
      }
      

      The circle() shape function can also take a radius and a position value:

      /* Circle width a 40% radius and positioned at 20% 60% */
      shape-outside: circle(40% at 20% 60%);
      

      Ellipse

      In the case of the ellipse() shape function, the syntax is similar to circle’s, except that a X-radius and Y-radius is provided:

      Shape outside ellipse

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus quam dolor, pulvinar et odio eu, accumsan malesuada augue. Donec luctus et neque nec dignissim. Phasellus varius ex sit amet ipsum gravida, at tincidunt neque luctus. Proin molestie, risus eu interdum bibendum, mauris urna laoreet nisi, in eleifend eros arcu in elit. Donec imperdiet dignissim erat et semper. Maecenas vestibulum tempor neque id pellentesque. Aenean vel justo maximus metus rutrum accumsan ac a dolor. Vivamus a nunc non elit luctus ornare pretium id risus. Nunc diam sapien, varius sit amet accumsan sit amet, malesuada quis diam. Donec condimentum odio eu ex pretium facilisis. Phasellus ligula enim, pulvinar sit amet efficitur vitae, sodales at elit. Donec sagittis arcu in convallis molestie. Maecenas vehicula hendrerit lacus at ornare. Suspendisse mattis ac mauris eu auctor. Nulla eu ipsum a lectus posuere aliquam id id est.

      .shape3 {
        float: right;
        width: 230px;
        height: 140px;
        margin-left: 2rem;
        border-radius: 50%;
        -webkit-shape-outside: ellipse(100px 55px at 38.7% 52.25%);
        shape-outside: ellipse(100px 55px at 38.7% 52.25%);
        object-fit: cover;
      }
      

      Here we also used object-fit to ensure that the image keeps its aspect ratio even though we squished the dimensions.


      Polygon

      You can create all kinds of interesting shapes using the polygon() color function. It’s quite complicated to figure out the proper dimmensions however, so for more complex shapes you’ll probably want to use a tool like this great CSS Shapes Editor Chrome Extension.

      Shape outside polygon

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus quam dolor, pulvinar et odio eu, accumsan malesuada augue. Donec luctus et neque nec dignissim. Phasellus varius ex sit amet ipsum gravida, at tincidunt neque luctus. Proin molestie, risus eu interdum bibendum, mauris urna laoreet nisi, in eleifend eros arcu in elit. Donec imperdiet dignissim erat et semper. Maecenas vestibulum tempor neque id pellentesque. Aenean vel justo maximus metus rutrum accumsan ac a dolor. Vivamus a nunc non elit luctus ornare pretium id risus. Nunc diam sapien, varius sit amet accumsan sit amet, malesuada quis diam. Donec condimentum odio eu ex pretium facilisis. Phasellus ligula enim, pulvinar sit amet efficitur vitae, sodales at elit. Donec sagittis arcu in convallis molestie. Maecenas vehicula hendrerit lacus at ornare. Suspendisse mattis ac mauris eu auctor. Nulla eu ipsum a lectus posuere aliquam id id est.

      img.shape4 {
        float: left;
        -webkit-shape-outside: polygon(-5px 86px, 243px 253px, 300px 220px, 296px 434px, -2px 434px);
        shape-outside: polygon(-5px 86px, 243px 253px, 300px 220px, 296px 434px, -2px 434px);
        -webkit-shape-margin: .7rem;
        shape-margin: .7rem;
      }
      

      Here notice the use of the shape-margin property, to nudge the whole shape slightly.


      Inset

      With the inset() shape function, you proved inset values for the top, right, bottom and left positions:

      Shape outside inset

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus quam dolor, pulvinar et odio eu, accumsan malesuada augue. Donec luctus et neque nec dignissim. Phasellus varius ex sit amet ipsum gravida, at tincidunt neque luctus. Proin molestie, risus eu interdum bibendum, mauris urna laoreet nisi, in eleifend eros arcu in elit. Donec imperdiet dignissim erat et semper. Maecenas vestibulum tempor neque id pellentesque. Aenean vel justo maximus metus rutrum accumsan ac a dolor. Vivamus a nunc non elit luctus ornare pretium id risus. Nunc diam sapien, varius sit amet accumsan sit amet, malesuada quis diam. Donec condimentum odio eu ex pretium facilisis. Phasellus ligula enim, pulvinar sit amet efficitur vitae, sodales at elit. Donec sagittis arcu in convallis molestie. Maecenas vehicula hendrerit lacus at ornare. Suspendisse mattis ac mauris eu auctor. Nulla eu ipsum a lectus posuere aliquam id id est.

      img.shape5 {
        float: right;
        -webkit-shape-outside: inset(50px 0 50px 55px);
        shape-outside: inset(50px 0 50px 55px);
      }
      

      URL

      We can provide an image via an URL, and the opaque parts of the image with create the shape:

      Shape outside URL

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus quam dolor, pulvinar et odio eu, accumsan malesuada augue. Donec luctus et neque nec dignissim. Phasellus varius ex sit amet ipsum gravida, at tincidunt neque luctus. Proin molestie, risus eu interdum bibendum, mauris urna laoreet nisi, in eleifend eros arcu in elit. Donec imperdiet dignissim erat et semper. Maecenas vestibulum tempor neque id pellentesque. Aenean vel justo maximus metus rutrum accumsan ac a dolor. Vivamus a nunc non elit luctus ornare pretium id risus. Nunc diam sapien, varius sit amet accumsan sit amet, malesuada quis diam. Donec condimentum odio eu ex pretium facilisis. Phasellus ligula enim, pulvinar sit amet efficitur vitae, sodales at elit. Donec sagittis arcu in convallis molestie. Maecenas vehicula hendrerit lacus at ornare. Suspendisse mattis ac mauris eu auctor. Nulla eu ipsum a lectus posuere aliquam id id est.

      img.shape6 {
        float: left;
        shape-outside: url("/shape.png");
      }
      

      Here’s what our transparent png (shape.png) image looks like:

      Shape image

      Browser Compatibility: As of 2020, 94% of browsers worldwide support the shape-outside property. The only browser that is completely lacking support is Internet Explorer 11.



      Source link

      Making Elements Stick in CSS Using position: sticky


      While this tutorial has content that we believe is of great benefit to our community, we have not yet tested or
      edited it to ensure you have an error-free learning experience. It’s on our list, and we’re working on it!
      You can help us out by using the “report an issue” button at the bottom of the tutorial.

      There’s a new value in town for the CSS position property: sticky. It allows us to make elements stick when the scroll reaches a certain point. An element with position: sticky will behave like a relatively-positioned element until it reaches a specified point and then starts behaving like a statically-positioned element. In this post we’ll create a simple example to illustrate.

      We’ll have a div container that will be a flex container and then 4 additional div elements that will be the flex items. Note we don’t have to use flexbox at all for position: sticky to work, here it’s just that flexbox happens to work great for our example.

      Check our flexbox primer if you’d like a refresher on the different flexbox properties and values.

      Here’s the simple markup:

      <div class="container">
        <div class="item punk">
          <img src="https://www.digitalocean.com/images/punk.svg" width="100" alt="Item 1">
        </div>
        <div class="item pony">
          <img src="/images/pony.svg" width="100" alt="Item 2">
        </div>
        <div class="item dino">
          <img src="/images/dino.svg" width="100" alt="Item 3">
        </div>
        <div class="item steampunk">
          <img src="/images/steampunk.svg" width="100" alt="Item 4">
        </div>
      </div>
      

      And now our styles, with the important rules highlighted:

      .container {
        display: flex;
        justify-content: space-around;
        align-items: flex-start;
      
        border: 2px dashed rgba(114, 186, 94, 0.35);
        height: 400px;
        background: rgba(114, 186, 94, 0.05);
      }
      
      .punk {
        position: -webkit-sticky;
        position: sticky;
        top: 4rem;
      }
      
      .pony {
        position: -webkit-sticky;
        position: sticky;
        top: 0;
      }
      
      .dino {
        position: -webkit-sticky;
        position: sticky;
        bottom: 1rem;
        align-self: flex-end;
      }
      

      And here’s the result. Try scrolling the page up and down to notice what happens:

      If position: sticky is not working: There are two common scenarios where an element set to position: sticky; won’t actually stick to the window as intended:

      1. No position property has been defined: Make sure the sticky element has top, bottom set. Or in the case of horizontal scrolling, left or right.)
      2. One of the element’s ancestors has incompatible overflow: If any of the parents above the sticky element have overflow (x or y) set to hidden, scroll or auto, sticky will not work.

      Conclusion

      Here are a few additional things to note:

      • With our example, the align-items: flex-start rule on the flex container is important because otherwise flex items default to a value of stretch where the elements would take the whole height of the container, cancelling the sticky effect.
      • We need to make use of the -webkit-sticky vendor prefix for it to work in Safari.
      • Notice how sticky-positioned elements are only sticky within their parent element.
      • Browser support for position: sticky: As of 2020, 95% of browsers have some level of support. For details see Can I Use css-sticky



      Source link