Isolating Root Cause: March 13th Facebook Outage

The Facebook outage that impacted the company’s globally-popular suite of social media apps last week certainly caused lots of headaches. But reports that the interruptions were due to issues on the network level proved premature.

Facebook operates its own collection of 15 data centers globally, which serve as a redundant, internal backbone network. As a result, the public doesn’t readily have insight into how an external routing problem would impact the performance of Facebook’s internal network.

Should You Use a Rules Engine to Manage Business Logic in IoT Applications?

It's not obvious to non-developers just how different computer-expressed logic is from human-expressed logic. It's one of the reasons why developers have a difficult time translating user requirements into conditional statements (rules) when designing software.

Knowing a language means being able to produce an infinite number of sentences never spoken before and to understand sentences never heard before. For us humans, it's natural to say things like Tom likes football and pancakes. For non-developers, the mental effort required to translate such statements into a computer language might not be that obvious. If we were to literally write the same statement into a computer program, it would mean (for the machine) that Tom is happy only when watching football while eating pancakes.

New Tools for Theme Developers: Theme Sniffer Plugin and Automated Accessibility Testing

WordPress contributor teams have shipped several new tools for theme developers in the past couple weeks, which have the potential to raise the quality of new themes coming into the ecosystem. The Theme Sniffer plugin is a new effort from the Theme Review team that uses custom sniffs for PHP_CodeSniffer to test a theme against WordPress coding standards and check for PHP version compatibility.

The plugin is useful for both theme reviewers and developers who want to get their themes approved for the WordPress.org directory. It includes several optional standards to test against beyond the ruleset for theme review requirements. Passing the Theme Sniffer checks is not required for themes entering the directory but reviewers can use the plugin to speed the process up.

The Accessibility Team also published a new tool called WP Theme Auditor that runs Axe tests against a theme for automated accessibility feedback. Axe is an open source library and testing engine created by the accessibility experts at Deque. The WP Theme Auditor package can be installed into a theme’s root directory. Developers can then add test cases. Examples are available in the project’s README file. The tests are run against http://one.wordpress.test by default but developers can specify a different test environment URL.

The Accessibility team plans to expand the test cases in the tool to include all the content from the current Theme Unit Test Data package. In the most recent team meeting, they decided to recommend WP Theme Auditor as a WordPress testing tool and plan to post more details about it on the make.wordpress.org/accessibility blog.

A Quick Introduction to WordPress’ Date/Time Component

At WordCamp Nordic’s contributor day I had the opportunity to chat with Andrey “Rarst” Savchenko about WordPress’ Date/Time component, the code that manages date, time, and timezone functionality. Savchenko is one of the maintainers of this lesser-known component, which includes code that dates back to PHP 4 times. After volunteering for years in the WordPress Stack Exchange forums, he encountered some of the worst Date/Time bugs, eventually spurring him on to get involved improving the code.

“From there it was a slow descent into the madness of the component,” Savchenko said. “Much of my experience ended up in my WpDateTime library. By last year I was, at last, confident I had a good grasp on the extent of the problem and a way forward for core.”

Date/Time issues affect both developers and users. Savchenko said most of the problems, by volume, are related to an incorrect output of localized time by `date_i18n()`. These things can trickle down to users and affect post scheduling, querying, and other operations.

“Some of them are outright bugs and some are easy to break due to incompatibility with Unix timestamps,” Savchenko said. “But many other parts of the core have problems related to time – most often around time zones and daylight savings time. Posts can end up with the wrong time, not published when needed, sorted in the wrong order, and so on.”

The requirement for backwards compatibility makes progress slow but Savchenko and fellow contributors shipped some of their work in the most recent release of WordPress. They will have more solutions available to pursue when the minimum required PHP version is bumped.

“In WordPress 5.1 we had shipped a set of important fixes for documentation and some of the worst bugs in `date_i18n()`.

“At the moment we continue to work on outstanding issues and get ready to implement a set of major new API functions. The work on the component has also revitalized the discussion of introducing user timezones. However I think those need a lot of UX work to reach workable proposal.”

Check out the video below for a quick overview of the work being done on the Date/Time component and find out how you can get involved at the #core-datetime channel in WordPress Slack.

How to Use Python With Real-Time Data and REST APIs

1. Introduction

The Forex Quote API provided by 1forge.com is one of the most generous places with free plans to get real-time currency exchange values. The https://1forge.com/forex-data-api site includes an introduction to the Forex data API.

For free accounts, the REST rate limit is 1000 requests per day returning results in JSON format. It supports more than 700 currency pairs. Unfortunately, the Peruvian Sol (PEN) is not supported.

How to Add Adsense to Your Website

You’ve spent countless hours designing and updating your website. But you’re not getting paid for all of your hard work.

Rather than letting your efforts go to waste, you can monetize your website by adding Google AdSense.

What is Google AdSense?

In short, AdSense is an advertising network run by Google. It’s a free way for websites to make money by displaying targeted Google advertisements on their sites.

Advertisements come in all shapes and sizes. Your site can display images, videos, text, and interactive ads as a monetization strategy.

Arguably the best part about Google AdSense (aside from the cost — it’s free) is that you won’t have to deal with advertisers directly. Everything gets handled through Google’s platform, so you don’t have to worry about collecting money or maintaining relationships when you’re hosting ads.

Google does all of that work for you. It collects money from the advertisers, keeps 32% for its role in facilitating the process, and the remaining 68% goes to the publisher (you).

It’s essentially a hassle-free way to earn money by displaying ads on your website.

How AdSense works

AdSense is based on a bidding system, which is referred to as an “ad auction.”

Advertisers determine how much they are willing to pay for their ads to be displayed by setting a maximum bid price. Google automatically connects advertisers with publishers who have relevant users for the advertisements.

For example, if you run a blog for new mothers about getting through that first pregnancy, your website visitors won’t see ads related to skateboarding targeted at teenage boys.

If more advertisers bid to be displayed on your site, bids will increase as well in order to stay competitive. In this case, you’ll be able to earn more money as a publisher.

Google uses a tool called Ad Rank to determine which ads will appear on your website. This is the basic formula used by Ad Rank.

Ad Rank Formula

Quality score is extremely important, which is why it equally weighted with the bid. Quality score is measured by predicted click-through rates based on past performance as well as other relevant factors, such as keywords.

This means that an ad with a lower bid could win an auction if they have a high quality score, even if other advertisers had a higher bid.

That’s because Google wants to make sure that the ads get clicked, which is a win-win-win scenario for your website, the advertiser, and Google.

Getting paid with AdSense (bid types)

Website owners get paid based on various bid types for the ads they display.

  • CPC (cost per click)
  • CPM (cost per thousand impressions)
  • Active View CPM (active view cost per thousand impressions)
  • CPE (cost per engagement)

CPC

With the CPC monetization strategy, you’ll get paid for each time a website visitor clicks on an ad displayed on your website. Depending on the content of the ad, some advertisers are willing to pay higher rates for clicks than others.

CPM

In the advertising world, the “M” in CPM stands for mille, which is Latin for thousand. So, Cost Per Thousand — or the cost per 1,000 impressions. In this case, publishers are paid for displaying the ad, regardless if a user clicks on it or not.

CPM bids are typically lower than CPC bids since the fee structure is not contingent on the user taking an action. Google will display whichever ad type (CPM or CPC) is expected to earn more revenue for the publisher, which is in Google’s best interest, since they take a 32% share of the revenue.

Active View CPM

In order to get paid for Active View CPM ads, the impressions must be measured as “viewable.” This means that at least 50% of an ad needs to be shown on the screen for at least one second.

These bids will be higher than traditional CPM bids since the chances of a website visitor actually seeing the ad are increased.

CPE

Cost per engagement is based on how active a user is with an advertisement. For example, let’s say an advertiser decides to run a lightbox ad. These formats are expandable — they take up a large portion of the screen if they’re clicked on. If a website visitor hovers over a lightbox ad for more than two seconds, the ad will expand. This is the type of engagement that is required for CPE payouts.

How to add Google AdSense to your website in 7 easy steps

Now that you understand the basics of AdSense and how it works, it’s time to get it set up on your website. Believe it or not, this actually isn’t very complicated. You can put AdSense on your website in just four steps.

Step 1: Set up your site

Before you get started, you need to have an existing website. You can’t apply for AdSense on a hypothetical or future site. So for those of you who are in the process of creating a new website or have an “under construction” landing page, you need to hold off before applying.

If you’re at this stage, I have a few guides that can help you out:

Step 2: Make sure your site is in compliance

Google does not just accept any website into this program. You need to meet their eligibility requirements to be considered.

This means that you must have an easy to use navigation. Elements need to be lined up properly. Text must be easy to read. All of the functionality of your site has to work properly.

AdSense won’t work with any publishers that sell counterfeit goods on their website. Any publishers in the AdSense program aren’t allowed to receive traffic from certain sources, such as paid-to-click programs or unsolicited emails.

Google has a responsibility to its advertisers. Businesses don’t want their ads associated with certain types of websites, so it’s Google’s responsibility to review your website content before you get accepted. These are some examples of content that cannot be included on pages with Google ads:

  • Mature or adult content
  • Shocking content
  • Excessive profanity
  • Malware or adware
  • Drugs or drug paraphernalia
  • Sales of alcohol, tobacco, prescription drugs, weapons, or ammunition
  • Illegal activity
  • Hateful content or discrimination against religion, race, nationality, sexual orientation, gender, etc.

For the full list refer to Google’s eligibility requirements for AdSense. You need to make sure your site complies with all of the guidelines before you apply, or your application will just be rejected.

Step 3: Apply to AdSense

Now that your website is up and running, you’re ready to apply to AdSense.

The first thing you need to do is navigate to the Google AdSense website.

Adsense Homepage

From the Home tab, look for the Sign Up Now button, and click it to start the application process.

Step 4: Configure your ads

Now you have to determine which types of advertisements you want to be displayed on your website.

Configure Adsense Ad Units

On the left side of your dashboard, look for the Content option. Once you click on Content, there will be a drop-down menu with some additional options. From here, you’ll want to click on the Ad Units menu.

This is where you’ll select things like the ad type, ad size, style, and everything else associated with the advertising space that advertisers will be bidding for.

When choosing a size, it’s in your best interest to go with one of the options recommended by Google. While there are a wide variety of choices, Google gives you recommendations based on the most popular sizes for advertisers.

For ad style options, you can control how text ads are displayed on your site. The best way to do this is to match the style with your website’s color scheme.

Step 5: Copy and paste the AdSense code onto your site

After you’re done configuring your ads, scroll to the bottom of the page.

Copy Adsense Code

Click on the “save and get code” button.

Google will automatically generate a code for you to add to your website, which will look something like this.

Adsense Code Example

Next, you’re going to copy and paste this code to your website. If you’re using WordPress, you can do this by using widgets.

From the administrative dashboard, go to Appearance and find Widgets.

Paste the custom AdSense URL, then you and just drag and drop the code into the widget area where you want it displayed on your website.

Adsense Widget

Alternatively, you can use plugins to help you manage your ads. I’d recommend the AdSanity plugin for this.

Step 6: Update your privacy policy

When AdSense is enabled, you need to include a privacy policy on your website. This is in place to let your website visitors know that an ad network is displaying ads on your site.

Here’s the full Google resource for required content in your privacy policy.

Step 7: Verify your address

Once you start generating earnings from Google AdSense, you’ll receive a card from Google in the mail. Before you can withdraw your earnings, you’ll need to make sure your address has been verified.

The card will include a PIN associated with your AdSense account. Just follow the instructions on your card for verifying the PIN online.

Once the PIN and address have been verified, you’ll be able to cash out payments when your account reaches the specified payment threshold.

Google AdSense best practices

Now that you’ve got AdSense installed on your website, you’ll want to make sure that you’re getting the most out of being a publisher. There are certain do’s and don’ts you need to be aware of.

Following these best practices will help you earn more money and reduce your chances of violating Google’s policies.

Never click on your own ads

Since AdSense is based on clicks and other engagement, clicking an advertisement on your own website is considered fraudulent. It’s important that you don’t let any family members in your household click on those ads either.

Google won’t be able to tell the difference between you or your spouse if you’re living together. If they see clicks coming from your house to ads on your website, they can remove you from the AdSense program.

Don’t display ads on your ecommerce site

This isn’t a violation of Google’s policy, but it’s not in the best interest for driving conversions on your website. Remember, AdSense is based on relevancy. So it’s possible (and likely) that one of your competitors’ ads could appear on your website.

If this happens, you could be driving visitors away from your website to a competitor’s site instead. The amount you’ll get paid for displaying the ad isn’t worth the lost sale. Furthermore, ads can distract users from your CTAs and sales copy, even if they aren’t associated with your competition.

So, I wouldn’t recommend AdSense to any websites selling products or services.

Run different ad units

Everyone has different preferences. Different website visitors might be attracted to different styles and types of ads displayed on your website.

If you’re just running the same ad unit over and over again, you could be leaving some money on the table. For example, let’s say you’re only running text and display ad units right now. You can probably earn more as a publisher by running native ads.

Native Ads

But you won’t know this for certain until you experiment with different ad units.

Find the best placement

In addition to experimenting with ad units, you’ll also want to test different areas of your website for displaying ads. You can’t assume that the first place you put your ad is the best.

I’d recommend checking out Google’s best practices for ad placements based on the type of website you have. They have different suggestions for:

  • Blogs
  • Gaming sites
  • News sites
  • Travel sites
  • Sports sites
  • Classifieds
  • Forums

It’s also a good idea to look at some of the most popular and successful websites in your industry. Look at their ad placements. If you notice a common formula across the board, you can try to replicate that as well.

Create content and drive traffic

AdSense isn’t a magic ticket to making money on your website. It’s 100% reliant on your website traffic. So you need to be constantly creating new content and coming up with ways to get more people to your website.

If you’re in a rut with creating content, you might want to read these guides:

The more traffic you have, the greater chances you’ll have of getting ads seen, clicked, and engaged with.

You can’t just put yourself on autopilot once you add AdSense to your website. It’s imperative that you continue doing all the good things that brought people to your website in the first place. This will be the best way for you to earn money.

In sum: It’s easy to add AdSense to your website

There you have it. You can add Google AdSense to your website in just seven steps.

I’d recommend AdSense for any website that isn’t already selling a product or service. There are tons of other ad networks out there, but Google is definitely the most reputable. AdSense is free for publishers, so there is no harm in trying it out.

Be sure to use this guide as a reference when you’re ready to set up AdSense. Follow my seven-step guide and your site will soon be earning money with ads.

Lightweight Serverless Java Functions With Quarkus

Quarkus is a “next-generation Kubernetes native Java framework” which is available as open source. Quarkus promises fast boot times and low memory usages. This makes Quarkus a perfect fit for Java workloads running as microservices on Kubernetes as well as Java workloads running as serverless functions.

Read the article Why Quarkus to learn how Quarkus works. In a nutshell, Quarkus compiles Java source code in native binaries via GraalVM. The Quarkus framework helps developers to easily build applications that can leverage the GraalVM benefits.

#CodePenChallenge: Literary Luminaries

Week Three of our Tributes challenge starts now!

Last week, we celebrated our favorite visual and musical artists. Check out the Pens from week two in our Art Heroes collection.

March Challenge Sponsor: Buddy

Buddy turns DevOps to NoOps with blazing fast performance packed in exceptional UI/UX. Create delivery pipelines in 10 minutes from over 100 pre-configured actions: builds, tests, deployments & more.

Week Three Prompt: Literary Luminaries

This week, we celebrate the people who can work a different kind of magic with a pen! Let's pay tribute to our favorite folks in the world of literature.

Your Challenge

Create a Pen that pays tribute to your favorite author, book illustrator, or playwright.

How to Participate

Create a Pen and tag it codepenchallenge and the weekly tag cpc-lit-hero. We'll gather those Pens into a collection and share our favorites on Twitter and Instagram (Use the #CodePenChallenge tag on Twitter and Instagram as well).

Ideas

  1. Children's books are full of magical images and brilliant turns of phrase. Create a Pen that showcases your favorite book from when you were little — or your favorite book to read to the little ones in your life!
  2. Book cover art is constantly evolving, and over time the very best books get many different covers. Could you recreate your favorite cover of your favorite book? Or maybe create a new one?
  3. Some great writing is meant to be performed. Highlight your favorite playwright's work with a fitting Pen tribute.

Resources

  1. Check out the The Art of Dr. Seuss Collection or the Eric Carle Museum of Picture Book Art for beautiful works of art in children's literature.
  2. Browse the Book Cover Archive or Typeroom's highlights from the Penguin Essentials Collection for cover inspiration.
  3. Planning to put on a play in a Pen? Browse through MIT's catalog of The Complete Works of William Shakespeare, or dig into some modern classics in Onstage Blog's Top 25 Plays of the 21st Century...So Far.

The post #CodePenChallenge: Literary Luminaries appeared first on CodePen Blog.

Collective #500


C500_nested

CSS Nesting Module

The draft of a new CSS module that introduces the ability to nest one style rule inside another.

Read it




C500_scroll

lax.js

A light-weight JavaScript library to create smooth and beautiful animations when you scroll.

Check it out




C500_core

Core

A responsive front-end feature kit in React. By the folks of Mason.

Get it
















Collective #500 was written by Pedro Botelho and published on Codrops.

The Whole Spreadsheets as Databases Thing is Pretty Cool

A spreadsheet has always been a strong (if fairly literal) analogy for a database. A database has tables, which is like a single spreadsheet. Imagine a spreadsheet for tracking RSVPs for a wedding. Across the top, column titles like First Name, Last Name, Address, and Attending?. Those titles are also columns in a database table. Then each person in that spreadsheet is literally a row, and that's also a row in a database table (or an entry, item, or even tuple if you're really a nerd).

It's been getting more and more common that this doesn't have to be an analogy. We can quite literally use a spreadsheet UI to be our actual database. That's meaningful in that it's not just viewing database data as a spreadsheet, but making spreadsheet-like features first-class citizens of the app right alongside database-like features.

With a spreadsheet, the point might be viewing the thing as a whole and understanding things that way. Browsing, sorting, entering and editing data directly in the UI, and making visual output that is useful.

With a database, you don't really look right at it — you query it and use the results. Entering and editing data is done through code and APIs.

That's not to say you can't look directly at a database. Database tools like Sequel Pro (and many others!) offer an interface for looking at tables in a spreadsheet-like format:

What's nice is that the idea of spreadsheets and databases can co-exist, offering the best of both worlds at once. At least, on a certain scale.

We've talked about Airtable before here on CSS-Tricks and it's a shining example of this.

Airtable calls them bases, and while you can view the data inside them in all sorts of useful ways (a calendar! a gallery! a kanban!), perhaps the primary view is that of a spreadsheet:

If all you ever do with Airtable is use it as a spreadsheet, it's still very nice. The UI is super well done. Things like filtering and sorting feel like true first-class citizens in a way that it's almost weird that other spreadsheet technology doesn't. Even the types of fields feel practical and modern.

Plus with all the different views in a base, and even cooler, all the "blocks" they offer to make the views more dashboard-like, it's a powerful tool.

But the point I'm trying to make here is that you can use your Airtable base like a database as well, since you automatically have read/write API access to your base.

So cool that these API docs use data from your own base to demonstrate the API.

I talked about this more in my article How To Use Airtable as a Front End Developer. This API access is awesome from a read data perspective, to do things like use it as a data source for a blog. Robin yanked in data to build his own React-powered interface. I dig that there is a GraphQL interface, if it is third-party.

The write access is arguably even more useful. We use it at CodePen to do CRM-ish stuff by sending data into an Airtable base with all the information we need, then use Airtable directly to visualize things and do the things we want.

Airtable alternatives?

There used to be Fieldbook, but that shut down.

RowShare looks weirdly similar (although a bit lighter on features) but it doesn't look like it has an API, so it doesn't quite fit the bill for that database/spreadsheet gap spanning.

Zoho Creator does have an API and interesting visualization stuff built in, which actually looks pretty darn cool. It looks like some of their marketing is based around the idea that if you need to build a CRUD app, you can do that with this with zero coding — and I think they are right that it's a compelling sell.

Actiondesk looks interesting in that it's in the category of a modern take on the power of spreadsheets.

While it's connected to a database in that it looks like it can yank in data from something like MySQL or PostgreSQL, it doesn't look like it has database-like read/write APIs.

Can we just use Google Sheets?

The biggest spreadsheet tool in the sky is, of course, the Google one, as it's pretty good, free, and familiar. It's more like a port of Excel to the browser, so I might argue it's more tied to the legacy of number-nerds than it is any sort of fresh take on a spreadsheet or data storage tool.

Google Sheets has an API. They take it fairly seriously as it's in v4 and has a bunch of docs and guides. Check out a practical little tutorial about writing to it from Slack. The problem, as I understand it, is that the API is weird and complicated and hard, like Sheets itself. Call me a wimp, but this quick start is a little eye-glazing.

What looks like the most compelling route here, assuming you want to keep all your data in Google Sheets and use it like a database, is Sheetsu. It deals with the connection/auth to the sheet on its end, then gives you API endpoints to the data that are clean and palatable.

Plus there are some interesting features, like giving you a form UI for possibly easier (or more public) data entry than dealing with the spreadsheet itself.

There is also Sheetrock.js, an open source library helping out with that API access to a sheet, but it hasn't been touched in a few years so I'm unsure the status there.

I ain't trying to tell you this idea entirely replaces traditional databases.

For one thing, the relational part of databases, like MySQL, is a super important aspect that I don't think spreadsheets always handle particularly well.

Say you have an employee table in your database, and for each row in that table, it lists the department they work for.

ID  Name                  Department
--  --                    --
1   Chris Coyier          Front-End Developer
2   Barney Butterscotch   Human Resources   

In a spreadsheet, perhaps those department names are just strings. But in a database, at a certain scale, that's probably not smart. Instead, you'd have another table of departments, and relate the two tables with a foreign key. That's exactly what is described in this classic explainer doc:

To find the name of a particular employee's department, there is no need to put the name of the employee's department into the employee table. Instead, the employee table contains a column holding the department ID of the employee's department. This is called a foreign key to the department table. A foreign key references a particular row in the table containing the corresponding primary key.

ID  Name                  Department
--  --                    --
1   Chris Coyier          1
2   Barney Butterscotch   2 

ID  Department            Manager    
--  --                    --
1   Front-End Developers  Akanya Borbio
2   Human Resources       Susan Snowrinkle

To be fair, spreadsheets can have relational features too (Airtable does), but perhaps it isn't a fundamental first-class citizen like some databases treat it.

Perhaps more importantly, databases, largely being open source technology, are supported by a huge ecosystem of technology. You can host your PostgreSQL or MySQL database (or whatever all the big database players are) on all sorts of different hosting platforms and hardware. There are all sorts of tools for monitoring it, securing it, optimizing it, and backing it up. Plus, if you're anywhere near breaking into the tens of thousands of rows point of scale, I'd think a spreadsheet has been outscaled.

Choosing a proprietary host of data is largely for convenience and fancy UX at a somewhat small scale. I kinda love it though.

The post The Whole Spreadsheets as Databases Thing is Pretty Cool appeared first on CSS-Tricks.

Super Dynamic APEX Forms Using APEX_ITEM and Dynamic Actions

Working with forms in Oracle APEX is really easy and even fun thanks to the improved wizard that can create a form page on any table, view, or even on a web source in a few simple and clear steps. But sometimes you'll need to enter multiple 'rows' at once. In most of these cases, you will not know how many items or rows the user will need to enter until run time, so the user may want to enter one row or 10 rows, and sometimes the user will enter zero rows of this specific type. So the question now is how can you, as a developer, build a 'dynamic form', a form that accepts multiple rows that can change in size according to the user's wish?

The answer is APEX_ITEM package + APEX's dynamic actions. Using this mix, you can build a very dynamic, powerful form on any page of your application. APEX_ITEM is a package that, according to Oracle's formal definition, is used to "create form elements dynamically based on a SQL query instead of creating individual items page by page." So basically, it gives the developer the ability to create items dynamically, and from these items, a form can be built. APEX_ITEM offers a list of item types: text box, text area, LOV (list of values), date popup, etc. For details, see Oracle's reference.

What You Need Know Before GDC 2019

For more than 30 years, the Game Developers Conference (GDC) has been one of the prominent events for displaying the most innovative video game technology to developers around the world. Each year, more than 28,000 developers gather for one week and learn about the advancements taking place in the video game industry and share the techniques and technologies shaping the future of gaming. This year, GDC will run from Monday, March 18 until Friday, March 22 in San Francisco, CA.

In this series, we will cover the significant updates from GDC 2019 each day of the week and recap the conference after its conclusion on Friday, March 22. Even if video games are not the reader's specialty or not of particular interest, GDC 2019 will likely include many noteworthy announcements and innovations that will ripple far beyond video games. Regardless of background, it is essential to digest the wealth of information and transformative technologies that will emerge from San Francisco next week.

Finally, a CSS Only Solution to :hover on Touchscreens

CSS :hover
There have been problems with the :hover pseudo-class ever since the first web browser was installed on a touchscreen device. Of course, there were solutions, but none were the solution. With the new Level 4 Media Queries, this issue seems like it’s solved for good.

‘Uhm… What’s the Problem Again?’

So let’s say you simply added a :hover styling to an element of your webpage, so it gets some styling when the mouse hovers over it. Easy.

Hovering on desktop. Source: https://proper-hovering.glitch.me