Click here to Skip to main content
15,885,985 members
Articles / Productivity Apps and Services / Sharepoint / SharePoint 2013
Tip/Trick

Adding Breadcrumb in SharePoint 2013

Rate me:
Please Sign up or sign in to vote.
5.00/5 (1 vote)
24 Feb 2016CPOL2 min read 26.1K   127   3
Customizing breadcrumb in SharePoint 2013. This tip will work for SharePoint 2013 on-premise and online both. In SharePoint 2010, we had nice breadcrumb. In SharePoint 2013, we have only pop up breadcrumb. So let's bring it back!!

Introduction

Breadcrumb is a very useful option in SharePoint. It helps users to get current location in the site and navigate back to the start. By default, this feature is not enabled in SharePoint 2013. We can enable it from the master page, but it does not look good. So, this document aims to show how we can start customizing it.

Current Problem

There are so many tutorials for enabling breadcrumb in SharePoint 2013. So let's see what it is. In the html master, we need to modify the following div.

HTML
<div class="ms-breadcrumb-dropdownBox" style="display:none;">
   <!--SPM:<SharePoint:AjaxDelta id="DeltaBreadcrumbDropdown" 
   runat="server">-->
   <!--SPM:<SharePoint:PopoutMenu
      Visible="false"
      runat="server"
      ID="GlobalBreadCrumbNavPopout"
      IconUrl="/_layouts/15/images/spcommon.png?rev=42"
      IconAlt="&#60;%$Resources:wss,master_breadcrumbIconAlt%&#62;"
      ThemeKey="v15breadcrumb"
      IconOffsetX="215"
      IconOffsetY="120"
      IconWidth="16"
      IconHeight="16"
      AnchorCss="ms-breadcrumb-anchor"
      AnchorOpenCss="ms-breadcrumb-anchor-open"
      MenuCss="ms-breadcrumb-menu ms-noList">-->
   <div class="ms-breadcrumb-top">
      <!--SPM:<asp:Label runat="server" 
      CssClass="ms-breadcrumb-header" 
      Text="&#60;%$Resources:wss,master_breadcrumbHeader%&#62;"/>-->
   </div>
   <!--SPM:<asp:ContentPlaceHolder id="PlaceHolderTitleBreadcrumb" 
   runat="server">-->
   <!--SPM:<SharePoint:ListSiteMapPath
      runat="server"
      SiteMapProviders="SPSiteMapProvider,SPContentMapProvider"
      RenderCurrentNodeAsLink="false"
      PathSeparator=""
      CssClass="ms-breadcrumb"
      NodeStyle-CssClass="ms-breadcrumbNode"
      CurrentNodeStyle-CssClass="ms-breadcrumbCurrentNode"
      RootNodeStyle-CssClass="ms-breadcrumbRootNode"
      NodeImageOffsetX="0"
      NodeImageOffsetY="289"
      NodeImageWidth="16"
      NodeImageHeight="16"
      NodeImageUrl="/_layouts/15/images/fgimg.png?rev=42"
      RTLNodeImageOffsetX="0"
      RTLNodeImageOffsetY="312"
      RTLNodeImageWidth="16"
      RTLNodeImageHeight="16"
      RTLNodeImageUrl="/_layouts/15/images/fgimg.png?rev=42"
      HideInteriorRootNodes="true"
      SkipLinkText=""/>-->
   <!--SPM:</asp:ContentPlaceHolder>-->
   <!--SPM:</SharePoint:PopoutMenu>-->
   <!--SPM:</SharePoint:AjaxDelta>-->
</div>

From the above div, we need to change the following things:

  1. Removing style="display:none;" from the div
  2. Setting Visible="true" in SharePoint:PopoutMenu

After changing everything, the above div should look like the following:

HTML
<div class="ms-breadcrumb-dropdownBox">
   <!--SPM:<SharePoint:AjaxDelta id="DeltaBreadcrumbDropdown" 
   runat="server">-->
   <!--SPM:<SharePoint:PopoutMenu
      Visible="true"
      runat="server"
      ID="GlobalBreadCrumbNavPopout"
      IconUrl="/_layouts/15/images/spcommon.png?rev=42"
      IconAlt="&#60;%$Resources:wss,master_breadcrumbIconAlt%&#62;"
      ThemeKey="v15breadcrumb"
      IconOffsetX="215"
      IconOffsetY="120"
      IconWidth="16"
      IconHeight="16"
      AnchorCss="ms-breadcrumb-anchor"
      AnchorOpenCss="ms-breadcrumb-anchor-open"
      MenuCss="ms-breadcrumb-menu ms-noList">-->
   <div class="ms-breadcrumb-top">
      <!--SPM:<asp:Label runat="server" CssClass="ms-breadcrumb-header" 
      Text="&#60;%$Resources:wss,master_breadcrumbHeader%&#62;"/>-->
   </div>
   <!--SPM:<asp:ContentPlaceHolder id="PlaceHolderTitleBreadcrumb" 
   runat="server">-->
   <!--SPM:<SharePoint:ListSiteMapPath
      runat="server"
      SiteMapProviders="SPSiteMapProvider,SPContentMapProvider"
      RenderCurrentNodeAsLink="false"
      PathSeparator=""
      CssClass="ms-breadcrumb"
      NodeStyle-CssClass="ms-breadcrumbNode"
      CurrentNodeStyle-CssClass="ms-breadcrumbCurrentNode"
      RootNodeStyle-CssClass="ms-breadcrumbRootNode"
      NodeImageOffsetX="0"
      NodeImageOffsetY="289"
      NodeImageWidth="16"
      NodeImageHeight="16"
      NodeImageUrl="/_layouts/15/images/fgimg.png?rev=42"
      RTLNodeImageOffsetX="0"
      RTLNodeImageOffsetY="312"
      RTLNodeImageWidth="16"
      RTLNodeImageHeight="16"
      RTLNodeImageUrl="/_layouts/15/images/fgimg.png?rev=42"
      HideInteriorRootNodes="true"
      SkipLinkText=""/>-->
   <!--SPM:</asp:ContentPlaceHolder>-->
   <!--SPM:</SharePoint:PopoutMenu>-->
   <!--SPM:</SharePoint:AjaxDelta>-->
</div>

If we apply this in an html master page, we will get the following look and feel.

default look

So the problem is: Nobody is going to be happy with this look & feel!! They must ask for something customized!!

Let's Start Customizing

For a good staring, I wish to give the following look & feel instead of the default. In SharePoint 2010, we had a nice look & feel. So, I have just tried to bring it back.

custom look

To accomplish the above look & feel, we need some JS & CSS.

CSS

CSS
#pageTitle{
    display: none;
}

JavaScript

JavaScript
SP.SOD.executeOrDelayUntilEventNotified(addBreadcrumb, "sp.bodyloaded");

function addBreadcrumb() {

    if (!document.querySelector("#pageTitle span span span")) {
        document.querySelector("#pageTitle").style.display = 'block';
        return;
    }

    var elementsInPageTitle = document.querySelector("#pageTitle span").outerHTML;
    var breadcrumbDivider = '<span style="height:16px;width:16px;
    position:relative;display:inline-block;overflow:hidden;">
    <img src="/_layouts/15/images/spcommon.png?rev=42" 
    alt=":" style="position:absolute;left:-109px 
    !important;top:-232px !important;"></span>';
    var allBreadcrumbElements = "";
    var siteTitle = _spPageContextInfo.webTitle;

    var elementIsExistsPageTitle = function(el) {
        return [].some.call(document.querySelectorAll
        ("#pageTitle span span span"), function(sEl) {
            return el.innerText == sEl.innerText;
        });
    };

    var breadcrumbClassName = "";

    if (document.querySelectorAll(".s4-breadcrumb li a").length) {
        breadcrumbClassName = ".s4-breadcrumb li a";
    } else {
        breadcrumbClassName = ".ms-breadcrumb li a";
    }

    var indexOfTheLastElement = document.querySelectorAll(breadcrumbClassName).length - 1;

    [].forEach.call(document.querySelectorAll(breadcrumbClassName), function(el, index) {
        if (el.innerText == siteTitle) {
            el.style['font-weight'] = 'bold';
        }

        if (!(index == indexOfTheLastElement && elementIsExistsPageTitle(el))) {
            allBreadcrumbElements += '<span>' + 
            el.outerHTML + '</span>' + breadcrumbDivider;
        }
    });

    allBreadcrumbElements += elementsInPageTitle;

    document.querySelector("#pageTitle").innerHTML = allBreadcrumbElements;
    document.querySelector("#pageTitle").style.display = 'block';
}

Deployment

Deployment is very easy. All we need is: creating a .css & .js file and adding them in the html master page. So now create the following two files:

  • breadcrumb.css
  • breadcrumb.js

Now upload the above files in any library according to your liking. I have uploaded them into Style Library. So in html master page, they should look like:

HTML
<!--SPM:<SharePoint:CssRegistration 
name="&#60;% $SPUrl:~sitecollection/Style Library/Custom/breadcrumb.css %&#62;" runat="server"/>-->

<!--SPM:<SharePoint:ScriptLink language="javascript" 
name="~sitecollection/Style Library/Custom/breadcrumb.js"  runat="server" Localizable="false"/>-->

Now, everything should work fine in the browser.

Conclusion

This is just the starting of breadcrumb customization. Hope you will dig into it more. Any feedback/suggestion is always welcome.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Instructor / Trainer Jashore University of Science and Technology
Bangladesh Bangladesh
2016 Microsoft MVP

Currently, I am devoted to provide technical and development support to the SharePoint clients and also I am working on angularjs. I am experienced with C#, ASP.NET, SharePoint, SignalR, angularjs, MS SQL, Oracle 11g R2, Windows Phone, Firefox OS and so on. I have fallen in love with many technologies but never got married to any of them. I am evolving myself as full stack developer. I always like to share knowledge as much as to gather from you.

Comments and Discussions

 
QuestionDuplicate Title show up for document sets Pin
Member 133966756-Sep-17 7:57
Member 133966756-Sep-17 7:57 
PraiseGreat Post! Pin
GoodPanos11-Jul-16 13:24
professionalGoodPanos11-Jul-16 13:24 
GeneralRe: Great Post! Pin
Atish Dipongkor13-Jul-16 21:57
professionalAtish Dipongkor13-Jul-16 21:57 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.