Archive

Archive for the ‘’ Category

Searching for a New CSS Logo

October 7th, 2024 No comments

There is an amazing community effort happening in search of a new logo for CSS. I was a bit skeptical at first, as I never really considered CSS a “brand.” Why does it need a logo? For starters, the current logo seems… a bit dated.

Displayed quite prominently is the number 3. As in CSS version 3, or simply CSS3. Depending on your IDE’s selected icon pack of choice, CSS file icons are often only the number 3.

VS Code file browser displaying a styles folder decorated with the CSS3 logo, as well as a CSS file with the CSS3 logo as it's file icon.

To give an incredibly glossed-over history of CSS3:

  • Earliest draft specification was in 1999!
  • Adoption began in 2011, when it was published as the W3C Recommendation.
  • It’s been used ever since? That can’t be right…

CSS is certainly not stuck in 2011. Take a look at all the features added to CSS in the past five years (warning, scrolling animation ahead):

CodePen Embed Fallback

(Courtesy of Alex Riviere)

Seems like this stems mainly from the discontinuation of version numbering for CSS. These days, we mostly reference newer CSS features by their individual specification level, such as Selectors Level 4 being the current Selectors specification, for example.

A far more general observation on the “progress” of CSS could be taking a look at features being implemented — things like Caniuse and Baseline are great for seeing when certain browsers implemented certain features. Similarly, the Interop Project is a group consisting of browsers figuring out what to implement next.

There are ongoing discussions about the “eras” of CSS, though, and how those may be a way of framing the way we refer to CSS features.

Chris posted about CSS4 here on CSS-Tricks (five years ago!), discussing how successful CSS3 was from a marketing perspective. Jen Simmons also started a discussion back in 2020 on the CSS Working Group’s GitHub about defining CSS4. Knowing that, are you at least somewhat surprised that we have blown right by CSS4 and are technically using CSS5?

The CSS-Next Community Group is leading the charge here, something that member Brecht de Ruyte introduced earlier this year at Smashing Magazine. The purpose of this group is to, well, determine what’s next for CSS! The group defines the CSS versions as:

  • CSS3 (~2009-2012): Level 3 CSS specs as defined by the CSSWG
  • CSS4 (~2013-2018): Essential features that were not part of CSS3, but are already a fundamental part of CSS.
  • CSS5 (~2019-2024): Newer features whose adoption is steadily growing.
  • CSS6 (~2025+): Early-stage features that are planned for future CSS.

Check out this slide deck from November 2023 detailing the need for defining stronger versioning. Their goals are clear in my opinion:

  1. Help developers learn CSS.
  2. Help educators teach CSS.
  3. Help employers define modern web skil…
  4. Help the community understand the progression of CSS capabilities over time.

Circling back around to the logo, I have to agree: Yes, it’s time for a change.

Back in August, Adam Argyle opened an issue on the CSS-Next project on GitHub to drum up ideas. The thread is active and ongoing, though appears to be honing in on a release candidate. Let’s take a look at some proposals!

Nils Binder, from 9elements, proposed this lovely design, riffing on the “cascade.” Note the river-like “S” shape flowing through the design.

two-by-two grid displaying a proposed CSS logo in various colors. 
Top left: black logo on white background.
Top Right: white logo on black background.
Bottom Left: light green logo on dark purple background.
Bottom Right: dark purple logo on light green background.

Chris Kirk-Nielson pitched a neat interactive logo concept he put together a while back. The suggestion plays into the “CSS is Awesome” meme, where the content overflows the wrapper. While playful and recognizable, Nils raised an excellent point:

Regarding the reference to the ‘CSS IS AWESOME’ meme, I initially chuckled, of course. However, at the same time, the meme also represents CSS as something quirky, unpredictable, and full of bugs. I’m not sure if that’s the exact message that needs to be repeated in the logo. It feels like it reinforces the recurring ‘CSS is broken’ mantra. To exaggerate: CSS is subordinate to JS and somehow broken.

Wow, is this the end of an era for the familiar meme? 

It’s looking that way, as the current candidate builds off of Javi Aguilar’s proposal. Javi’s design is being iterated upon by the group, it’s shaping up and looks great hanging with friends:

new CSS logo placed next to the JavaScript, Typescript, and Web Assembly logos

Javi describes the design considerations in the thread. Personally, I’m a fan of the color choice, and the softer shape differentiates it from the more rigid JavaScript and Typescript logos.

As mentioned, the discussion is ongoing and the design is actively being worked on. You can check out the latest versions in Adam’s CodePen demo:

CodePen Embed Fallback

Or if checking out design files is more your speed, take a look in Figma.

I think the thing that impresses me most about community initiatives like this is the collaboration involved. If you have opinions on the design of the logo, feel free to chime in on the discussion thread!

Once the versions are defined and the logo finalized, the only thing left to decide on will be a mascot for CSS. A chameleon? A peacock? I’m sure the community will choose wisely.


Searching for a New CSS Logo originally published on CSS-Tricks, which is part of the DigitalOcean family. You should get the newsletter.

Categories: Designing, Others Tags:

Scaling Your Small Business: When and How to Hire Your First Employees

October 7th, 2024 No comments

It’s a great time to start a small business. Although many Americans feel pretty gloomy about the 2024 economic outlook, a majority think it’s primed for a rebound in the near future. Most Americans are already spending like boom times are back anyway, according to a recent study on spending habits

One-man startups that could be looking to scale up in response to consumer spending may be wondering when and how to hire their first employee. There’s no easy, one-size-fits-all answer to this question. 

If you wait too long to hire that first employee, you could be putting them in a workplace environment of low morale because of missed deadlines and heavy workloads. If you hire them too early, you’re wasting money and time devising work to keep them busy.

Here’s when and how to properly hire your first employees.

Crunch the numbers

Start with the fundamental questions: Will hiring new employees help your business save money or generate more money? If you’re just starting out, increasing your business’ income is more important than saving money, but both are important. If you can’t firmly answer yes to at least one of those questions, hiring someone may not make sense for you right now.

Take your emotional temperature

Objectively ask yourself why you’re thinking of hiring a new employee. Is it because it’ll help you level up your business, or is it for more emotional reasons?

If you’re desperately behind, overworked, or lonely being the sole employee of your business, those are valid concerns, but they aren’t necessarily good reasons to hire someone — especially if your desperation leads you to rush your recruitment process

If you’re hiring because your business simply isn’t bringing in enough revenue, it’s doubtful that the generative effects of bringing on a new employee will surpass their compensation. It might make more sense for you to enhance your cash flow through some lucrative side hustles to make extra money until your revenue increases.

Some common signs that you may be hiring prematurely or for the wrong reasons are that you can’t define a specific role for your first employee or you have very low standards for who you’ll hire. If you feel like you just need to get someone in the door, step back and think about why you feel that way and what your business actually needs.

Consider a co-founder

Your first hire doesn’t necessarily need to be an employee. They could just as well be a partner. If you come across someone who perfectly shares and complements your skills, values, and vision as a founder and entrepreneur, consider bringing them on board as a co-founder. Empowering a talented entrepreneur as an equal partner can often unlock hidden potential and put your business on the fast track to success.

Test drive a contractor

On the other end of the spectrum, you might want to take things slow. In that case, a contractor could be a great test case for what you need out of your early hires. 

The commitment to a contractor is limited and usually quite short — usually between a month and a year depending on the agreement. In that time, you can try them out in different roles and evaluate their overall performance. If they prove themselves to be a valuable asset, you can always transition them into a permanent full-time role.

You could also interview a freelancer. In general, freelancers work on much shorter terms than contractors. You could bring them aboard to work only on a specific project and conclude their employment when that project is finished. 

Think skills, not job titles

Alongside considering what you want your early hires to do, consider what kinds of skills and experiences will enable them to excel in that role. The more specific you can be, the better. Make a list and target only candidates who check all the boxes.

Understand that hiring is a two-way process

You know why you want to hire your first employees, and you probably have a pretty specific idea of the skills and experiences you want those first employees to have. But during the interview process, don’t forget that candidates are evaluating you as much as you’re evaluating them. 

Employees want to know that you have a defined role for them. Before you start interviewing, sit down and define the role you’re hiring for, including how you plan to measure their performance, the outcomes and deliverables that role will be responsible for, and the processes they’ll be expected to perform.

Think about the role on different timelines, too. How will that role work in the next year, and how might it evolve in the next two, three, or five years? For someone interviewing for a job, there’s no such thing as too much information.

Widen your hiring horizons

When you’re searching for that perfect hire, think globally. There’s elite talent all over the world, especially when it comes to qualified tech workers. If their role can be performed remotely, you could tap into serious savings, especially if they live in a country with public health care. Foreign employees also offer valuable insights into their local markets and can dramatically increase your business’ availability if they’re in a different time zone.

Consider tapping into youthful energy by hiring a promising college student. If the role you’re looking to fill can be performed by a recent grad or even a college intern, they could provide a huge amount of hustle and motivation, as well as novel perspectives and ideas that could be valuable to forward-thinking industries.

Featured Image by Jotform on Unsplash

The post Scaling Your Small Business: When and How to Hire Your First Employees appeared first on noupe.

Categories: Others Tags:

Build A Static RSS Reader To Fight Your Inner FOMO

October 7th, 2024 No comments

In a fast-paced industry like tech, it can be hard to deal with the fear of missing out on important news. But, as many of us know, there’s an absolutely huge amount of information coming in daily, and finding the right time and balance to keep up can be difficult, if not stressful. A classic piece of technology like an RSS feed is a delightful way of taking back ownership of our own time. In this article, we will create a static Really Simple Syndication (RSS) reader that will bring you the latest curated news only once (yes: once) a day.

We’ll obviously work with RSS technology in the process, but we’re also going to combine it with some things that maybe you haven’t tried before, including Astro (the static site framework), TypeScript (for JavaScript goodies), a package called rss-parser (for connecting things together), as well as scheduled functions and build hooks provided by Netlify (although there are other services that do this).

I chose these technologies purely because I really, really enjoy them! There may be other solutions out there that are more performant, come with more features, or are simply more comfortable to you — and in those cases, I encourage you to swap in whatever you’d like. The most important thing is getting the end result!

The Plan

Here’s how this will go. Astro generates the website. I made the intentional decision to use a static site because I want the different RSS feeds to be fetched only once during build time, and that’s something we can control each time the site is “rebuilt” and redeployed with updates. That’s where Netlify’s scheduled functions come into play, as they let us trigger rebuilds automatically at specific times. There is no need to manually check for updates and deploy them! Cron jobs can just as readily do this if you prefer a server-side solution.

During the triggered rebuild, we’ll let the rss-parser package do exactly what it says it does: parse a list of RSS feeds that are contained in an array. The package also allows us to set a filter for the fetched results so that we only get ones from the past day, week, and so on. Personally, I only render the news from the last seven days to prevent content overload. We’ll get there!

But first…

What Is RSS?

RSS is a web feed technology that you can feed into a reader or news aggregator. Because RSS is standardized, you know what to expect when it comes to the feed’s format. That means we have a ton of fun possibilities when it comes to handling the data that the feed provides. Most news websites have their own RSS feed that you can subscribe to (this is Smashing Magazine’s RSS feed: https://www.smashingmagazine.com/feed/). An RSS feed is capable of updating every time a site publishes new content, which means it can be a quick source of the latest news, but we can tailor that frequency as well.

RSS feeds are written in an Extensible Markup Language (XML) format and have specific elements that can be used within it. Instead of focusing too much on the technicalities here, I’ll give you a link to the RSS specification. Don’t worry; that page should be scannable enough for you to find the most pertinent information you need, like the kinds of elements that are supported and what they represent. For this tutorial, we’re only using the following elements: </code></strong>, <strong><code></code></strong>, <strong><code></code></strong>, <strong><code></code></strong>, and <strong><code></code></strong>. We’ll also let our RSS parser package do some of the work for us.</p> <p>Creating The State Site</p> <p>We’ll start by creating our Astro site! In your terminal run <code>pnpm create astro@latest</code>. You can use any package manager you want — I’m simply trying out <a target="_blank" href="https://pnpm.io/" rel="noopener">pnpm</a> for myself.</p> <p>After running the command, Astro’s chat-based helper, Houston, walks through some setup questions to get things started.</p> <pre><code> astro Launch sequence initiated. dir Where should we create your new project? ./rss-buddy tmpl How would you like to start your new project? Include sample files ts Do you plan to write TypeScript? Yes use How strict should TypeScript be? Strict deps Install dependencies? Yes git Initialize a new git repository? Yes </code></pre> <p>I like to use Astro’s sample files so I can get started quickly, but we’re going to clean them up a bit in the process. Let’s clean up the <code>src/pages/index.astro</code> file by removing everything inside of the <code><main></main></code> tags. Then we’re good to go!</p> <p>From there, we can spin things by running <code>pnpm start</code>. Your terminal will tell you which localhost address you can find your site at.</p> <p>Pulling Information From RSS feeds</p> <p>The <code>src/pages/index.astro</code> file is where we will make an array of RSS feeds we want to follow. We will be using <a target="_blank" href="https://docs.astro.build/en/basics/astro-syntax/" rel="noopener">Astro’s template syntax</a>, so between the two code fences (—), create an array of <code>feedSources</code> and add some feeds. If you need inspiration, you can copy this:</p> <pre><code>const feedSources = [ 'https://www.smashingmagazine.com/feed/', 'https://developer.mozilla.org/en-US/blog/rss.xml', // etc. ] </code></pre> <p>Now we’ll install the <a target="_blank" href="https://github.com/rbren/rss-parser" rel="noopener">rss-parser package</a> in our project by running <code>pnpm install rss-parser</code>. This package is a small library that turns the XML that we get from fetching an RSS feed into JavaScript objects. This makes it easy for us to read our RSS feeds and manipulate the data any way we want.</p> <p>Once the package is installed, open the <code>src/pages/index.astro</code> file, and at the top, we’ll import the rss-parser and instantiate the <code>Partner</code> class.</p> <pre><code>import Parser from 'rss-parser'; const parser = new Parser(); </code></pre> <p>We use this parser to read our RSS feeds and (surprise!) <em>parse</em> them to JavaScript. We’re going to be dealing with a list of promises here. Normally, I would probably use <code>Promise.all()</code>, but the thing is, this is supposed to be a complicated experience. If one of the feeds doesn’t work for some reason, I’d prefer to simply ignore it.</p> <p>Why? Well, because <code>Promise.all()</code> rejects everything even if only one of its promises is rejected. That might mean that if one feed doesn’t behave the way I’d expect it to, my entire page would be blank when I grab my hot beverage to read the news in the morning. I do not want to start my day confronted by an error.</p> <p>Instead, I’ll opt to use <code>Promise.allSettled()</code>. This method will actually let all promises complete even if one of them fails. In our case, this means any feed that errors will just be ignored, which is perfect.</p> <p>Let’s add this to the <code>src/pages/index.astro</code> file:</p> <div> <pre><code>interface FeedItem { feed?: string; title?: string; link?: string; date?: Date; } const feedItems: FeedItem[] = []; await Promise.allSettled( feedSources.map(async (source) => { try { const feed = await parser.parseURL(source); feed.items.forEach((item) => { const date = item.pubDate ? new Date(item.pubDate) : undefined; feedItems.push({ feed: feed.title, title: item.title, link: item.link, date, }); }); } catch (error) { console.error(<code>Error fetching feed from ${source}:</code>, error); } }) ); </code></pre> </div> <p>This creates an array (or more) named <code>feedItems</code>. For each URL in the <code>feedSources</code> array we created earlier, the rss-parser retrieves the items and, yes, parses them into JavaScript. Then, we return whatever data we want! We’ll keep it simple for now and only return the following:</p> <ul> <li>The feed title,</li> <li>The title of the feed item,</li> <li>The link to the item,</li> <li>And the item’s published date.</li> </ul> <p>The next step is to ensure that all items are sorted by date so we’ll truly get the “latest” news. Add this small piece of code to our work:</p> <div> <pre><code>const sortedFeedItems = feedItems.sort((a, b) => (b.date ?? new Date()).getTime() - (a.date ?? new Date()).getTime()); </code></pre> </div> <p>Oh, and… remember when I said I didn’t want this RSS reader to render anything older than seven days? Let’s tackle that right now since we’re already in this code.</p> <p>We’ll make a new variable called <code>sevenDaysAgo</code> and assign it a date. We’ll then set that date to seven days ago and use that logic before we add a new item to our <code>feedItems</code> array.</p> <p>This is what the <code>src/pages/index.astro</code> file should now look like at this point:</p> <div> <pre><code>--- import Layout from '../layouts/Layout.astro'; import Parser from 'rss-parser'; const parser = new Parser(); const sevenDaysAgo = new Date(); sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7); const feedSources = [ '<a target="_blank" href="https://www.smashingmagazine.com/feed/'" rel="noopener">https://www.smashingmagazine.com/feed/'</a>, '<a target="_blank" href="https://developer.mozilla.org/en-US/blog/rss.xml'" rel="noopener">https://developer.mozilla.org/en-US/blog/rss.xml'</a>, ] interface FeedItem { feed?: string; title?: string; link?: string; date?: Date; } const feedItems: FeedItem[] = []; await Promise.allSettled( feedSources.map(async (source) => { try { const feed = await parser.parseURL(source); feed.items.forEach((item) => { const date = item.pubDate ? new Date(item.pubDate) : undefined; if (date && date >= sevenDaysAgo) { feedItems.push({ feed: feed.title, title: item.title, link: item.link, date, }); } }); } catch (error) { console.error(<code>Error fetching feed from ${source}:</code>, error); } }) ); const sortedFeedItems = feedItems.sort((a, b) => (b.date ?? new Date()).getTime() - (a.date ?? new Date()).getTime()); --- <Layout title="Welcome to Astro."> <main> </main> </Layout> </code></pre> </div> <p>Rendering XML Data</p> <p>It’s time to show our news articles on the Astro site! To keep this simple, we’ll format the items in an unordered list rather than some other fancy layout.</p> <p>All we need to do is update the <code></code> element in the file with the XML objects sprinkled in for a feed item’s title, URL, and publish date.</p> <pre><code><Layout title="Welcome to Astro."> <main> {sortedFeedItems.map(item => ( <ul> <li> <a href={item.link}>{item.title}</a> <p>{item.feed}</p> <p>{item.date}</p> </li> </ul> ))} </main> </Layout> </code></pre> <p>Go ahead and run <code>pnpm start</code> from the terminal. The page should display an unordered list of feed items. Of course, everything is styled at the moment, but luckily for you, you can make it look exactly like you want with CSS!</p> <p>And remember that there are even <strong>more fields available in the XML for each item</strong> if you want to display more information. If you run the following snippet in your DevTools console, you’ll see all of the fields you have at your disposal:</p> <pre><code>feed.items.forEach(item => {} </code></pre> <p>Scheduling Daily Static Site Builds</p> <p>We’re nearly done! The feeds are being fetched, and they are returning data back to us in JavaScript for use in our Astro page template. Since feeds are updated whenever new content is published, we need a way to fetch the latest items from it.</p> <p>We want to avoid doing any of this manually. So, let’s set this site on Netlify to gain access to their scheduled functions that trigger a rebuild and their build hooks that do the building. Again, other services do this, and you’re welcome to roll this work with another provider — I’m just partial to Netlify since I work there. In any case, you can follow Netlify’s documentation for <a target="_blank" href="https://docs.netlify.com/welcome/add-new-site/#import-from-an-existing-repository" rel="noopener">setting up a new site</a>. </p> <p>Once your site is hosted and live, you are ready to schedule your rebuilds. A <a target="_blank" href="https://docs.netlify.com/configure-builds/build-hooks/" rel="noopener">build hook</a> gives you a URL to use to trigger the new build, looking something like this:</p> <pre><code>https://api.netlify.com/build_hooks/your-build-hook-id </code></pre> <p>Let’s trigger builds every day at midnight. We’ll use Netlify’s <a target="_blank" href="https://docs.netlify.com/functions/scheduled-functions/" rel="noopener">scheduled functions</a>. That’s really why I’m using Netlify to host this in the first place. Having them at the ready via the host greatly simplifies things since there’s no server work or complicated configurations to get this going. Set it and forget it!</p> <p>We’ll install <code>@netlify/functions</code> (<a target="_blank" href="https://docs.netlify.com/functions/get-started/" rel="noopener">instructions</a>) to the project and then create the following file in the project’s root directory: <code>netlify/functions/deploy.ts</code>.</p> <p>This is what we want to add to that file:</p> <div> <pre><code>// netlify/functions/deploy.ts import type { Config } from '@netlify/functions'; const BUILD_HOOK = '<a target="_blank" href="https://api.netlify.com/build_hooks/your-build-hook-id'" rel="noopener">https://api.netlify.com/build_hooks/your-build-hook-id'</a>; // replace me! export default async (req: Request) => { await fetch(BUILD_HOOK, { method: 'POST', }).then((response) => { console.log('Build hook response:', response.json()); }); return { statusCode: 200, }; }; export const config: Config = { schedule: '0 0 * * *', }; </code></pre> </div> <p>If you commit your code and push it, your site should re-deploy automatically. From that point on, it follows a schedule that rebuilds the site every day at midnight, ready for you to take your morning brew and catch up on everything that <em>you</em> think is important.</p> <div class="fixed"></div> </div> <div class="under"> <span class="categories">Categories: </span><span><a href="http://www.webmastersgallery.com/category/uncategorized/" rel="category tag">Others</a></span> <span class="tags">Tags: </span><span></span> </div> </div> <div class="post" id="post-7200697"> <h2><a class="title" href="http://www.webmastersgallery.com/2024/10/07/exciting-new-tools-for-designers-october-2024/" rel="bookmark">Exciting New Tools for Designers, October 2024</a></h2> <div class="info"> <span class="date">October 7th, 2024</span> <span class="author"><a href="http://www.webmastersgallery.com/author/admin/" title="Posts by admin" rel="author">admin</a></span> <span class="comments"><a href="http://www.webmastersgallery.com/2024/10/07/exciting-new-tools-for-designers-october-2024/#respond">No comments</a></span> <div class="fixed"></div> </div> <div class="content"> <div class="ftpimagefix" style="float:left"><a target="_blank" href="1" rel="noopener"><img decoding="async" src="https://www.webdesignerdepot.com/assets/posts/featured/tools_oct_009.jpg"></a></div> <p>Welcome to our roundup of top new tools for October.</p> <div class="fixed"></div> </div> <div class="under"> <span class="categories">Categories: </span><span><a href="http://www.webmastersgallery.com/category/design/" rel="category tag">Designing</a>, <a href="http://www.webmastersgallery.com/category/uncategorized/" rel="category tag">Others</a></span> <span class="tags">Tags: </span><span></span> </div> </div> <div class="post" id="post-7237141"> <h2><a class="title" href="http://www.webmastersgallery.com/2024/10/07/exciting-new-tools-for-designers-october-2024-2/" rel="bookmark">Exciting New Tools for Designers, October 2024</a></h2> <div class="info"> <span class="date">October 7th, 2024</span> <span class="author"><a href="http://www.webmastersgallery.com/author/admin/" title="Posts by admin" rel="author">admin</a></span> <span class="comments"><a href="http://www.webmastersgallery.com/2024/10/07/exciting-new-tools-for-designers-october-2024-2/#respond">No comments</a></span> <div class="fixed"></div> </div> <div class="content"> <div class="ftpimagefix" style="float:left"><a target="_blank" href="1" rel="noopener"><img decoding="async" class="alignnone size-full wp-image-61555" src="http://webdesignerdepot-wp.s3.us-east-2.amazonaws.com/2024/10/05031307/tools_oct_001.png" alt="Feeedy is a notes app that offers the convenience of messaging apps with enhanced note-taking features." title="Exciting New Tools for Designers, October 2024"></a></div> <p>We’ve got goodies for designers, developers, SEO-ers, content managers, and those of you who wear multiple hats. And, of course, it wouldn’t be October without a Halloween themed font. Enjoy!</p> <h2><a target="_blank" href="https://feeedy.com/" rel="noopener noreferrer nofollow">Feeedy</a></h2> <p>Feeedy is a notes app that offers the convenience of messaging apps with enhanced note-taking features.</p> <figure></figure> <h2><a target="_blank" href="https://www.realmail.dev/" rel="noopener noreferrer nofollow">RealMail</a></h2> <p>Email sign ups can go wrong for a number of reasons, like fake addresses and typos. RealMail provides email validation that is easily configurable and fast to implement.</p> <figure><a target="_blank" href="https://www.realmail.dev/" rel="noopener nofollow"></a></figure> <h2><a target="_blank" href="https://syncly.app/" rel="noopener noreferrer nofollow">Syncly</a></h2> <p>The Syncly platform could help you pinpoint and eliminate causes of customer dissatisfaction by using AI to analyze and categorize user feedback automatically.</p> <figure><a target="_blank" href="https://syncly.app/" rel="noopener nofollow"><img decoding="async" loading="lazy" class="alignnone size-full wp-image-61557" src="http://webdesignerdepot-wp.s3.us-east-2.amazonaws.com/2024/10/05031311/tools_oct_003.jpg" alt="The Syncly platform could help you pinpoint and eliminate causes of customer dissatisfaction by using AI to analyze and categorize user feedback automatically." width="1600" height="1040" title="Exciting New Tools for Designers, October 2024"></a></figure> <h2><a target="_blank" href="https://personno.nl/" rel="noopener noreferrer nofollow">Personno</a></h2> <p>If you need to do a lot of user testing but don’t have the budget, Personno will let you create AI respondents for fast results. It’s due to launch in Beta in the next couple of weeks.</p> <figure><a target="_blank" href="https://personno.nl/" rel="noopener nofollow"><img decoding="async" loading="lazy" class="alignnone size-full wp-image-61558" src="http://webdesignerdepot-wp.s3.us-east-2.amazonaws.com/2024/10/05031313/tools_oct_004.jpg" alt="If you need to do a lot of user testing but don’t have the budget, Personno will let you create AI respondents for fast results. It’s due to launch in Beta in the next couple of weeks." width="1600" height="1040" title="Exciting New Tools for Designers, October 2024"></a></figure> <h2><a target="_blank" href="https://www.fluidseo.app/" rel="noopener noreferrer nofollow">FluidSEO</a></h2> <p>FluidSEO is an SEO plugin for Webflow. As well as the usual SEO help such as page audits, Fluid SEO can implement changes and suggestions for you, and run tasks in bulk.</p> <figure><a target="_blank" href="https://www.fluidseo.app/" rel="noopener nofollow"><img decoding="async" loading="lazy" class="alignnone size-full wp-image-61559" src="http://webdesignerdepot-wp.s3.us-east-2.amazonaws.com/2024/10/05031315/tools_oct_005.jpg" alt="FluidSEO is an SEO plugin for Webflow. As well as the usual SEO help such as page audits, Fluid SEO can implement changes and suggestions for you, and run tasks in bulk." width="1600" height="1040" title="Exciting New Tools for Designers, October 2024"></a></figure> <h2><a target="_blank" href="https://bcons.dev/" rel="noopener noreferrer nofollow">bcons</a></h2> <p>bcons is a php console that is added to your browser devtools. Inspect variable values, errors, and warnings without wading through error logs and var dumps. It currently works with Chromium and mozilla browsers.</p> <figure><a target="_blank" href="https://bcons.dev/" rel="noopener nofollow"><img decoding="async" loading="lazy" class="alignnone size-full wp-image-61560" src="http://webdesignerdepot-wp.s3.us-east-2.amazonaws.com/2024/10/05031327/tools_oct_006.png" alt="bcons is a php console that is added to your browser devtools. Inspect variable values, errors, and warnings without wading through error logs and var dumps." width="1600" height="1040" title="Exciting New Tools for Designers, October 2024"></a></figure> <h2><a target="_blank" href="https://www.airbounce.co/" rel="noopener noreferrer nofollow">Airbounce</a></h2> <p>Airbounce aims to simplify using Zoom by turning your Mac’s caps lock key into a control switch. Press it to join or leave calls, and while on a call, use it to toggle mute. And as a bonus, the light will indicate whether you’re muted.</p> <figure><a target="_blank" href="https://www.airbounce.co/" rel="noopener nofollow"><img decoding="async" loading="lazy" class="alignnone size-full wp-image-61561" src="http://webdesignerdepot-wp.s3.us-east-2.amazonaws.com/2024/10/05031330/tools_oct_007.jpg" alt="Airbounce aims to simplify using Zoom by turning your Mac’s caps lock key into a control switch." width="1600" height="1040" title="Exciting New Tools for Designers, October 2024"></a></figure> <h2><a target="_blank" href="https://akashramaswamy.dev/projects/done" rel="noopener noreferrer nofollow">Done</a></h2> <p>There are a ton of task managers and to-do lists out there, but Done is one of the simplest. It has a very minimal UI which at the same time is intuitive and easy to use. It allows you to create task groups, set reminders, and push unfinished tasks to the next day.</p> <figure><a target="_blank" href="https://akashramaswamy.dev/projects/done" rel="noopener nofollow"><img decoding="async" loading="lazy" class="alignnone size-full wp-image-61562" src="http://webdesignerdepot-wp.s3.us-east-2.amazonaws.com/2024/10/05031332/tools_oct_008.jpg" alt="There are a ton of task managers and to-do lists out there, but Done is one of the simplest." width="1600" height="1040" title="Exciting New Tools for Designers, October 2024"></a></figure> <h2><a target="_blank" href="https://creativemarket.com/Nickylaatz/284843084-Monster-Madness-Typeface" rel="noopener noreferrer nofollow">Monster Madness</a></h2> <p>This fun, lettering font is clearly inspired by old monster movie posters. It comes in three variants, and includes Opentype ligatures.</p> <figure><a target="_blank" href="https://creativemarket.com/Nickylaatz/284843084-Monster-Madness-Typeface" rel="noopener nofollow"><img decoding="async" loading="lazy" class="alignnone size-full wp-image-61563" src="http://webdesignerdepot-wp.s3.us-east-2.amazonaws.com/2024/10/05031334/tools_oct_009.jpg" alt="Monster Madness" width="1600" height="1040" title="Exciting New Tools for Designers, October 2024"></a></figure> <h2><a target="_blank" href="https://power-charts.com/" rel="noopener noreferrer nofollow">PowerCharts</a></h2> <p>PowerCharts records your Mac’s battery health and performance and visualizes it in easy-to-read charts. Taking control of battery levels, consumption rates, maximum capacity, and level distribution over time may help you improve the battery life.</p> <figure><a target="_blank" href="https://power-charts.com/" rel="noopener nofollow"><img decoding="async" loading="lazy" class="alignnone size-full wp-image-61564" src="http://webdesignerdepot-wp.s3.us-east-2.amazonaws.com/2024/10/05031336/tools_oct_010.jpg" alt="PowerCharts records your Mac’s battery health and performance and visualizes it in easy-to-read charts." width="1600" height="1040" title="Exciting New Tools for Designers, October 2024"></a></figure> <h2><a target="_blank" href="https://www.getclearspace.com/" rel="noopener noreferrer nofollow">Clearspace</a></h2> <p>We all do it: turn to our phones for a quick break, then get hooked on social feeds or games. Clearspace prompts you to pause before opening your worst habit apps and take a few deep breaths. On the iPhone version, you can even set it to make you do some physical exercise first.</p> <figure><a target="_blank" href="https://www.getclearspace.com/" rel="noopener nofollow"><img decoding="async" loading="lazy" class="alignnone size-full wp-image-61565" src="http://webdesignerdepot-wp.s3.us-east-2.amazonaws.com/2024/10/05031338/tools_oct_011.jpg" alt=" Clearspace prompts you to pause before opening your worst habit apps and take a few deep breaths." width="1600" height="1040" title="Exciting New Tools for Designers, October 2024"></a></figure> <h2><a target="_blank" href="https://www.cursor.com/" rel="noopener noreferrer nofollow">Cursor</a></h2> <p>Cursor is an AI code editor. Its autocomplete offers suggestions based on your most recent edits, and it will write code from natural language prompts. It can speed up development by taking over the grunt work, but you do still need to know code.</p> <figure><a target="_blank" href="https://www.cursor.com/" rel="noopener nofollow"><img decoding="async" loading="lazy" class="alignnone size-full wp-image-61566" src="http://webdesignerdepot-wp.s3.us-east-2.amazonaws.com/2024/10/05031340/tools_oct_012.jpg" alt="Cursor is an AI code editor. Its autocomplete offers suggestions based on your most recent edits, and it will write code from natural language prompts." width="1600" height="1040" title="Exciting New Tools for Designers, October 2024"></a></figure> <h2><a target="_blank" href="https://www.magicinspector.com/" rel="noopener noreferrer nofollow">Magic Inspector</a></h2> <p>Magic Inspector’s AI lets you create, run, and schedule automated browser tests using natural language, without needing to be a developer.</p> <figure><a target="_blank" href="https://www.magicinspector.com/" rel="noopener nofollow"><img decoding="async" loading="lazy" class="alignnone size-full wp-image-61567" src="http://webdesignerdepot-wp.s3.us-east-2.amazonaws.com/2024/10/05031342/tools_oct_013.jpg" alt="Magic Inspector’s AI lets you create, run, and schedule automated browser tests using natural language, without needing to be a developer." width="1600" height="1040" title="Exciting New Tools for Designers, October 2024"></a></figure> <h2><a target="_blank" href="https://strapi.io/" rel="noopener noreferrer nofollow">Strapi 5.0</a></h2> <p>Strapi headless CMS has been around for a while now, and last week saw the launch of version 5.0, with a whole host of major improvements for developers and for content managers.</p> <figure><a target="_blank" href="https://strapi.io/" rel="noopener nofollow"><img decoding="async" loading="lazy" class="alignnone size-full wp-image-61568" src="http://webdesignerdepot-wp.s3.us-east-2.amazonaws.com/2024/10/05031344/tools_oct_014.jpg" alt="Strapi headless CMS has been around for a while now, and last week saw the launch of version 5.0" width="1600" height="1040" title="Exciting New Tools for Designers, October 2024"></a></figure> <h2><a target="_blank" href="https://taborganizer.com/" rel="noopener noreferrer nofollow">Tab Organizer</a></h2> <p>This Chrome extension groups tabs by domain, subdomain, or custom rules, to to help minimize browser clutter. You can set custom colors for each tab group, and sort by title or domain.</p> <figure><a target="_blank" href="https://taborganizer.com/" rel="noopener nofollow"><img decoding="async" loading="lazy" class="alignnone size-full wp-image-61569" src="http://webdesignerdepot-wp.s3.us-east-2.amazonaws.com/2024/10/05031346/tools_oct_015.jpg" alt="This Chrome extension groups tabs by domain, subdomain, or custom rules, to to help minimize browser clutter." width="1600" height="1040" title="Exciting New Tools for Designers, October 2024"></a></figure> <div class="fixed"></div> </div> <div class="under"> <span class="categories">Categories: </span><span><a href="http://www.webmastersgallery.com/category/design/" rel="category tag">Designing</a>, <a href="http://www.webmastersgallery.com/category/uncategorized/" rel="category tag">Others</a></span> <span class="tags">Tags: </span><span></span> </div> </div> <div class="post" id="post-7160188"> <h2><a class="title" href="http://www.webmastersgallery.com/2024/10/04/guest-blogging-what-why-how-to-do-it-in-2024/" rel="bookmark">Guest Blogging: What, Why & How to Do it in 2024</a></h2> <div class="info"> <span class="date">October 4th, 2024</span> <span class="author"></span> <span class="comments"><a href="http://www.webmastersgallery.com/2024/10/04/guest-blogging-what-why-how-to-do-it-in-2024/#respond">No comments</a></span> <div class="fixed"></div> </div> <div class="content"> <div class="ftpimagefix" style="float:left"><a target="_blank" href="0" rel="noopener"><img decoding="async" src="https://www.noupe.com/wp-content/uploads/2024/10/jakub-zerdzicki-orfe0w1tvs-unsplash-1024x683.jpg" class="attachment-large size-large wp-post-image" alt=""></a></div> <div></div> <p class="opener">Guest blogging has been a staple off-page SEO marketing strategy since time immemorial. When external websites accept guest posts, those articles become sources of backlinks that directly benefit the sender’s website. </p> <p>However, many guest bloggers and websites overlook the fact that guest posts benefit both parties. </p> <p>Case in point: I recently submitted a guest post to a company called Outreach Monks, which is now ranking 5th on Google for the query “link decay” (feel free to Google it).</p> <figure class="wp-block-image"><img decoding="async" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfAIzUkZB6IEizRDGuXC4Lrg-Fu3PG321mHCJKJFq7m8Wpg0tizCwp98taHIJnRli6tKT5yo0dxcdmQ-JPOC_kSM8wLiuLSyGijEe8_7gwkdTHSTsavyx1ew1IPdGJraYyHN8EHMbWnCfxoYSyES-UnFYe3?key=Mo4hOFSY6ACDZKanmOZevg" alt=""></figure> <p>In this case, not only did the guest blogging efforts benefit me, but even the site owner is actively benefiting through high-quality organic traffic, increased site visibility, and potentially boosted sales.</p> <p>There’s no debate. Guest blogging is an essential <a target="_blank" href="https://www.noupe.com/business-online/content-marketing-the-key-to-making-the-best-content-infographic.html" data-wpel-link="internal" rel="noopener">content marketing tactic</a>.</p> <p>In this article, we’ll dive deeper into guest blogging, exploring its core definition, its immense benefits, and how you can do it.</p> <h2 class="wp-block-heading"><strong>What is Guest Blogging?</strong></h2> <p>Guest blogging, also known as guest posting, is a content marketing tactic that involves writing, sending, and publishing articles on external websites.</p> <p>Guest blogging differs from ghostwriting because writers receive no attribution with the latter. </p> <p>When submitting a guest post, the author still receives full ownership of the article, as evidenced by the byline. The host blog may even highlight the article as ‘written by a contributor’ with your very own author bio.</p> <p>A guest blogging strategy is rooted in link-building principles, where people write a guest post and <a target="_blank" href="https://www.noupe.com/business-online/backlinks-basics.html" data-wpel-link="internal" rel="noopener">receive a backlink in exchange</a>. However, there are also some cases when a guest blogger receives monetary compensation for their contribution, or the blog owner demands payment for the opportunity to publish an article on their site.</p> <h2 class="wp-block-heading"><strong>Benefits of Guest Blogging</strong></h2> <p>While getting backlinks is enough to convince websites to engage in guest blogging, it’s important to note that links are only the tip of the iceberg. Below, we’ll flesh out the benefits of submitting a guest blog post:</p> <h3 class="wp-block-heading"><strong>1. Build valuable links back to your website</strong></h3> <p>Guest posting is one of the most known no-nonsense approaches to link building.</p> <p>You simply find sites, pitch your guest post idea, and write the content according to the host website’s guidelines. Once published, you often get one or several backlinks in exchange for your efforts.</p> <p>Since Google considers backlinks a <a target="_blank" href="https://www.noupe.com/business-online/5-unexpected-seo-factors-you-should-be-tapping-into.html" data-wpel-link="internal" rel="noopener">ranking factor</a>, more links from high-quality sites directly impact your website’s SEO performance. This results in a measurable increase in search engine rankings, increasing your website’s visibility while inviting more organic traffic.</p> <h3 class="wp-block-heading"><strong>2. Establishes thought leadership outside of your website</strong></h3> <p>Guest authors also benefit from guest blogging as this lets them speak on a different platform and address a different audience.</p> <p>Creating highly engaging, valuable, and amazing guest articles establishes yourself as a thought leader outside of your domain. This may expand your market and grow your audience.</p> <p>Consider it from the perspective of an e-commerce owner. Guest blog posts offer free commercial real estate to promote one’s business. If you infuse some engaging direct-response copy into your content, some readers might feel compelled to buy your product.</p> <p>Moreover, guest articles can potentially grow your readership since most feature your author’s bio at the bottom, which boosts brand awareness and may drive referral traffic back to your website.</p> <h3 class="wp-block-heading"><strong>3. Builds relationships with external websites</strong></h3> <p>Contrary to popular belief, guest blogging goes beyond content creation and <a target="_blank" href="https://www.noupe.com/business-online/digital-marketing-for-small-business.html" data-wpel-link="internal" rel="noopener">digital marketing</a>. It is an interpersonal process.</p> <p>Before writing guest posts, you start by pitching a guest post to the site owner first. This initial process requires communication and interpersonal skills; otherwise, the site owner might reject your pitch immediately.</p> <p>In attempting to build rapport and pitch your idea, you’re actively engaging in professional collaboration. This networking establishes a connection between you and the host, which fosters mutual respect and trust.</p> <p>Your content’s quality may also impact your relationship with the site owner, mainly when you follow the guidelines, do <a target="_blank" href="https://indexcheckr.com/blog/why-is-keyword-research-important/" rel="noreferrer noopener" data-wpel-link="external">proper keyword research</a>, adapt to their style guide, and tailor content to their audience. This may open doors to future opportunities, such as co-marketing, partnerships, or guest post exchanges.</p> <h3 class="wp-block-heading"><strong>4. Introduces fresh content to host websites</strong></h3> <p>Every writer is different, and when you submit a guest article, your creative writing style, unique angles, and new perspectives can introduce new ideas that enrich the site’s content and satisfy its readers.</p> <p>The readers might be inundated with the website’s conventional writing. Guest blogging opportunities break the monotony by offering a breath of fresh air to a host website.</p> <h2 class="wp-block-heading"><strong>How to Find Guest Post Opportunities?</strong></h2> <p>So, do you want to write a guest article? Follow this step-by-step guide to guest blogging, and you will succeed! </p> <h3 class="wp-block-heading"><strong>Step 1: Find sites that are viable</strong></h3> <p>First of all, what does “viable” even mean? In the case of guest posting, I defined viable in three ways:</p> <h4 class="wp-block-heading"><strong>A. The website is related to your niche</strong></h4> <p>A simple Google search using your primary keywords reveals all websites relevant to your niche. </p> <p>For example, if you sell food supplements, searching “health websites” will tell you which websites perfectly align with your niche. Pick websites of the same niche to increase your chances of being accommodated for a guest post. </p> <p>However, you may also work with websites distant from your industry if you convince them that your guest post pitch will be relevant to the host site. </p> <h4 class="wp-block-heading"><strong>B. The website is actively accepting guest posts</strong></h4> <p>What good is a relevant website if they don’t accept guest blogs? Sites that accept guest posts often have a dedicated page explaining their guidelines. Look for this specific page on the website. </p> <p>If they lack this particular page, it doesn’t mean they are not open to accepting a contribution. Find their contact information on the website and reach out with your proposal.</p> <h4 class="wp-block-heading"><strong>C. The website is high-quality</strong></h4> <p><a target="_blank" href="https://www.stanventures.com/blog/link-farms/" rel="noreferrer noopener nofollow" data-wpel-link="external">Guest post farms</a> are becoming popular, especially since SEO has become increasingly challenging. These spammy sites exist solely to accept payments and publish guest posts, even unrelated ones. Before pitching your idea, ensure it’s a reputable site with a respectable domain authority or rating. </p> <p>Take time to review the blog page, too. Read the topics they publish and get a feel for the content. If the content is overly promotional and riddled with external links, it might indicate a red flag. </p> <h3 class="wp-block-heading"><strong>Step 2: Read their guest post guidelines</strong></h3> <p>Once you find a viable website, read their guidelines first. The website might have some prior submission guidelines before you can successfully submit guest posts. For example, our website requires guest posters to email us with the subject line, “<em>I have carefully read, and I accept the guidelines.</em>” This tells us a lot about the sender’s dedication.</p> <p>Take a look at some of our unreplied guest post proposal emails:</p> <figure class="wp-block-image"><img decoding="async" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeCXGUwZu7tI-Wc5v9ObkPe84VAQfHR-SkhaOe-xceruRkfA6WTh3NbzjUaEg9frg_uKUIvMMs3QoTonrPVK8uKAgZmm3mGk7BpRksoBOiZcqIVvW-nhJC-WOOKZJMMI65KSDUtXf0Pz4Wymti_Di4Z308?key=Mo4hOFSY6ACDZKanmOZevg" alt=""></figure> <p>Even if they have good intentions, we found that people who do not use our prescribed subject line always submit substandard content that doesn’t get published. </p> <p>Another reason to read the blog’s guest post guidelines page is to discover which topics they accept. This will guide you on what type of content to write and how to write it. </p> <h3 class="wp-block-heading"><strong>Step 3: Brainstorm mutually beneficial topic ideas</strong></h3> <p>A guest blogging site’s blog owner or editor will always gravitate toward a topic that serves their website. To maximize the benefits you can reap from guest post submissions, conceptualize mutually beneficial topics. That means coming up with topic ideas that serve both the guest post website and the sender. </p> <p>For example, if you sell <a target="_blank" href="https://linkstorm.io/resources/best-internal-linking-tools-for-seo" rel="noreferrer noopener" data-wpel-link="external">internal linking software</a>, you could conceptualize content ideas strictly about internal linking and submit them to an SEO website.</p> <p>The topics will resonate with both parties while giving the sender more headroom in creating the content since it is their field of specialization. Plus, you can embed resource backlinks from the content to your website, which is a win-win! </p> <p>Moreover, look for topics that haven’t been covered yet on the blog; otherwise, your suggestions might be rejected.</p> <h3 class="wp-block-heading"><strong>Step 4: Pitch your guest post idea</strong></h3> <p>Once you’ve developed topics, it’s time to send them to the guest blogging sites. Some blogs might have specific submission guidelines and instructions, while others are loose on how you pitch your idea. Whatever it is, make sure you don’t beat around the bush and make your intention clear. </p> <p>Here is an example guest post proposal that I appreciate:</p> <figure class="wp-block-image"><img decoding="async" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcLlvs7RF4MbafFh6cKqYos4kXwkNV9wsL7hSRknSPtIDkUQw1k5ynK9j8z9rEOVNpG_vhyTZI1pi6WNo4iOAx0Cf5PhLln6aIktg9i9pyu6fgvozPqbPuOe4fvhqPMazYPJ3qTJsGYpX3oTBZRG4cf8SyG?key=Mo4hOFSY6ACDZKanmOZevg" alt=""></figure> <p>The content is straight to the point and covers all the essentials: topic, keyword, and summary or goal, which increases the chances of getting replied and accepted.</p> <p>While the guidelines might specify it, you may also include a discussion on the terms of the guest post. For instance, how many contextual backlinks can you include in the post, and what will be the rel attribute of your links? Remember that it all depends on the host site’s preference. </p> <p>In some isolated cases, the host site might reject your topic proposal but give you another subject to write about.  </p> <h3 class="wp-block-heading"><strong>Step 5: Write your guest post</strong></h3> <p>After you receive the sweet “yes,” it’s time to write the actual guest post and make it worth your and the host website’s time. Knowing your goals for the guest article will impact what and how you create the content.</p> <p>Now, I won’t give you a template for structuring an article or give tips on writing the content because circling back to benefit #4, “<em>every writer is different</em>.”</p> <p>We all bring unique flavors to the table; your writing style is your own personal branding. </p> <h2 class="wp-block-heading"><strong>Ready to Submit a Guest Post?</strong></h2> <p>Successful guest blogging begins with a conscious decision to share your voice on different platforms from your own. Beyond being good for SEO, submitting guest posts helps establish you as a thought leader in your industry and builds rapport with other experts within your niche.</p> <p>By following the steps above, you can also become a successful guest blogger. </p> <p>Are you ready to publish a guest post? </p> <p>Featured Image by <a target="_blank" href="https://unsplash.com/@jakubzerdzicki?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash" rel="noreferrer noopener nofollow" data-wpel-link="external">Jakub ?erdzicki</a> on <a target="_blank" href="https://unsplash.com/photos/a-laptop-computer-sitting-on-top-of-a-wooden-desk--orfe0w1tvs?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash" rel="noreferrer noopener nofollow" data-wpel-link="external">Unsplash</a></p> <p>The post <a target="_blank" href="https://www.noupe.com/business-online/guest-blogging-what-why-how-to-do-it.html" data-wpel-link="internal" rel="noopener">Guest Blogging: What, Why & How to Do it in 2024</a> appeared first on <a target="_blank" href="https://www.noupe.com/" data-wpel-link="internal" rel="noopener">noupe</a>.</p> <div class="fixed"></div> </div> <div class="under"> <span class="categories">Categories: </span><span><a href="http://www.webmastersgallery.com/category/uncategorized/" rel="category tag">Others</a></span> <span class="tags">Tags: </span><span></span> </div> </div> <div class="post" id="post-7160001"> <h2><a class="title" href="http://www.webmastersgallery.com/2024/10/04/how-a-bottom-up-design-approach-enhances-site-accessibility/" rel="bookmark">How A Bottom-Up Design Approach Enhances Site Accessibility</a></h2> <div class="info"> <span class="date">October 4th, 2024</span> <span class="author"></span> <span class="comments"><a href="http://www.webmastersgallery.com/2024/10/04/how-a-bottom-up-design-approach-enhances-site-accessibility/#respond">No comments</a></span> <div class="fixed"></div> </div> <div class="content"> <div class="ftpimagefix" style="float:left"><a target="_blank" href="0" rel="noopener"><img decoding="async" src="https://files.smashing.media/articles/how-bottom-up-design-approach-enhances-site-accessibility/1-top-down-strategy-design.png"></a></div> <p>Accessibility is key in modern web design. A site that doesn’t consider how its user experience may differ for various audiences — especially those with disabilities — will fail to engage and serve everyone equally. One of the best ways to prevent this is to approach your site from <strong>a bottom-up perspective</strong>.</p> <p>Understanding Bottom-Up Design</p> <p>Conventional, top-down design approaches start with the big picture before breaking these goals and concepts into smaller details. Bottom-up philosophies, by contrast, consider the minute details first, eventually achieving the broader goal piece by piece.</p> <p>This alternative way of thinking is important for accessibility in general because it reflects how neurodivergent people commonly think. While non-autistic people <a target="_blank" href="https://psychcentral.com/autism/why-people-with-autism-are-more-logical" rel="noopener">tend to think from a top-down perspective</a>, those with autism often employ a bottom-up way of thinking. </p> <p>Of course, there is considerable variation, and researchers have identified <a target="_blank" href="https://www.psychologytoday.com/us/blog/mind-matters-from-menninger/202204/autism-acceptance-great-minds-dont-think-alike" rel="noopener">at least three specialist thinking types</a> within the autism spectrum:</p> <ul> <li> <strong>Visual thinkers</strong> who think in images;</li> <li> <strong>Pattern thinkers</strong> who think of concepts in terms of patterns and relationships;</li> <li> <strong>Verbal thinkers</strong> who think only in word detail.</li> </ul> <p>Still, research shows that people with autism and ADHD <a target="_blank" href="https://journals.sagepub.com/doi/full/10.1177/27546330241229004" rel="noopener">show a bias toward bottom-up thinking</a> rather than the top-down approach you often see in neurotypical users. Consequently, a top-down strategy means you may miss details your audience may notice, and your site may not feel easily usable for all users.</p> </p> <p>As a real-world example, consider the task of writing an essay. Many students are instructed to start an essay assignment by thinking about the main point they want to convey and then create an outline with points that support the main argument. This is top-down thinking — starting with the big picture of the topic and then gradually breaking down the topic into points and then later into words that articulate these points.</p> <p><img decoding="async" src="https://files.smashing.media/articles/how-bottom-up-design-approach-enhances-site-accessibility/2-bottom-up-design.png"></p> <p>In contrast, someone who uses a bottom-up thinking approach might start an essay with no outline but rather just by freely jotting down every idea that comes to mind as it comes to mind — perhaps starting with one particular idea or example that the writer finds interesting and wants to explore further and branching off from there. Then, once all the ideas have been written out, the writer goes back to group related ideas together and arrange them into a logical outline. This writer starts with the small details of the essay and then works these details into the big picture of the final form.</p> <p>In web design, in particular, a bottom-up approach means <strong>starting with the specifics of the user experience instead of the desired effect</strong>. You may determine a readable layout for a single blog post, then ask how that page relates to others and slowly build on these decisions until you have several well-organized website categories. </p> <p>You may even get more granular. Say you start your site design by placing a menu at the bottom of a mobile site to make it easier to tap with one hand, improving ease of use. Then, you build a drop-down menu around that choice — placing the most popular or needed options at the bottom instead of the top for easy tapping. From there, you may have to rethink larger-scale layouts to work around those interactive elements being lower on the screen, slowly addressing larger categories until you have a finished site design.</p> <p><img decoding="async" src="https://files.smashing.media/articles/how-bottom-up-design-approach-enhances-site-accessibility/3-bottom-up-design.png"></p> <p>In either case, the idea of bottom-up design is to <strong>begin with the most specific problems</strong> someone might have. You then address them in sequence instead of determining the big picture first.</p> <p>Benefits Of A Bottom-Up Approach For Accessible Design</p> <p>While neither bottom-up nor top-down approaches dominate the industry, some web engineers prefer the bottom-up approach due to the various accessibility benefits this process provides. This strategy has several accessibility benefits.</p> <h3>Putting User Needs First</h3> <p>The biggest benefit of bottom-up methods is that they <strong>prioritize the user’s needs</strong>.</p> <p>Top-down approaches seem organized, but they often result in a site that reflects the designer’s choices and beliefs more than it serves your audience.</p> <p>Consider some of the complaints that social media users have made over the years related to usability and accessibility for the everyday user. For example, many users complain that their Facebook feed will randomly refresh as they scroll for the sake of providing users with the most up-to-date content. However, the feature makes it virtually impossible to get back to a post a user viewed that they didn’t think to save. Likewise, TikTok’s watch history feature <a target="_blank" href="https://www.distractify.com/p/did-tiktok-remove-watch-history" rel="noopener">has come and gone over the years</a> and still today is difficult for many users to find without viewing an outside tutorial on the subject. </p> <p>This is a common problem: <a target="_blank" href="https://webaim.org/projects/million/#wcag" rel="noopener">95.9% of the largest one million homepages</a> have Web Content Accessibility Guidelines (WCAG) errors. While a bottom-up alternative doesn’t mean you won’t make any mistakes, it may make them less likely, as bottom-up thinking <a target="_blank" href="https://uk.indeed.com/career-advice/career-development/bottom-up-processing" rel="noopener">often improves your awareness</a> of new stimuli so you can catch things you’d otherwise overlook. It’s easier to meet user’s needs when you build your entire site around their experience instead of looking at UX as an afterthought.</p> <p><img decoding="async" src="https://files.smashing.media/articles/how-bottom-up-design-approach-enhances-site-accessibility/4-exampleberkshire-hathaway.png"></p> <p>Consider this <a target="_blank" href="https://www.berkshirehathaway.com/" rel="noopener">example from Berkshire Hathaway</a>, a multi-billion-dollar holding company. The overall design philosophy is understandable: It’s simple and direct, choosing to focus on information instead of fancy aesthetics that may not suit the company image. However, you could argue it loses itself in this big picture.</p> <p>While it is simple, the lack of menus or color contrast and the small font make it harder to read and a little overwhelming. This confusion can counteract any accessibility benefits of its simplicity.</p> <p><img decoding="async" src="https://files.smashing.media/articles/how-bottom-up-design-approach-enhances-site-accessibility/5-example-berkshire-hathaway-redesign.png"></p> <p>Alternatively, even a simple website redesign could include intuitive menus, additional contrast, and accessible font for easy navigation across the site.</p> <p><img decoding="async" src="https://files.smashing.media/articles/how-bottom-up-design-approach-enhances-site-accessibility/6-homepage-scope.png"></p> <p>The <a target="_blank" href="https://www.scope.org.uk/" rel="noopener">homepage for U.K. charity Scope</a> offers a better example of web design centered around users’ needs. Concise, clear menus line the top of the page to aid quicker, easier navigation. The color scheme is simple enough to avoid confusion but provides enough contrast to make everything easy to read — something the sans-serif font further helps.</p> <h3>Ensuring Accessibility From The Start</h3> <p>A top-down method also makes catering to a diverse audience difficult because you may need to <strong>shoehorn features into an existing design</strong>. </p> <p>For example, say, a local government agency creates a website focused on providing information and services to a general audience of residents. The site originally featured high-resolution images, bright colors, and interactive charts. </p> <p><img decoding="async" src="https://files.smashing.media/articles/how-bottom-up-design-approach-enhances-site-accessibility/7-government-agency-website.png"></p> <p>However, they realize the images are not accessible to people navigating the site with screen readers, while multiple layers of submenus are difficult for keyboard-only users. Further, the bright colors make it hard for visually impaired users to read the site’s information.</p> <p>The agency, realizing these accessibility concerns, adds captions to each image. However, the captions disrupt the originally intended visual aesthetics and user flow. Further, adjusting the bright colors would involve completely rethinking the site’s entire color palette. If these considerations had been made before the site was built, the site build could have specifically accommodated these elements while still creating an aesthetically pleasing and user-friendly result.</p> <p><img decoding="async" src="https://files.smashing.media/articles/how-bottom-up-design-approach-enhances-site-accessibility/8-accessible-government-agency-website.png"></p> <p>Alternatively, a site initially built with high contrast, a calm color scheme, clear typography, simple menus, and reduced imagery would make this site much more accessible to a wide user base from the get-go.</p> <p><img decoding="async" src="https://files.smashing.media/articles/how-bottom-up-design-approach-enhances-site-accessibility/9-awwwards-website.png"></p> <p>As a real-world example, <a target="_blank" href="https://www.awwwards.com/" rel="noopener">consider the Awwwards</a> website. There are plenty of menus to condense information and ease navigation without overloading the screen — a solid accessibility choice. However, there does not seem to be consistent thought in these menus’ placement or organization. </p> <p><img decoding="async" src="https://files.smashing.media/articles/how-bottom-up-design-approach-enhances-site-accessibility/10-awwwards-website-menus.png"></p> <p>There are far too many menus; some are at the top while others are at the bottom, and a scrolling top bar adds further distractions. It seems like Awwwards may have added additional menus as an afterthought to improve navigation. This leads to inconsistencies and crowding because they did not begin with this thought.</p> <p>In contrast,</p> <p>Bottom-up alternatives address usability issues from the beginning, which results in a more functional, accessible website.</p> <p>Redesigning a system to address a usability issue it didn’t originally make room for is challenging. It can lead to errors like broken links and other unintended consequences that may hinder access for other visitors. Some sites have even claimed to lose <a target="_blank" href="https://support.google.com/webmasters/thread/40281085/90-of-our-traffic-is-lost-business-is-down?hl=en" rel="noopener">90% of their traffic</a> after a redesign. While bottom-up approaches won’t eliminate those possibilities, they make them <em>less likely</em> by centering everything around usage from the start.</p> <p><img decoding="async" src="https://files.smashing.media/articles/how-bottom-up-design-approach-enhances-site-accessibility/11-vasa-museum-website.png"></p> <p>The <a target="_blank" href="https://www.vasamuseet.se/en" rel="noopener">website for the Vasa Museum</a> in Stockholm, Sweden, showcases a more cohesive approach to ensuring accessibility. Like Awwwards, it uses menus to aid navigation and organization, but there seems to be more forethought into these features. All menus are at the top, and there are fewer of them, resulting in less clutter and a faster way to find what you’re looking for. The overall design complements this by keeping things simple and neat so that the menus stand out.</p> <h3>Increasing Awareness</h3> <p>Similarly, bottom-up design ensures you don’t miss as many accessibility concerns. When you start at the top, before determining what details fit within it, you may not consider all the factors that influence it. Beginning with the specifics instead makes it easier to spot and address problems you would’ve missed otherwise.</p> <p>This awareness is particularly important for serving a diverse population. An estimated <a target="_blank" href="https://www.who.int/news-room/fact-sheets/detail/disability-and-health" rel="noopener">16% of the global population</a> — 1.6 billion people — have a significant disability. That means there’s a huge range of varying needs to account for, but most people lack firsthand experience living with these conditions. Consequently, it’s easy to miss things impacting others’ UX. You can overcome that knowledge gap by asking how everyone can use your site first.</p> <p><img decoding="async" src="https://files.smashing.media/articles/how-bottom-up-design-approach-enhances-site-accessibility/12-run-usability-test.jpg"></p> <p>Bottom-Up vs. Top-Down: Which Is Best for You?</p> <p>As these benefits show, a bottom-up design philosophy can be helpful when building an accessible site. Still, top-down methods can be advantageous at times, too. Which is best depends on your situation.</p> <p>Top-down approaches are <strong>a good way to ensure a consistent brand image</strong>, as you start with the overall idea and base future decisions on this concept. It also makes it easier to create <strong>a design hierarchy</strong> to facilitate decision-making within your team. When anyone has a question, they can turn to whoever is above them or refer to the broader goals. Such organization can also mean faster design processes.</p> <p>Bottom-up methods, by contrast, are better when accessibility for a diverse audience is your main concern. It may be harder to keep everyone on the same overall design philosophy page, but it usually produces <strong>a more functional website</strong>. You can catch and solve problems early and pay great attention to detail. However, this can mean longer design cycles, which can incur extra costs.</p> <p>It may come down to what your team is most comfortable with. People think and work differently, with some preferring a top-down approach while others find bottom-up more natural. Combining the two — starting with a top-down model before tackling updates from a bottom-up perspective — can be beneficial, too. </p> <p>Strategies For Implementing A Bottom-Up Design Model</p> <p>Should you decide a bottom-up design method is best for your goals, here are some ways you can embrace this philosophy.</p> <h3>Talk To Your Existing User Base</h3> <p>One of the most important factors in bottom-up web design is to center everything around your users. As a result, your existing user base — whether from a separate part of your business or another site you run — is the perfect place to start.</p> <p>Survey customers and web visitors about their experience on your sites and others. Ask what pain points they have and what features they’d appreciate. Any commonalities between responses deserve attention. You can also <a target="_blank" href="https://www.w3.org/WAI/standards-guidelines/wcag/" rel="noopener">turn to WCAG standards</a> for inspiration on accessible functionality, but first-hand user feedback should form the core of your mission.</p> <h3>Look To Past Projects For Accessibility Gaps</h3> <p>Past sites and business projects can also reveal what specifics you should start with. Look for any accessibility gaps by combing through old customer feedback and update histories and using these sites yourself to find issues. Take note of any barriers or usability concerns to address in your next website.</p> <p>Remember to document everything you find as you go. Up to <a target="_blank" href="https://blog.box.com/ai-summarization-definition-and-best-practices" rel="noopener">90% of organizations’ data</a> is unstructured, making it difficult to analyze later. Reversing that trend by organizing your findings and recording your accessible design process will streamline future accessibility optimization efforts.</p> <h3>Divide Tasks But Communicate Often</h3> <p>Keep in mind that <strong>a bottom-up strategy can be time-consuming</strong>. One of the reasons why top-down alternatives are popular is because they’re efficient. You can overcome this gap by splitting tasks between smaller teams. However, these groups must communicate frequently to ensure separate design considerations work as a cohesive whole.</p> <p>A DevOps approach is helpful here. DevOps has helped <a target="_blank" href="https://www.atlassian.com/whitepapers/devops-survey-2020" rel="noopener">49% of its adopters</a> achieve a faster time to market, and 61% report higher-quality deliverables. It also includes space for both detailed work and team-wide meetings to keep everyone on track. Such benefits ensure you can remain productive in a bottom-up strategy.</p> <p>Accessible Websites Need A Bottom-Up Design Approach</p> <p>You can’t overstate the importance of accessible website design. By the same token, bottom-up philosophies are crucial in modern site-building. A detail-oriented approach makes it easier to serve a more diverse audience along several fronts. Making the most of this opportunity will both extend your reach to new niches and make the web a more equitable place.</p> <p>The <a target="_blank" href="https://www.w3.org/WAI/standards-guidelines/wcag/" rel="noopener">Web Accessibility Initiative’s WCAG standards</a> are a good place to start. While these guidelines don’t necessarily describe how to apply a bottom-up approach, they do outline critical user needs and accessibility concerns your design should consider. The site also offers a free and comprehensive <a target="_blank" href="https://www.w3.org/WAI/courses/foundations-course/" rel="noopener">Digital Accessibility Foundations course</a> for designers and developers.</p> <p>Familiarizing yourself with these standards and best practices will make it easier to understand your audience before you begin designing your site. You can then build a more accessible platform from the ground up.</p> <p>Additionally, the following are some valuable related reads that can act as inspiration in accessibility-centered and user-centric design.</p> <ul> <li> <a target="_blank" href="https://www.amazon.com/Inclusive-Design-Digital-World-Accessibility/dp/148425015X" rel="noopener"><em>Inclusive Design for a Digital World: Designing with Accessibility in Mind</em></a> by Regine M. Gilbert</li> <li> <a target="_blank" href="https://www.amazon.com/Practical-Web-Inclusion-Accessibility-Comprehensive/dp/1484254511" rel="noopener"><em>Practical Web Inclusion and Accessibility: A Comprehensive Guide to Access Needs</em></a> by Ashley Firth</li> <li> <a target="_blank" href="https://www.amazon.com/Dont-Make-Think-Revisited-Usability/dp/0321965515" rel="noopener"><em>Don’t Make Me Think, Revisited: A Common Sense Approach to Web Usability</em></a> by Steve Krug</li> </ul> <p>By employing bottom-up thinking as well as resources like these in your design approach, you can create websites that not only meet current accessibility standards but actively encourage site use among users of all backgrounds and abilities.</p> <h3>Further Reading On SmashingMag</h3> <ul> <li>“<a target="_blank" href="https://deploy-preview-9934--smashing-prod.netlify.app/2024/07/getting-bottom-minimum-wcag-conformant-interactive-element-size/" rel="noopener">Getting To The Bottom Of Minimum WCAG-Conformant Interactive Element Size</a>,” Eric Bailey</li> <li>“<a target="_blank" href="https://deploy-preview-9934--smashing-prod.netlify.app/2024/06/how-make-strong-case-accessibility/" rel="noopener">How To Make A Strong Case For Accessibility</a>,” Vitaly Friedman</li> <li>“<a target="_blank" href="https://www.smashingmagazine.com/2023/02/guide-accessible-form-validation/" rel="noopener">A Guide To Accessible Form Validation</a>,” Sandrina Pereira</li> <li>“<a target="_blank" href="https://www.smashingmagazine.com/2023/01/creating-high-contrast-design-system-css-custom-properties/" rel="noopener">Creating A High-Contrast Design System With CSS Custom Properties</a>,” Brecht De Ruyte</li> </ul> <div class="fixed"></div> </div> <div class="under"> <span class="categories">Categories: </span><span><a href="http://www.webmastersgallery.com/category/uncategorized/" rel="category tag">Others</a></span> <span class="tags">Tags: </span><span></span> </div> </div> <div class="post" id="post-7155788"> <h2><a class="title" href="http://www.webmastersgallery.com/2024/10/02/css-anchor-positioning-guide/" rel="bookmark">CSS Anchor Positioning Guide</a></h2> <div class="info"> <span class="date">October 2nd, 2024</span> <span class="author"><a href="http://www.webmastersgallery.com/author/admin/" title="Posts by admin" rel="author">admin</a></span> <span class="comments"><a href="http://www.webmastersgallery.com/2024/10/02/css-anchor-positioning-guide/#respond">No comments</a></span> <div class="fixed"></div> </div> <div class="content"> <div class="ftpimagefix" style="float:left"><a target="_blank" href="1" rel="noopener"><img decoding="async" data-recalc-dims="1" src="https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/09/anchor-name-7.png?resize=1024%2C576&ssl=1" alt='Square labeled as "anchor"' class="wp-image-381095"></a></div> <div class="wp-block-columns are-vertically-aligned-top is-layout-flex wp-container-core-columns-is-layout-1 wp-block-columns-is-layout-flex"> <div class="wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow"> <p>Not long ago, if we wanted a tooltip or popover positioned on top of another element, we would have to set our tooltip’s position to something other than <code>static</code> and use its inset/transform properties to place it <em>exactly</em> where we want. This works, but the element’s position is susceptible to user scrolls, zooming, or animations since the tooltip could overflow off of the screen or wind up in an awkward position. The only way to solve this was using JavaScript to check whenever the tooltip goes out of bounds so we can correct it… again in JavaScript.</p> <p> CSS Anchor Positioning gives us a simple interface to attach elements next to others just by saying which sides to connect — directly in CSS. It also lets us set a fallback position so that we can avoid the overflow issues we just described. For example, we might set a tooltip element above its anchor but allow it to fold underneath the anchor when it runs out of room to show it above.</p> <p>Anchor positioning is different from a lot of other features as far as how quickly it’s gained browser support: its <a target="_blank" href="https://www.w3.org/standards/history/css-anchor-position-1/" rel="noopener">first draft was published on June 2023</a> and, just a year later, it was <a target="_blank" href="https://caniuse.com/css-anchor-positioning" rel="noopener">released on Chrome 125</a>. To put it into perspective, the first draft specification for CSS variables <a target="_blank" href="https://www.w3.org/standards/history/css-variables-1/" rel="noopener">was published in 2012</a>, but it took four years for them to gain wide browser support.</p> <p>So, let’s dig in and learn about things like attaching target elements to anchor elements and positioning and sizing them.</p> </div> <div class="wp-block-column is-vertically-aligned-top ticss-986972e6 is-layout-flow wp-block-column-is-layout-flow"> <h2 class="wp-block-heading">Quick reference</h2> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>/* Define an anchor element */ .anchor { anchor-name: --my-anchor; }</code></pre> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>/* Anchor a target element */ .target { position: absolute; position-anchor: --my-anchor; }</code></pre> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>/* Position a target element */ .target { position-area: start end; }</code></pre> <div class="wp-block-group sticky-toc"> <div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained"> <details> <summary> Table of contents </summary> <ol class="wp-block-list"> <li><a target="_blank" href="https://css-tricks.com/#aa-basics-and-terminology" rel="noopener">Basics and terminology</a></li> <li><a target="_blank" href="https://css-tricks.com/#aa-attaching-targets-to-anchors" rel="noopener">Attaching targets to anchors</a></li> <li><a target="_blank" href="https://css-tricks.com/#aa-positioning-targets" rel="noopener">Positioning targets</a></li> <li><a target="_blank" href="https://css-tricks.com/#aa-setting-fallback-positions" rel="noopener">Setting fallback positions</a></li> <li><a target="_blank" href="https://css-tricks.com/#aa-custom-position-and-size-fallbacks" rel="noopener">Custom position and size fallbacks</a></li> <li><a target="_blank" href="https://css-tricks.com/#aa-multiple-anchors" rel="noopener">Multiple anchors</a></li> <li><a target="_blank" href="https://css-tricks.com/#aa-accessibility" rel="noopener">Accessibility</a></li> <li><a target="_blank" href="https://css-tricks.com/#aa-browser-support" rel="noopener">Browser support</a></li> <li><a target="_blank" href="https://css-tricks.com/#aa-spec-changes" rel="noopener">Spec changes</a></li> <li><a target="_blank" href="https://css-tricks.com/#aa-known-bugs" rel="noopener">Known bugs</a></li> <li><a target="_blank" href="https://css-tricks.com/#aa-almanac-references" rel="noopener">Almanac references</a></li> <li><a target="_blank" href="https://css-tricks.com/#aa-further-reading" rel="noopener">Further reading</a></li> </ol> </details> </div> </div> </div> </div> <div aria-hidden="true" class="wp-block-spacer"></div> <details open> <summary> <h2>Basics and terminology</h2> </summary> <p>At its most basic, CSS Anchor Positioning introduces a completely new way of placing elements on the page relative to one another. To make our lives easier, we’re going to use specific names to clarify which element is connecting to which:</p> <ul class="wp-block-list"> <li> <strong>Anchor:</strong> This is the element used as a reference for positioning other elements, hence the <em>anchor</em><strong> </strong>name.</li> <li> <strong>Target:</strong> This is an absolutely positioned element placed relative to one or more anchors. The <em>target</em> is the name we will use from now on, but you will often find it as just an “absolutely positioned element” in the spec.</li> </ul> <p>For the following code examples and demos, you can think of these as just two <code></p> <div></code> elements next to one another.</p> <pre class="wp-block-csstricks-code-block language-markup" data-line=""><code><div class="anchor">anchor</div> <div class="target">target</div></code></pre> <p>CSS Anchor Positioning is all about elements with absolute positioning (i.e., <code>display: absolute</code>), so there are also some concepts we have to review before diving in.</p> <ul class="wp-block-list"> <li> <strong>Containing Block:</strong> This is the box that contains the elements. For an absolute element, the containing block is the viewport the closest ancestor with a position other than <code>static</code> or certain values in properties like <a target="_blank" href="https://css-tricks.com/almanac/properties/c/contain/" rel="noopener"><code>contain</code></a> or <a target="_blank" href="https://css-tricks.com/almanac/properties/f/filter/" rel="noopener"><code>filter</code></a>.</li> <li> <strong>Inset-Modified Containing Block (IMCB):</strong> For an absolute element, inset properties (<code>top</code>, <code>right</code>, <code>bottom</code>, <code>left</code>, etc.) reduce the size of the containing block into which it is sized and positioned, resulting in a new box called the <em>inset-modified containing block</em>, or IMCB for short. This is a vital concept to know since properties we’re covering in this guide — like <code>position-area</code> and <code>position-try-order</code> — rely on this concept.</li> </ul> </details> <details> <summary> <h2>Attaching targets to anchors</h2> </summary> <p>We’ll first look at the two properties that establish anchor positioning. The first, <code>anchor-name</code>, establishes the anchor element, while the second, <code>position-anchor</code>, attaches a target element to the anchor element.</p> <div class="wp-block-group"> <div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained"> <div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-2 wp-block-columns-is-layout-flex"> <div class="wp-block-column ticss-30288ed1 is-layout-flow wp-block-column-is-layout-flow"> <div class="wp-block-group"> <div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained"> <figure class="wp-block-image size-large is-resized"></figure> <h4 class="wp-block-heading"><code>anchor-name</code></h4> <p>A normal element isn’t an anchor by default — we have to explicitly make an element an anchor. The most common way is by giving it a name, which we can do with the <code><a target="_blank" href="https://css-tricks.com/almanac/properties/a/anchor-name/" rel="noopener">anchor-name</a></code> property.</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>anchor-name: none | <dashed-ident>#</code></pre> <p>The name must be a <code></code>, that is, a custom name prefixed with two dashes (<code>--</code>), like <code>--my-anchor</code> or <code>--MyAnchor</code>.</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.anchor { anchor-name: --my-anchor; }</code></pre> <p>This gives us an anchor element. All it needs is something anchored to it. That’s what we call the “target” element which is set with the <code>position-anchor</code> property.</p> </div> </div> </div> <div class="wp-block-column ticss-bd46f479 is-layout-flow wp-block-column-is-layout-flow"> <div class="wp-block-group"> <div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained"> <figure class="wp-block-image size-large is-resized"><img decoding="async" loading="lazy" data-recalc-dims="1" width="1024" height="576" src="https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/09/position-anchor-5.png?resize=1024%2C576&ssl=1" alt='Square labeled as "target"' class="wp-image-381096"></figure> <h4 class="wp-block-heading"><code>position-anchor</code></h4> <p>The target element is an element with an absolute position linked to an anchor element matching what’s declared on the <code>anchor-name</code> property. This attaches the target element to the anchor element.</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>position-anchor: auto | <anchor-element></code></pre> <p>It takes a valid <code></code>. So, if we establish another element as the “anchor” we can set the target with the <code><a target="_blank" href="https://css-tricks.com/almanac/properties/p/position-anchor/" rel="noopener">position-anchor</a></code> property:</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { position: absolute; position-anchor: --my-anchor; }</code></pre> <p>Normally, if a valid anchor element isn’t found, then other anchor properties and functions will be ignored.</p> </div> </div> </div> </div> </div> </div> </details> <details> <summary> <h2>Positioning targets</h2> </summary> <p>Now that we know how to establish an anchor-target relationship, we can work on <strong>positioning</strong> the target element in relation to the anchor element. The following two properties are used to set which side of the anchor element the target is positioned on (<code>position-area</code>) and conditions for hiding the target element when it runs out of room (<code>position-visibility</code>).</p> <div class="wp-block-columns are-vertically-aligned-top is-layout-flex wp-container-core-columns-is-layout-3 wp-block-columns-is-layout-flex"> <div class="wp-block-column is-vertically-aligned-top ticss-168d39a5 is-layout-flow wp-block-column-is-layout-flow"> <div class="wp-block-group"> <div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained"> <figure class="wp-block-image size-large is-resized"><img decoding="async" loading="lazy" data-recalc-dims="1" width="1024" height="576" src="https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/09/position-area-9.png?resize=1024%2C576&ssl=1" alt="Anchor element with target elements spanning around it." class="wp-image-380907"></figure> <h4 class="wp-block-heading"><code>position-area</code></h4> <p>The next step is positioning our target relative to its anchor. The easiest way is to use the <code>position-area</code> property, which creates an imaginary 3×3 grid around the anchor element and lets us place the target in one or more regions of the grid.</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>position-area: auto | <position-area></code></pre> <p>It works by setting the row and column of the grid using <strong>logical values</strong> like <code>start</code> and <code>end</code> (dependent on the writing mode); <strong>physical values</strong> like <code>top</code>, <code>left</code>, <code>right</code>, <code>bottom</code> and the <code>center</code> <strong>shared value</strong>, then it will shrink the target’s IMCB into the region of the grid we chose.</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { position-area: top right; /* or */ position-area: start end; }</code></pre> <p>Logical values refer to the containing block’s writing mode, but if we want to position our target relative to its writing mode we would prefix it with the <code>self</code> value.</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { position-area: self-start self-end; }</code></pre> <p>There is also the <code>center</code> value that can be used in every axis.</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { position-area: center right; /* or */ position-area: start center; }</code></pre> <p>To place a target across two adjacent grid regions, we can use the prefix <code>span-</code> on any value (that isn’t <code>center</code>) a row or column at a time.</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { position-area: span-top left; /* or */ position-area: span-start start; }</code></pre> <p>Finally, we can span a target across three adjacent grid regions using the <code>span-all</code> value.</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { position-area: bottom span-all; /* or */ position-area: end span-all; }</code></pre> <p>You may have noticed that the <code>position-area</code> property doesn’t have a strict order for physical values; writing<code> position-area: top left</code> is the same as <code>position-area: left top</code>, but the order is important for logical value since <code>position-area: start end</code> is completely opposite to <code>position-area: end start</code>.</p> <p>We can make logical values interchangeable by prefixing them with the desired axis using <code>y-</code>, <code>x-</code>, <code>inline-</code> or <code>block-</code>.</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { position-area: inline-end block-start; /* or */ position-area: y-start x-end; }</code></pre> <div class="wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper">CodePen Embed Fallback</div> </div> </div> <div class="wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper">CodePen Embed Fallback</div> </div> <div class="wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow"> <div class="wp-block-group ticss-e32e6402"> <div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained"> <figure class="wp-block-image size-large is-resized"><img decoding="async" data-recalc-dims="1" loading="lazy" width="1024" height="576" src="https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/09/anchor-visibility-3.png?resize=1024%2C576&ssl=1" alt="Examples on each position-visibility value: always showing the target, anchors-visible hiding it when the anchor goes out of screen and no-overflow hiding it when the target overflows" class="wp-image-380921"></figure> <h4 class="wp-block-heading"><code>position-visibility</code></h4> <p>It provides certain conditions to hide the target from the viewport.</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>position-visibility: always | anchors-visible | no-overflow</code></pre> <ul class="wp-block-list"> <li> <strong><code>always</code>:</strong> The target is always displayed without regard for its anchors or its overflowing status.</li> <li> <strong><code>no-overflow</code>:</strong> If even after applying the position fallbacks, the target element is still overflowing its containing block, then it is strongly hidden.</li> <li> <strong><code>anchors-visible</code>:</strong> If the <strong>anchor</strong> (not the target) has completely overflowed its containing block or is completely covered by other elements, then the target is strongly hidden.</li> </ul> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>position-visibility: always | anchors-visible | no-overflow</code></pre> <div class="wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper">CodePen Embed Fallback</div> </div> </div> </div> </div> </details> <details> <summary> <h2>Setting fallback positions</h2> </summary> <p>Once the target element is positioned against its anchor, we can give the target additional instructions that tell it what to do if it runs out of space. We’ve already looked at the <code>position-visibility</code> property as one way of doing that — we simply tell the element to hide. The following two properties, however, give us more control to <strong>re-position</strong> the target by trying other sides of the anchor (<code>position-try-fallbacks</code>) and the order in which it attempts to re-position itself (<code>position-try-order</code>).</p> <p>The two properties can be declared together with the <code>position-try</code> shorthand property — we’ll touch on that after we look at the two constituent properties.</p> <div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-4 wp-block-columns-is-layout-flex"> <div class="wp-block-column ticss-b9b485c1 is-layout-flow wp-block-column-is-layout-flow"> <div class="wp-block-group"> <div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained"> <figure class="wp-block-image size-large"><img decoding="async" data-recalc-dims="1" loading="lazy" width="1024" height="576" src="https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/09/position-try-fallbacks.png?resize=1024%2C576&ssl=1" alt="Examples on each try-tactic: flip-block flipping the target from the top to the bottom, flip-inline from left to right and flip-start from left to top (single value) and top right to left bottom (two values)" class="wp-image-380903"></figure> <h4 class="wp-block-heading"><code>position-try-fallbacks</code></h4> <p>This property accepts a list of comma-separated <em>position fallbacks</em> that are tried whenever the target overflows out of space in its containing block. The property attempts to reposition itself using each fallback value until it finds a fit or runs out of options.</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>position-try-fallbacks: none | [ [<dashed-ident> || <try-tactic>] | <'inset-area'> ]#</code></pre> <ul class="wp-block-list"> <li> <strong><code>none</code>:</strong> Leaves the target’s position options list empty.</li> <li> <strong><code></code>:</strong> Adds to the options list a custom <code><a target="_blank" href="https://css-tricks.com/#aa-anchor-at-rule" rel="noopener">@position-try</a></code> fallback with the given name. If there isn’t a matching <code>@position-try</code>, the value is ignored.</li> <li> <strong><code></code>:</strong> Creates an option list by flipping the target’s current position on one of three axes, each defined by a distinct keyword. They can also be combined to add up their effects.</p> <ul class="wp-block-list"> <li>The <code>flip-block</code> keyword swaps the values in the block axis.</li> <li>The <code>flip-inline</code> keyword swaps the values in the inline axis.</li> <li>The <code>flip-start</code> keyword swaps the values diagonally.</li> </ul> </li> <li> <strong><code></code> || <code>:</code></strong> Combines a custom <code>@try-option</code> and a <code></code> to create a single-position fallback. The <code></code> keywords can also be combined to sum up their effects.</li> <li> <strong><code></code></strong> Uses the <code>position-area</code> syntax to move the anchor to a new position.</li> </ul> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { position-try-fallbacks: --my-custom-position, --my-custom-position flip-inline, bottom left; }</code></pre> </div> </div> </div> <div class="wp-block-column ticss-69217be6 is-layout-flow wp-block-column-is-layout-flow"> <div class="wp-block-group"> <div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained"> <figure class="wp-block-image size-large"><img decoding="async" data-recalc-dims="1" loading="lazy" width="1024" height="576" src="https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/09/position-try-order.png?resize=1024%2C576&ssl=1" alt="two targets sorrounding an anchor, positioned where the IMCB is the largest. " class="wp-image-380914"></figure> <h4 class="wp-block-heading"><code>position-try-order</code></h4> <p>This property chooses a new position from the fallback values defined in the <code>position-try-fallbacks</code> property based on which position gives the target the most space. The rest of the options are reordered with the largest available space coming first.</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>position-try-order: normal | most-width | most-height | most-block-size | most-inline-size</code></pre> <p>What exactly does “more space” mean? For each position fallback, it finds the IMCB size for the target. Then it chooses the value that gives the IMCB the widest or tallest size, depending on which option is selected:</p> <ul class="wp-block-list"> <li><code>most-width</code></li> <li><code>most-height</code></li> <li><code>most-block-size</code></li> <li><code>most-inline-size</code></li> </ul> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { position-try-fallbacks: --custom-position, flip-start; position-try-order: most-width; }</code></pre> </div> </div> <h4 class="wp-block-heading"><code>position-try</code></h4> <p>This is a shorthand property that combines the <code>position-try-fallbacks</code> and <code>position-try-order</code> properties into a single declaration. It accepts first the order and then the list of possible position fallbacks.</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>position-try: < "position-try-order" >? < "position-try-fallbacks" >;</code></pre> <p>So, we can combine both properties into a single style rule:</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { position-try: most-width --my-custom-position, flip-inline, bottom left; }</code></pre> </div> </div> </details> <details> <summary> <h2>Custom position and size fallbacks</h2> </summary> <div class="wp-block-group"> <div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained"> <div class="wp-block-group"> <div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained"> <h4 class="wp-block-heading"><code>@position-try</code></h4> <p>This at-rule defines a custom position fallback for the <code>position-try-fallbacks</code> property.</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>@position-try <dashed-ident> { <declaration-list> }</code></pre> <p>It takes various properties for changing a target element’s position and size and grouping them as a new position fallback for the element to try.</p> <p>Imagine a scenario where you’ve established an anchor-target relationship. You want to position the target element against the anchor’s top-right edge, which is easy enough using the <code>position-area</code> property we saw earlier:</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { position: absolute; position-area: top right; width: 100px; }</code></pre> <p>See how the <code>.target</code> is sized at <code>100px</code>? Maybe it runs out of room on some screens and is no longer able to be displayed at anchor’s the top-right edge. We can supply the <code>.target</code> with the fallbacks we looked at earlier so that it attempts to re-position itself on an edge with more space:</p> <pre class="wp-block-csstricks-code-block language-css" data-line="4,5"><code>.target { position: absolute; position-area: top right; position-try-fallbacks: top left; position-try-order: most-width; width: 100px; }</code></pre> <p>And since we’re being good CSSer’s who strive for clean code, we may as well combine those two properties with the <code>position-try</code> shorthand property:</p> <pre class="wp-block-csstricks-code-block language-css" data-line="4"><code>.target { position: absolute; position-area: top right; position-try: most-width, flip-inline, bottom left; width: 100px; }</code></pre> <p>So far, so good. We have an anchored target element that starts at the top-right corner of the anchor at <code>100px</code>. If it runs out of space there, it will look at the <code>position-try</code> property and decide whether to reposition the target to the anchor’s top-left corner (declared as <code>flip-inline</code>) or the anchor’s bottom-left corner — whichever offers the most width.</p> <p>But what if we want to simulataneously <strong>re-size</strong> the target element when it is re-positioned? Maybe the target is simply too dang big to display at <code>100px</code> at either fallback position and we need it to be <code>50px</code> instead. We can use the <code>@position-try</code> to do exactly that:</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>@position-try --my-custom-position { position-area: top left; width: 50px; }</code></pre> <p>With that done, we now have a custom property called <code>--my-custom-position</code> that we can use on the <code>position-try</code> shorthand property. In this case, <code>@position-try</code> can replace the <code>flip-inline</code> value since it is the equivalent of <code>top left</code>:</p> <pre class="wp-block-csstricks-code-block language-css" data-line="9"><code>@position-try --my-custom-position { position-area: top left; width: 50px; } .target { position: absolute; position-area: top right; position-try: most-width, --my-custom-position, bottom left; width: 100px; }</code></pre> <p>This way, the <code>.target</code> element’s width is re-sized from <code>100px</code> to <code>50px</code> when it attempts to re-position itself to the anchor’s top-right edge. That’s a nice bit of flexibility that gives us a better chance to make things fit together in any layout.</p> </div> </div> </div> </div> </details> <details> <summary> <h2>Anchor functions</h2> </summary> <div class="wp-block-group"> <div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained"> <div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-5 wp-block-columns-is-layout-flex"> <div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"> <div class="wp-block-group ticss-9c54673b"> <div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained"> <h4 class="wp-block-heading"><code>anchor()</code></h4> <p>You might think of the CSS <code>anchor()</code> function as a shortcut for attaching a target element to an anchor element — specify the anchor, the side we want to attach to, and how large we want the target to be in one fell swoop. But, as we’ll see, the function also opens up the possibility of attaching one target element to multiple anchor elements.</p> <p>This is the function’s formal syntax, which takes up to three arguments:</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>anchor( <anchor-element>? && <anchor-side>, <length-percentage>? )</code></pre> <p>So, we’re identifying an anchor element, saying which side we want the target to be positioned on, and how big we want it to be. It’s worth noting that <code>anchor()</code> can only be declared on inset-related properties (e.g. <code>top</code>, <code>left</code>, <code>inset-block-end</code>, etc.)</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { top: anchor(--my-anchor bottom); left: anchor(--my-anchor end, 50%); }</code></pre> <p>Let’s break down the function’s arguments.</p> <details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow"> <summary></summary> <p>This argument specifies which anchor element we want to attach the target to. We can supply it with either the anchor’s name (see <a target="_blank" href="https://css-tricks.com/#aa-attaching-targets-to-anchors" rel="noopener">“Attaching targets to anchors”</a>).</p> <p>We also have the choice of not supplying an anchor at all. In that case, the target element uses an implicit anchor element defined in <code>position-anchor</code>. If there isn’t an implicit anchor, the function resolves to its fallback. Otherwise, it is invalid and ignored.</p> </details> <details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow"> <summary></summary> <p>This argument sets which side of the anchor we want to position the target element to, e.g. the anchor’s <code>top</code>, <code>left</code>, <code>bottom</code>, <code>right</code>, etc.</p> <p>But we have more options than that, including logical side keywords (<code>inside</code>, <code>outside</code>), logical direction arguments relative to the user’s writing mode (<code>start</code>, <code>end</code>, <code>self-start</code>, <code>self-end</code>) and, of course, <code>center</code>.</p> <ul class="wp-block-list"> <li> <code></code>: Resolves to the <code></code> of the corresponding side of the anchor element. It has physical arguments (<code>top</code>, <code>left</code>, <code>bottom</code> <code>right</code>), logical side arguments (<code>inside</code>, <code>outside</code>), logical direction arguments relative to the user’s writing mode (<code>start</code>, <code>end</code>, <code>self-start</code>, <code>self-end</code>) and the <code>center</code> argument.</li> <li> <code></code>: Refers to the position between the <code>start</code> (<code>0%</code>) and <code>end</code> (<code>100%</code>). Values below <code>0%</code> and above <code>100%</code> are allowed.</li> </ul> </details> <details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow"> <summary></summary> <p>This argument is totally optional, so you can leave it out if you’d like. Otherwise, use it as a way of re-sizing the target elemenrt whenever it doesn’t have a valid anchor or position. It positions the target to a fixed <code></code> or <code></code> relative to its containing block.</p> </details> <p>Let’s look at examples using different types of arguments because they all do something a <em>little</em> different.</p> <details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow"> <summary>Using physical arguments</summary> <figure class="wp-block-image size-large is-resized"><img decoding="async" data-recalc-dims="1" loading="lazy" width="1024" height="576" src="https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/09/anchor-function-1.png?resize=1024%2C576&ssl=1" alt="targets sorrounding the anchor. each with a different position" class="wp-image-380924"></figure> <p><strong>Physical arguments</strong> (<code>top</code>, <code>right</code>, <code>bottom</code>, <code>left</code>) can be used to position the target regardless of the user’s writing mode. For example, we can position the <code>right</code> and <code>bottom</code> inset properties of the target at the <code>anchor(top)</code> and <code>anchor(left)</code> sides of the anchor, effectively positioning the target at the anchor’s top-left corner:</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { bottom: anchor(top); right: anchor(left); }</code></pre> </p> </details> <details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow"> <summary>Using logical side keywords</summary> <figure class="wp-block-image size-large is-resized"><img decoding="async" data-recalc-dims="1" loading="lazy" width="1024" height="576" src="https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/09/anchor-function-2.png?resize=1024%2C576&ssl=1" alt="targets sorrounding the anchor. each with a different position" class="wp-image-380926"></figure> <p><strong>Logical side arguments</strong> (i.e., <code>inside</code>, <code>outside</code>), are dependent on the inset property they are in. The <code>inside</code> argument will choose the same side as its inset property, while the <code>outside</code> argument will choose the opposite. For example:</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { left: anchor(outside); /* is the same as */ left: anchor(right); top: anchor(inside); /* is the same as */ top: anchor(top); }</code></pre> </p> </details> <details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow"> <summary>Using logical directions</summary> </p> <figure class="wp-block-image size-large is-resized"><img decoding="async" data-recalc-dims="1" loading="lazy" width="1024" height="576" src="https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/09/anchor-function-3.png?resize=1024%2C576&ssl=1" alt="targets sorrounding the anchor. each with a different position" class="wp-image-380927"></figure> <p><strong>Logical direction arguments </strong>are dependent on two factors:</p> <ol class="wp-block-list"> <li>The user’s writing mode: they can follow the writing mode of the containing block (<code>start</code>, <code>end</code>) or the target’s own writing mode (<code>self-start</code>, <code>self-end</code>).</li> <li>The inset property they are used in: they will choose the same axis of their inset property.</li> </ol> <p>So for example, using physical inset properties in a left-to-right horizontal writing would look like this:</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { left: anchor(start); /* is the same as */ left: anchor(left); top: anchor(end); /* is the same as */ top: anchor(bottom); }</code></pre> <p>In a right-to-left writing mode, we’d do this:</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { left: anchor(start); /* is the same as */ left: anchor(right); top: anchor(end); /* is the same as */ top: anchor(bottom); }</code></pre> <p>That can quickly get confusing, so we should also use logical arguments with <a target="_blank" href="https://css-tricks.com/css-logical-properties-and-values/" rel="noopener">logical inset properties</a> so the writing mode is respected in the first place:</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { inset-inline-start: anchor(end); inset-block-start: anchor(end); }</code></pre> </p> </details> <details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow"> <summary>Using percentage values</summary> <figure class="wp-block-image size-large is-resized"><img decoding="async" data-recalc-dims="1" loading="lazy" width="1024" height="576" src="https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/09/anchor-function-4-1.png?resize=1024%2C576&ssl=1" alt="targets sorrounding the anchor. each with a different position" class="wp-image-380929"></figure> <p><strong>Percentages </strong>can be used to position the target from any point between the <code>start</code> (<code>0%</code>) and <code>end</code> (<code>100%</code> ) sides. Since percentages are relative to the user writing mode, is preferable to use them with logical inset properties.</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { inset-inline-start: anchor(100%); /* is the same as */ inset-inline-start: anchor(end); inset-block-end: anchor(0%); /* is the same as */ inset-block-end: anchor(start); }</code></pre> <p>Values smaller than <code>0%</code> and bigger than <code>100%</code> are accepted, so <code>-100%</code> will move the target towards the start and <code>200%</code> towards the end.</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { inset-inline-start: anchor(200%); inset-block-end: anchor(-100%); }</code></pre> </p> </details> <details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow"> <summary>Using the center keyword</summary> <figure class="wp-block-image size-large is-resized"><img decoding="async" data-recalc-dims="1" loading="lazy" width="1024" height="576" src="https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/09/anchor-function-5.png?resize=1024%2C576&ssl=1" alt="targets sorrounding the anchor. each with a different position" class="wp-image-380934"></figure> <p><strong>The <code>center</code> argument</strong> is equivalent to <code>50%</code>. You could say that it’s “immune” to direction, so there is no problem if we use it with physical or logical inset properties.</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { position: absolute; position-anchor: --my-anchor; left: anchor(center); bottom: anchor(top); }</code></pre> </p> </details> </div> </div> </div> <div class="wp-block-column ticss-f036ecb3 is-layout-flow wp-block-column-is-layout-flow"> <h4 class="wp-block-heading"><code>anchor-size()</code></h4> <p>The <code>anchor-size()</code> function is unique in that it sizes the target element relative to the size of the anchor element. This can be super useful for ensuring a target scales in size with its anchor, particularly in responsive designs where elements tend to get shifted, re-sized, or obscured from overflowing a container.</p> <div class="wp-block-group"> <div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained"> <p>The function takes an anchor’s side and resolves to its <code></code>, essentially returning the anchor’s <code>width</code>, <code>height</code>, <code>inline-size</code> or <code>block-size</code>.</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>anchor-size( [ <anchor-element> || <anchor-size> ]? , <length-percentage>? )</code></pre> <figure class="wp-block-image size-large is-resized"><img decoding="async" data-recalc-dims="1" loading="lazy" width="1024" height="576" src="https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/09/anchor-size-function.png?resize=1024%2C576&ssl=1" alt="anchor with an anchor-size() function on each side" class="wp-image-380930"></figure> <p>Here are the arguments that can be used in the <code>anchor-size()</code> function:</p> <ul class="wp-block-list"> <li> <strong><code></code>:</strong> Refers to the side of the anchor element.</li> <li> <strong><code></code>:</strong> This optional argument can be used as a fallback whenever the target doesn’t have a valid anchor or size. It returns a fixed <code></code> or <code></code> relative to its containing block.</li> </ul> <p>And we can declare the function on the target element’s <code>width</code> and <code>height</code> properties to size it with the anchor — or both at the same time!</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { width: anchor-size(width, 20%); /* uses default anchor */` height: anchor-size(--other-anchor inline-size, 100px); }</code></pre> </div> </div> </div> </div> </div> </div> </details> <details> <summary> <h2>Multiple anchors</h2> </summary> <p>We learned about the <code>anchor()</code> function in the last section. One of the function’s quirks is that we can only declare it on inset-based properties, and all of the examples we saw show that. That might sound like a constraint of working with the function, but it’s actually what gives <code>anchor()</code> a superpower that anchor positioning properties don’t: <strong>we can declare it on more than one inset-based property at a time.</strong> As a result, we can <a target="_blank" href="https://css-tricks.com/multiple-anchors/" rel="noopener">set the function multiple anchors on the same target element</a>!</p> <p>Here’s one of the first examples of the <code>anchor()</code> function we looked at in the last section:</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { top: anchor(--my-anchor bottom); left: anchor(--my-anchor end, 50%); }</code></pre> <p>We’re declaring the same anchor element named <code>--my-anchor</code> on both the <code>top</code> and <code>left</code> inset properties. That doesn’t have to be the case. Instead, we can attach the target element to multiple anchor elements.</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.anchor-1 { anchor-name: --anchor-1; } .anchor-2 { anchor-name: --anchor-2; } .anchor-3 { anchor-name: --anchor-3; } .anchor-4 { anchor-name: --anchor-4; } .target { position: absolute; inset-block-start: anchor(--anchor-1); inset-inline-end: anchor(--anchor-2); inset-block-end: anchor(--anchor-3); inset-inline-start: anchor(--anchor-4); }</code></pre> <p>Or, perhaps more succintly:</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.anchor-1 { anchor-name: --anchor-1; } .anchor-2 { anchor-name: --anchor-2; } .anchor-3 { anchor-name: --anchor-3; } .anchor-4 { anchor-name: --anchor-4; } .target { position: absolute; inset: anchor(--anchor-1) anchor(--anchor-2) anchor(--anchor-3) anchor(--anchor-4); }</code></pre> <p>The following demo shows a target element attached to two <code><textarea></code> elements that are registered anchors. A <code><textarea></code> allows you to click and drag it to change its dimensions. The two of them are absolutely positioned in opposite corners of the page. If we attach the target to each anchor, we can create an effect where resizing the anchors stretches the target all over the place almost like a tug-o-war between the two anchors.</p> <div class="wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper">CodePen Embed Fallback</div> <p>The demo is only supported in Chrome at the time we’re writing this guide, so let’s drop in a video so you can see how it works.</p> <figure class="wp-block-video"><video controls src="https://css-tricks.com/wp-content/uploads/2024/09/multiple-anchors-gumby.mov" playsinline preload="none"></video></figure> </details> <details> <summary> <h2>Accessibility</h2> </summary> <p>The most straightforward use case for anchor positioning is for making tooltips, info boxes, and popovers, but it can also be used for decorative stuff. That means anchor positioning doesn’t have to establish a semantic relationship between the anchor and target elements. You can probably spot the issue right away: <strong>non-visual devices, like screen readers, are left in the dark about how to interpret two seemingly unrelated elements.</strong></p> <p>As an example, let’s say we have an element called <code>.tooltip</code> that we’ve set up as a target element anchored to another element called <code>.anchor</code>. </p> <pre class="wp-block-csstricks-code-block language-markup" data-line=""><code><div class="anchor">anchor</div> <div class="toolip">toolip</div></code></pre> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.anchor { anchor-name: --my-anchor; } .toolip { position: absolute; position-anchor: --my-anchor; position-area: top; }</code></pre> <p>We need to set up a connection between the two elements in the DOM so that they share a context that assistive technologies can interpret and understand. The general rule of thumb for using <a target="_blank" href="https://css-tricks.com/why-how-and-when-to-use-semantic-html-and-aria/" rel="noopener">ARIA attributes</a> to describe elements is generally: <strong>don’t do it.</strong> Or at least avoid doing it unless you have no other semantic way of doing it.</p> <p>This is one of those cases where it makes sense to reach for ARIA atributes. Before we do anything else, a screen reader currently sees the two elements next to one another without any remarking relationship. That’s a bummer for accessibility, but we can easily fix it using the corresponding ARIA attribute:</p> <pre class="wp-block-csstricks-code-block language-markup" data-line=""><code><div class="anchor" aria-describedby="tooltipInfo">anchor</div> <div class="toolip" role="tooltip" id="tooltipInfo">toolip</div></code></pre> <p>And now they are both visually and semantically linked together! If you’re new to ARIA attributes, you ought to check out Adam Silver’s <a target="_blank" href="https://css-tricks.com/why-how-and-when-to-use-semantic-html-and-aria/" rel="noopener">“Why, How, and When to Use Semantic HTML and ARIA”</a> for a great introduction.</p> </details> <details> <summary> <h2>Browser support</h2> </summary> <div class="caniuse"> <div class="caniuse-header"> <p>This browser support data is from <a target="_blank" href="http://caniuse.com/#feat=css-anchor-positioning" rel="noopener">Caniuse</a>, which has more detail. A number indicates that browser supports the feature at that version and up.</p> </div> <div class="caniuse-section"> <h4>Desktop</h4> <table class="browser-support-table"> <thead> <tr> <th class="chrome"><span>Chrome</span></th> <th class="firefox"><span>Firefox</span></th> <th class="ie"><span>IE</span></th> <th class="edge"><span>Edge</span></th> <th class="safari"><span>Safari</span></th> </tr> </thead> <tbody> <tr> <td class="y yep" title="Chrome - "><span class="caniuse-agents-version version">125</span></td> <td class="n nope" title="Firefox - "><span class="caniuse-agents-version version">No</span></td> <td class="n nope" title="IE - "><span class="caniuse-agents-version version">No</span></td> <td class="y yep" title="Edge - "><span class="caniuse-agents-version version">125</span></td> <td class="n nope" title="Safari - "><span class="caniuse-agents-version version">No</span></td> </tr> </tbody> </table> </div> <div class="caniuse-section"> <h4>Mobile / Tablet</h4> <table class="browser-support-table"> <thead> <tr> <th class="and_chr"><span>Android Chrome</span></th> <th class="and_ff"><span>Android Firefox</span></th> <th class="android"><span>Android</span></th> <th class="ios_saf"><span>iOS Safari</span></th> </tr> </thead> <tbody> <tr> <td class="y yep" title="Android Chrome - "><span class="caniuse-agents-version version">129</span></td> <td class="n nope" title="Android Firefox - "><span class="caniuse-agents-version version">No</span></td> <td class="y yep" title="Android - "><span class="caniuse-agents-version version">129</span></td> <td class="n nope" title="iOS Safari - "><span class="caniuse-agents-version version">No</span></td> </tr> </tbody> </table> </div> </div> </details> <details> <summary> <h2>Spec changes</h2> </summary> <p>CSS Anchor Positioning has undergone several changes since it was introduced as an Editor’s Draft. The Chrome browser team was quick to hop on board and implement anchor positioning even though the feature was still being defined. That’s caused confusion because Chromium-based browsers implemented some pieces of anchor positioning while the specification was being actively edited.</p> <p>We are going to outline specific cases for you where browsers had to update their implementations in response to spec changes. It’s a bit confusing, but as of Chrome 129+, this is the stuff that was shipped but changed:</p> <h4 class="wp-block-heading"><code>position-area</code></h4> <p>The <code>inset-area</code> property was renamed to <code>position-area</code> (<a target="_blank" href="https://github.com/w3c/csswg-drafts/issues/10209" rel="noopener">#10209</a>), but it will be supported until Chrome 131.</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { /* from */ inset-area: top right; /* to */ position-area: top right; }</code></pre> <h4 class="wp-block-heading"><code>position-try-fallbacks</code></h4> <p>The <code>position-try-options</code> was renamed to <code>position-try-fallbacks</code> (<a target="_blank" href="https://github.com/w3c/csswg-drafts/issues/10395" rel="noopener">#10395</a>).</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { /* from */ position-try-options: flip-block, --smaller-target; /* to */ position-try-fallbacks: flip-block, --smaller-target; }</code></pre> <h4 class="wp-block-heading"><code>inset-area()</code></h4> <p>The <code>inset-area()</code> wrapper function doesn’t exist anymore for the <code>position-try-fallbacks</code> (<a target="_blank" href="https://github.com/w3c/csswg-drafts/issues/10320" rel="noopener">#10320</a>), you can just write the values without the wrapper:</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { /* from */ position-try-options: inset-area(top left); /* to */ position-try-fallbacks: top left; }</code></pre> <h4 class="wp-block-heading"><code>anchor(center)</code></h4> <p>In the beginning, if we wanted to center a target from the center, we would have to write this convoluted syntax:</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { --center: anchor(--x 50%); --half-distance: min(abs(0% - var(--center)), abs(100% - var(--center))); left: calc(var(--center) - var(--half-distance)); right: calc(var(--center) - var(--half-distance)); }</code></pre> <p>The CWSSG working group <a target="_blank" href="https://github.com/w3c/csswg-drafts/issues/8979" rel="noopener">resolved (#8979)</a> to add the <code>anchor(center)</code> argument to prevent us from having to do all that mental juggling:</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.target { left: anchor(center); }</code></pre> </details> <details> <summary> <h2>Known bugs</h2> </summary> <p>Yes, there are some bugs with CSS Anchor Positioning, at least at the time this guide is being written. For example, the specification says that if an element doesn’t have a default anchor element, then the <code>position-area</code> does nothing. This is a known issue (<a target="_blank" href="https://github.com/w3c/csswg-drafts/issues/10500" rel="noopener">#10500</a>), but it’s still possible to replicate.</p> <p>So, the following code…</p> <pre class="wp-block-csstricks-code-block language-css" data-line=""><code>.container { position: relative; } .element { position: absolute; position-area: center; margin: auto; }</code></pre> <p>…will center the <code>.element</code> inside its container, at least in Chrome:</p> <div class="wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper">CodePen Embed Fallback</div> <p>Credit to <a target="_blank" href="https://github.com/Afif13" rel="noopener">Afif13</a> for that great demo!</p> <p>Another example involves the <code>position-visibility</code> property. If your anchor element is out of sight or off-screen, you typically want the target element to be hidden as well. The specification says that property’s the default value is <code>anchors-visible</code>, but browsers default to <code>always</code> instead.</p> <blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"> <p>The current implemenation in Chrome isn’t reflecting the spec; it indeed is using <code>always</code> as the initial value. But the spec is intentional: <strong>if your anchor is off-screen or otherwise scrolled off, you usually want it to hide.</strong> (<a target="_blank" href="https://github.com/w3c/csswg-drafts/issues/10425#issuecomment-2160956423" rel="noopener">#10425</a>)</p> </blockquote> </details> <details> <summary> <h2>Almanac references</h2> </summary> <h3 class="wp-block-heading">Anchor position properties</h3> <div class="in-article-cards"> <article class="in-article-card "><strong></p> <p> Almanac<br /> </strong></p> <p> on</p> <p> Sep 17, 2024 </p> <h3> <a target="_blank" href="https://css-tricks.com/almanac/properties/a/anchor-name/" rel="noopener"><br /> anchor-name </a><br /> </h3> <p> <a target="_blank" href="https://css-tricks.com/almanac/properties/a/anchor-name/" class="almanac-example" rel="noopener"><br /> <code class="language-css">.anchor { anchor-name: --my-anchor; }</code><br /> </a></p> <div class="tags"> <a target="_blank" href="https://css-tricks.com/tag/anchor-positioning/" rel="tag noopener">anchor positioning</a> </div> <div class="author-row"> <a target="_blank" href="https://css-tricks.com/author/geoffgraham/" aria-label="Author page of Geoff Graham" rel="noopener"><br /> <img decoding="async" loading="lazy" alt="" src="https://secure.gravatar.com/avatar/ac0d6274a6cea04669e66a20ec0ea204?s=80&d=retro&r=pg" class="avatar avatar-80 photo" height="80" width="80"></a></p> <p> <a target="_blank" class="author-name" href="https://css-tricks.com/author/geoffgraham/" rel="noopener"><br /> Geoff Graham </a> </div> </article> <article class="in-article-card "><strong></p> <p> Almanac<br /> </strong></p> <p> on</p> <p> Sep 12, 2024 </p> <h3> <a target="_blank" href="https://css-tricks.com/almanac/properties/p/position-anchor/" rel="noopener"><br /> position-anchor </a><br /> </h3> <p> <a target="_blank" href="https://css-tricks.com/almanac/properties/p/position-anchor/" class="almanac-example" rel="noopener"><br /> <code class="language-css">.target { position-anchor: --my-anchor; }</code><br /> </a></p> <div class="tags"> <a target="_blank" href="https://css-tricks.com/tag/anchor-positioning/" rel="tag noopener">anchor positioning</a> </div> <div class="author-row"> <a target="_blank" href="https://css-tricks.com/author/monknow/" aria-label="Author page of Juan Diego Rodríguez" rel="noopener"><br /> <img decoding="async" data-recalc-dims="1" loading="lazy" alt="" class="avatar avatar-80 photo avatar-default" height="80" src="https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/07/juan-diego-rodriguez.png?resize=80%2C80&ssl=1" width="80"></a></p> <p> <a target="_blank" class="author-name" href="https://css-tricks.com/author/monknow/" rel="noopener"><br /> Juan Diego Rodríguez </a> </div> </article> <article class="in-article-card "><strong></p> <p> Almanac<br /> </strong></p> <p> on</p> <p> Sep 8, 2024 </p> <h3> <a target="_blank" href="https://css-tricks.com/almanac/properties/p/position-area/" rel="noopener"><br /> position-area </a><br /> </h3> <p> <a target="_blank" href="https://css-tricks.com/almanac/properties/p/position-area/" class="almanac-example" rel="noopener"><br /> <code class="language-css">.target { position-area: bottom end; }</code><br /> </a></p> <div class="tags"> <a target="_blank" href="https://css-tricks.com/tag/anchor-positioning/" rel="tag noopener">anchor positioning</a> </div> <div class="author-row"> <a target="_blank" href="https://css-tricks.com/author/monknow/" aria-label="Author page of Juan Diego Rodríguez" rel="noopener"><br /> <img decoding="async" data-recalc-dims="1" loading="lazy" alt="" class="avatar avatar-80 photo avatar-default" height="80" src="https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/07/juan-diego-rodriguez.png?resize=80%2C80&ssl=1" width="80"></a></p> <p> <a target="_blank" class="author-name" href="https://css-tricks.com/author/monknow/" rel="noopener"><br /> Juan Diego Rodríguez </a> </div> </article> <article class="in-article-card "><strong></p> <p> Almanac<br /> </strong></p> <p> on</p> <p> Sep 14, 2024 </p> <h3> <a target="_blank" href="https://css-tricks.com/almanac/properties/p/position-try-fallbacks/" rel="noopener"><br /> position-try-fallbacks </a><br /> </h3> <p> <a target="_blank" href="https://css-tricks.com/almanac/properties/p/position-try-fallbacks/" class="almanac-example" rel="noopener"><br /> <code class="language-css">.target { position-try-fallbacks: flip-inline, bottom left; }</code><br /> </a></p> <div class="tags"> <a target="_blank" href="https://css-tricks.com/tag/anchor-positioning/" rel="tag noopener">anchor positioning</a> </div> <div class="author-row"> <a target="_blank" href="https://css-tricks.com/author/monknow/" aria-label="Author page of Juan Diego Rodríguez" rel="noopener"><br /> <img decoding="async" data-recalc-dims="1" loading="lazy" alt="" class="avatar avatar-80 photo avatar-default" height="80" src="https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/07/juan-diego-rodriguez.png?resize=80%2C80&ssl=1" width="80"></a></p> <p> <a target="_blank" class="author-name" href="https://css-tricks.com/author/monknow/" rel="noopener"><br /> Juan Diego Rodríguez </a> </div> </article> <article class="in-article-card "><strong></p> <p> Almanac<br /> </strong></p> <p> on</p> <p> Sep 8, 2024 </p> <h3> <a target="_blank" href="https://css-tricks.com/almanac/properties/p/position-try-order/" rel="noopener"><br /> position-try-order </a><br /> </h3> <p> <a target="_blank" href="https://css-tricks.com/almanac/properties/p/position-try-order/" class="almanac-example" rel="noopener"><br /> <code class="language-css">.element { position-try-order: most-width; }</code><br /> </a></p> <div class="tags"> <a target="_blank" href="https://css-tricks.com/tag/anchor-positioning/" rel="tag noopener">anchor positioning</a> </div> <div class="author-row"> <a target="_blank" href="https://css-tricks.com/author/monknow/" aria-label="Author page of Juan Diego Rodríguez" rel="noopener"><br /> <img decoding="async" data-recalc-dims="1" loading="lazy" alt="" class="avatar avatar-80 photo avatar-default" height="80" src="https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/07/juan-diego-rodriguez.png?resize=80%2C80&ssl=1" width="80"></a></p> <p> <a target="_blank" class="author-name" href="https://css-tricks.com/author/monknow/" rel="noopener"><br /> Juan Diego Rodríguez </a> </div> </article> <article class="in-article-card "><strong></p> <p> Almanac<br /> </strong></p> <p> on</p> <p> Sep 8, 2024 </p> <h3> <a target="_blank" href="https://css-tricks.com/almanac/properties/p/position-visibility/" rel="noopener"><br /> position-visibility </a><br /> </h3> <p> <a target="_blank" href="https://css-tricks.com/almanac/properties/p/position-visibility/" class="almanac-example" rel="noopener"><br /> <code class="language-css">.target { position-visibility: no-overflow; }</code><br /> </a></p> <div class="tags"> <a target="_blank" href="https://css-tricks.com/tag/anchor-positioning/" rel="tag noopener">anchor positioning</a> </div> <div class="author-row"> <a target="_blank" href="https://css-tricks.com/author/monknow/" aria-label="Author page of Juan Diego Rodríguez" rel="noopener"><br /> <img decoding="async" data-recalc-dims="1" loading="lazy" alt="" class="avatar avatar-80 photo avatar-default" height="80" src="https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/07/juan-diego-rodriguez.png?resize=80%2C80&ssl=1" width="80"></a></p> <p> <a target="_blank" class="author-name" href="https://css-tricks.com/author/monknow/" rel="noopener"><br /> Juan Diego Rodríguez </a> </div> </article> </div> <h3 class="wp-block-heading">Anchor position functions</h3> <div class="in-article-cards"> <article class="in-article-card "><strong></p> <p> Almanac<br /> </strong></p> <p> on</p> <p> Sep 14, 2024 </p> <h3> <a target="_blank" href="https://css-tricks.com/almanac/functions/a/anchor/" rel="noopener"><br /> anchor() </a><br /> </h3> <p> <a target="_blank" href="https://css-tricks.com/almanac/functions/a/anchor/" class="almanac-example" rel="noopener"><br /> <code class="language-css">.target { top: anchor(--my-anchor bottom); }</code><br /> </a></p> <div class="tags"> <a target="_blank" href="https://css-tricks.com/tag/anchor-positioning/" rel="tag noopener">anchor positioning</a> </div> <div class="author-row"> <a target="_blank" href="https://css-tricks.com/author/monknow/" aria-label="Author page of Juan Diego Rodríguez" rel="noopener"><br /> <img decoding="async" data-recalc-dims="1" loading="lazy" alt="" class="avatar avatar-80 photo avatar-default" height="80" src="https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/07/juan-diego-rodriguez.png?resize=80%2C80&ssl=1" width="80"></a></p> <p> <a target="_blank" class="author-name" href="https://css-tricks.com/author/monknow/" rel="noopener"><br /> Juan Diego Rodríguez </a> </div> </article> <article class="in-article-card "><strong></p> <p> Almanac<br /> </strong></p> <p> on</p> <p> Sep 18, 2024 </p> <h3> <a target="_blank" href="https://css-tricks.com/almanac/functions/a/anchor-size/" rel="noopener"><br /> anchor-size() </a><br /> </h3> <p> <a target="_blank" href="https://css-tricks.com/almanac/functions/a/anchor-size/" class="almanac-example" rel="noopener"><br /> <code class="language-css">.target { width: anchor-size(width); }</code><br /> </a></p> <div class="tags"> <a target="_blank" href="https://css-tricks.com/tag/anchor-positioning/" rel="tag noopener">anchor positioning</a> </div> <div class="author-row"> <a target="_blank" href="https://css-tricks.com/author/monknow/" aria-label="Author page of Juan Diego Rodríguez" rel="noopener"><br /> <img decoding="async" data-recalc-dims="1" loading="lazy" alt="" class="avatar avatar-80 photo avatar-default" height="80" src="https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/07/juan-diego-rodriguez.png?resize=80%2C80&ssl=1" width="80"></a></p> <p> <a target="_blank" class="author-name" href="https://css-tricks.com/author/monknow/" rel="noopener"><br /> Juan Diego Rodríguez </a> </div> </article> </div> <h3 class="wp-block-heading">Anchor position at-rules</h3> <div class="in-article-cards"> <article class="in-article-card "><strong></p> <p> Almanac<br /> </strong></p> <p> on</p> <p> Sep 28, 2024 </p> <h3> <a target="_blank" href="https://css-tricks.com/almanac/rules/p/position-try/" rel="noopener"><br /> @position-try </a><br /> </h3> <p> <a target="_blank" href="https://css-tricks.com/almanac/rules/p/position-try/" class="almanac-example" rel="noopener"><br /> <code class="language-css">@position-try --my-position { position-area: top left; }</code><br /> </a></p> <div class="tags"> <a target="_blank" href="https://css-tricks.com/tag/anchor-positioning/" rel="tag noopener">anchor positioning</a> </div> <div class="author-row"> <a target="_blank" href="https://css-tricks.com/author/monknow/" aria-label="Author page of Juan Diego Rodríguez" rel="noopener"><br /> <img decoding="async" data-recalc-dims="1" loading="lazy" alt="" class="avatar avatar-80 photo avatar-default" height="80" src="https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/07/juan-diego-rodriguez.png?resize=80%2C80&ssl=1" width="80"></a></p> <p> <a target="_blank" class="author-name" href="https://css-tricks.com/author/monknow/" rel="noopener"><br /> Juan Diego Rodríguez </a> </div> </article> </div> </details> <details> <summary> <h2>Further reading</h2> </summary> <ul class="wp-block-list"> <li> <a target="_blank" href="https://www.w3.org/TR/css-anchor-position-1/#position-anchor" rel="noopener">“CSS Anchor Positioning”</a> (CSSWG)</li> <li> <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_anchor_positioning/Using" rel="noopener">“Using CSS anchor positioning”</a> (MDN)</li> <li> <a target="_blank" href="https://developer.chrome.com/blog/anchor-positioning-api" rel="noopener">“Introducing the CSS anchor positioning API”</a> (Una Kravets)</li> </ul> </details> <hr> <p><small><a target="_blank" rel="nofollow noopener" href="https://css-tricks.com/css-anchor-positioning-guide/">CSS Anchor Positioning Guide</a> originally published on <a target="_blank" rel="nofollow noopener" href="https://css-tricks.com/">CSS-Tricks</a>, which is part of the <a target="_blank" href="https://try.digitalocean.com/css-tricks/?utm_medium=rss&utm_source=css-tricks.com&utm_campaign=family_&utm_content=" rel="noopener">DigitalOcean</a> family. You should <a target="_blank" href="https://css-tricks.com/newsletters/" rel="noopener">get the newsletter</a>.</small></p> <div class="fixed"></div> </div> <div class="under"> <span class="categories">Categories: </span><span><a href="http://www.webmastersgallery.com/category/design/" rel="category tag">Designing</a>, <a href="http://www.webmastersgallery.com/category/uncategorized/" rel="category tag">Others</a></span> <span class="tags">Tags: </span><span></span> </div> </div> <div class="post" id="post-7155600"> <h2><a class="title" href="http://www.webmastersgallery.com/2024/10/02/interview-with-bjorn-ottosson-creator-of-the-oklab-color-space/" rel="bookmark">Interview With Björn Ottosson, Creator Of The Oklab Color Space</a></h2> <div class="info"> <span class="date">October 2nd, 2024</span> <span class="author"></span> <span class="comments"><a href="http://www.webmastersgallery.com/2024/10/02/interview-with-bjorn-ottosson-creator-of-the-oklab-color-space/#respond">No comments</a></span> <div class="fixed"></div> </div> <div class="content"> <div class="ftpimagefix" style="float:left"><a target="_blank" href="0" rel="noopener"><img decoding="async" src="https://files.smashing.media/authors/bjorn-ottosson.jpg"></a></div> <p>Oklab is a new perceptual color space supported in all major browsers created by the Swedish engineer Björn Ottosson. In this interview, Philip Jägenstedt explores how and why Björn created Oklab and how it spread across the ecosystem.</p> <p><strong>Note</strong>: <em>The original interview was conducted in Swedish and is <a target="_blank" href="https://www.youtube.com/watch?v=1LuF9eOXeBY" rel="noopener">available to watch</a>.</em></p> <p>About Björn</p> <p>Philip Jägenstedt: Tell me a little about yourself, Björn.</p> </p> <p>Björn Ottosson: I worked for many years in the game industry on game engines and games like FIFA, Battlefield, and Need for Speed. I’ve always been interested in technology and its interaction with the arts. I’m an engineer, but I’ve always held both of these interests.</p> <p>On Working With Color</p> <p>Philip: For someone who hasn’t dug into colors much, what’s so hard about working with them?</p> <p>Björn: Intuitively, colors can seem quite simple. A color can be lighter or darker, it can be more blue or more green, and so on. Everyone with typical color vision has a fairly similar experience of color, and this can be modeled.</p> <p>However, the way we manipulate colors in software usually doesn’t align with human perception of colors. The most common color space is sRGB. There’s also HSL, which is common for choosing colors, but it’s also based on sRGB.</p> <p>One problem with sRGB is that in a gradient between blue and white, it becomes a bit purple in the middle of the transition. That’s because sRGB really isn’t created to mimic how the eye sees colors; rather, it is based on how <a target="_blank" href="https://en.wikipedia.org/wiki/Cathode-ray_tube" rel="noopener">CRT monitors</a> work. That means it works with certain frequencies of red, green, and blue, and also the <a target="_blank" href="https://blog.johnnovak.net/2016/09/21/what-every-coder-should-know-about-gamma/" rel="noopener">non-linear coding called gamma</a>. It’s a miracle it works as well as it does, but it’s not connected to color perception. When using those tools, you sometimes get surprising results, like purple in the gradient.</p> <p><img decoding="async" src="https://files.smashing.media/articles/interview-bjorn-ottosson-creator-oklab-color-space/1-purple-in-gradient.png"></p> <p>On Color Perception</p> <p>Philip: How do humans perceive color?</p> <p>Björn: When light enters the eye and hits the retina, it’s processed in many layers of neurons and creates a mental impression. It’s unlikely that the process would be simple and linear, and it’s not. But incredibly enough, most people still perceive colors similarly.</p> <p>People have been trying to understand colors and have created color wheels and similar visualizations for hundreds of years. During the 20th century, a lot of research and modeling went into color vision. For example, the <a target="_blank" href="https://en.wikipedia.org/wiki/CIE_1931_color_space" rel="noopener">CIE XYZ</a> model is based on how sensitive our photoreceptor cells are to different frequencies of light. CIE XYZ is still a foundational color space on which all other color spaces are based.</p> <p>There were also attempts to create simple models matching human perception based on XYZ, but as it turned out, it’s not possible to model all color vision that way. Perception of color is incredibly complex and depends, among other things, on whether it is dark or light in the room and the background color it is against. When you look at a photograph, it also depends on what you think the color of the light source is. <a target="_blank" href="https://en.wikipedia.org/wiki/The_dress" rel="noopener">The dress</a> is a typical example of color vision being very context-dependent. It is almost impossible to model this perfectly.</p> <p>Models that try to take all of this complexity into account are called <strong>color appearance models</strong>. Although they have many applications, they’re not that useful if you don’t know if the viewer is in a light or bright room or other viewing conditions.</p> <p>The odd thing is that there’s a gap between the tools we typically use — such as sRGB and HSL — and the findings of this much older research. To an extent, this makes sense because when HSL was developed in the 1970s, we didn’t have much computing power, so it’s a fairly simple translation of RGB. However, not much has changed since then.</p> <p>We have a lot more processing power now, but we’ve settled for fairly simple tools for handling colors in software.</p> <p>Display technology has also improved. Many displays now have different RGB primaries, i.e., a redder red, greener green, or bluer blue. sRGB cannot reach all colors available on these displays. The new P3 color space can, but it’s very similar to sRGB, just a little wider.</p> <p>On Creating Oklab</p> <p>Philip: What, then, is Oklab, and how did you create it?</p> <p>Björn: When working in the game industry, sometimes I wanted to do simple color manipulations like making a color darker or changing the hue. I researched existing color spaces and how good they are at these simple tasks and concluded that all of them are problematic in some way.</p> <p>Many people know about <a target="_blank" href="https://en.wikipedia.org/wiki/CIELAB_color_space" rel="noopener">CIE Lab</a>. It’s quite close to human perception of color, but the handling of hue is not great. For example, a gradient between blue and white turns out purple in CIE Lab, similar to in sRGB. Some color spaces handle hue well but have other issues to consider.</p> <p>When I left my job in gaming to pursue education and consulting, I had a bit of time to tackle this problem. Oklab is my attempt to find a better balance, something Lab-like but “okay”.</p> <p>I based Oklab on two other color spaces, <a target="_blank" href="https://onlinelibrary.wiley.com/doi/abs/10.1002/col.22131" rel="noopener">CIECAM16</a> and <a target="_blank" href="https://library.imaging.org/admin/apis/public/api/ist/website/downloadArticle/cic/6/1/art00003" rel="noopener">IPT</a>. I used the lightness and saturation prediction from CIECAM16, which is a color appearance model, as a target. I actually wanted to use the datasets used to create CIECAM16, but I couldn’t find them.</p> <p>IPT was designed to have better hue uniformity. In experiments, they asked people to match light and dark colors, saturated and unsaturated colors, which resulted in a dataset for which colors, subjectively, have the same hue. IPT has a few other issues but is the basis for hue in Oklab.</p> <p>Using these three datasets, I set out to create a simple color space that would be “okay”. I used an approach quite similar to IPT but combined it with the lightness and saturation estimates from CIECAM16. The resulting Oklab still has good hue uniformity but also handles lightness and saturation well.</p> <p>Philip: How about the name Oklab? Why is it just okay?</p> <p>Björn: This is a bit tongue-in-cheek and some amount of humility.</p> <p>For the tasks I had in mind, existing color spaces weren’t okay, and my goal was to make one that is. At the same time, it is possible to delve deeper. If a university had worked on this, they could have run studies with many participants. For a color space intended mainly for use on computer and phone screens, you could run studies in typical environments where they are used. It’s possible to go deeper.</p> <p>Nevertheless, I took the datasets I could find and made the best of what I had. The objective was to make a very simple model that’s okay to use. And I think it is okay, and I couldn’t come up with anything better. I didn’t want to call it Björn Ottosson Lab or something like that, so I went with Oklab.</p> <p>Philip: Does the name follow a tradition of calling things okay? I know there’s also a <a target="_blank" href="https://qoiformat.org/" rel="noopener">Quite OK Image</a> format.</p> <p>Björn: No, I didn’t follow any tradition here. Oklab was just the name I came up with.</p> <p>On Oklab Adoption</p> <p>Philip: I discovered Oklab when it suddenly appeared in all browsers. Things often move slowly on the web, but in this case, things moved very quickly. How did it happen?</p> <p>Björn: I was surprised, too! I wrote <a target="_blank" href="https://bottosson.github.io/posts/oklab/" rel="noopener">a blog post</a> and shared it on Twitter.</p> <p>I have a lot of contacts in the gaming industry and some contacts in the Visual Effects (VFX) industry. I expected that people working with shaders or visual effects might try this out, and maybe it would be used in some games, perhaps as an effect for a smooth color transition.</p> <p>But the blog post was spread much more widely than I thought. It was on Hacker News, and many people read it.</p> <p>The code for Oklab is only 10 lines long, so many open-source libraries have adopted it. This all happened very quickly.</p> <p><a target="_blank" href="https://svgees.us/" rel="noopener">Chris Lilley</a> from the W3C got in touch and asked me some questions about Oklab. We discussed it a bit, and I explained how it works and why I created it. He gave a <a target="_blank" href="https://www.w3.org/Graphics/Color/Workshop/slides/talk/lilley" rel="noopener">presentation</a> at a conference about it, and then he pushed for it to be added to CSS.</p> <p>Photoshop also changed its gradients to use Oklab. All of this happened organically without me having to cheer it on.</p> <p>On Okhsl</p> <p>Philip: In <a target="_blank" href="https://bottosson.github.io/posts/colorpicker/" rel="noopener">another blog post</a>, you introduced two other color spaces, Okhsv and Okhsl. You’ve already talked about HSL, so what is Okhsl?</p> <p>Björn: When picking colors, HSL has a big advantage, which is that the parameter space is simple. Any value 0-360 for hue (H) together with any values 0-1 for saturation (S) and lightness (L) are valid combinations and result in different colors on screen. The geometry of HSL is a cylinder, and there’s no way to end up outside that cylinder accidentally.</p> <p><img decoding="async" src="https://files.smashing.media/articles/interview-bjorn-ottosson-creator-oklab-color-space/2-color-solid-cylinder.png"></p> <p>By contrast, <a target="_blank" href="https://en.wikipedia.org/wiki/Oklab_color_space" rel="noopener">Oklab</a> contains all physically possible colors, but there are combinations of values that don’t work where you reach colors that don’t exist. For example, starting from light and saturated yellow in Oklab and rotating the hue to blue, that blue color does not exist in sRGB; there are only darker and less saturated blues. That’s because sRGB in Oklab has a strange shape, so it’s easy to end up going outside it. This makes it difficult to select and manipulate colors with Oklab or Oklch.</p> <p><img decoding="async" src="https://files.smashing.media/articles/interview-bjorn-ottosson-creator-oklab-color-space/3-srgb-shape-oklab.png"></p> <p>Okhsl was an attempt at compromise. It maintains Oklab’s behavior for colors that are not very saturated, close to gray, and beyond that, stretches out to a cylinder that contains all of sRGB. Another way to put it is that the strange shape of sRGB in Oklab has been stretched into a cylinder with reasonably smooth transitions.</p> <p>The result is similar to HSL, where all parameters can be changed independently without ending up outside sRGB. It also makes Okhsl more complicated than Oklab. There are unavoidable compromises to get something with the characteristics that HSL has.</p> <p>Everything with color is about compromises. Color vision is so complex that it’s about making practical compromises.</p> <p>This is an area where I wish there were more research. If I have a white background and want to pick some nice colors to put on it, then you can make a lot of assumptions. Okhsl solves many things, but is it possible to do even better?</p> <p>On Color Compromises</p> <p>Philip: Some people who have tried Oklab say there are too many dark shades. You changed that in Okhsl with a new lightness estimate.</p> <p>Björn: This is because Oklab is exposure invariant and doesn’t account for viewing conditions, such as the background color. On the web, there’s usually a white background, which makes it harder to see the difference between black and other dark colors. But if you look at the same gradient on a black background, the difference is more apparent.</p> <p>CIE Lab handles this, and I tried to handle it in Okhsl, too. So, gradients in Okhsl look better on a white background, but there will be other issues on a black background. It’s always a compromise.</p> <p>And, Finally…</p> <p>Philip: Final question: What’s your favorite color?</p> <p>Björn: I would have to say Burgundy. Burgundy, dark greens, and navy blues are favorites.</p> <p>Philip: Thank you for your time, Björn. I hope our readers have learned something, and I’ll remind them of <a target="_blank" href="https://bottosson.github.io/" rel="noopener">your excellent blog</a>, where you go into more depth about Oklab and Okhsl.</p> <p>Björn: Thank you!</p> <div class="fixed"></div> </div> <div class="under"> <span class="categories">Categories: </span><span><a href="http://www.webmastersgallery.com/category/uncategorized/" rel="category tag">Others</a></span> <span class="tags">Tags: </span><span></span> </div> </div> <div class="post" id="post-7157929"> <h2><a class="title" href="http://www.webmastersgallery.com/2024/09/30/15-best-new-fonts-september-2024/" rel="bookmark">15 Best New Fonts, September 2024</a></h2> <div class="info"> <span class="date">September 30th, 2024</span> <span class="author"><a href="http://www.webmastersgallery.com/author/admin/" title="Posts by admin" rel="author">admin</a></span> <span class="comments"><a href="http://www.webmastersgallery.com/2024/09/30/15-best-new-fonts-september-2024/#respond">No comments</a></span> <div class="fixed"></div> </div> <div class="content"> <div class="ftpimagefix" style="float:left"><a target="_blank" href="1" rel="noopener"><img decoding="async" src="https://www.webdesignerdepot.com/assets/posts/featured/01-kornel.jpg"></a></div> <p>Welcome to our roundup of the best new fonts we’ve found on the web in the previous four weeks. In this month’s edition there’s plenty of hand-lettering charm, and some excellent historical revivals. Enjoy!</p> <div class="fixed"></div> </div> <div class="under"> <span class="categories">Categories: </span><span><a href="http://www.webmastersgallery.com/category/design/" rel="category tag">Designing</a>, <a href="http://www.webmastersgallery.com/category/uncategorized/" rel="category tag">Others</a></span> <span class="tags">Tags: </span><span></span> </div> </div> <div id="pagenavi"> <span class="newer"><a href="http://www.webmastersgallery.com/category/uncategorized/0/page/7/" >Newer Entries</a></span> <span class="older"><a href="http://www.webmastersgallery.com/category/uncategorized/0/page/9/" >Older Entries</a></span> <div class="fixed"></div> </div> </div> <!-- main END --> <!-- sidebar START --> <div id="sidebar"> <!-- sidebar north START --> <div id="northsidebar" class="sidebar"> <!-- feeds --> <div class="widget widget_feeds"> <div class="content"> <div id="subscribe"> <a rel="external nofollow" id="feedrss" title="Subscribe to this blog..." href="http://www.webmastersgallery.com/feed/"><abbr title="Really Simple Syndication">RSS</abbr></a> </div> <div class="fixed"></div> </div> </div> <!-- showcase --> <div id="text-389627311" class="widget widget_text"> <div class="textwidget"><a href="http://feeds2.feedburner.com/webmastersgallery" title="Subscribe to my feed" rel="alternate" type="application/rss+xml"><img src="http://www.feedburner.com/fb/images/pub/feed-icon32x32.png" alt="" style="border:0"/></a><a href="http://feeds2.feedburner.com/webmastersgallery" title="Subscribe to my feed" rel="alternate" type="application/rss+xml">Subscribe for latest Updates</a></div> </div><div id="text-389629461" class="widget widget_text"> <div class="textwidget"><form style="border:1px solid #ccc;padding:3px;text-align:center;" action="http://feedburner.google.com/fb/a/mailverify" method="post" target="popupwindow" onsubmit="window.open('http://feedburner.google.com/fb/a/mailverify?uri=webmastersgallery', 'popupwindow', 'scrollbars=yes,width=550,height=520');return true"><p>Enter your email address:</p><p><input type="text" style="width:140px" name="email"/></p><input type="hidden" value="webmastersgallery" name="uri"/><input type="hidden" name="loc" value="en_US"/><input type="submit" value="Subscribe" /><p>Delivered by <a href="http://feedburner.google.com" target="_blank" rel="noopener">FeedBurner</a></p></form></div> </div></div> <!-- sidebar north END --> <div id="centersidebar"> <!-- sidebar east START --> <div id="eastsidebar" class="sidebar"> <!-- categories --> <div class="widget widget_categories"> <h3>Categories</h3> <ul> <li class="cat-item cat-item-518"><a href="http://www.webmastersgallery.com/category/affiliate-programs/">Affiliate Programs</a> </li> <li class="cat-item cat-item-147"><a href="http://www.webmastersgallery.com/category/design/">Designing</a> </li> <li class="cat-item cat-item-519"><a href="http://www.webmastersgallery.com/category/domain-names/">Domain Names</a> </li> <li class="cat-item cat-item-37"><a href="http://www.webmastersgallery.com/category/e-commerce/">E-commerce</a> </li> <li class="cat-item cat-item-509"><a href="http://www.webmastersgallery.com/category/internet-directories/">Internet Directories</a> </li> <li class="cat-item cat-item-510"><a href="http://www.webmastersgallery.com/category/message-boards/">Message Boards</a> </li> <li class="cat-item cat-item-1"><a href="http://www.webmastersgallery.com/category/uncategorized/">Others</a> </li> <li class="cat-item cat-item-506"><a href="http://www.webmastersgallery.com/category/programming/">Programming</a> </li> <li class="cat-item cat-item-511"><a href="http://www.webmastersgallery.com/category/promotion-and-marketing/">Promotion and Marketing</a> </li> <li class="cat-item cat-item-534"><a href="http://www.webmastersgallery.com/category/scripts-and-programming/">Scripts and Programming</a> </li> <li class="cat-item cat-item-513"><a href="http://www.webmastersgallery.com/category/search-engines/">Search Engines</a> </li> <li class="cat-item cat-item-135"><a href="http://www.webmastersgallery.com/category/social-media/">Social Media</a> </li> <li class="cat-item cat-item-514"><a href="http://www.webmastersgallery.com/category/softwares/">Softwares</a> </li> <li class="cat-item cat-item-515"><a href="http://www.webmastersgallery.com/category/tips-and-tutorials/">Tips and Tutorials</a> </li> <li class="cat-item cat-item-338"><a href="http://www.webmastersgallery.com/category/web-hosting/">Web Hosting</a> </li> <li class="cat-item cat-item-516"><a href="http://www.webmastersgallery.com/category/webmaster-tools/">Webmaster Tools</a> </li> <li class="cat-item cat-item-501"><a href="http://www.webmastersgallery.com/category/webmaster-resources/">Webmasters Resources</a> </li> <li class="cat-item cat-item-3"><a href="http://www.webmastersgallery.com/category/web-design/">Website Design</a> </li> </ul> </div> </div> <!-- sidebar east END --> <!-- sidebar west START --> <div id="westsidebar" class="sidebar"> <!-- blogroll --> <div class="widget widget_links"> <h3>Blogroll</h3> <ul> <li><a href="http://wordpress.org/development/">Development Blog</a></li> <li><a href="http://codex.wordpress.org/">Documentation</a></li> <li><a href="http://wordpress.org/extend/plugins/">Plugins</a></li> <li><a href="http://wordpress.org/extend/ideas/">Suggest Ideas</a></li> <li><a href="http://wordpress.org/support/">Support Forum</a></li> <li><a href="http://wordpress.org/extend/themes/">Themes</a></li> <li><a href="http://planet.wordpress.org/">WordPress Planet</a></li> </ul> </div> </div> <!-- sidebar west END --> <div class="fixed"></div> </div> <!-- sidebar south START --> <div id="southsidebar" class="sidebar"> <!-- archives --> <div class="widget"> <h3>Archives</h3> <ul> <li><a href='http://www.webmastersgallery.com/2024/11/'>November 2024</a></li> <li><a href='http://www.webmastersgallery.com/2024/10/'>October 2024</a></li> <li><a href='http://www.webmastersgallery.com/2024/09/'>September 2024</a></li> <li><a href='http://www.webmastersgallery.com/2024/08/'>August 2024</a></li> <li><a href='http://www.webmastersgallery.com/2024/07/'>July 2024</a></li> <li><a href='http://www.webmastersgallery.com/2024/06/'>June 2024</a></li> <li><a href='http://www.webmastersgallery.com/2024/05/'>May 2024</a></li> <li><a href='http://www.webmastersgallery.com/2024/04/'>April 2024</a></li> <li><a href='http://www.webmastersgallery.com/2024/03/'>March 2024</a></li> <li><a href='http://www.webmastersgallery.com/2024/02/'>February 2024</a></li> <li><a href='http://www.webmastersgallery.com/2024/01/'>January 2024</a></li> <li><a href='http://www.webmastersgallery.com/2023/12/'>December 2023</a></li> <li><a href='http://www.webmastersgallery.com/2023/11/'>November 2023</a></li> <li><a href='http://www.webmastersgallery.com/2023/10/'>October 2023</a></li> <li><a href='http://www.webmastersgallery.com/2023/09/'>September 2023</a></li> <li><a href='http://www.webmastersgallery.com/2023/08/'>August 2023</a></li> <li><a href='http://www.webmastersgallery.com/2023/07/'>July 2023</a></li> <li><a href='http://www.webmastersgallery.com/2023/06/'>June 2023</a></li> <li><a href='http://www.webmastersgallery.com/2023/05/'>May 2023</a></li> <li><a href='http://www.webmastersgallery.com/2023/04/'>April 2023</a></li> <li><a href='http://www.webmastersgallery.com/2023/03/'>March 2023</a></li> <li><a href='http://www.webmastersgallery.com/2023/02/'>February 2023</a></li> <li><a href='http://www.webmastersgallery.com/2023/01/'>January 2023</a></li> <li><a href='http://www.webmastersgallery.com/2022/12/'>December 2022</a></li> <li><a href='http://www.webmastersgallery.com/2022/11/'>November 2022</a></li> <li><a href='http://www.webmastersgallery.com/2022/10/'>October 2022</a></li> <li><a href='http://www.webmastersgallery.com/2022/09/'>September 2022</a></li> <li><a href='http://www.webmastersgallery.com/2022/08/'>August 2022</a></li> <li><a href='http://www.webmastersgallery.com/2022/07/'>July 2022</a></li> <li><a href='http://www.webmastersgallery.com/2022/06/'>June 2022</a></li> <li><a href='http://www.webmastersgallery.com/2022/05/'>May 2022</a></li> <li><a href='http://www.webmastersgallery.com/2022/04/'>April 2022</a></li> <li><a href='http://www.webmastersgallery.com/2022/03/'>March 2022</a></li> <li><a href='http://www.webmastersgallery.com/2022/02/'>February 2022</a></li> <li><a href='http://www.webmastersgallery.com/2022/01/'>January 2022</a></li> <li><a href='http://www.webmastersgallery.com/2021/12/'>December 2021</a></li> <li><a href='http://www.webmastersgallery.com/2021/11/'>November 2021</a></li> <li><a href='http://www.webmastersgallery.com/2021/10/'>October 2021</a></li> <li><a href='http://www.webmastersgallery.com/2021/09/'>September 2021</a></li> <li><a href='http://www.webmastersgallery.com/2021/08/'>August 2021</a></li> <li><a href='http://www.webmastersgallery.com/2021/07/'>July 2021</a></li> <li><a href='http://www.webmastersgallery.com/2021/06/'>June 2021</a></li> <li><a href='http://www.webmastersgallery.com/2021/05/'>May 2021</a></li> <li><a href='http://www.webmastersgallery.com/2021/04/'>April 2021</a></li> <li><a href='http://www.webmastersgallery.com/2021/03/'>March 2021</a></li> <li><a href='http://www.webmastersgallery.com/2021/02/'>February 2021</a></li> <li><a href='http://www.webmastersgallery.com/2021/01/'>January 2021</a></li> <li><a href='http://www.webmastersgallery.com/2020/12/'>December 2020</a></li> <li><a href='http://www.webmastersgallery.com/2020/11/'>November 2020</a></li> <li><a href='http://www.webmastersgallery.com/2020/10/'>October 2020</a></li> <li><a href='http://www.webmastersgallery.com/2020/09/'>September 2020</a></li> <li><a href='http://www.webmastersgallery.com/2020/08/'>August 2020</a></li> <li><a href='http://www.webmastersgallery.com/2020/07/'>July 2020</a></li> <li><a href='http://www.webmastersgallery.com/2020/06/'>June 2020</a></li> <li><a href='http://www.webmastersgallery.com/2020/05/'>May 2020</a></li> <li><a href='http://www.webmastersgallery.com/2020/04/'>April 2020</a></li> <li><a href='http://www.webmastersgallery.com/2020/03/'>March 2020</a></li> <li><a href='http://www.webmastersgallery.com/2020/02/'>February 2020</a></li> <li><a href='http://www.webmastersgallery.com/2020/01/'>January 2020</a></li> <li><a href='http://www.webmastersgallery.com/2019/12/'>December 2019</a></li> <li><a href='http://www.webmastersgallery.com/2019/11/'>November 2019</a></li> <li><a href='http://www.webmastersgallery.com/2019/10/'>October 2019</a></li> <li><a href='http://www.webmastersgallery.com/2019/09/'>September 2019</a></li> <li><a href='http://www.webmastersgallery.com/2019/08/'>August 2019</a></li> <li><a href='http://www.webmastersgallery.com/2019/07/'>July 2019</a></li> <li><a href='http://www.webmastersgallery.com/2019/06/'>June 2019</a></li> <li><a href='http://www.webmastersgallery.com/2019/05/'>May 2019</a></li> <li><a href='http://www.webmastersgallery.com/2019/04/'>April 2019</a></li> <li><a href='http://www.webmastersgallery.com/2019/03/'>March 2019</a></li> <li><a href='http://www.webmastersgallery.com/2019/02/'>February 2019</a></li> <li><a href='http://www.webmastersgallery.com/2019/01/'>January 2019</a></li> <li><a href='http://www.webmastersgallery.com/2018/12/'>December 2018</a></li> <li><a href='http://www.webmastersgallery.com/2018/11/'>November 2018</a></li> <li><a href='http://www.webmastersgallery.com/2018/10/'>October 2018</a></li> <li><a href='http://www.webmastersgallery.com/2018/09/'>September 2018</a></li> <li><a href='http://www.webmastersgallery.com/2018/08/'>August 2018</a></li> <li><a href='http://www.webmastersgallery.com/2018/07/'>July 2018</a></li> <li><a href='http://www.webmastersgallery.com/2018/04/'>April 2018</a></li> <li><a href='http://www.webmastersgallery.com/2018/01/'>January 2018</a></li> <li><a href='http://www.webmastersgallery.com/2017/12/'>December 2017</a></li> <li><a href='http://www.webmastersgallery.com/2017/11/'>November 2017</a></li> <li><a href='http://www.webmastersgallery.com/2017/09/'>September 2017</a></li> <li><a href='http://www.webmastersgallery.com/2017/08/'>August 2017</a></li> <li><a href='http://www.webmastersgallery.com/2017/07/'>July 2017</a></li> <li><a href='http://www.webmastersgallery.com/2017/06/'>June 2017</a></li> <li><a href='http://www.webmastersgallery.com/2017/05/'>May 2017</a></li> <li><a href='http://www.webmastersgallery.com/2017/04/'>April 2017</a></li> <li><a href='http://www.webmastersgallery.com/2017/03/'>March 2017</a></li> <li><a href='http://www.webmastersgallery.com/2017/02/'>February 2017</a></li> <li><a href='http://www.webmastersgallery.com/2017/01/'>January 2017</a></li> <li><a href='http://www.webmastersgallery.com/2016/12/'>December 2016</a></li> <li><a href='http://www.webmastersgallery.com/2016/11/'>November 2016</a></li> <li><a href='http://www.webmastersgallery.com/2016/10/'>October 2016</a></li> <li><a href='http://www.webmastersgallery.com/2016/09/'>September 2016</a></li> <li><a href='http://www.webmastersgallery.com/2016/08/'>August 2016</a></li> <li><a href='http://www.webmastersgallery.com/2016/07/'>July 2016</a></li> <li><a href='http://www.webmastersgallery.com/2016/06/'>June 2016</a></li> <li><a href='http://www.webmastersgallery.com/2016/05/'>May 2016</a></li> <li><a href='http://www.webmastersgallery.com/2016/04/'>April 2016</a></li> <li><a href='http://www.webmastersgallery.com/2016/03/'>March 2016</a></li> <li><a href='http://www.webmastersgallery.com/2016/02/'>February 2016</a></li> <li><a href='http://www.webmastersgallery.com/2016/01/'>January 2016</a></li> <li><a href='http://www.webmastersgallery.com/2015/12/'>December 2015</a></li> <li><a href='http://www.webmastersgallery.com/2015/11/'>November 2015</a></li> <li><a href='http://www.webmastersgallery.com/2015/10/'>October 2015</a></li> <li><a href='http://www.webmastersgallery.com/2015/09/'>September 2015</a></li> <li><a href='http://www.webmastersgallery.com/2015/08/'>August 2015</a></li> <li><a href='http://www.webmastersgallery.com/2015/07/'>July 2015</a></li> <li><a href='http://www.webmastersgallery.com/2015/06/'>June 2015</a></li> <li><a href='http://www.webmastersgallery.com/2015/05/'>May 2015</a></li> <li><a href='http://www.webmastersgallery.com/2015/04/'>April 2015</a></li> <li><a href='http://www.webmastersgallery.com/2015/03/'>March 2015</a></li> <li><a href='http://www.webmastersgallery.com/2015/02/'>February 2015</a></li> <li><a href='http://www.webmastersgallery.com/2015/01/'>January 2015</a></li> <li><a href='http://www.webmastersgallery.com/2014/12/'>December 2014</a></li> <li><a href='http://www.webmastersgallery.com/2014/11/'>November 2014</a></li> <li><a href='http://www.webmastersgallery.com/2014/10/'>October 2014</a></li> <li><a href='http://www.webmastersgallery.com/2014/09/'>September 2014</a></li> <li><a href='http://www.webmastersgallery.com/2014/08/'>August 2014</a></li> <li><a href='http://www.webmastersgallery.com/2014/07/'>July 2014</a></li> <li><a href='http://www.webmastersgallery.com/2014/06/'>June 2014</a></li> <li><a href='http://www.webmastersgallery.com/2013/07/'>July 2013</a></li> <li><a href='http://www.webmastersgallery.com/2013/01/'>January 2013</a></li> <li><a href='http://www.webmastersgallery.com/2012/12/'>December 2012</a></li> <li><a href='http://www.webmastersgallery.com/2012/08/'>August 2012</a></li> <li><a href='http://www.webmastersgallery.com/2012/07/'>July 2012</a></li> <li><a href='http://www.webmastersgallery.com/2012/06/'>June 2012</a></li> <li><a href='http://www.webmastersgallery.com/2012/05/'>May 2012</a></li> <li><a href='http://www.webmastersgallery.com/2012/04/'>April 2012</a></li> <li><a href='http://www.webmastersgallery.com/2012/01/'>January 2012</a></li> <li><a href='http://www.webmastersgallery.com/2011/11/'>November 2011</a></li> <li><a href='http://www.webmastersgallery.com/2011/06/'>June 2011</a></li> <li><a href='http://www.webmastersgallery.com/2011/03/'>March 2011</a></li> <li><a href='http://www.webmastersgallery.com/2011/02/'>February 2011</a></li> <li><a href='http://www.webmastersgallery.com/2011/01/'>January 2011</a></li> <li><a href='http://www.webmastersgallery.com/2010/12/'>December 2010</a></li> <li><a href='http://www.webmastersgallery.com/2010/11/'>November 2010</a></li> <li><a href='http://www.webmastersgallery.com/2010/09/'>September 2010</a></li> <li><a href='http://www.webmastersgallery.com/2010/07/'>July 2010</a></li> <li><a href='http://www.webmastersgallery.com/2010/06/'>June 2010</a></li> <li><a href='http://www.webmastersgallery.com/2010/05/'>May 2010</a></li> <li><a href='http://www.webmastersgallery.com/2010/02/'>February 2010</a></li> <li><a href='http://www.webmastersgallery.com/2009/12/'>December 2009</a></li> <li><a href='http://www.webmastersgallery.com/2009/08/'>August 2009</a></li> <li><a href='http://www.webmastersgallery.com/2009/07/'>July 2009</a></li> <li><a href='http://www.webmastersgallery.com/2009/06/'>June 2009</a></li> <li><a href='http://www.webmastersgallery.com/2009/05/'>May 2009</a></li> <li><a href='http://www.webmastersgallery.com/2009/04/'>April 2009</a></li> <li><a href='http://www.webmastersgallery.com/2009/03/'>March 2009</a></li> </ul> </div> <!-- meta --> <div class="widget"> <h3>Meta</h3> <ul> <li><a href="http://www.webmastersgallery.com/wp-login.php">Log in</a></li> </ul> </div> </div> <!-- sidebar south END --> </div> <!-- sidebar END --> <div class="fixed"></div> </div> <!-- content END --> <!-- footer START --> <div id="footer"> <a id="gotop" href="#" onclick="MGJS.goTop();return false;">Top</a> <a id="powered" href="http://wordpress.org/">WordPress</a> <div id="copyright"> Copyright © 2009-2024 Webmasters Gallery </div> <div id="themeinfo"> Theme by <a href="http://www.neoease.com/">NeoEase</a>. Valid <a href="http://validator.w3.org/check?uri=referer">XHTML 1.1</a> and <a href="http://jigsaw.w3.org/css-validator/check/referer?profile=css3">CSS 3</a>. </div> </div> <!-- footer END --> </div> <!-- container END --> </div> <!-- wrap END --> </body> </html>