LoL: How To Get an S Rank with Every Champion (2023)

");$( "#content-area" ).prepend($addFlag);} }// This function handles animation for the new ToC, which currently includes:// 1. Fading the ToC in and out to prevent it from covering up the Info section in the footer ; function handleTocAnim( $tocBox, winHeight, docHeight, scrollTop ) { // We're going to check if we're near the bottom for an animation to hide the ToC so we don't // cover up the Info section in the footer var bottomBuffer = 384; //px var isNearBottom = scrollTop + winHeight > docHeight - bottomBuffer; // Fetch the value for the animFlag key var tocAnimating = $ "animFlag" ); // If ToC has been hidden by the fade anim, display will be 'none' when // finished animating var tocHidden = $tocBox.css( 'display' ) === 'none'; if( isNearBottom ) { // If we're near the bottom, and the ToC is not animating // and not hidden, then hide it if( !tocAnimating && !tocHidden ) { $ "animFlag", true ) $tocBox.fadeOut( 400, function() { $ "animFlag", false ); }); } } else { // If we're not near the bottom, and the ToC is not animating // and hidden, then unhide it if( !tocAnimating && tocHidden ) { $ "animFlag", true ); $tocBox.fadeIn( 400, function() { $ "animFlag", false ); }); } } }// Calculate the available height for the ToC Box ; function calcAvailableHeight( height ) {return height * 80.0 / 100.0;}// This function resizes specific page elements, depending on // window size and whether the ToC is present, to keep things // consistent.// The boolean debug arg enables verbose logging. ; function handleReflow( $, winOuterWidth, winInnerHeight, debug ) {if( debug ) {console.log( "Checking if page layout should be reflowed..." );}// We want to reflow the layout whether or not we have the TOC, // with the hasTOC bool as a flag for if it exists on the pagevar tocFlag = $("#content-side");var hasToC = true; // FORCE HAS TOC, DEPLOYING SITEWIDE -supersoup// Check number of H2 elements. If <= 3, early returnvar numH2 = $("h2");if( numH2.length <= 3 ) {return;}// Cache varsvar $mainContainer = $("#main-content");var $logoContainer = $(".hgg-logo-space");var $navContainer = $(".hgg-menu-icon");var $contentArea = $("#content-area");// Null-check variablesvar anyNull = $mainContainer.length && $logoContainer.length && $navContainer.length && $contentArea.length;if( !($mainContainer.length) && debug ) {console.log( "$mainContainer null in reflowLayout..." );}if( !($logoContainer.length) && debug ) {console.log( "$logoContainer null in reflowLayout..." );}if( !($navContainer.length) && debug ) {console.log( "$navContainer null in reflowLayout...")}if( !($contentArea.length) && debug ) {console.log( "$contentArea null in reflowLayout..." );} if( debug ) {console.log( "anyNull: " + anyNull );console.log( "hasTOC: " + hasToC );}if( hasToC ) {// The previous process for initializing offsetTopForView didn't play well when// refreshing the page while partially down the post, switching to pulling the // main-header height for consistency -supersoupvar offsetTopForView = $("#main-header").height() ; //pxvar $toc = $( ".toc-box" );if( $toc.length > 0 ) {var availableHeight = calcAvailableHeight( winInnerHeight - offsetTopForView );if( debug ) {console.log( "window.innerHeight: " + winInnerHeight );console.log( "availableHeight: " + availableHeight );console.log( "toc[0].scrollHeight: " + $toc[0].scrollHeight );console.log( "toc.height(): " + $toc.height() );}if( $toc.outerHeight() > availableHeight ) {$toc.css( 'height', availableHeight );if( debug ) {console.log( "Setting ToC height to ", availableHeight );}} else {var newHeight = availableHeight < $toc[0].scrollHeight ? availableHeight : $toc[0].scrollHeight;$toc.css( 'height', newHeight );if( debug ) {console.log( "Setting ToC height to ", newHeight );}}/*// Update largest sizevar maxSize = $ "maxSize" );var outerHeight = $toc.outerHeight;if( maxSize === 0 || maxSize == undefined || maxSize == NaN || maxSize < cssHeight ) {$ "maxSize", $toc.outerHeight);console.log( "maxSize is now " + $toc.outerHeight );}*/if( $toc.height() < $toc[0].scrollHeight ) {$toc.css( 'overflow-x', 'hidden' );$toc.css( 'overflow-y', 'auto' );}else {$toc.css( 'overflow-x', 'hidden' );$toc.css( 'overflow-y', 'none' );}}if( winOuterWidth >= 1600 ) {$mainContainer.css( "margin-left", "15.95rem" );$logoContainer.css( "margin-left", "-6.1rem" );$navContainer.css( "margin-right", "-8.0rem" );} else if( winOuterWidth < 1600 && winOuterWidth >= 1440 ) {$mainContainer.css( "margin-left", "14.8rem" );$logoContainer.css( "margin-left", "-3.8rem" );$navContainer.css( "margin-right", "-3.8rem" );} else if( winOuterWidth < 1440 ) {// Clear applied CSS$mainContainer.css( "margin-left", "0" );$logoContainer.css( "margin-left", "0" );$navContainer.css( "margin-right", "0" );} else {if( debug ) {console.log( "Unhandled window width in reflowLayout() - With ToC" );}}} else {if( winOuterWidth >= 1600 ) {// Don't do anything yet on non-ToC pages} else if( winOuterWidth < 1600 && winOuterWidth >= 1440 ) {$contentArea.css( "margin-left", "0");} else if( winOuterWidth < 1440 ) {// Don't do anything yet on non-ToC pages} else {if( debug ) {console.log( "Unhandled window width in reflowLayout() - Without ToC" );}}} }// Handles reflowing content on the page depending on different variables; (function (window, $, undefined) {$.fn.reflowLayout = function() {// Should we enable verbose logging for debugging?// SHOULD NOT BE TRUE IN PRODUCTION! -supersoupvar debug = false;handleReflow( $, window.outerWidth, window.innerHeight, debug );$(window).on( 'load', function () {handleReflow( $, window.outerWidth, window.innerHeight, debug );});// For reflowing when browser size changes$(window).on( 'resize', function () {handleReflow( $, window.outerWidth, window.innerHeight, debug );});/*$(window).on( 'scroll', function () {var $toc = $( ".toc-box" );if( $toc.length === 0 )return;console.log( "availableHeight: " + calcAvailableHeight( window.innerHeight ) );console.log( "toc[0].scrollHeight: " + $toc[0].scrollHeight );console.log( "toc.outerHeight(): " + $toc.outerHeight() );});*/};})(this, jQuery);// Transform guide content by visually organizing it into cards ; (function(window, $, undefined) { $.fn.cardify = function() { var $contentBody = $("#content-body"); if($contentBody === 0) { return; } var $contentBodyChildren = $contentBody.children(); var $h2s = $contentBody.children("h2"); console.log("H2 children of #content-body: " + $h2s.length); if($h2s.length === 0) { return; } for(var i = 0; i < $h2s.length; i++) { var $array = $contentBodyChildren.nextUntil("h2"); $array.each( function(index) { console.log("Element " + index + ": " + $(this).html()); }); // console.log("Card " + i + ":" + $contentBodyChildren.nextUntil("h2").html()); } } }(this, jQuery));// The main function for creating, populating, and managing the new ToC ; (function (window, $, undefined) { $.fn.createTOC = function (settings) {const MAX_MOBILE_WIDTH = 1438;// Before anything else, if this is a post in a Category that we // specifically want to force the ToC on, let's handle that// THIS IS NO LONGER NEEDED, as we're pushing ToC sitewide -supersoup// handleForceToC( $ );// For now, we only want to add the new ToC to manually flagged posts.// The post is flagged with the presence of a

// contained within the content of the post. Originally, this div was being used// to wrap the ToC, but I (supersoup) am going to move the ToC out to a new div.// So, the first thing we want to do is test for this div, early return if not // found, or remove it and recreate a #content-side div elsewhere if it is found.var tocFlag = $("#content-side");var hasToC = !(tocFlag.length === 0);// If #content-side element is foundif( hasToC ) {// Get rid of tosFlag #content-side elementtocFlag.remove();} // If on mobile, early return if( $(window).width() <= MAX_MOBILE_WIDTH ) {return; }// Check number of H2 elements. If <= 3, early returnvar numH2 = $("h2");if( numH2.length <= 3 ) {return;}// Recreate #content-side element in new locationvar $tocDiv = $("

");$( "#content-area" ).prepend($tocDiv); // Want it to be the first subdiv of #content-area// Proceed with .CreateTOC() var option = $.extend({ title: "hgg-toc", insert: "body", }, settings); var ACTIVE_CLASS = 'active'; var list = ["h2", "h3"]; var $headings = this.find(list.join(",")); var tocBox = document.createElement("ul"); var $tocBox = $(tocBox); tocBox.className = "toc-box"; var idList = []; $ (i, head) { var nodeName = head.nodeName; var id = 'toc_' + i + '_' + nodeName; = id; idList.push(id); var row = document.createElement("li"); row.className = 'toc-item toc-' + nodeName; var link = document.createElement('a'); link.innerText = head.innerText; link.className = 'toc-item-link'; link.href = '#' + id; row.appendChild(link); tocBox.appendChild(row); }); // Control the takeover of the highlighted elements var isTakeOverByClick = false; // Event delegate, add click ,Highlight the currently clicked item $tocBox.on("click", ".toc-item", function (ev) { // Set as true ,Represents the click event to take over the control of the highlighted element isTakeOverByClick = true; var $item = $(this); var $itemSiblings = $item.siblings(); $itemSiblings.removeClass(ACTIVE_CLASS); $item.addClass(ACTIVE_CLASS); }); var headBox = document.createElement("div"); headBox.className = "toc-titler"; headBox.innerHTML = option.title; var wrapBox = document.createElement("div"); wrapBox.className = "wrap-toc"; wrapBox.appendChild(headBox); wrapBox.appendChild(tocBox); var $insertBox = $(option.insert); var $helperBox = $("

"); $helperBox.append(wrapBox); $insertBox.prepend($helperBox); // The style of the storage container box var CACHE_WIDTH = $insertBox.css('width'); var CACHE_PADDING_TOP = $insertBox.css('paddingTop'); var CACHE_PADDING_RIGHT = $insertBox.css('paddingRight'); var CACHE_PADDING_BOTTOM = $insertBox.css('paddingBottom'); var CACHE_PADDING_LEFT = $insertBox.css('paddingLeft'); var CACHE_MARGIN_TOP = $insertBox.css('marginTop'); // var scrollTop = $('html,body').scrollTop(); // var offsetTop = $insertBox.offset().top; // var marginTop = parseInt($insertBox.css('marginTop')); // var offsetTopForView = offsetTop - scrollTop - marginTop; // For initialization on load$(window).on( 'load', function () {initTocAnimData( $insertBox );}); // Rolling ceiling $(window).scroll(function () {// If on mobile, early returnif( $(window).width() <= MAX_MOBILE_WIDTH ) {return;}// The previous process for initializing offsetTopForView didn't play well when// refreshing the page while partially down the post, switching to pulling the // main-header height for consistency -supersoupvar offsetTopForView = $(".hgg-top-nav").height() ; //px// IE6/7/8: // For pages without doctype declaration, document.body.scrollTop can be used to get the height of scrollTop; // For pages with doctype declaration, document.documentElement.scrollTop can be used;// Safari: // Safari is special, it has its own function to get scrollTop: window.pageYOffset;// Firefox: // Relatively standard browsers such as Firefox can save more worry, just use document.documentElement.scrollTop;var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop; // Scroll highlight // Only when the click event cancels the control of the highlighted element, the scroll event can have the control of the highlighted element !isTakeOverByClick && $.each(idList, function (index, id) { var $head = $('#' + id); var $item = $('[href="#' + id + '"]').parent(); var $itemSiblings = $item.siblings();var offsetBuffer = 64; // px, we want the class swap to trigger slightly before so we show an accurate active element// when zooming to a specific element var offsetTopHead = $head.offset().top - offsetBuffer; var isActived = $item.hasClass(ACTIVE_CLASS); if (scrollTop >= offsetTopHead) { $itemSiblings.removeClass(ACTIVE_CLASS); !isActived && $item.addClass(ACTIVE_CLASS); } else { $item.removeClass(ACTIVE_CLASS); } }); // Set to false, which means that the click event will cancel the control of the highlighted element isTakeOverByClick = false;// Handle animation for the ToChandleTocAnim( $insertBox, $(window).height(), $(document).height(), scrollTop );// Handle any changes to ToC CSS on scrollvar isFixed = $helperBox.css("position") === "fixed"; if (scrollTop >= offsetTopForView) {if (isFixed) return;$tocBox.css({overflow: 'auto',padding: 0,});$helperBox.css({position: 'fixed',top: CACHE_MARGIN_TOP,width: CACHE_WIDTH,paddingTop: CACHE_PADDING_TOP,paddingRight: CACHE_PADDING_RIGHT,paddingBottom: CACHE_PADDING_BOTTOM,paddingLeft: CACHE_PADDING_LEFT,backgroundColor: $tocBox.css('backgroundColor')});} else {if (!isFixed) return;$helperBox.css({position: 'static',padding: 0});$tocBox.css({overflow: 'auto',paddingTop: CACHE_PADDING_TOP,paddingRight: CACHE_PADDING_RIGHT,paddingBottom: CACHE_PADDING_BOTTOM,paddingLeft: CACHE_PADDING_LEFT,});} }); };}(this, jQuery));});

by Jeffrey Hsu | Jan 27, 2022

LoL: How To Get an S Rank with Every Champion (1)

Image: Riot Games

Every LoL player wants to see that beautiful S rank pop up after they’re done with a game. After all, it’s proof that you were one of the best players in the match and that you played to peak perfection with your champion.

But what exactly determines your rank after each game? Is it the number of kills, how many objectives you took, or how quickly the game was finished?

Looking for more LoL tips and tricks? Click to view all our League of Legends guides.

The answer is yes to all of the above. But there’s a lot more to it than that.

In this guide, we’ll be going over the various factors that determine your placement and teach you how to get an S rank in League of Legends. If you’re ready to crank your rank, it’s time get started.

Table of Contents

How To Get an S in League of Legends

Before we dive into the specifics of how to get an S in LoL, we need to disclose one critical piece of information. That is, Riot has not released exact information on the specific criteria or scoring metrics they use to determine rank. Players over the years have deduced what the general conditions are and we’ve gathered that information here for you.

Unfortunately, there will be games that you feel as though you should have a higher rating, but the game decides otherwise.

Okay, with that out of the way, let’s go into the most important factor of all — your performance!

Champion Performance

It’s not the enemy team or your own allies that your performance is measured against to determine your rank. Instead, it’s all the other players who play the same champion.

That’s right, your performance is literally being compared to every other player in the world.

Even if you’re 15/0/10 in a game, it might not be good enough to get an S rank if other players do even better with the same champion.

Even losing the game doesn’t prevent you from getting a S rank, as long as you did well on your champion.

Thankfully, the rating is dependent on the champion’s average performance. As long as you do considerably better than the average player on the same champion, an S rank is possible.

LoL: How To Get an S Rank with Every Champion (3)

Naturally, this means that champions with a low-pick rate are easier to get S ranks on, as there’s less competition for your performance to be weighted against. Even more so if the champion is fairly new, as other players have yet to figure out how to play them. This means the average performance of that champion will be lower, so if you manage to play them on a competent level, it may be good enough at the time to warrant an S rank.

Conversely, champions with high pick rates mean you have a lot more competition. It doesn’t help that highly picked champions are more likely to have high skill ceilings as well. Take Ezreal for example. The typical Ezreal player might not be fantastic, but the absolute best ones can end up with ridiculous scores that bump up the average threshold.

When buffs and nerfs to a champion occur, you can expect the average threshold for a champion to shift after a few weeks. In terms of learning how to get an S grade in LoL, this can make it harder or easier for you depending on how much the balance change affects your playstyle and willingness to keep playing said champion.

K/D/A and Role

LoL: How To Get an S Rank with Every Champion (4)

The meat/bulk of your rating score. Naturally, you want a lot of kills, next to no deaths, and however many assists you can get. Also having a high CS score helps tremendously, so get good at last hitting minions!

However, the biggest factor is definitely to minimize your death count. You can usually get away with up to three deaths before your chances of getting an S rank start dropping dramatically. It doesn’t mean it’s impossible to get one, but your kills and assists will have to dramatically outpace your deaths to make it worth it.

Additionally, the role you play has a large impact on how heavily weighted your K/D/A is.

When it comes to learning how to get an S in League of Legends, solo laners and damage dealers, such as bruisers and ADCs, will need to make sure they have a large kill count to have a chance of getting an S. Above all else, just keep inflicting as much damage as possible without dying. Even those assists will weigh heavily if the amount of damage you put out is high (though having more kills = more gold = more damage output with items).

Meanwhile, roles such as supports and tanks want to prioritize simply staying alive and hitting the enemy with their CC abilities. The more you play your role properly, the more points are added to your score (such as landing a Morgana Q binding or mitigating damage with Janna’s E shield). Assists typically make up the bulk of your score, but Riot apparently forgot to reduce the value of kills for support.

If you happen to end up with a bunch of kills, all the better for your score. Just make sure the rest of your team has enough gold to help you stay relevant!

LoL: How To Get an S Rank with Every Champion (5)

Length of the Game

Before we get into the remaining factors, we need to discuss how the game’s length impacts how to get an S in League of Legends. As the game’s length goes on, the threshold of S rank lowers itself.

If you’re playing incredibly well during the match, this tends to make it easier for you. However, it also presents more opportunities to mess up and die too much.

Typically, you’re not going to get an S rank on games shorter than 20 minutes. You just simply don’t have enough time to accumulate enough points to earn an S rank unless you absolutely demolish the enemy team single-handedly. I’m talking going 10/0/5 at the enemy nexus before 20 minutes. If you manage to pull off that, then there’s a chance you can get a short game S rank.


Your vision score can often make or break the difference in getting an A or S rank. Even more so if you’re going for the coveted S+ rank.

LoL: How To Get an S Rank with Every Champion (6)

To maximize the points obtained from a ward you place, you want to make sure it sees enemy presence, survives for as long as possible, and try to place it in enemy territory. For example, tossing a ward in Baron pit when the enemy is on it, will get you more points than if it were empty.

In other words, the more value and information you get from a ward, the more points you earn towards your vision score.

Additionally, you want to try and get the takedown on enemy wards as quickly as possible. Killing an enemy ward with a longer lifespan on it will get you more points.

In regards to your rank score, having a vision score of 25+ is standard. Getting it to 40+ would be the most ideal way to maximize the points your vision score adds to your rank.

Objective Control

A simple way to further boost your rank score is to just participate in every major objective. Taking towers/inhibitors, stealing enemy jungle camps, and fighting for Baron/Dragon all bolster your score. Even if it’s a single hit, as long as you participated you get full credit.

Naturally, impressive plays like stealing Baron from the enemy when you’re not even the jungler is worth more points, but consistent participation on objectives is key.

If you’re playing the jungler role, this is even more impactful on your score. As long as you secure objectives and camps, you can earn a S rank even with a low K/D/A score. Though obviously having a higher one makes it easier.

LoL: How To Get an S Rank with Every Champion (7)

As a caveat for champions that can be played in multiple roles or players who just take their champion into off-meta positions (such as Garen support), your score is weighed a bit differently.

As opposed to being compared to your champion’s typical performance, the game does factor in that you’re playing them in an off-meta fashion. The standard examples consist of taking solo-laner mages and putting them into a support role (ex. Xerath or Brand as the support).

The game usually checks what items, summoner spells (mainly smite for jungling), and which lane you spend the most time in to determine if you’re taking an odd route.

However, it’s mostly divided up into three categories: laner, support, and jungler. Using the previous example, throwing Garen into bot lane as the ADC role is weighed the same as if he were in top lane by himself. However, if he were jungling, the game would take it consideration that he’s not in usual top lane role and calculate his rank score accordingly.

We don’t really recommend this strategy for getting S ranks, as champions usually perform better in their conventional roles. Plus, you’re more likely to make your team angry and reduce their performance.

Why Go for S Rank? The Spoils of Victory

LoL: How To Get an S Rank with Every Champion (8)

So what’s the point of learning how to get an S in League of Legends? Same as every other ranking metric in the game — prestige!

Every time you finish a game on a specific champion, your rank score is added to that champion’s mastery. It’s simply a way of showing off how much experience you have with a certain champion, as you can flash a mastery emote in game.

Higher rank scores means gaining mastery faster. However, once you hit rank 5, you’ll have to obtain mastery tokens in order to reach the next tier.

If you earn an S- rank or higher, you’ll be granted a champion-specific mastery token. You need two of these tokens to upgrade to rank 6 mastery.

Going from rank 6 to rank 7 requires three mastery tokens that can only be earned with an S or S+ rank. If you’re aiming for mastery 7, you’ll have to be playing at the top of your game.

Remember, you can earn mastery tokens only once you hit rank 5 with a champion. Even getting an S+ won’t give you one if you’re at rank 4 or lower, though learning how to get S rank in LoL can’t hurt.

Additionally, you can earn a Hextech Chest once per champion each season if someone in your pre-made party earns a S- rank or higher. However, you can only earn 4 chests per month.

LoL: How To Get an S Rank with Every Champion (9)

Become a High Grounder

And that’s it for our guide on how to get an S in League of Legends. We hope it’s helped you plan out your path to glorious mastery 7 with your favorite champion. If you have any other comments or questions, leave them down below! As always, maintain the advantage with the latest articles and guides here at High Ground Gaming.

How To Farm Blue Essence Fast

What Is Lethality and How Does It Work?

What Is Hail of Blades and How To Use It Properly?

Best LoL Champions for Beginners

Rarest LoL Skins

Best LoL Settings

" );})(jQuery);});

Submit a Comment

Top Articles
Latest Posts
Article information

Author: Prof. An Powlowski

Last Updated: 11/14/2022

Views: 5916

Rating: 4.3 / 5 (44 voted)

Reviews: 91% of readers found this page helpful

Author information

Name: Prof. An Powlowski

Birthday: 1992-09-29

Address: Apt. 994 8891 Orval Hill, Brittnyburgh, AZ 41023-0398

Phone: +26417467956738

Job: District Marketing Strategist

Hobby: Embroidery, Bodybuilding, Motor sports, Amateur radio, Wood carving, Whittling, Air sports

Introduction: My name is Prof. An Powlowski, I am a charming, helpful, attractive, good, graceful, thoughtful, vast person who loves writing and wants to share my knowledge and understanding with you.