Feeds:
Posts
Comments

Posts Tagged ‘css’

Adding a box or rounded corners around a SharePoint web part can be challenging due to the way that SharePoint renders it’s web parts in a <table> layout. This article explains how to add extra <div> elements around the SharePoint web parts. Then by using the ‘sliding doors’ css technique we can add a flexible box arround the SharePoint web part and even include rounded corners.
This tutorial already assumes that you know what SharePoint master pages are and how to work with css and JavaScript files.

Problem.

The HTML code of a SharePoint web part is made out of tables. Depending on the web part options you selected extra  tables and css classes can be added, removed or nested.

The basic HTML markup of a SharePoint web part looks like this

    <table cellspacing="0" cellpadding="0" border="0" width="100%" class="s4-wpTopTable">
        <tbody>
          <tr>
            <td>
            <table cellspacing="0" cellpadding="0" border="0" width="100%">
                <tbody>
                    <tr class="ms-WPHeader">
                    <!-- web part title and menu goes here -->
                   </tr>
                </tbody>
            </table>
            </td>
          </tr>
          <tr>
            <!-- actual web part content goes here -->
          </tr>
        </tbody>
    </table>

This table layout does not leave much room to add a flexible box layout.

The solution.

By using jQuery we can add extra <div> elements to each web part on the SharePoint page. We will use these extra <div> elements  to create a box arround the web part.

For simplicity sake I have put all the needed files together in a folder “boxdemo”. I simply copied these files to the ‘_layouts\styles\’ folder of my SharePoint hive.

Note: putting your files in a folder on the SharePoint server harddrive is not best practice! But for tutorial purposes this will do :-) .  Always use a SharePoint feature when deploying files to a SharePoint server.

The actual box around the web part will be created by simple images. You can use this website to generate the desired images.

For this solution we will need 6 images

  1. l.png   (left image)
  2. r.png (right image)
  3. t.png (top image)
  4. b.png (bottom image)
  5. tl.png   (top left image)
  6. bl.png  (bottom left image)

And also 2 extra files. A stylesheet and a javascript file. you can already create these and leave them empty for now.

  1. style.css
  2. boxing.js

We will add code to these empty files later on.

Adjust your master page

In order to make the boxing work we need to add 3 links to our master page. These links points to the jQuery library, our styling file and our JavaScript file.

Open your master page and add the following links to the <HEAD> section of your master page:

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script>
    <script src="/_layouts/Styles/boxdemo/boxing.js" type="text/javascript"></script>
    <link rel="stylesheet" type="text/css" href="/_layouts/Styles/boxdemo/style.css" media="screen" />

I use the jQuery hosted at googleapis.com. In corporate environments this domain is sometimes blocked. If this is the case you should download the jQuery library and put it in the _layouts\styles folder together with the other files.

Javascript

To dynamically add the extra <div> elements arround your webparts we will need a piece of javascript.

Open the (empty) boxing.js file you created earlier and add the following code

/* Add extra div arround webparts so they can be styled with a box. */
$(document).ready(
    function RoundWebPartHeader() {
        $(".s4-wpTopTable").each(function () {
            $(this).addClass("wp-head-round")
            .wrap('<div class=\"box-wp-dialog\">')
            .wrap('<div class=\"box-wp-content\">')
            .wrap(' <div class=\"innerbox\">')
            .parents("div:first").parents("div:first").parents("div:first").prepend('<div class=\"top\"><span>&nbsp;</span></div>')
            .append('<div class=\"bottom\"><span>&nbsp;</span></div>')
        });
    }
);

This JavaScript uses jQuery to find all HTML elements with the css class “s4-wpTopTable”.  By default this css class is assigned  to every web part on the page by SharePoint.

For each HTML element with css class “s4-wpTopTable” the code does the following :

  • adds a css class “wp-head-round”
  • wraps the web part in a <div> with class “box-wp-dialog”
  • wraps the web part again with a <div> with class “box-wp-content”
  • inside the <div> with class “box-wp-dialog”, a new <div class”top”> is added
  • inside the <div> with class “box-wp-dialog”, a new <div class”bottom”> is added

When this is done the SharePoint web part will be encapsulated by various <div> elements.
And the HTML will look like this

<div class="box-wp-dialog">
  <div class="top">
     <span>&nbsp;</span>
  </div>
  <div class="box-wp-content">
    <div class="innerbox">
      <! -- The webpart table HTML is included here -->
      <table cellspacing="0" cellpadding="0" border="0" width="100%" class="s4-wpTopTable">
      </table>
    </div>
  </div>
  <div class="bottom">
    <span>&nbsp;</span>
  </div>
</div>

Go ahead and try it out. Visually there will be no changes (yet). But the extra <div> should be there in the HTML. Keep in mind that the extra HTML elements  are added dynamically on the client side. You will not see these new HTML elements in the source of the page. You need to inspect the HTML with FireBug or with the “Internet Explorer Developer Tools” (F12)

Styling

So now that you have the (extra) <div> elements in our HTML, we can focus on actually styling and creating the box. The last step in our tutorial.

Open the (empty) style.css file and add the following css code.

.box-wp-dialog .top
{
  background-image:url(/_layouts/Styles/boxdemo/tl.png);
  background-repeat: no-repeat;
  background-position: left top;
  height: 12px;padding: 0px 0px 0px 10px;
}
.box-wp-dialog .top span
{
  background-image:url(/_layouts/Styles/boxdemo/t.png);
  background-repeat: no-repeat;
  background-position: right top;
  width: 100%;height: 12px;float:  left;
}

.box-wp-dialog .bottom
{
  background:url(/_layouts/Styles/boxdemo/bl.png) no-repeat left bottom;
  height: 10px;
  padding-left:15px;
}

.box-wp-dialog .bottom span
{
  background:url(/_layouts/Styles/boxdemo/b.png) no-repeat right bottom;
  height: 10px;
  display:block;
}

.box-wp-dialog  .box-wp-content
{
  background: url(/_layouts/Styles/boxdemo/l.png) repeat-y top left;
  padding-left: 2px;
}

.box-wp-dialog  .box-wp-content .innerbox
{
  background: url(/_layouts/Styles/boxdemo/r.png) repeat-y top right;
  background-color: #FFFFFF;
  padding: 5px 5px 0px 10px;
}

This CSS code simply defines the correct background images on our web part to create the illusion of a box.  Save the file and reload your page. Make sure your browser is not using a cached copy.

You should see something similar to this

 

You can change the images to the desired color. Play around with the height, padding, etc…

Happy coding…

Read Full Post »

The new Ribbon functionality in SharePoint 2010 can cause some frustration when creating custom master pages. The trick is to develop a master page with the ribbon always on top of your page without losing functionality and keep the content scrolling working correctly. Sometimes the scroll bars seems to grow outside the browser window leaving the end-user unable to scroll to the bottom of the page. Chances are that you forgot some HTML in the master page.

How does it work?

SharePoint 2010 fixes the Ribbon to the top of the page using CSS.  In order to display the scroll bars correctly a JavaScript runs to update the height of certain HTML elements. It does this by dynamically adding the style attribute to the targeted HTML tag. So in order the have a fixed ribbon with correct scrolling content you need:

  • JavaScript to calculate content height
  • A <div> element containing the ribbon
  • A <div> element containing the actual SharePoint content
  • Some CSS to hide / display the correct scroll bars

Luckily most of this functionality is already build-in in SharePoint 2010. You need to make sure that when creating a custom master page you include the correct HTML elements and JavaScript pieces. Here is how.

Adjust the master page.

For this tutorial I assume you are confident with HTML, you know what a master page is and how to edit a CSS file in a SharePoint environment.

Open your master page and look for the body tag. Add the attributes scroll=”no” and class=”v4master” to the body tag. So you get the following.

<body scroll=”noonload=”...” class=”v4master>

Leave the onload attribute as is.

Next make sure that in your HTML you have a <div> element to contain the ribbon. Do this by adding the following HTML element to your master page.

<div id=”s4-ribbonrowclass=”s4-pr s4-ribbonrowhidetitle>

If SharePoint finds this <div> element it will inject the Ribbon at this place.
Immediately after the closing tag of the above <div> ,  add the following div elements.

<div id=”s4-workspace>
   <div id=”s4-bodyContainer> 

      <!-- Your content goes here -->

   </div>
</div>

The s4-bodyContainer will be your main working pane. Add all your layout code, navigation, webpartzones, SharePoint controls, etc… go in this div element.
Finally you need to add the JavaScript that will dynamically calculate the height of the s4-workspace. Do this by adding the following JavaScipt code in the <HEAD> of your master page

<script type=”text/javascript>
var _fV4UI = true;
</script>

To be correct: this is not actually a script. You just declare a variable. The _fV4UI indicates  to SharePoint that the page is a version 4 type master page ( version 4 =  SharePoint 2010 master pages).

The CSS.

All the necessary elements for your fixed ribbon, scrolling content SharePoint page are now in place.  Add these CSS styles to display or hide the scroll bars on the correct <div> elements.

body #s4-ribbonrow {
     background-color: lime;
     overflow-y: hidden;
     min-height: 43px;
}

body s4-workspace {
   overflow-y: scroll;
   overflow-x: hidden;
}
body #s4-bodyContainer {
   width: 760px;
}

I added a fancy green color to the ribbon to make the changes more visible. Play a little with the CSS until you are satisfied with the result.

Happy branding..

Read Full Post »

Follow

Get every new post delivered to your Inbox.