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%;
}
+ }
}