diff --git a/src/balloon.less b/src/balloon.less index e60be9d..fe6ed47 100644 --- a/src/balloon.less +++ b/src/balloon.less @@ -12,73 +12,79 @@ // ----------------------------------------- .mixin-svg-arrow(@width, @height, @degrees) { - @arrow-width: @width * 2; - @arrow-height: @height * 2; - @svg-arrow: ~''; - @-svg-code: escape(~'@{svg-arrow}'); - background: url('data:image/svg+xml;charset=utf-8,@{-svg-code}') no-repeat; - background-size: 100% auto; - height: @height; - width: @width; + @arrow-width: @width * 2; + @arrow-height: @height * 2; + @svg-arrow: ~''; + @-svg-code: escape(~'@{svg-arrow}'); + background: url('data:image/svg+xml;charset=utf-8,@{-svg-code}') no-repeat; + background-size: 100% auto; + height: @height; + width: @width; } .svg-arrow(@color, @position) { - & when (@position = up) { - @width: @balloon-arrow-size * 3; - @height: @balloon-arrow-size; - @degrees: 0; - .mixin-svg-arrow(@width, @height, @degrees); - } - & when (@position = down) { - @width: @balloon-arrow-size * 3; - @height: @balloon-arrow-size; - @degrees: 180 18 6; - .mixin-svg-arrow(@width, @height, @degrees); - } - & when (@position = left) { - @width: @balloon-arrow-size; - @height: @balloon-arrow-size * 3; - @degrees: -90 18 18; - .mixin-svg-arrow(@width, @height, @degrees); - } - & when (@position = right) { - @width: @balloon-arrow-size; - @height: @balloon-arrow-size * 3; - @degrees: 90 6 6; - .mixin-svg-arrow(@width, @height, @degrees); - } + & when (@position = up) { + @width: @balloon-arrow-size * 3; + @height: @balloon-arrow-size; + @degrees: 0; + .mixin-svg-arrow(@width, @height, @degrees); + } + & when (@position = down) { + @width: @balloon-arrow-size * 3; + @height: @balloon-arrow-size; + @degrees: 180 18 6; + .mixin-svg-arrow(@width, @height, @degrees); + } + & when (@position = left) { + @width: @balloon-arrow-size; + @height: @balloon-arrow-size * 3; + @degrees: -90 18 18; + .mixin-svg-arrow(@width, @height, @degrees); + } + & when (@position = right) { + @width: @balloon-arrow-size; + @height: @balloon-arrow-size * 3; + @degrees: 90 6 6; + .mixin-svg-arrow(@width, @height, @degrees); + } } .transition(@args) { - -webkit-transition: @args; - transition: @args; + -webkit-transition: @args; + transition: @args; } .transform (@val) { - -webkit-transform: @val; - -ms-transform: @val; - transform: @val; + -webkit-transform: @val; + -ms-transform: @val; + transform: @val; } .transform-origin(@val) { - -webkit-transform-origin: @val; - -ms-transform-origin: @val; - transform-origin: @val; + -webkit-transform-origin: @val; + -ms-transform-origin: @val; + transform-origin: @val; } .opacity(@trans) { - @multiply: @trans * 100; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=@{multiply})"; - filter: alpha(opacity=@multiply); - -khtml-opacity: @trans; - -moz-opacity: @trans; - opacity: @trans; + @multiply: @trans * 100; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=@{multiply})"; + filter: alpha(opacity=@multiply); + -khtml-opacity: @trans; + -moz-opacity: @trans; + opacity: @trans; } .base-effects() { - .opacity(0); - pointer-events: none; - .transition(all .18s ease-out .18s); + .opacity(0); + pointer-events: none; + .transition(all .18s ease-out .18s); +} + +.no-effects() { + .opacity(0); + pointer-events: none; + .transition(none); } @@ -88,141 +94,148 @@ // IE 11 button bugfix button[data-balloon] { - overflow: visible; + overflow: visible; } [data-balloon] { - position: relative; // alt. absolute or fixed - - // Fixing iOS Safari event issue. - // More info at: https://goo.gl/w8JF4W - cursor: pointer; - + position: relative; // alt. absolute or fixed + + // Fixing iOS Safari event issue. + // More info at: https://goo.gl/w8JF4W + cursor: pointer; + + &:before, + &:after { + .base-effects(); + bottom: 100%; + left: 50%; + position: absolute; + z-index: 10; + .transform(translate(-50%, 10px)); + .transform-origin(top); + } + &:after { + background: @balloon-bg; + border-radius: @balloon-font-size / 3; + color: #fff; + content: attr(data-balloon); + font-size: @balloon-font-size; + padding: .5em 1em; + white-space: nowrap; + margin-bottom: @balloon-arrow-size + 5; + } + &:before { + .svg-arrow(@balloon-bg, up); + content: ""; + margin-bottom: @balloon-arrow-size - 1; + } + &:hover, &[data-balloon-visible] { &:before, &:after { - .base-effects(); - bottom: 100%; - left: 50%; - position: absolute; - z-index: 10; - .transform(translate(-50%, 10px)); - .transform-origin(top); - } - &:after { - background: @balloon-bg; - border-radius: @balloon-font-size / 3; - color: #fff; - content: attr(data-balloon); - font-size: @balloon-font-size; - padding: .5em 1em; - white-space: nowrap; - margin-bottom: @balloon-arrow-size + 5; - } - &:before { - .svg-arrow(@balloon-bg, up); - content: ""; - margin-bottom: @balloon-arrow-size - 1; - } - &:hover, &[data-balloon-visible] { - &:before, - &:after { - .opacity(1); - pointer-events: auto; - .transform(translate(-50%, 0)); - } + .opacity(1); + pointer-events: auto; + .transform(translate(-50%, 0)); } + } - &.font-awesome:after { - font-family: FontAwesome; - } + &.font-awesome:after { + font-family: FontAwesome; + } - &[data-balloon-break] { - &:after { - white-space: pre; - } + &[data-balloon-break] { + &:after { + white-space: pre; } + } +} + +[data-balloon-blunt] { + &:before, + &:after { + .no-effects(); + } } [data-balloon-pos="down"] { + &:before, + &:after { + bottom: auto; + left: 50%; + top: 100%; + .transform(translate(-50%, -10px)); + } + &:after { + margin-top: @balloon-arrow-size + 5; + } + &:before { + .svg-arrow(@balloon-bg, down); + margin-top: @balloon-arrow-size - 1; + margin-bottom: 0; + } + &:hover, &[data-balloon-visible] { &:before, &:after { - bottom: auto; - left: 50%; - top: 100%; - .transform(translate(-50%, -10px)); - } - &:after { - margin-top: @balloon-arrow-size + 5; - } - &:before { - .svg-arrow(@balloon-bg, down); - margin-top: @balloon-arrow-size - 1; - margin-bottom: 0; - } - &:hover, &[data-balloon-visible] { - &:before, - &:after { - .transform(translate(-50%, 0)); - } + .transform(translate(-50%, 0)); } + } } [data-balloon-pos="left"] { + &:before, + &:after { + bottom: auto; + left: auto; + right: 100%; + top: 50%; + .transform(translate(10px, -50%)); + } + &:after { + margin-right: @balloon-arrow-size + 5; + } + &:before { + .svg-arrow(@balloon-bg, left); + margin-right: @balloon-arrow-size - 1; + margin-bottom: 0; + } + &:hover, &[data-balloon-visible] { &:before, &:after { - bottom: auto; - left: auto; - right: 100%; - top: 50%; - .transform(translate(10px, -50%)); - } - &:after { - margin-right: @balloon-arrow-size + 5; - } - &:before { - .svg-arrow(@balloon-bg, left); - margin-right: @balloon-arrow-size - 1; - margin-bottom: 0; - } - &:hover, &[data-balloon-visible] { - &:before, - &:after { - .transform(translate(0, -50%)); - } + .transform(translate(0, -50%)); } + } } [data-balloon-pos="right"] { + &:before, + &:after { + bottom: auto; + left: 100%; + top: 50%; + .transform(translate(-10px, -50%)); + } + &:after { + margin-left: @balloon-arrow-size + 5; + } + &:before { + .svg-arrow(@balloon-bg, right); + margin-bottom: 0; + margin-left: @balloon-arrow-size - 1; + } + &:hover, &[data-balloon-visible] { &:before, &:after { - bottom: auto; - left: 100%; - top: 50%; - .transform(translate(-10px, -50%)); - } - &:after { - margin-left: @balloon-arrow-size + 5; - } - &:before { - .svg-arrow(@balloon-bg, right); - margin-bottom: 0; - margin-left: @balloon-arrow-size - 1; - } - &:hover, &[data-balloon-visible] { - &:before, - &:after { - .transform(translate(0, -50%)); - } + .transform(translate(0, -50%)); } + } } :after { - [data-balloon-length]& { white-space: normal; } - [data-balloon-length="small"]& { width: 80px; } - [data-balloon-length="medium"]& { width: 150px; } - [data-balloon-length="large"]& { width: 260px; } - [data-balloon-length="xlarge"]& { width: 90vw; - @media screen and (min-width: 768px) { width: 380px; } - } - [data-balloon-length="fit"]& { width: 100%; } + [data-balloon-length]& { white-space: normal; } + [data-balloon-length="small"]& { width: 80px; } + [data-balloon-length="medium"]& { width: 150px; } + [data-balloon-length="large"]& { width: 260px; } + [data-balloon-length="xlarge"]& { width: 90vw; + @media screen and (min-width: 768px) { width: 380px; } + } + [data-balloon-length="fit"]& { width: 100%; } } diff --git a/src/balloon.scss b/src/balloon.scss index 83da17e..5ff0d65 100644 --- a/src/balloon.scss +++ b/src/balloon.scss @@ -13,26 +13,26 @@ $balloon-arrow-height: 6px; @mixin svg-arrow ($color, $position: up) { - $degrees: 0; - $height: 6px; - $width: 18px; - - @if ($position == down) { - $degrees: 180 18 6; - } @else if ($position == left) { - $degrees: -90 18 18; - $width: 6px; - $height: 18px; - } @else if ($position == right) { - $degrees: 90 6 6; - $width: 6px; - $height: 18px; - } - - background: no-repeat url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http://www.w3.org/2000/svg%22%20width%3D%22#{$width * 2}%22%20height%3D%22#{$height * 2}%22%3E%3Cpath%20fill%3D%22#{$color}%22%20transform%3D%22rotate(#{$degrees})%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E'); - background-size: 100% auto; - width: $width; - height: $height; + $degrees: 0; + $height: 6px; + $width: 18px; + + @if ($position == down) { + $degrees: 180 18 6; + } @else if ($position == left) { + $degrees: -90 18 18; + $width: 6px; + $height: 18px; + } @else if ($position == right) { + $degrees: 90 6 6; + $width: 6px; + $height: 18px; + } + + background: no-repeat url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http://www.w3.org/2000/svg%22%20width%3D%22#{$width * 2}%22%20height%3D%22#{$height * 2}%22%3E%3Cpath%20fill%3D%22#{$color}%22%20transform%3D%22rotate(#{$degrees})%22%20d%3D%22M2.658,0.000%20C-13.615,0.000%2050.938,0.000%2034.662,0.000%20C28.662,0.000%2023.035,12.002%2018.660,12.002%20C14.285,12.002%208.594,0.000%202.658,0.000%20Z%22/%3E%3C/svg%3E'); + background-size: 100% auto; + width: $width; + height: $height; } @mixin transition ($args...) { @@ -66,9 +66,15 @@ $balloon-arrow-height: 6px; } @mixin base-effects () { - @include opacity(0); - pointer-events: none; - @include transition(all .18s ease-out .18s); + @include opacity(0); + pointer-events: none; + @include transition(all .18s ease-out .18s); +} + +@mixin no-effects () { + @include opacity(0); + pointer-events: none; + @include transition(none); } @@ -78,208 +84,215 @@ $balloon-arrow-height: 6px; // IE 11 button bugfix button[data-balloon] { - overflow: visible; + overflow: visible; } [data-balloon] { - position: relative; // alt. absolute or fixed + position: relative; // alt. absolute or fixed + + // Fixing iOS Safari event issue. + // More info at: https://goo.gl/w8JF4W + cursor: pointer; + + &:after { + @include base-effects(); + + background: $balloon-bg; + border-radius: 4px; + color: #fff; + content: attr(data-balloon); + font-size: $balloon-base-size + 2; + padding: .5em 1em; + position: absolute; + white-space: nowrap; + z-index: 10; + } + + &:before { + @include svg-arrow($balloon-bg); + @include base-effects(); + + content: ''; + position: absolute; + z-index: 10; + } + + &:hover, &[data-balloon-visible] { + &:before, + &:after { + @include opacity(1); + pointer-events: auto; + } + } + + &.font-awesome:after { + font-family: FontAwesome; + } + + &[data-balloon-break] { + &:after { + white-space: pre; + } + } + + &[data-balloon-blunt] { + &:before, + &:after { + @include no-effects(); + } + } + + &[data-balloon-pos="up"] { + &:after { + bottom: 100%; + left: 50%; + margin-bottom: 5px + $balloon-arrow-height; + @include transform(translate(-50%, 10px)); + @include transform-origin(top); + } + &:before { + bottom: 100%; + left: 50%; + margin-bottom: 5px; + @include transform(translate(-50%, 10px)); + @include transform-origin(top); + } + + &:hover, &[data-balloon-visible] { + &:after { + @include transform(translate(-50%, 0)); + } + + &:before { + @include transform(translate(-50%, 0)); + } + } - // Fixing iOS Safari event issue. - // More info at: https://goo.gl/w8JF4W - cursor: pointer; + } + &[data-balloon-pos='down'] { &:after { - @include base-effects(); - - background: $balloon-bg; - border-radius: 4px; - color: #fff; - content: attr(data-balloon); - font-size: $balloon-base-size + 2; - padding: .5em 1em; - position: absolute; - white-space: nowrap; - z-index: 10; + left: 50%; + margin-top: 5px + $balloon-arrow-height; + top: 100%; + @include transform(translate(-50%, -10px)); } &:before { - @include svg-arrow($balloon-bg); - @include base-effects(); + @include svg-arrow($balloon-bg, 'down'); - content: ''; - position: absolute; - z-index: 10; + left: 50%; + margin-top: 5px; + top: 100%; + @include transform(translate(-50%, -10px)); } &:hover, &[data-balloon-visible] { - &:before, - &:after { - @include opacity(1); - pointer-events: auto; - } + &:after { + @include transform(translate(-50%, 0)); + } + + &:before { + @include transform(translate(-50%, 0)); + } } + } - &.font-awesome:after { - font-family: FontAwesome; + &[data-balloon-pos='left'] { + &:after { + margin-right: 5px + $balloon-arrow-height; + right: 100%; + top: 50%; + @include transform(translate(10px, -50%)); } - &[data-balloon-break] { - &:after { - white-space: pre; - } + &:before { + @include svg-arrow($balloon-bg, 'left'); + + margin-right: 5px; + right: 100%; + top: 50%; + @include transform(translate(10px, -50%)); } - &[data-balloon-pos="up"] { - &:after { - bottom: 100%; - left: 50%; - margin-bottom: 5px + $balloon-arrow-height; - @include transform(translate(-50%, 10px)); - @include transform-origin(top); - } - &:before { - bottom: 100%; - left: 50%; - margin-bottom: 5px; - @include transform(translate(-50%, 10px)); - @include transform-origin(top); - } - - &:hover, &[data-balloon-visible] { - &:after { - @include transform(translate(-50%, 0)); - } - - &:before { - @include transform(translate(-50%, 0)); - } - } + &:hover, &[data-balloon-visible] { + &:after { + @include transform(translate(0, -50%)); + } + &:before { + @include transform(translate(0, -50%)); + } } - &[data-balloon-pos='down'] { - &:after { - left: 50%; - margin-top: 5px + $balloon-arrow-height; - top: 100%; - @include transform(translate(-50%, -10px)); - } - - &:before { - @include svg-arrow($balloon-bg, 'down'); - - left: 50%; - margin-top: 5px; - top: 100%; - @include transform(translate(-50%, -10px)); - } - - &:hover, &[data-balloon-visible] { - &:after { - @include transform(translate(-50%, 0)); - } - - &:before { - @include transform(translate(-50%, 0)); - } - } + } + + &[data-balloon-pos='right'] { + &:after { + + left: 100%; + margin-left: 5px + $balloon-arrow-height; + top: 50%; + @include transform(translate(-10px, -50%)); } - &[data-balloon-pos='left'] { - &:after { - margin-right: 5px + $balloon-arrow-height; - right: 100%; - top: 50%; - @include transform(translate(10px, -50%)); - } - - &:before { - @include svg-arrow($balloon-bg, 'left'); - - margin-right: 5px; - right: 100%; - top: 50%; - @include transform(translate(10px, -50%)); - } - - &:hover, &[data-balloon-visible] { - &:after { - @include transform(translate(0, -50%)); - } - - &:before { - @include transform(translate(0, -50%)); - } - } + &:before { + @include svg-arrow($balloon-bg, 'right'); + left: 100%; + margin-left: 5px; + top: 50%; + @include transform(translate(-10px, -50%)); } - &[data-balloon-pos='right'] { - &:after { - - left: 100%; - margin-left: 5px + $balloon-arrow-height; - top: 50%; - @include transform(translate(-10px, -50%)); - } - - &:before { - @include svg-arrow($balloon-bg, 'right'); - - left: 100%; - margin-left: 5px; - top: 50%; - @include transform(translate(-10px, -50%)); - } - - &:hover, &[data-balloon-visible] { - &:after { - @include transform(translate(0, -50%)); - } - - &:before { - @include transform(translate(0, -50%)); - } - } + &:hover, &[data-balloon-visible] { + &:after { + @include transform(translate(0, -50%)); + } + + &:before { + @include transform(translate(0, -50%)); + } } + } - &[data-balloon-length='small'] { - &:after { - white-space: normal; - width: 80px; - } + &[data-balloon-length='small'] { + &:after { + white-space: normal; + width: 80px; } + } - &[data-balloon-length='medium'] { - &:after { - white-space: normal; - width: 150px; - } + &[data-balloon-length='medium'] { + &:after { + white-space: normal; + width: 150px; } + } - &[data-balloon-length='large'] { - &:after { - white-space: normal; - width: 260px; - } + &[data-balloon-length='large'] { + &:after { + white-space: normal; + width: 260px; } + } - &[data-balloon-length='xlarge'] { - &:after { - white-space: normal; - width: 380px; + &[data-balloon-length='xlarge'] { + &:after { + white-space: normal; + width: 380px; - @media screen and (max-width: 768px) { - white-space: normal; - width: 90vw; - } - } + @media screen and (max-width: 768px) { + white-space: normal; + width: 90vw; + } } + } - &[data-balloon-length='fit'] { - &:after { - white-space: normal; - width: 100%; - } + &[data-balloon-length='fit'] { + &:after { + white-space: normal; + width: 100%; } + } }