round-corner.js - 丸角ライブラリ

Nifty Corners: rounded corners without images By Alessandro Fulciniti

を参考にやってみたら結構シンプルな作りでできるのねん。 Grazie così tanto! Alessandro.


ポイントは

window.onload = function() {
    RoundCorner.apply( "divClass1","divClass2", "divClass3" );
}

というようなコードで丸角ができるっていうところです。
RoundCorner.applyの引数にはHTML要素のclassを好きなだけ並べてください。1個でも2個でもOK(上記は3個ね)。後は必要なスタイルを予め登録しておいて、スクリプトを2つ追加するだけです。

他のライブラリだと、色の指定をしなきゃなんないみたいなんですが、このスクリプトには必要ありません(bodyには色を指定しておかないといけないけど)。

以下スクリプトとサンプルのHTMLです。

sample-round-corner.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>round corner example</title>
<style type="text/css">
body{
    padding: 20px; 
    background-color: #FFFFFF; /* body's background-color is mandatory */
    font: 100.00% medium "MS UI Gothic",Arial,sans-serif
}
div { text-align: center }
div.divClass1{ margin: 5px 10%; background: #377CB1}
div.divClass2{ margin: 5px 10%; background: #9BD1FA}
div.divClass3{ margin: 5px 10%; background: #D1FA9B}
    
/** the following styles are usually provided in 'niftyCorners.css' */
.rtop,.rbottom{display:block}
.rtop *,.rbottom *{display:block;height: 1px;overflow: hidden}
.r1{margin: 0 5px}
.r2{margin: 0 3px}
.r3{margin: 0 2px}
.r4{margin: 0 1px;height: 2px}
.rs1{margin: 0 2px}
.rs2{margin: 0 1px}
</style>
<script language="JavaScript" type="text/javascript" src="prototype.js"></script>
<script language="JavaScript" type="text/javascript" src="/round-corner.js"></script>
<script language="JavaScript" type="text/javascript"><!--
    window.onload = function() {
        RoundCorner.apply( "divClass1","divClass2", "divClass3" );
    }
--></script>
</head>
<body>
    round corner example
    <div class="divClass1">
        This example is using just 2 libraries.
        <div class="divClass2">
            round-corner.js
            which is written by <a href="http://d.hatena.ne.jp/akm/">Akima-ta</a> and is another implementation of 
            <div class="divClass3">
                <a href="http://pro.html.it/esempio/nifty/">NiftyCorner By Alessandro Fulciniti</a> 
                Grazie cosi tanto!
            </div>
        </div>
        powered by 
        <div class="divClass2">
            <a href="http://prototype.conio.net/">prototype.js</a>
        </div>
    </div>
</body>
</html>


round-corner.js

/**
 * round-corner.js
 * 
 * require 
 *   prototype.js (1.4.0 - )
 * 
 * @author T.Akima
 * @copyright T.Akima
 * 
 * see also: NiftyCorner written by Alessandro Fulciniti
 * http://pro.html.it/esempio/nifty/
 */
RoundCorner = Class.create();
Object.extend( RoundCorner, {
    apply: function() {
        for(var i = 0; i < arguments.length; i++)
            this._apply( arguments[i] );
    },
    
    _apply: function( className ) {
        var elements = document.getElementsByClassName(className, document);
        for(var i = 0; i < elements.length; i++) {
            var element = elements[i];
            var elementBg = Element.getStyle(element, "background-color");
            var parentBg = this.getParentColor( element );
            new RoundCorner( element, elementBg , parentBg );
        }
    },
    
    getParentColor: function( element ) {
        var elementBg = Element.getStyle(element, "background-color");
        for(var current = element.parentNode; current != document; current = current.parentNode) {
            var currentBg = Element.getStyle(current, "background-color");
            if (elementBg != currentBg)
                return currentBg;
        }
        return elementBg;
    }
} );
RoundCorner.prototype = {
    initialize: function( element, innerColor, outerColor, size ) {
        this.element = element;
        this.innerColor = innerColor;
        this.outerColor = outerColor;
        this.size = size || null;
        this.addTopPart();
        this.addToBottom();
    },
    
    addTopPart: function() {
        var d = document.createElement("b");
        d.className="rtop";
        d.style.backgroundColor = this.outerColor;
        var cn = (this.size == "small") ? "rs" :"r";
        var lim = (this.size == "small") ? 2 : 4;
        for(var i=1; i <= lim; i++){
            var x = document.createElement("b");
            x.className = cn + i;
            x.style.backgroundColor = this.innerColor;
            d.appendChild(x);
        }
        this.element.insertBefore(d, this.element.firstChild);
    },
    
    addToBottom: function() {
        var d = document.createElement("b");
        d.className = "rbottom";
        d.style.backgroundColor = this.outerColor;
        var cn = (this.size == "small") ? "rs" :"r";
        var lim = (this.size == "small") ? 2 : 4;
        for(var i=lim; i>0; i--){
            var x = document.createElement("b");
            x.className = cn + i;
            x.style.backgroundColor = this.innerColor;
            d.appendChild(x);
        }
        this.element.appendChild(d, this.element.firstChild);
    }
}