お遊びクオリティ

画像には効かないし、グラデーションにも効かないし、疑似要素にも効かないし……。

あと、実行後のstyle属性値がめちゃくちゃグロい!!

読める状態のソースコードは以下。

(function() {
	// スタイルのRGB文字列またはRGBA文字列から、RGBA値を配列で取得する関数
	var rgbaStringToRGBA = function(rgbaStr) {
		var rgba = rgbaStr.replace(/rgba?\(|\)|\s/g, '').split(',');
		if (rgba.length === 3) {
			rgba[3] = 1;
		}
		for (var i = 0; i < 4; ++i) {
			rgba[i] = Number(rgba[i]);
		}
		return rgba;
	};

	// RGBA値を反転させる関数
	var invertRGBA = function(rgba) {
		for (var i = 0; i < 3; ++i) {
			rgba[i] = 255 - rgba[i];
		}
		return rgba;
	};

	// 画面内の全要素を取得
	var elems = document.querySelectorAll('*');
	var newStyles = [];

	Array.prototype.forEach.call(elems, (elem) => {
		// 計算済みスタイルを取得
		var style = window.getComputedStyle(elem);
		var newStyle = {};
		for (var prop in style) {
			// 名前にcolorとつき、値がrgbで始まるスタイルだけ処理する
			if (prop.toLowerCase().indexOf('color') < 0) {
				continue;
			}
			var color = style[prop].toLowerCase();
			if (color.indexOf('rgb') === 0) {
				// スタイルの文字列からRGBA値を抽出
				var rgba = rgbaStringToRGBA(color);
				
				// html要素でbackgroundColorのα値がゼロだったら、不透明の白として扱う
				if (elem.tagName.toLowerCase() == 'html' && prop == 'backgroundColor' && rgba[3] == 0) {
					rgba[0] = rgba[1] = rgba[2] = 255;
					rgba[3] = 1;
				}

				// 色を反転してとっておく
				newStyle[prop] = 'rgba(' + invertRGBA(rgba).join(',') + ')';
			}
		}
		newStyles.push(newStyle);
	});

	// 反転した色を適用する (※全て色を作ってからまとめて反転しないと、親が反転したせいで子が再反転するので)
	Array.prototype.forEach.call(elems, (elem, i) => {
		var newStyle = newStyles[i];
		for (var prop in newStyle) {
			elem.style[prop] = newStyle[prop];
		}
	});
})();