@function calculate-luminance($color) {
$r: math.div(color.channel($color, "red"), 255);
$g: math.div(color.channel($color, "green"), 255);
$b: math.div(color.channel($color, "blue"), 255);
// 計算方法の参考: https://www.w3.org/TR/WCAG22/#dfn-relative-luminance
$r: if($r < 0.04045, math.div($r, 12.92), math.pow(math.div(($r + 0.055), 1.055), 2.4));
$g: if($g < 0.04045, math.div($g, 12.92), math.pow(math.div(($g + 0.055), 1.055), 2.4));
$b: if($b < 0.04045, math.div($b, 12.92), math.pow(math.div(($b + 0.055), 1.055), 2.4));
@return 0.2126 * $r + 0.7152 * $g + 0.0722 * $b;
@function contrast-ratio($color1, $color2) {
$l1: calculate-luminance($color1);
$l2: calculate-luminance($color2);
// 計算方法の参考: https://www.w3.org/TR/WCAG22/#dfn-contrast-ratio
@return floor-to-2decimals(math.div(($l1 + 0.05), ($l2 + 0.05)));
@return floor-to-2decimals(math.div(($l2 + 0.05), ($l1 + 0.05)));
// コントラスト比がWCAGの達成基準を満たしているかチェックする関数
@function success-criterion($contrast) {
@if $contrast >= 7 { @return "AAA"; }
@else if $contrast >= 4.5 { @return "AA";}
@else if $contrast >= 3 { @return "AA (Large Text)"; }
@else { @return "Fail"; }
@function floor-to-2decimals($number) {
@return math.div(math.floor($number * $factor), $factor);
@mixin check-contrast($foreground, $background) {
$contrast-ratio: contrast-ratio($foreground, $background);
$accessibility: success-criterion($contrast-ratio);
@debug 'コントラスト比:#{$contrast-ratio} #{$accessibility}';
@include check-contrast(#ffffff, #bf4080); // 出力結果「コントラスト比:4.92 AA」