Tag: CSS

  • The Separation of HTML and CSS

    The Separation of HTML & CSS
    An illustration of HTML on the left and CSS on the right.

    In its basic sense, HTML is standalone. It is independent from CSS especially from the perspective of screenreaders and search engine crawlers. This goes to show about the importance of semantics and content structure in the HTML markup.

    In this regard, I strongly advocate for the manipulation of the style sheet instead of the manipulation of the HTML markup.

    Consider the scenario wherein you, as the front-end designer, have only 3 chances in having control over the HTML markup and on the other hand, an unlimited number of revisions and updates on the visual design aspect of the project.

    This indeed is a far-fetched situation – but it definitely will get us creative in setting up the HTML markup or in planning ahead. This scenario encourages us to use semantic names in the class attribute of the HTML markup as opposed to peppering it with presentational class names which are heavily tied up with the style sheet.


    In this basic HTML and CSS tutorial, we are going to demonstrate the following:

    • the separation of HTML (content structure) and CSS (visual design)
    • how to position a secondary element (like a graphic element or a label) thru CSS position: absolute and padding

    And some disclaimers:

    • while it discusses semantics, it does not tackle accessibility attributes (say, ARIA)
    • it does not show any SEO / screenreader test results regarding the benefits of an HTML markup with intentions on content structure or semantic HTML markup
    • it only translates into HTML and CSS a specific component (from a much complicated whole), although the HTML and CSS process remains the same if applied to a whole

    Separation of HTML and CSS

    HTML markup is intended for chunks of text content to have meaning for web browsers (screenreaders and search engine crawlers too, among others that I am not aware of) so that they could very well translate the content into something that people would understand easily.

    The text content along with its HTML markup must stand alone without the CSS layer. The content structure must remain intact and must be established before fully considering the visual design. Imagine writing a document in rich text format wherein you could create headings, lists, etc.

    This separation prevents the compromise of the content structure. For example, in a visual design mock-up it is shown that the navigation is located on top of the brand logo – in the HTML, should the author be putting the navigation markup first before the brand name markup or vice versa?

    In web design, it is not our ultimate goal to only replicate the visual design mock-up using HTML and CSS. While it is important to achieve visual quality, there’s an optimal approach in doing it while adhering to HTML’s semantic intentions. And semantics is the way to properly communicate with search engine crawlers and screenreaders. And of course, ultimately the people to whom the information is served.

    The Example

    The “Next Post” and “Previous Post” links are common in blog websites. Sometimes they also contain the article titles. Here’s a sample screenshot from PetaPixel.

    The Next & Previous post links in blog websites

    Step 1: Establish the content structure

    Let’s say we want to show the article titles along with their respective labels; the raw content would follow this structure:

    Previous Post: Previous article title
    Next Post: Next article title

    We give importance to the previous article that’s why it’s on top. But if our intention is for the reader to read forward to newer posts, we put the next article on top.

    Step 2: Markup using HTML

    <label>Previous Post:</label> <a>Previous article title</a>
    <label>Next Post:</label> <a>Next article title</a>

    Marking up in HTML involves semantics – meaning, assign the HTML element that conveys the meaning of that content. Sometimes it is objective and sometimes it depends on the HTML author’s intention.

    In our example, the objective nature of “Previous Post:” is that it is a label and it is also our intention – for it to be a simple text label that’s why we marked it up by the HTML label tag. For the article title, our intention is for it to be a link, so we marked it up by the HTML a tag.

    But since the label tag is intended for form elements, we choose another HTML tag that could convey the label meaning. Unfortunately, there isn’t any other HTML element intended for labels outside of forms. Here will come in handy, the generic inline tag which is span. Only use it as a last resort if you can’t match the content with its semantic HTML tag.

    <span>Previous Post:</span> <a>Previous article title</a>
    <span>Next Post:</span> <a>Next article title</a>

    Step 3: Put the proper HTML attributes

    <span class="label">Previous Post:</span> <a href="#">Previous article title</a>
    <span class="label">Next Post:</span> <a href="#">Next article title</a>

    Since span is a generic element, we must put a class attribute with a class name to make it semantic.

    Step 4: Label the component

    <span class="label">Post Navigation</span>
    <span class="label">Previous Post:</span> <a href="#">Previous article title</a>
    <span class="label">Next Post:</span> <a href="#">Next article title</a>

    Consider these links as one control – a type of navigation that aids the reader to navigate through old and new articles. In this regard, we could label it “Post Navigation”.

    Step 5: Check the HTML document in a web browser

    Remember about the separation of HTML and CSS? Apart from giving importance to the content structure (the arrangement of content according to its importance from top to bottom), we should also give importance to the bare HTML document that is displayed in the web browser.

    Does the content displayed conveys the content structure? Does it show hierarchy of information? Or the very least, is it readable? One could argue that it is readable – although we could further improve its readability by further improving its sematics.

    Step 5: Level up the semantics

    We will be adding several HTML tags not to “fix” the layout of what the browser displays but to be more semantic which in turn, positively affects the way the content is displayed and laid out in the web browser.

    <div class="post-navigation">
        <span class="label">Post Navigation</span>
        <ul>
            <li><span class="label">Previous Post:</span> <a href="#">Previous article title</a></li>
            <li><span class="label">Next Post:</span> <a href="#">Next article title</a></li>
        </ul>
    </div>

    Here comes the importance of knowing if an HTML element is block-level element or an inline-level element. To simply put, block-level elements simply block off the entire width of the space it occupies while inline-level elements could be joined together on a line – just like in our example on Step 5.

    So, basically, span is an inline-level element, as well as a that’s why they are displayed all on one line.

    On using <div>

    Use div to contain components or content when there’s no appropriate HTML elements that match. Another thing is div provide for the flexibility to nest or contain any kind of HTML element unlike p, HTML standards does not allow it to contain a div, for example.

    On using <p>

    Personally, I would use p or the paragraph tag as a substitute for div as a block-level element. This is OK for simple text content.

    On using <ul>

    ul stands for unordered list. I intend to treat the previous and next content to be a list of actions. Though one could also simply intend to treat them as they are, like:

    <div class="post-navigation">
        <p class="label title">Post Navigation</p>
        <p class="previous-action"><span class="label">Previous Post:</span> <a href="#">Previous article title</a></p>
        <p class="next-action"><span class="label">Next Post:</span> <a href="#">Next article title</a></p>
    </div>

    But I prefer using ul as it conveys structure.

    Step 6: Check the HTML document in a web browser

    That’s more readable, right? While its underlying markup wasn’t constructed to convey layout but meaning.

    Step 7: Pre-CSS – classify HTML elements

    Now that we got it going for us in terms of readability, we can now proceed to setting-up our HTML markup for CSS considerations.

    While the HTML markup of the example above is OK on its own, we must remember that working with CSS requires us to easily pinpoint or target HTML elements directly or at least using fewer selectors, otherwise it would be very difficult to style such elements. We could achieve this by naming HTML elements thru the class attribute. And these attribute values we will use as selectors to pinpoint the HTML element.

    <div class="post-navigation">
        <p class="label title">Post Navigation:</p>
        <ul class="action-list">
            <li class="previous-action"><span class="label">Previous Post:</span> <a href="#">Previous article title</a></li>
            <li class="next-action"><span class="label">Next Post:</span> <a href="#">Next article title</a></li>
        </ul>
    </div>

    Here, we specifically classified “previous-action” and “next-action” so that we could easily pinpoint it during the CSS phase. Of course, apart from CSS considerations, this approach is an added semantics to our HTML document because apart from marking up the content as a list, we specified what type of content are contained within each list item.

    At this point, I wouldn’t say that classifying each HTML element is purely for semantic purposes only because we are already transitioning towards the CSS phase, thus pre-CSS.


    Watch our for the second and last part of this tutorial tomorrow wherein we will demonstrate that CSS could simply transform the content displayed top to be laid out at the bottom (or anywhere else).

  • I Agree to the Terms of Agreement

    A while ago, I was connecting my HTC phone to Mac and it needed a piece of app to do so. Of course, there’s a requirement to agree to something I seldom read.

    My behavior is to press on the label “I agree to the terms of the license agreement” instead of on the checkbox hoping that this will also tick the box.

    I Agree to the Terms of Agreement

    But nothing happens because the label is a mere label unconnected from the form element (checkbox).

    How do we make it easier for the user?

    We must provide an action whether the user’s behavior is to press on the checkbox or on the label – the box should toggle.

    (more…)

  • Recreating Spotify’s Album Cover

    Ever use Spotify? It’s been around for many years now but just two months ago it landed here in Philippines – making everyone curb their Aegis.

    Circular images everywhere

    No doubt that the traditional rectangle image has lost its edge literally. CSS border-radius enabled designers to carve the sharp edges into rounded corners. And take it to the extreme, the corners vanish and the shape becomes a circle.

    Spotify’s app presents album and artist covers in a circular manner with the same picture faded in the background.

    Spotify - Album Covers
    A screenshot of Spotify’s Mac application showing the circular album and artist covers.

    This is what we’ll recreate using HTML and CSS.

    (more…)
  • Center-align lists

    It’s easy to center-align a bunch of text:

    [code lang=”html” title=”HTML”]
    <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>
    [/code]

    [code lang=”css” title=”CSS”]
    p {text-align:center;}
    [/code]

    But how do you center-align a list such as a ul or an ol with children set as inline (or side by side)?

    Simply set the parent (ul) to text-align:center and the children (li) to display:inline-block

    [code lang=”html” title=”HTML”]
    <ul>
    <li><a href="#">Home</a></li>
    <li><a href="#">About</a></li>
    <li><a href="#">Contact</a></li>
    </ul>
    [/code]

    [code lang=”css” title=”CSS”]
    ul {
    list-style:none;
    margin:0;
    padding:0;
    text-align:center;
    }

    li {display:inline-block;}
    [/code]

    This is useful for footer links displayed in mobile browsers wherein you want texts to center-align.

    See a demo at CSSDesk

  • CSS, I could see what you’re doing there…

    …you’re translating all the features and functions of all software combined into styles and you’re making the browser a mashup of those software.

    CSS, I could see what you're doing there

    One day, Photoshop will have an “export to HTML and CSS” function wherein the lens flare filter I dearly love would be a bunch of vector shapes rendered by the browser.

    And whenever I see the need to make the lens flare in my image more awesome, I could easily tweak it:

    [code lang=”css” title=”CSS”]
    img {
    lens-flare-type:35mm-prime;
    lens-flare-brightness:100%;
    }
    [/code]

    By then, writing the stylesheet might become as easy as spelling my name in binary code due to its vast properties and values.

    Then we’ll be back to GUIs again.

  • CSS Regions–we’re waiting for you

    Your content will flow through various containers (called regions) which you specify.

    The CSS regions module allows content to flow across multiple areas called regions. The regions are not necessarily contiguous in the document order. The CSS regions module provides an advanced content flow mechanism, which can be combined with positioning schemes as defined by other CSS modules such as the Multi-Column Module [CSS3COL] or the Grid Layout Module [CSS3-GRID-LAYOUT] to position the regions where content flows.

    Source: http://dev.w3.org/csswg/css-regions/

    CSS Regions
    An analogy of CSS Regions using a faucet and water flowing through interconnected containers.

    Imagine a magazine layout where you could have multiple columns in your article or where the cut of a paragraph continues to the next page.

    With all these CSS developments going on, one could really build a web app based on HTML and CSS as its front-end.

    We’re really in the 21st century.

    Also, checkout Adobe & HTML’s page on CSS Regions.

  • We’re waiting for position:sticky

    Sounds like booger? Nope, it’s what’s been brewing in browsers and hopefully it becomes a standard. The basic syntax is:

    [code lang=”css” title=”CSS”]
    div {position:sticky;}
    [/code]

    We already have position:fixed and it sticks!

    Well, if you’re familiar with the CSS propety-value position:fixed, it fixes the position of an element relative to the viewport (and not its parent element)–so that when you scroll the screen, the element stays where you tell it to. That’s one of its caveats: it escapes any parent and becomes relative to the viewport or in other words, it escapes the layout.

    position:fixed sticks but we don’t have much control over it like if we want the element to be contained to its parent element. On the other hand, position:sticky is more like position:absolute (the power of being relative to its parent) + position:fixed (the power to stay where you tell it to).

    An illustration of element with different position property values.
    An illustration of elements with different position property values.

    What’s more to sticky?

    The proposal is that you could define its top, right, bottom, and left values to be detected relative to the viewport–and this is the time when sticky will be activated. For example:

    [code lang=”css” title=”CSS”]
    div {
    position:sticky;
    top:10px;
    }
    [/code]

    Wherever this div is located, when you scroll the screen and this element is exactly 10px from the top of your viewport, it will become sticky so that when you scroll farther away, that element stays in your view (you can do this to position:fixed but with the help of JS for the activation part).

    One last thing, I propose it be named, stick as in, position:stick.

  • Minify and un-minify CSS

    Whether you have an unreadable stylesheet or you want to minify/compress it for optimization purposes, Client-side CSS (De)Compressor is your friend.

    Update: since the previous tool doesn’t exist anymore, here’s another tool to unminify your CSS:

  • Setting the width of absolutely-positioned elements

    One way to set the height of an element to 100% is to absoultely-position it yet you needed a max-width for it to follow (instead of a simple width) for layout reponse purposes.

    The solution is to simply set its width to 100% and set the max-width to your desired value. For example:

    [code lang=”css” title=”CSS”]
    div {
    position:absolute;
    width:100%;
    max-width:1280px;
    height:100%;
    background-color:red;
    }
    [/code]

  • 100% parent, definite-width child

    You want to have a 100% expanding parent while still having control over the child to have a definite width?

    What’s the use for this? A 100% background not interfering with the child that has width.

    [code title=”HTML” lang=”html”]
    <div class="container">
    <div class="content">
    Content
    </div>
    </div>
    [/code]

    [code title=”CSS” lang=”css”]
    .container {
    background-color:red;
    }

    .content {
    margin:0 auto; /* To center the div */
    max-width:960px; /* To make it responsive in viewports smaller than 960px */
    }
    [/code]

    And you can even add box-sizing:border-box to the content!

    [code title=”CSS” lang=”css”]
    .content {
    max-width:960px;
    box-sizing:border-box; /* Don’t forget to add the vendor prefixes */
    }
    [/code]