READSPEAKER ENTERPRISE HIGHLIGHTING 2.5

Similar documents
CSS Cascading Style Sheets

Make a Website. A complex guide to building a website through continuing the fundamentals of HTML & CSS. Created by Michael Parekh 1

Welcome Please sit on alternating rows. powered by lucid & no.dots.nl/student

Cascading Style Sheets Level 2

Assignments (4) Assessment as per Schedule (2)

Introduction to WEB PROGRAMMING

CSS Selectors. element selectors. .class selectors. #id selectors

Chapter 3 Style Sheets: CSS

Session 3.1 Objectives Review the history and concepts of CSS Explore inline styles, embedded styles, and external style sheets Understand style

HTML and CSS a further introduction

Cascading Style Sheets (CSS)

CSS Cascading Style Sheets

CSS.

Using CSS for page layout

BIM222 Internet Programming

GIMP WEB 2.0 MENUS WEB 2.0 MENUS: HORIZONTAL NAVIGATION BAR CREATING AN HTML LIST

Chapter 1 Getting Started with HTML 5 1. Chapter 2 Introduction to New Elements in HTML 5 21

CSS: The Basics CISC 282 September 20, 2014

Introduction to Multimedia. MMP100 Spring 2016 thiserichagan.com/mmp100

Unit 10 - Client Side Customisation of Web Pages. Week 5 Lesson 1 CSS - Selectors

HTML & CSS. SWE 432, Fall 2017 Design and Implementation of Software for the Web

The internet is a worldwide collection of networks that link millions of computers. These links allow the computers to share and send data.

HTML + CSS. ScottyLabs WDW. Overview HTML Tags CSS Properties Resources

Web Engineering CSS. By Assistant Prof Malik M Ali

Zen Garden. CSS Zen Garden

Index. alt, 38, 57 class, 86, 88, 101, 107 href, 24, 51, 57 id, 86 88, 98 overview, 37. src, 37, 57. backend, WordPress, 146, 148

CSS. Shan-Hung Wu CS, NTHU

<style type="text/css"> <!-- body {font-family: Verdana, Arial, sans-serif} ***set font family for entire Web page***

How to lay out a web page with CSS

Block & Inline Elements

Tutorial 3: Working with Cascading Style Sheets

ADOBE 9A Adobe Dreamweaver CS4 ACE.

CSS THE M\SS1NG MANUAL. David Sawyer McFarland. POGUE PRESS" O'REILLr Beijing Cambridge Farnham Köln Paris Sebastopol Taipei Tokyo

Page Layout. 4.1 Styling Page Sections 4.2 Introduction to Layout 4.3 Floating Elements 4.4 Sizing and Positioning

The Benefits of CSS. Less work: Change look of the whole site with one edit

CSS مفاهیم ساختار و اصول استفاده و به کارگیری

Introduction to Web Tech and Programming

CSS: Cascading Style Sheets

8a. Cascading Style Sheet

2005 WebGUI Users Conference

Appendix D CSS Properties and Values

3.1 Introduction. 3.2 Levels of Style Sheets. - The CSS1 specification was developed in There are three levels of style sheets

- The CSS1 specification was developed in CSS2 was released in CSS2.1 reflects browser implementations

COPYRIGHTED MATERIAL. Contents. Chapter 1: Creating Structured Documents 1

Parashar Technologies HTML Lecture Notes-4

Using Advanced Cascading Style Sheets

ICT IGCSE Practical Revision Presentation Web Authoring


CMPT 165 INTRODUCTION TO THE INTERNET AND THE WORLD WIDE WEB

Reading 2.2 Cascading Style Sheets

Website Development with HTML5, CSS and Bootstrap

Table Basics. The structure of an table

The Importance of the CSS Box Model

CSS3 Basics. From & CSS Visual Dictionary Learning Curve Books, LLC

Downloads: Google Chrome Browser (Free) - Adobe Brackets (Free) -

Creating your first website Part 4: Formatting your page with CSS

Introduction to CSS. 2 Sep 13. Derek Peacock. An introduction to defining CSS style rules using tags, classes and ids.

Creating Web Pages with HTML-Level III Tutorials HTML 6.01

Styles, Style Sheets, the Box Model and Liquid Layout

Unveiling the Basics of CSS and how it relates to the DataFlex Web Framework

Session 4. Style Sheets (CSS) Reading & References. A reference containing tables of CSS properties

<body bgcolor=" " fgcolor=" " link=" " vlink=" " alink=" "> These body attributes have now been deprecated, and should not be used in XHTML.

CSS. Selectors & Measurments. Copyright DevelopIntelligence LLC

CSS: Cascading Style Sheets

ADDING CSS TO YOUR HTML DOCUMENT. A FEW CSS VALUES (colour, size and the box model)

Taking Fireworks Template and Applying it to Dreamweaver

Study Guide 2 - HTML and CSS - Chap. 6,8,10,11,12 Name - Alexia Bernardo

Text and Layout. Digital Multimedia, 2nd edition Nigel Chapman & Jenny Chapman Chapter 11. This presentation 2004, MacAvon Media Productions

CSS: Layout, Floats, and More

Getting Started with Eric Meyer's CSS Sculptor 1.0

CSS: formatting webpages

Creating a CSS driven menu system Part 1

GIMP WEB 2.0 MENUS. Web 2.0 Menus: Horizontal Navigation Bar with Dynamic Background Image

Using Dreamweaver. 6 Styles in Websites. 1. Linked or Imported Stylesheets. 2. Embedded Styles. 3. Inline Styles

CSS MOCK TEST CSS MOCK TEST III

Multimedia Systems and Technologies Lab class 6 HTML 5 + CSS 3

Using Dreamweaver CC. Logo. 4 Creating a Template. Page Heading. Page content in this area. About Us Gallery Ordering Contact Us Links

8/19/2018. Web Development & Design Foundations with HTML5. Learning Objectives (1 of 2) Learning Objectives (2 of 2)

CSS worksheet. JMC 105 Drake University

Creating Web Pages with SeaMonkey Composer

Creating a Website: Advanced Dreamweaver

COMM 2555: Interactive Digital Communication / Spring 2018 Lab 9: Basic layout techniques with CSS

Certified CSS Designer VS-1028

Web Designer s Reference

VISA/APCO/STAC 2P61 WEBSITE CREATION Fall Term 2012

Web Design and Implementation

FrontPage 2000 Tutorial -- Advanced

1 of 7 11/12/2009 9:29 AM

CS197WP. Intro to Web Programming. Nicolas Scarrci - February 13, 2017

Before you begin, make sure you have the images for these exercises saved in the location where you intend to create the Nuklear Family Website.

Cascading Style Sheets. Overview and Basic use of CSS

Dreamweaver CS5 Lab 2

To link to an external stylesheet, the link element is placed within the head of the html page:

APPLIED COMPUTING 1P01 Fluency with Technology

COMS 359: Interactive Media

Tutorial 4: Creating Special Effects with CSS

Module 2 (VII): CSS [Part 4]

INTRODUCTION TO CSS. Mohammad Jawad Kadhim

Dreamweaver CS3 Lab 2

Web Design and Development Tutorial 03

Transcription:

READSPEAKER ENTERPRISE HIGHLIGHTING 2.5 Advanced Skinning Guide Introduction The graphical user interface of ReadSpeaker Enterprise Highlighting is built with standard web technologies, Hypertext Markup Language (HTML), Cascading Style Sheets (CSS) and JavaScript. Therefore, it is very simple to create a customized version of the player, for example to make it match your organization s graphical profile. This guide is intended for web developers, and assumes that you have previous experience of the aforementioned web technologies. Getting started This is a simple step-by-step guide that explains the overall process of creating and implementing a new skin. In the chapters that follow we will explain each step more indepth. 1. Setup the folder structure This is the recommended way of structuring your skin files. You are not required to follow it, but doing so will make it easier to follow this guide. Create a new folder that will contain your skin files, i.e. JavaScript, CSS as well as images or any other skin-related files. Use only alphanumeric characters and capitalize the initial letter of each new word. Omit spaces. Ex. MyNewReadSpeakerSkin Inside the new folder, create two empty text files: o A CSS file. Example: MyNewReadSpeakerSkin.css o A JavaScript file. Example: MyNewReadSpeakerSkin.js 2. Add reference to your skin files Add links to your skin files from the page/template where you want use ReadSpeaker. These references should go in the HEAD section of the HTML page. If you have made inline configurations using the rsconf object, it is important that you include the references AFTER the inline configuration. ReadSpeaker, The Voice of the Web! Page 1 of 18

Example: <head>... <script type= text/javascript > <!-- // Inline ReadSpeaker configuration window.rsconf = {... //--> </script> <link rel= stylesheet type= text/css href= MyNewReadSpeakerSkin/MyNewReadSpeakerSkin.css /> <script type= text/javascript src= MyNewReadSpeakerSkin/MyNewReadSpeakerSkin.js ></script>... </head> Note that the code might have to look different depending on which document type you are using. All examples in this document assume that XHTML 1.0 Strict is being used. 3. Add the CSS class to the configuration Your JavaScript skin file should set the name of the CSS class that your skin is built on. The JavaScript skin file should contain at least the following code: if (! window.rsconf) { window.rsconf = {; if (! window.rsconf.ui) { window.rsconf.ui = {; window.rsconf.ui.rsbtnclass = 'MyNewReadSpeakerSkin'; The first two lines are there to make sure that the configuration object is set up correctly. The third line tells ReadSpeaker which class to look for when rendering the skin. 4. Change the listen button s code The listen button s code contains several CSS classes. If you want to use a custom skin, you need to replace the class rsbtn with whatever name your skin uses as its base class. Based on the example in step 3, your class name should be: MyNewReadSpeakerSkin. Example: <div id="readspeaker_button" class="rsbtn rs_skip rs_preserve"> <a class="rsbtn_play"... </div> ReadSpeaker, The Voice of the Web! Page 2 of 18

Should then be: <div id="readspeaker_button" class="mynewreadspeakerskin rs_skip rs_preserve"> <a class="rsbtn_play"... </div> The Anatomy of the Player The player mainly consists of two parts: 1. The Listen button. This is the link that activates the speech. It is visible when the page is first loaded. 2. The Expanding area also referred to as the player area. This is where the playback controls are located. The Listen button This is the markup for the listen button (shortened): <div id="auniqueid" class="rsbtn rs_skip rs_preserve"> <a class="rsbtn_play" accesskey="l" title="title" href="..."> <span class="rsbtn_left rsimg rspart"> <span class="rsbtn_text"> <span>listen <span class="rsbtn_right rsimg rsplay rspart"> </div> Our recommendation is that the markup for the listen button remains unchanged, except for the rsbtn class of the outer DIV. This is how the listen button in the default skin maps against the code above: ReadSpeaker, The Voice of the Web! Page 3 of 18

The expanding area When the service has been started the markup for the expanding area is automatically injected and the code then looks like this (shortened): <div id="auniqueid" class="rs_skip rsbtn rs-no-touch rsexpanded rsplaying"> <a class="rsbtn_play" accesskey="l" title="title" href="..."> <span class="rsbtn_left rsimg rspart"> <span class="rsbtn_text"><span>listen <span class="rsbtn_right rsimg rsplay rspart"> <span class="rsbtn_exp rsimg rspart"> <a class="rsbtn_pause rsimg rspart" href="..."> <span class="rsbtn_btnlabel">play <a class="rsbtn_stop rsimg rspart" href="..."> <span class="rsbtn_btnlabel">stop <span class="rsbtn_player rsimg rspart"> <span class="rsbtn_progress_container rsimg rsplaypart"> <span class="rsbtn_progress_played rsimg" > <span class="rsbtn_progress_handle rsimg"> <a href="..." class="keylink"> <a class="rsbtn_volume rsimg rsplaypart" href="..."> <span class="rsbtn_btnlabel">volume <span class="rsbtn_volume_container rsimg"> <span class="rsbtn_volume_slider"> <span class="rsbtn_volume_handle rsimg"> <a href="..." class="keylink"> <a class="rsbtn_settings rsimg rsplaypart" href="..."> <span class="rsbtn_btnlabel">settings <a class="rsbtn_dl rsimg rsplaypart" href="..."> <span class="rsbtn_btnlabel">no Sound? <a class="rsbtn_closer rsimg rspart" href="..."> <span class="rsbtn_btnlabel">close <span class="rsbtn_powered rsimg"> <span class="rsbtn_btnlabel">speech enabled by <a href="...">readspeaker </div> ReadSpeaker, The Voice of the Web! Page 4 of 18

The green area represents the classes assigned to the outer container. The yellow section is the code that is inserted when player is expanded. The classes that need to remain unchanged have been marked in bold. The elements that have these classes will represent buttons and other functionality in the player and will automatically be assigned the necessary event-handlers. In addition to the reserved classes mentioned above, there is also.rsbtn_current_time and.rsbtn_total_time. Any elements that have these classes will be updated with the player s current time and the total time that has been buffered so far. The updates happen every 0.5 seconds, while the audio is playing. The format of the time labels will be hh:mm:ss, e.g. 01:35:02. Here is an overview of the classes and their respective functions in the default skin: The code for the expanding area can be customized using the public configuration API. The path should be rsconf.ui.player. See the next chapter for more information on how to change this code. Player CSS Classes The outer container will be assigned different classes (the green area in the code block above) depending on the current state of the player. These classes can be used to change the appearance of the player using CSS. rsexpanded - This is added when the player is expanded, ie the user clicks on the listen button. Tip: Use this class to determine whether the expanding area, rsbtn_exp, should be visible or not. rsplaying - The player is currently playing audio. rspaused - The player has been paused. ReadSpeaker, The Voice of the Web! Page 5 of 18

rsstopped - The player was previously playing or paused, but has now been stopped. rs-no-touch - This class is added to all browsers except on ios devices. Tip: Use this class to disable :hover pseudo-classes on ios to avoid multiple clicks to activate player buttons. rsfloating - This class is assigned to the outer container when the expanding area is not adjacent to the listen button. This happens when using non-standard implementation code for the listen button, e.g. when using Highlighting 1.x implementation code with Highlighting 2.5. rsimg - This class is added to all elements that are expected to be visible. Tip: The existence of this class facilitates the use of CSS sprites. Note: The same classes will be used for the popup player. The Javascript file As mentioned earlier, the JavaScript file needs these two of lines of code to work: if (! window.rsconf) { window.rsconf = {; if (! window.rsconf.ui) { window.rsconf.ui = {; These two lines make sure that the configuration object exists before we start to make changes to it. Therefore they must be placed at the very beginning of the file. Note: You will have to add a conditional statement for every sub-section of the rsconf object that you will be changing. This is to prevent that any previous configurations get overwritten. Example: To change rsconf.general.usepost, you need to add: if (! window.rsconf.general) { window.rsconf.general = {; After this declaration you can change any setting in the general object in this way: window.rsconf.general.usepost = true; Apart from the graphical user interface, any configurable aspect of Enterprise Highlighting can be changed using this JavaScript file. See the ReadSpeaker Highlighting Configuration API reference for more information on how to do this. ReadSpeaker, The Voice of the Web! Page 6 of 18

Try to always update the lowest level of the configuration structure. It is better to override multiple settings inside the same element multiple times rather than updating the entire parent object at once. Example: window.rsconf.ui.player = [ ]; window.rsconf.ui.popupplayer = [ ]; is better than: window.rsconf.ui = { player: [], popupplayer: [] This is because additional properties might be added to the ui object in the future, and overriding the entire ui object might delete the added properties. Note that since the skin s JavaScript file should be referenced after any inline configurations, the changes made in it will override their counterparts in the inline configuration. In terms of the user interface and skinning, these properties are particularly relevant: rs.conf.ui.progresshandleclass - Defines the CSS class/es that will be added to the progress slider s drag handle element. Multiple classes should be separated by a space. If not set, it will default to horizontal. rsconf.ui.progressdir - This sets the direction in which the progress slider will be rendered. v for vertical and h for horizontal. rsconf.ui.volumehandleclass - This is the CSS class/es that will be added to the volume drag handle element. rsconf.ui.volumedir - The direction of the volume slider. v for vertical and h for horizontal. If omitted, it will default to vertical. rsconf.ui.player - This is an array that defines the markup of the player s expanding area. rsconf.ui.popupbutton - This is an array that defines the appearance of the popup button, that is displayed when the user selects text. rsconf.ui.popupplayer - An array that defines the player area of the popup player. ReadSpeaker, The Voice of the Web! Page 7 of 18

The CSS file The CSS file will look very different from one skin to another and there are not many limitations. However, there is one thing that is important to remember: All CSS definitions must start with the name of the skin s base class. In the example above (Gettings Started, section 3) we used MyNewReadSpeakerSkin as the base class. Example:.MyNewReadSpeakerSkin.rsbtn_exp.rsbtn_pause {.MyNewReadSpeakerSkin.rsbtn_exp.rsbtn_stop { Sample Skin Walkthrough In this section, we will go through the code of the sample skin which is included with this documentation. The sample skin looks something like this (at about 200% zoom): All necessary files can be found in the folder named ReadSpeakerSampleSkin: ReadSpeakerSampleSkin.css - The style definitions for this sample skin. ReadSpeakerSampleSkin.js - The skin JavaScript file. ReadSpeakerSampleSkin.png - The CSS sprite image we will be using for this sample skin. 1. The JavaScript file We have only included the absolutely necessary data in the JavaScript file to keep it as small and readable as possible. if (! window.rsconf) { window.rsconf = {; if (! window.rsconf.ui) { window.rsconf.ui = {; These two lines create the required objects, if they do not already exist. window.rsconf.ui.rsbtnclass = 'rsbtn_sampleskin'; ReadSpeaker, The Voice of the Web! Page 8 of 18

This line tells ReadSpeaker what the current skin is called, and which style definitions should be used. window.rsconf.ui.player = [ '<span class="rsbtn_box">', ' <a href="javascript:void(0);" class="rsbtn_pause rsimg rspart rsbutton" title="pause">', ' <span class="rsbtn_btnlabel">pause', ' ', ' <a href="javascript:void(0);" class="rsbtn_stop rsimg rspart rsbutton" title="stop">', ' <span class="rsbtn_btnlabel">stop', ' ', ' <span class="rsbtn_progress_container rspart">', ' <span class="rsbtn_progress_played">', ' ', ' <a href="javascript:void(0);" class="rsbtn_volume rsimg rspart rsbutton" title="volume">', ' <span class="rsbtn_btnlabel">volume', ' ', ' <span class="rsbtn_volume_container">', ' <span class="rsbtn_volume_slider">', ' ', ' <a href="javascript:void(0);" class="rsbtn_settings rsimg rspart rsbutton" title="settings">', ' <span class="rsbtn_btnlabel">settings', ' ', ' <a href="javascript:void(0);" class="rsbtn_closer rsimg rspart rsbutton" title="close player">', ' <span class="rsbtn_btnlabel">close', ' ', ' <span class="rsdefloat">', '' ]; This is the markup for the player. It is a simplified version of the default player. The classes that are automatically assigned functionality by ReadSpeaker have been marked in bold. In theory, you can omit any of the buttons as well as the outer slider containers from the markup. In practice, of course it does not make much sense to create a player without buttons. However, omitting certain buttons or the sliders might be a way to create a very easy-to-use player. The order in which the buttons and sliders appear is not important. You can also add additional elements to the markup to achieve the structure you want. Please note that if you want to use the sliders, all elements marked in bold must be included, not just the outer container. For the progress container this means that the ReadSpeaker, The Voice of the Web! Page 9 of 18

markup must include both the.rsbtn_progress_container and the.rsbtn_progress_played elements. In the sample skin we have omitted the rsconf.ui.popupbutton and rsconf.ui.popupplayer configuration settings. This means that we will use the default ones instead. 2. The Sample CSS File Let s go through the CSS file section by section. Explanations and comments follow after each code block. The container.rsbtn_sampleskin { position: relative; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 1.3em; float: left; border: 1px solid #ccc; We start off by defining the layout of the div container that hosts the listen button as well as the player. The position directive makes sure that all child elements are positioned relative to this container. The border needs to be defined here to ensure it surrounds both the player and the listen button. General classes.rsbtn_sampleskin a,.rsbtn_sampleskin span { position: relative; display: block; text-decoration: none; Here we tell the browser to treat a and span tags as block element, even though they are normally inline elements. The main difference between block and inline elements is that block elements occupy the entire width of their parent container, while inline elements can be placed on the same line. We prefer block style elements in the player because it is easier to control their position and dimensions. ReadSpeaker, The Voice of the Web! Page 10 of 18

.rsbtn_sampleskin.rsimg { background: transparent url(readspeakersampleskin.png) no-repeat scroll 0 0; We are going to use a CSS sprite for all bitmap graphics. With the definition above we make sure that all elements that have the rsimg class will use the sprite as a background image. The sprite image looks like this (background color has been added for visibility): Using the background-position directive we can select certain slices of the image by changing the offset. This example shows how the volume icon is selected by setting the vertical offset to - 70 pixels: In the above example the position was defined: background-position: 0-70px.rsbtn_sampleskin.rspart { float: left; margin-left: 2px; Since all span tags have been defined as block level elements they would normally occupy the entire width of the parent element. So in order to have them line up horizontally, we need to make them float. We use the class.rspart to control which elements should float. ReadSpeaker, The Voice of the Web! Page 11 of 18

.rsbtn_sampleskin.rsdefloat { clear: both; This class is used to make sure that the elements that come after the floated elements start on a separate line..rsbtn_sampleskin.rspart.rsbutton { background-color: #999; width: 18px; height: 18px; -moz-transition: background-color.2s ease; -webkit-transition: background-color.2s ease; -o-transition: background-color.2s ease; transition: background-color.2s ease; This class defines all buttons in our sample player. We want to make sure that they use the same dimensions and background color. The transitions are there to make the rollover effect a little smoother..rsbtn_sampleskin.rspart.rsbutton:hover { background-color: #aaa; We add a very subtle color effect when the mouse pointer hovers the buttons. Thanks to the transition directives in the.rsbutton definition, this effect is appears animated..rsbtn_sampleskin.rspart.rsbutton:active { background-color: #888; In the same way as above, using a pseudo selector (in this case :active), we create a color effect for when the buttons are pressed..rsbtn_sampleskin.rspart.rsbtn_btnlabel { display: none; In our graphical player we do not want the text labels to be visible. However, by including them in the markup and hiding them with CSS we make sure that they are still accessible to text-based browsers and assistive technology. ReadSpeaker, The Voice of the Web! Page 12 of 18

.rsbtn_sampleskin.rsbtn_box { margin: 1px; The.rsbtn_box element has been added to wrap all elements in the player so that we can add a margin between the elements and the containing element. The reason we use margin instead padding in the containing element is because we want to avoid problems caused by discrepancies between different box models. Playback control.rsbtn_sampleskin.rsbtn_play { float: left; margin: 1px 0;.rsbtn_sampleskin.rsbtn_left.rsbtn_text { background: transparent url(readspeakersampleskin.png) no-repeat scroll 0 0; padding-left: 20px; This defines the listen button and the listen icon. Since this is part of the implementation code that sits in the actual webpage we choose to not add the.rsimg class, but instead we redefine the background image. Our recommendation is to not change the markup of the listen button part, to prevent potential problems with future updates..rsbtn_sampleskin.rsbtn_exp.rsimg.rspart { background: none; float: left; display: none;.rsbtn_sampleskin.rsexpanded.rsbtn_exp.rsimg { display: block; The.rsbtn_exp container holds all elements in the expanded player area. The.rsexpanded class is automatically added to the outer container when the player opens. We use this class to determine whether or not the expanded area should be visible. ReadSpeaker, The Voice of the Web! Page 13 of 18

.rsbtn_sampleskin.rsbtn_pause { background-position: 0-34px;.rsbtn_sampleskin.rspaused.rsbtn_pause,.rsbtn_sampleskin.rsstopped.rsbtn_pause { background-position: 0-16px; This is the definition of the Play/Pause button (.rsbtn_pause). The first rule makes sure that the background image is correct. Then, we change the background image to display a play symbol when the player is in the paused (.rspaused) or stopped (.rsstopped) state, which we can see in the second rule. When the player is expanded, the play/pause toggle event will automatically be assigned to.rsbtn_pause..rsbtn_sampleskin.rsbtn_stop { background-position: 0-52px; This is the stop button (.rsbtn_stop). We make sure that the background image is correctly positioned. ReadSpeaker will assign the stop event to this element. Progress slider.rsbtn_sampleskin.rsbtn_progress_container { border: 1px solid #999; width: 50px; height: 8px; margin-top: 4px; margin-left: 4px; background-image: none;.rsbtn_sampleskin.rsbtn_progress_handle.rsimg { position: absolute; background-color: #666; top: -3px; left: -2px; width: 4px; height: 14px; background-image: none;.rsbtn_sampleskin.rsbtn_progress_played { position: absolute; height: 100%; background-color: #ccc; background-image: none; ReadSpeaker, The Voice of the Web! Page 14 of 18

The progress slider consists of four elements: The container,.rsbtn_progress_container. This is typically the area to which the drag handle is constrained. The drag handle,.rsbtn_progress_handle. This is a draggable handle that can be used to skip to different parts of the audio file. The drag handle s CSS-class can be changed using the JavaScript skin file: window.rsconf.ui.progresshandleclass = AClassName ; The keyboard activator,.keylink. This is an anchor tag which is used for activating the drag handle via the keyboard. It is usually not visible. The progressbar,.rsbtn_progress_played. This element can be used to visualize the current progress. Its width (expressed in percent) will be automatically updated every 500 milliseconds to reflect the current position in the audio stream. Note! Both the drag handle and the progressbar need to be positioned absolutely in order for them to work. When the drag handle (.rsbtn_progress_handle) is controlled by the keyboard, an additional class,.rskeycontrolled will be added to it. You can redefine this class in order to change the appearance of the drag handle to indicate that it is currently keyboard-controlled. In the same way, the class.dragged will be added to the drag handle when it is being dragged, either with the mouse or the keyboard. ReadSpeaker, The Voice of the Web! Page 15 of 18

Volume.rsbtn_sampleskin.rsbtn_volume { margin-left: 4px; background-position: 0-70px; We set the volume button s background position and add a little margin to make it symmetrical to the other buttons. Clicking this element will toggle the visibility of the volume slider container. Volume slider.rsbtn_sampleskin.rsbtn_volume_container { position: absolute; display: none; top: 100%; width: 16px; height: 40px; border: 1px solid #999; background: #fff;.rsbtn_sampleskin.rsbtn_volume_slider { width: 6px; height: 30px; margin: 5px; background: #ccc;.rsbtn_sampleskin.rsbtn_volume_handle.rsimg { position: absolute; top: -2px; left: -3px; width: 12px; height: 4px; background: #666; The volume slider s structure is similar to that of the progress slider, although the volume slider renders vertically by default. You need to take the direction into ReadSpeaker, The Voice of the Web! Page 16 of 18

consideration when defining the volume slider s styles. You can change the direction of the volume slider in the skin JavaScript file: window.rsconf.ui.volumedir = v h ; v for vertical and h for horizontal. We hide the container, because it will be made visible when the user clicks the volume button. We give the drag handle negative top and left values because we want the center of the handle to start at the top of the slider track. The ReadSpeaker user interface controller will take this into account when rendering the slider component. Note: Just like for the progress slider the drag handle must be positioned absolutely in order to work. The.rskeycontrolled and.dragged classes will be added to the drag handle (.rsbtn_volume_handle) in the same way as for the progress slider. See the Progress Slider section for more information about this. Settings Button.rsbtn_sampleskin.rsbtn_settings { background-position: 0-88px; This button opens the settings dialog. All we do in the CSS is to change the background position so that the right icon is displayed. Download Button In this sample skin we have chosen to not include the download button. If you want to include it in your skin, you can define it using this selector:.rsbtn_sampleskin.rsbtn_dl.rsimg { ReadSpeaker, The Voice of the Web! Page 17 of 18

Close Button.rsbtn_sampleskin.rsbtn_closer { margin-left: 4px; background-position: 0-106px; We add a little extra left margin and set the background position. The close player event will be automatically assigned to this element..rsbtn_sampleskin.rspopup { position: absolute; background: #fff; border: 1px solid #555; box-shadow: 0 0 5px #777; display: none; Finally, we add a rule that controls the popup button/popup player. The position statement is important in order to not disturb the document flow when the popup button is displayed. The box shadow is there to make the popup stand out from the rest of the page and make it more visible. ReadSpeaker, The Voice of the Web! Page 18 of 18