Display & Video 360 is Google’s consolidated marketing platform that helps marketers manage their campaigns across display, video, TV, audio, etc., all in one place. The platform is designed to increase productivity in collaborative environments and simplify marketing data visualization through consolidation.
US HHS Introduces New Healthcare APIs
The US Department of Health and Human Services (HHS) has finalized two rules aimed at delivering US patients better access to their own health data. One rule was issued by the HHS Office of National Coordinator for Health Information Technology (ONC). The other was issued by HHS Centers for Medicare & Medicaid Services (CMS).
Negative Margins
PPK digs into the subject, which he found woefully undercovered in web tech documentation. Our entry doesn't mention them at all, which I'll aim to fix.
Agree on this situation:
This is by far the most common use case for negative margins. You give a container a padding so that its contents have some breathing space. However, you want the header to span the entire container, ignoring the padding. Negative margins are the way to go.
Like this:
Anecdotally, I find negative margins fairly intuitive. Although that's surprising since there are so many oddities, like how they sometimes affect the element applied to itself (e.g. move itself to the left) and sometimes affect other elements (e.g. move other elements upward) — plus the fact that it affects margin collapsing which is weird anyway.
It would probably be smart to do this directional margin stuff with logical properties too.
Direct Link to Article — Permalink
The post Negative Margins appeared first on CSS-Tricks.
Go Gets Protocol Buffering
The latest Go API release includes support for protocol buffers: Google's language-neutral and platform-neutral data interchange format. Although protocol buffer bindings were originally rolled out for Go between 2010 and 2012, Go and protocol buffers have both evolved. Because user changes have evolved to a point where making new practices compatible with older versions, the latest Go release includes a completely rebuilt protobuf module.
Booknetic: WordPress Appointments & Booking in a Box
Adding a robust booking system to your WordPress site is arduous for beginners and pros alike. If you were to code a booking system from scratch, it would probably take months, if not years. And it would be an exercise in futility, especially when the wheel has already been invented, and there exist amazing plugins […]
The post Booknetic: WordPress Appointments & Booking in a Box appeared first on WPExplorer.
WordPress Database Clean-up – How to Go about It?
Operating a WordPress website comprises of multiple tasks! One of the most crucial and overlooked tasks is database maintenance. Most people think that the MySQL database is an essential Aspect of WordPress install and conveniently forget about the same. It is necessary to manage the database systems in WordPress. There needs to be daily clean-ups […]
The post WordPress Database Clean-up – How to Go about It? appeared first on WPArena.
Relay Medical Announces API for its Medication Management System
Relay Medical Corp., a Canadian provider of MedTech solutions, has announced a new API for the company’s Pharmatrac Medication Management System. The new API provides opportunities for greater integration with Relay’s partners in the telemedicine and medication management markets.
Currying in CSS
Funny timing on this I was just looking at the website for Utopia (which is a responsive type project which I hate to admit I don't fully understand) and I came across some CSS they show off that looked like this:
:root {
--fluid-max-negative: (1 / var(--fluid-max-ratio) / var(--fluid-max-ratio));
--fluid-min-negative: (1 / var(--fluid-min-ratio) / var(--fluid-min-ratio));
...
}
See anything weird there? That code is using mathematical operators, but there is no calc()
function wrapped around it.
Just as my curiosity set in, Trys Mudford, a creator of Utopia, blogged it:
The value after the
:
in the CSS custom property does not have to be valid CSS. It won’t cause any errors, nor invalidate the custom property. It won’t be evaluated in the browser until used, or more specifically, placed in acalc()
function.
Here's a contrived example:
:root {
--padding: 1rem;
/* These are meaningless alone */
--padding-S: var(--padding) / 2;
--padding-L: var(--padding) * 2;
}
.module--large {
/* But they evaluate once they are in a calc() */
padding: calc(var(--padding-L));
}
In my limited understanding, currying is like functions that return functions. I suppose this is sorta like that in that the alternate padding properties above are sort of like derivative functions of the main padding function (if you can call it that), and you only call them and execute them as needed.
The post Currying in CSS appeared first on CSS-Tricks.
Creating a Modal Image Gallery With Bootstrap Components
Have you ever clicked on an image on a webpage that opens up a larger version of the image with navigation to view other photos?
Some folks call it a pop-up. Others call it a lightbox. Bootstrap calls it a modal. I mention Bootstrap because I want to use it to make the same sort of thing. So, let’s call it a modal from here on out.
Why Bootstrap? you might ask. Well, a few reasons:
- I’m already using Bootstrap on the site where I want this effect, so there’s no additional overhead in terms of loading resources.
- I want something where I have complete and easy control over aesthetics. Bootstrap is a clean slate compared to most modal plugins I’ve come across.
- The functionality I need is fairly simple. There isn’t much to be gained by coding everything from scratch. I consider the time I save using the Bootstrap framework to be more beneficial than any potential drawbacks.
Here’s where we’ll end up:
Let’s go through that, bit by bit.
Step 1: Create the image gallery grid
Let’s start with the markup for a grid layout of images. We can use Bootstrap’s grid system for that.
<div class="row" id="gallery">
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-1">
</div>
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-2">
</div>
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-3">
</div>
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-4">
</div>
</div>
Now we need data attributes to make those images interactive. Bootstrap looks at data attributes to figure out which elements should be interactive and what they should do. In this case, we’ll be creating interactions that open the modal component and allow scrolling through the images using the carousel component.
About those data attributes:
- We’ll add
data-toggle="modal"
anddata-target="#exampleModal"
to the parent element(#gallery
). This makes it so clicking anything in the gallery opens the modal. We should also add the data-target value (#exampleModal
) as the ID of the modal itself, but we’ll do that once we get to the modal markup. - Let’s add
data-target="#carouselExample"
and adata-slide-to
attribute to each image. We could add those to the image wrappers instead, but we’ll go with the images in this post. Later on, we’ll want to use the data-target value (#carouselExample
) as the ID for the carousel, so note that for when we get there. The values fordata-slide-to
are based on the order of the images.
Here’s what we get when we put that together:
<div class="row" id="gallery" data-toggle="modal" data-target="#exampleModal">
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-1.jpg" data-target="#carouselExample" data-slide-to="0">
</div>
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-2.jpg" data-target="#carouselExample" data-slide-to="1">
</div>
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-3.jpg" data-target="#carouselExample" data-slide-to="2">
</div>
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-4.jpg" data-target="#carouselExample" data-slide-to="3">
</div>
</div>
Interested in knowing more about data attributes? Check out the CSS-Tricks guide to them.
Step 2: Make the modal work
This is a carousel inside a modal, both of which are standard Bootstrap components. We’re just nesting one inside the other here. Pretty much a straight copy-and-paste job from the Bootstrap documentation.
Here’s some important parts to watch for though:
- The modal ID should match the
data-target
of the gallery element. - The carousel ID should match the
data-target
of the images in the gallery. - The carousel slides should match the gallery images and must be in the same order.
Here’s the markup for the modal with our attributes in place:
<!-- Modal markup: https://getbootstrap.com/docs/4.4/components/modal/ -->
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<!-- Carousel markup goes here -->
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
We can drop the carousel markup right in there, Voltron style!
<!-- Modal markup: https://getbootstrap.com/docs/4.4/components/modal/ -->
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<!-- Carousel markup: https://getbootstrap.com/docs/4.4/components/carousel/ -->
<div id="carouselExample" class="carousel slide" data-ride="carousel">
<div class="carousel-inner">
<div class="carousel-item active">
<img class="d-block w-100" src="/image-1.jpg">
</div>
<div class="carousel-item">
<img class="d-block w-100" src="/image-2.jpg">
</div>
<div class="carousel-item">
<img class="d-block w-100" src="/image-3.jpg">
</div>
<div class="carousel-item">
<img class="d-block w-100" src="/image-4.jpg">
</div>
</div>
<a class="carousel-control-prev" href="#carouselExample" role="button" data-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a class="carousel-control-next" href="#carouselExample" role="button" data-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
Looks like a lot of code, right? Again, it’s basically straight from the Bootstrap docs, only with our attributes and images.
Step 3: Deal with image sizes
This isn’t necessary, but if the images in the carousel have different dimensions, we can crop them with CSS to keep things consistent. Note that we're using Sass here.
// Use Bootstrap breakpoints for consistency.
$bootstrap-sm: 576px;
$bootstrap-md: 768px;
$bootstrap-lg: 992px;
$bootstrap-xl: 1200px;
// Crop thumbnail images.
#gallery {
img {
height: 75vw;
object-fit: cover;
@media (min-width: $bootstrap-sm) {
height: 35vw;
}
@media (min-width: $bootstrap-lg) {
height: 18vw;
}
}
}
// Crop images in the coursel
.carousel-item {
img {
height: 60vw;
object-fit: cover;
@media (min-width: $bootstrap-sm) {
height: 350px;
}
}
}
Step 4: Optimize the images
You may have noticed that the markup uses the same image files in the gallery as we do in the modal. That doesn’t need to be the case. In fact, it’s a better idea to use smaller, more performant versions of the images for the gallery. We’re going to be blowing up the images to their full size version anyway in the modal, so there’s no need to have the best quality up front.
The good thing about Bootstrap’s approach here is that we can use different images in the gallery than we do in the modal. They’re not mutually exclusive where they have to point to the same file.
So, for that, I’d suggest updating the gallery markup with lower-quality images:
<div class="row" id="gallery" data-toggle="modal" data-target="#exampleModal">
<div class="col-12 col-sm-6 col-lg-3">
<img class="w-100" src="/image-1-small.jpg" data-target="#carouselExample" data-slide-to="0">
<!-- and so on... -->
</div>
That’s it!
The site where I’m using this has already themed Bootstrap. That means everything is already styled to spec. That said, even if you haven't themed Bootstrap you can still easily add custom styles! With this approach (Bootstrap vs. plugins), customization is painless because you have complete control over the markup and Bootstrap styling is relatively sparse.
Here’s the final demo:
The post Creating a Modal Image Gallery With Bootstrap Components appeared first on CSS-Tricks.
How to Use Figma to Create an Awesome Landing Page
Two Simple Tricks to Picking Fonts for Your Projects
How to Overcome AI Distrust With Explainability
AI has permeated our lives in nearly every Aspect. We rely on it to get accurate search results, to enable conversational marketing, ad personalization, and even to suggest medical treatment.
In spite of headways in AI and it’s widespread use, there’s considerable distrust in it. Such distrust and unease arise from popular media representations of AI in movies where robots threaten to overthrow the human race.
Khronos Announces ANARI Working Group to Create Analytic Rendering Interface API
TranslateMe Releases French to English API
TranslateMe, an AI-driven decentralized translation platform, announced the release of a French to English Translation API. The API is currently free for interested parties to both test and use. While it's fully functional, the company reported that it only uses 20% of its total capability (which includes a database of 10 million French to English sentences).
How I think about solving problems
Eventually, I settled on a list of questions I would ask myself for each problem as it arose. I found that asking these questions, in order, helped me make the best decision possible:
1) Is this really a problem?
2) Does the problem need to be solved?
3) Does the problem need to be solved now?
4) Does the problem need to be solved by me?
5) Is there a simpler problem I can solve instead?
We've talked about what it takes to be a senior developer before, and I'd say this kind of thinking should be on that list as well.
Direct Link to Article — Permalink
The post How I think about solving problems appeared first on CSS-Tricks.
How to Comment Out Code in WordPress for PHP, HTML and CSS
Laravel 7 Now Available
Laravel, which calls itself the "PHP framework for web artisans," has released version 7. Laravel 7 includes better routing speed, a new HTTP client, CORS support and other enhancements. New features include Laravel Airlock, custom Eloquent casts, Blade component tags, and fluent string operations.
4 Ways to Animate the Color of a Text Link on Hover
Let’s create a pure CSS effect that changes the color of a text link on hover… but slide that new color in instead of simply swapping colors.
There are four different techniques we can use to do this. Let’s look at those while being mindful of important things, like accessibility, performance, and browser support in mind.
Let’s get started!
Technique 1: Using background-clip: text
At the time of writing, the background-clip: text
property is an experimental feature and is not supported in Internet Explorer 11 and below.
This technique involves creating knockout text with a hard stop gradient. The markup consists of a single HTML link (<a>
) element to create a hyperlink:
<a href="#">Link Hover</a>
We can start adding styles to the hyperlink. Using overflow: hidden
will clip any content outside of the hyperlink during the hover transition:
a {
position: relative;
display: inline-block;
font-size: 2em;
font-weight: 800;
color: royalblue;
overflow: hidden;
}
We will need to use a linear gradient with a hard stop at 50% to the starting color we want the link to be as well as the color that it will change to:
a {
/* Same as before */
background: linear-gradient(to right, midnightblue, midnightblue 50%, royalblue 50%);
}
Let’s use background-clip
to clip the gradient and the text
value to display the text. We will also use the background-size
and background-position
properties to have the starting color appear:
a {
/* Same as before */
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-size: 200% 100%;
background-position: 100%;
}
Finally, let’s add the transition
CSS property and :hover
CSS pseudo-class to the hyperlink. To have the link fill from left to right on hover, use the background-position
property:
a {
/* Same as before */
transition: background-position 275ms ease;
}
a:hover {
background-position: 0 100%;
}
While this technique does achieve the hover effect, Safari and Chrome will clip text decorations and shadows, meaning they won’t be displayed. Applying text styles, such as an underline, with the text-decoration CSS property will not work. Perhaps consider using other approaches when creating underlines.
Technique 2: Using width/height
This works by using a data attribute containing the same text as the one in the <a>
tag and setting the width
(filling the text from left-to-right or right-to-left) or height
(filling the text from top-to-bottom or bottom-to-top), from 0% to 100% on hover.
Here is the markup:
<a href="#" data-content="Link Hover">Link Hover</a>
The CSS is similar to the previous technique minus the background CSS properties. The text-decoration
property will work here:
a {
position: relative;
display: inline-block;
font-size: 2em;
color: royalblue;
font-weight: 800;
text-decoration: underline;
overflow: hidden;
}
This is when we need to use the content from the data-content
attribute. It will be positioned above the content in the <a>
tag. We get to use the nice little trick of copying the text in the data attribute and displaying it via the attr()
function on the content property of the element’s ::before
pseudo-element.
a::before {
position: absolute;
content: attr(data-content); /* Prints the value of the attribute */
top: 0;
left: 0;
color: midnightblue;
text-decoration: underline;
overflow: hidden;
transition: width 275ms ease;
}
To keep the text from wrapping to the next line, white-space: nowrap
will be applied. To change the link fill color, set the value for the color CSS property using the ::before
pseudo-element and having the width
start at 0:
a::before {
/* Same as before */
width: 0;
white-space: nowrap;
}
Increase the width to 100% to the ::before
pseudo element to complete the text effect on hover:
a:hover::before {
width: 100%;
}
While this technique does the trick, using the width
or height
properties will not produce a performant CSS transition. It is best to use either the transform
or opacity
properties to achieve a smooth, 60fps transition.
Using the text-decoration
CSS property can allow for different underline styles to appear in the CSS transition. I created a demo showcasing this using the next technique: the clip-path
CSS property.
Technique 3: Using clip-path
For this technique, we will be using the clip-path
CSS property with a polygon shape. The polygon will have four vertices, with two of them expanding to the right on hover:
The markup is the same as the previous technique. We will use a ::before
pseudo-element again, but the CSS is different:
a::before {
position: absolute;
content: attr(data-content);
color: midnightblue;
text-decoration: underline;
clip-path: polygon(0 0, 0 0, 0% 100%, 0 100%);
transition: clip-path 275ms ease;
}
Unlike the previous techniques, text-decoration: underline
must be declared to the ::before pseudo-element
for the color to fill the underline on hover.
Now let’s look into the CSS for the clip-path
technique:
clip-path: polygon(0 0, 0 0, 0% 100%, 0 100%);
The polygon’s vertices of the clip-path
property are set in percentages to define coordinates by the order written:
0 0
= top left0 0
= top right100% 0
= bottom right0 100%
= bottom left
The direction of the fill effect can be changed by modifying the coordinates. Now that we have an idea for the coordinates, we can make the polygon expand to the right on hover:
a:hover::before {
clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
}
This technique works pretty well, but note that support for the clip-path
property varies between browsers. Creating a CSS transition with clip-path
is a better alternative than using the width
/height
technique; however, it does affect the browser paint.
Technique 4: Using transform
The markup for this technique uses a masking method with a <span>
element. Since we will be using duplicated content in a separate element, we will use aria-hidden="true"
to improve accessibility — that will hide it from screen readers so the content isn’t read twice:
<a href="#"><span data-content="Link Hover" aria-hidden="true"></span>Link Hover</a>
The CSS for the <span>
element contains a transition that will be starting from the left:
span {
position: absolute;
top: 0;
left: 0;
overflow: hidden;
transform: translateX(-100%);
transition: transform 275ms ease;
}
Next, we need to get the <span>
to slide the right like this:
To do this, we will use the translateX()
CSS function and set it to 0:
a:hover span {
transform: translateX(0);
}
Then, we will use the ::before
pseudo-element for the <span>
, again using the data-content
attribute we did before. We’ll set the position by translating it 100% along the x-axis.
span::before {
display: inline-block;
content: attr(data-content);
color: midnightblue;
transform: translateX(100%);
transition: transform 275ms ease;
text-decoration: underline;
}
Much like the <span>
element, the position of the ::before
pseudo-element will also be set to translateX(0)
:
a:hover span::before {
transform: translateX(0);
}
While this technique is the the most cross-browser compatible of the bunch, it requires more markup and CSS to get there. That said, using the transform CSS property is great for performance as it does not trigger repaints and thus produces smooth, 60fps CSS transitions.
There we have it!
We just looked at four different techniques to achieve the same effect. Although each has its pros and cons, you can see that it’s totally possible to slide in a color change on text. It’s a neat little effect that makes links feel a little more interactive.
The post 4 Ways to Animate the Color of a Text Link on Hover appeared first on CSS-Tricks.