Commit 6fcf6aec262df4ffc2f6bdb60212f6955506b373
1 parent
2c0a9da3
feat(popover): 优化组件
Showing
6 changed files
with
270 additions
and
251 deletions
Show diff stats
build/Common/Common.js
... | ... | @@ -59,5 +59,18 @@ angular.module("esNgAntd").service("esNgAntd", [ |
59 | 59 | document.body.appendChild(div); |
60 | 60 | $compile(div)(scope); |
61 | 61 | }; |
62 | + | |
63 | + this.getOffset = function (ele) { | |
64 | + if (!ele || ele.nodeType != 1) { | |
65 | + return; | |
66 | + } | |
67 | + | |
68 | + let rect = ele.getBoundingClientRect(); | |
69 | + let doc = ele.ownerDocument.documentElement; | |
70 | + return { | |
71 | + top: rect.top + window.pageYOffset - doc.clientTop, | |
72 | + left: rect.left + window.pageXOffset - doc.clientLeft, | |
73 | + }; | |
74 | + }; | |
62 | 75 | }, |
63 | 76 | ]); | ... | ... |
build/Popover/Popover.js
1 | 1 | import template from "./Popover.html"; |
2 | -angular.module("esNgAntd").directive("esPopover", function ($compile) { | |
3 | - return { | |
4 | - controllerAs: "esPopover", | |
5 | - restrict: "E", | |
6 | - transclude: true, | |
7 | - replace: true, | |
8 | - scope: { | |
9 | - title: "@", | |
10 | - content: "@", | |
11 | - context: "=", | |
12 | - placement: "@", | |
13 | - getPopupContainer: "&", | |
14 | - }, | |
15 | - template: template, | |
16 | - controller: function ($scope, $element) { | |
17 | - this.getContext = function () { | |
18 | - return $scope; | |
19 | - }; | |
20 | - | |
21 | - $scope.state = { | |
22 | - visible: false, | |
23 | - content: $scope.content ? $scope.content : "", | |
24 | - clickTarget: null, | |
25 | - }; | |
26 | - | |
27 | - $scope.myEvent = function () { | |
28 | - setTimeout(() => { | |
29 | - $scope.state.visible = false; | |
30 | - $scope.$apply(); | |
31 | - document.body.removeEventListener("click", $scope.myEvent); | |
32 | - }, 0); | |
33 | - }; | |
34 | - | |
35 | - $scope.handleClick = function () { | |
36 | - if ($scope.state.visible === false) { | |
37 | - // 气泡层(显示) | |
38 | - $scope.state.visible = true; // j | |
39 | - | |
40 | - $scope.handlePosition(); // 事件绑定 | |
41 | - | |
42 | - document.body.addEventListener("click", $scope.myEvent); | |
43 | - } else { | |
2 | +import style from "antd/lib/popover/style/index.css"; | |
3 | +angular | |
4 | + .module("esNgAntd") | |
5 | + .directive("esPopover", function ($compile, esNgAntd) { | |
6 | + return { | |
7 | + controllerAs: "esPopover", | |
8 | + restrict: "E", | |
9 | + transclude: true, | |
10 | + replace: true, | |
11 | + scope: { | |
12 | + title: "@", | |
13 | + content: "@", | |
14 | + context: "=", | |
15 | + placement: "@", | |
16 | + getPopupContainer: "&", | |
17 | + }, | |
18 | + template: template, | |
19 | + controller: function ($scope, $element, $attrs) { | |
20 | + this.getContext = function () { | |
21 | + return $scope; | |
22 | + }; | |
23 | + | |
24 | + $scope.state = { | |
25 | + visible: false, | |
26 | + content: $scope.content ? $scope.content : "", | |
27 | + clickTarget: null, | |
28 | + }; | |
29 | + | |
30 | + $scope.myEvent = function () { | |
44 | 31 | setTimeout(() => { |
45 | 32 | $scope.state.visible = false; |
46 | 33 | $scope.$apply(); |
... | ... | @@ -49,126 +36,142 @@ angular.module("esNgAntd").directive("esPopover", function ($compile) { |
49 | 36 | $scope.myEvent |
50 | 37 | ); |
51 | 38 | }, 0); |
52 | - } | |
53 | - }; | |
39 | + }; | |
40 | + | |
41 | + $scope.handleClick = function () { | |
42 | + if ($scope.state.visible === false) { | |
43 | + // 气泡层(显示) | |
44 | + $scope.state.visible = true; // 处理位置 | |
45 | + | |
46 | + $scope.handlePosition(); // 事件绑定 | |
47 | + | |
48 | + document.body.addEventListener("click", $scope.myEvent); | |
49 | + } else { | |
50 | + setTimeout(() => { | |
51 | + $scope.state.visible = false; | |
52 | + $scope.$apply(); | |
53 | + document.body.removeEventListener( | |
54 | + "click", | |
55 | + $scope.myEvent | |
56 | + ); | |
57 | + }, 0); | |
58 | + } | |
59 | + }; | |
54 | 60 | |
55 | - $scope.showPopover = function () { | |
56 | - let popover = $scope.state.popover; | |
57 | - popover.classList.remove("ant-popover-hidden"); | |
58 | - }; | |
61 | + $scope.handlePosition = function () { | |
62 | + setTimeout(function () { | |
63 | + let popover = | |
64 | + $scope.state.popover.querySelector(".ant-popover"); | |
59 | 65 | |
60 | - $scope.handlePosition = function () { | |
61 | - setTimeout(function () { | |
62 | - let popover = | |
63 | - $scope.state.popover.querySelector(".ant-popover"); | |
64 | - | |
65 | - if ($scope.placement === "top") { | |
66 | - popover.style["top"] = $scope.getTop(); | |
67 | - } else if ($scope.placement === "bottom") { | |
68 | - popover.style["top"] = $scope.getTop(); | |
69 | - } | |
66 | + if ($scope.placement === "top") { | |
67 | + popover.style["top"] = $scope.getTop(); | |
68 | + } else if ($scope.placement === "bottom") { | |
69 | + popover.style["top"] = $scope.getTop(); | |
70 | + } | |
70 | 71 | |
71 | - popover.style.left = $scope.getLeft() + "px"; | |
72 | - }, 0); | |
73 | - }; | |
72 | + popover.style.left = $scope.getLeft() + "px"; | |
73 | + }, 0); | |
74 | + }; | |
74 | 75 | |
75 | - $scope.getLeft = function () { | |
76 | - let parent = $scope.getPopupContainer(); | |
77 | - let popover = | |
78 | - $scope.state.popover.querySelector(".ant-popover"); | |
79 | - let target = $scope.state.target; | |
76 | + $scope.getLeft = function () { | |
77 | + let parent = $scope.getPopupContainer(); | |
78 | + let popover = | |
79 | + $scope.state.popover.querySelector(".ant-popover"); | |
80 | + let target = $scope.state.target; | |
80 | 81 | |
81 | - if (parent) { | |
82 | - return -(popover.clientWidth / 2 - target.clientWidth / 2); | |
83 | - } else { | |
84 | - return ( | |
85 | - $(target).offset().left - | |
86 | - (popover.clientWidth / 2 - target.clientWidth / 2) | |
87 | - ); | |
88 | - } | |
89 | - }; | |
90 | - | |
91 | - $scope.getTop = function () { | |
92 | - let parent = $scope.getPopupContainer(); | |
93 | - let popover = | |
94 | - $scope.state.popover.querySelector(".ant-popover"); | |
95 | - let target = $scope.state.target; | |
96 | - | |
97 | - if (parent) { | |
98 | - if ($scope.placement === "top") { | |
99 | - return -popover.clientHeight + "px"; | |
100 | - } else if ($scope.placement === "bottom") { | |
101 | - } | |
102 | - } else { | |
103 | - if ($scope.placement === "top") { | |
104 | - return ( | |
105 | - $(target).offset().top - | |
106 | - popover.clientHeight - | |
107 | - 4 + | |
108 | - "px" | |
82 | + if (parent) { | |
83 | + return -( | |
84 | + popover.clientWidth / 2 - | |
85 | + target.clientWidth / 2 | |
109 | 86 | ); |
110 | - } else if ($scope.placement === "bottom") { | |
87 | + } else { | |
88 | + let offset = esNgAntd.getOffset(target); | |
111 | 89 | return ( |
112 | - $(target).offset().top + | |
113 | - target.clientHeight + | |
114 | - 4 + | |
115 | - "px" | |
90 | + offset.left - | |
91 | + (popover.clientWidth / 2 - target.clientWidth / 2) | |
116 | 92 | ); |
117 | 93 | } |
118 | - } | |
119 | - }; | |
120 | - }, | |
121 | - link: function ($scope, $element, $attrs, $controllers, $transclude) { | |
122 | - $scope.state.target = $element[0]; | |
123 | - let title = $scope.title | |
124 | - ? `<div class="ant-popover-title"><span>${$scope.title}</span></div>` | |
125 | - : ""; | |
126 | - let content = `<div> | |
127 | - <div style="outline:none" ng-class="'ant-popover ant-popover-placement-${ | |
128 | - $scope.placement | |
129 | - }'+(!state.visible?' ant-popover-hidden': '')"> | |
94 | + }; | |
95 | + | |
96 | + $scope.getTop = function () { | |
97 | + let parent = $scope.getPopupContainer(); | |
98 | + let popover = | |
99 | + $scope.state.popover.querySelector(".ant-popover"); | |
100 | + let target = $scope.state.target; | |
101 | + | |
102 | + if (parent) { | |
103 | + if ($scope.placement === "top") { | |
104 | + return -popover.clientHeight + "px"; | |
105 | + } else if ($scope.placement === "bottom") { | |
106 | + } | |
107 | + } else { | |
108 | + let offset = esNgAntd.getOffset(target); | |
109 | + | |
110 | + if ($scope.placement === "top") { | |
111 | + return offset.top - popover.clientHeight - 4 + "px"; | |
112 | + } else if ($scope.placement === "bottom") { | |
113 | + return offset.top + target.clientHeight + 4 + "px"; | |
114 | + } | |
115 | + } | |
116 | + }; | |
117 | + }, | |
118 | + link: function ( | |
119 | + $scope, | |
120 | + $element, | |
121 | + $attrs, | |
122 | + $controllers, | |
123 | + $transclude | |
124 | + ) { | |
125 | + esNgAntd.createStyle("ant-popover", style); | |
126 | + $scope.state.target = $element[0]; | |
127 | + let title = $scope.title | |
128 | + ? `<div class="ant-popover-title"><span>${$scope.title}</span></div>` | |
129 | + : ""; | |
130 | + let content = `<div> | |
131 | + <div style="outline:none" ng-class="'ant-popover ant-popover-placement-${$scope.placement}'+(!state.visible?' ant-popover-hidden': '')+(state.visible?' ant-zoom-big-enter ant-zoom-big-enter-active': '')"> | |
130 | 132 | <div class="ant-popover-content"> |
131 | - <div class="ant-popover-arrow"></div> | |
133 | + <div class="ant-popover-arrow"> | |
134 | + <span class="ant-popover-arrow-content"></span> | |
135 | + </div> | |
132 | 136 | <div class="ant-popover-inner"> |
133 | 137 | <div> |
134 | 138 | ${title} |
135 | - <div class="ant-popover-inner-content"> | |
136 | - ${$scope.state.content.replace( | |
137 | - /\$scope/g, | |
138 | - "context" | |
139 | - )} | |
140 | - </div> | |
139 | + <div class="ant-popover-inner-content"></div> | |
141 | 140 | </div> |
142 | 141 | </div> |
143 | 142 | </div> |
144 | 143 | </div> |
145 | 144 | </div>`; |
146 | - let div = document.createElement("div"); | |
147 | - | |
148 | - if (typeof $scope.getPopupContainer() === "function") { | |
149 | - $scope.state.popupContainer = $scope.getPopupContainer()(); | |
150 | - } | |
151 | - | |
152 | - if (!$scope.state.popupContainer) { | |
153 | - div.style.position = "absolute"; | |
154 | - div.style.top = "0px"; | |
155 | - div.style.left = "0px"; | |
156 | - div.style.width = "100%"; | |
157 | - div.innerHTML = content; | |
158 | - document.body.appendChild(div); | |
159 | - } else { | |
160 | - div.innerHTML = content; | |
161 | - $scope.state.popupContainer.appendChild(div); | |
162 | - } | |
163 | - | |
164 | - div.addEventListener("click", function (event) { | |
165 | - event.stopPropagation(); | |
166 | - }); | |
167 | - $scope.state.target.addEventListener("click", (e) => { | |
168 | - e.stopPropagation(); | |
169 | - }); | |
170 | - $compile(div)($scope); | |
171 | - $scope.state.popover = div; | |
172 | - }, | |
173 | - }; | |
174 | -}); | |
145 | + let div = document.createElement("div"); | |
146 | + | |
147 | + if (typeof $scope.getPopupContainer() === "function") { | |
148 | + $scope.state.popupContainer = $scope.getPopupContainer()(); | |
149 | + } | |
150 | + | |
151 | + if (!$scope.state.popupContainer) { | |
152 | + div.style.position = "absolute"; | |
153 | + div.style.top = "0px"; | |
154 | + div.style.left = "0px"; | |
155 | + div.style.width = "100%"; | |
156 | + div.innerHTML = content; | |
157 | + document.body.appendChild(div); | |
158 | + } else { | |
159 | + $scope.state.popupContainer.appendChild(div); | |
160 | + } | |
161 | + | |
162 | + div.addEventListener("click", function (event) { | |
163 | + event.stopPropagation(); | |
164 | + }); | |
165 | + $scope.state.target.addEventListener("click", (e) => { | |
166 | + e.stopPropagation(); | |
167 | + }); | |
168 | + $compile(div)($scope); | |
169 | + div.querySelector(".ant-popover-inner-content").innerHTML = | |
170 | + $scope.state.content; | |
171 | + $compile(div.querySelector(".ant-popover-inner-content"))( | |
172 | + $scope.$parent | |
173 | + ); | |
174 | + $scope.state.popover = div; | |
175 | + }, | |
176 | + }; | |
177 | + }); | ... | ... |
dist/ng-antd.js
... | ... | @@ -104,7 +104,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Col |
104 | 104 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { |
105 | 105 | |
106 | 106 | "use strict"; |
107 | -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var antd_lib_style_index_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! antd/lib/style/index.css */ \"./node_modules/antd/lib/style/index.css\");\n\nangular.module(\"esNgAntd\").service(\"esNgAntd\", [\n \"$compile\",\n function ($compile) {\n this.styleSheets = null;\n\n this.createStyle = function (key, style) {\n if (!document.querySelector(\"#antd\")) {\n let styleElement = document.createElement(\"style\");\n styleElement.setAttribute(\"id\", \"antd\");\n styleElement.setAttribute(\"type\", \"text/css\");\n styleElement.innerHTML = antd_lib_style_index_css__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toString();\n document.head.appendChild(styleElement);\n }\n\n if (!document.querySelector(\"#\" + key)) {\n let styleElement = document.createElement(\"style\");\n styleElement.setAttribute(\"id\", key);\n styleElement.setAttribute(\"type\", \"text/css\");\n styleElement.innerHTML = style.toString();\n document.head.appendChild(styleElement);\n\n if (this.styleSheets) {\n this.disableStyle(key);\n }\n }\n };\n\n this.disableStyle = function (name) {\n for (let i = 0; i < this.styleSheets.cssRules.length; i++) {\n let rule = this.styleSheets.cssRules[i];\n\n if (\n rule.selectorText &&\n rule.selectorText.indexOf(name) !== -1\n ) {\n rule.selectorText = rule.selectorText.replace(\n /\\.ant\\-/g,\n \".disabled-ant-\"\n );\n console.log(rule.selectorText);\n }\n }\n };\n\n this.conflict = function (filename) {\n for (let i = 0; i < document.styleSheets.length; i++) {\n const element = document.styleSheets[i];\n\n if (element.href && element.href.indexOf(filename) !== -1) {\n this.styleSheets = element;\n }\n }\n };\n\n this.createLayer = function (content, scope) {\n let div = document.createElement(\"div\");\n div.innerHTML = content;\n document.body.appendChild(div);\n $compile(div)(scope);\n };\n },\n]);\n\n\n//# sourceURL=webpack://ng-antd/./build/Common/Common.js?"); | |
107 | +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var antd_lib_style_index_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! antd/lib/style/index.css */ \"./node_modules/antd/lib/style/index.css\");\n\nangular.module(\"esNgAntd\").service(\"esNgAntd\", [\n \"$compile\",\n function ($compile) {\n this.styleSheets = null;\n\n this.createStyle = function (key, style) {\n if (!document.querySelector(\"#antd\")) {\n let styleElement = document.createElement(\"style\");\n styleElement.setAttribute(\"id\", \"antd\");\n styleElement.setAttribute(\"type\", \"text/css\");\n styleElement.innerHTML = antd_lib_style_index_css__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toString();\n document.head.appendChild(styleElement);\n }\n\n if (!document.querySelector(\"#\" + key)) {\n let styleElement = document.createElement(\"style\");\n styleElement.setAttribute(\"id\", key);\n styleElement.setAttribute(\"type\", \"text/css\");\n styleElement.innerHTML = style.toString();\n document.head.appendChild(styleElement);\n\n if (this.styleSheets) {\n this.disableStyle(key);\n }\n }\n };\n\n this.disableStyle = function (name) {\n for (let i = 0; i < this.styleSheets.cssRules.length; i++) {\n let rule = this.styleSheets.cssRules[i];\n\n if (\n rule.selectorText &&\n rule.selectorText.indexOf(name) !== -1\n ) {\n rule.selectorText = rule.selectorText.replace(\n /\\.ant\\-/g,\n \".disabled-ant-\"\n );\n console.log(rule.selectorText);\n }\n }\n };\n\n this.conflict = function (filename) {\n for (let i = 0; i < document.styleSheets.length; i++) {\n const element = document.styleSheets[i];\n\n if (element.href && element.href.indexOf(filename) !== -1) {\n this.styleSheets = element;\n }\n }\n };\n\n this.createLayer = function (content, scope) {\n let div = document.createElement(\"div\");\n div.innerHTML = content;\n document.body.appendChild(div);\n $compile(div)(scope);\n };\n\n this.getOffset = function (ele) {\n if (!ele || ele.nodeType != 1) {\n return;\n }\n\n let rect = ele.getBoundingClientRect();\n let doc = ele.ownerDocument.documentElement;\n return {\n top: rect.top + window.pageYOffset - doc.clientTop,\n left: rect.left + window.pageXOffset - doc.clientLeft,\n };\n };\n },\n]);\n\n\n//# sourceURL=webpack://ng-antd/./build/Common/Common.js?"); | |
108 | 108 | |
109 | 109 | /***/ }), |
110 | 110 | |
... | ... | @@ -291,7 +291,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Pag |
291 | 291 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { |
292 | 292 | |
293 | 293 | "use strict"; |
294 | -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Popover_html__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Popover.html */ \"./build/Popover/Popover.html\");\n\nangular.module(\"esNgAntd\").directive(\"esPopover\", function ($compile) {\n return {\n controllerAs: \"esPopover\",\n restrict: \"E\",\n transclude: true,\n replace: true,\n scope: {\n title: \"@\",\n content: \"@\",\n context: \"=\",\n placement: \"@\",\n getPopupContainer: \"&\",\n },\n template: _Popover_html__WEBPACK_IMPORTED_MODULE_0__[\"default\"],\n controller: function ($scope, $element) {\n this.getContext = function () {\n return $scope;\n };\n\n $scope.state = {\n visible: false,\n content: $scope.content ? $scope.content : \"\",\n clickTarget: null,\n };\n\n $scope.myEvent = function () {\n setTimeout(() => {\n $scope.state.visible = false;\n $scope.$apply();\n document.body.removeEventListener(\"click\", $scope.myEvent);\n }, 0);\n };\n\n $scope.handleClick = function () {\n if ($scope.state.visible === false) {\n // 气泡层(显示)\n $scope.state.visible = true; // j\n\n $scope.handlePosition(); // 事件绑定\n\n document.body.addEventListener(\"click\", $scope.myEvent);\n } else {\n setTimeout(() => {\n $scope.state.visible = false;\n $scope.$apply();\n document.body.removeEventListener(\n \"click\",\n $scope.myEvent\n );\n }, 0);\n }\n };\n\n $scope.showPopover = function () {\n let popover = $scope.state.popover;\n popover.classList.remove(\"ant-popover-hidden\");\n };\n\n $scope.handlePosition = function () {\n setTimeout(function () {\n let popover =\n $scope.state.popover.querySelector(\".ant-popover\");\n\n if ($scope.placement === \"top\") {\n popover.style[\"top\"] = $scope.getTop();\n } else if ($scope.placement === \"bottom\") {\n popover.style[\"top\"] = $scope.getTop();\n }\n\n popover.style.left = $scope.getLeft() + \"px\";\n }, 0);\n };\n\n $scope.getLeft = function () {\n let parent = $scope.getPopupContainer();\n let popover =\n $scope.state.popover.querySelector(\".ant-popover\");\n let target = $scope.state.target;\n\n if (parent) {\n return -(popover.clientWidth / 2 - target.clientWidth / 2);\n } else {\n return (\n $(target).offset().left -\n (popover.clientWidth / 2 - target.clientWidth / 2)\n );\n }\n };\n\n $scope.getTop = function () {\n let parent = $scope.getPopupContainer();\n let popover =\n $scope.state.popover.querySelector(\".ant-popover\");\n let target = $scope.state.target;\n\n if (parent) {\n if ($scope.placement === \"top\") {\n return -popover.clientHeight + \"px\";\n } else if ($scope.placement === \"bottom\") {\n }\n } else {\n if ($scope.placement === \"top\") {\n return (\n $(target).offset().top -\n popover.clientHeight -\n 4 +\n \"px\"\n );\n } else if ($scope.placement === \"bottom\") {\n return (\n $(target).offset().top +\n target.clientHeight +\n 4 +\n \"px\"\n );\n }\n }\n };\n },\n link: function ($scope, $element, $attrs, $controllers, $transclude) {\n $scope.state.target = $element[0];\n let title = $scope.title\n ? `<div class=\"ant-popover-title\"><span>${$scope.title}</span></div>`\n : \"\";\n let content = `<div>\n <div style=\"outline:none\" ng-class=\"'ant-popover ant-popover-placement-${\n $scope.placement\n }'+(!state.visible?' ant-popover-hidden': '')\">\n <div class=\"ant-popover-content\">\n <div class=\"ant-popover-arrow\"></div>\n <div class=\"ant-popover-inner\">\n <div>\n ${title}\n <div class=\"ant-popover-inner-content\">\n ${$scope.state.content.replace(\n /\\$scope/g,\n \"context\"\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>`;\n let div = document.createElement(\"div\");\n\n if (typeof $scope.getPopupContainer() === \"function\") {\n $scope.state.popupContainer = $scope.getPopupContainer()();\n }\n\n if (!$scope.state.popupContainer) {\n div.style.position = \"absolute\";\n div.style.top = \"0px\";\n div.style.left = \"0px\";\n div.style.width = \"100%\";\n div.innerHTML = content;\n document.body.appendChild(div);\n } else {\n div.innerHTML = content;\n $scope.state.popupContainer.appendChild(div);\n }\n\n div.addEventListener(\"click\", function (event) {\n event.stopPropagation();\n });\n $scope.state.target.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n });\n $compile(div)($scope);\n $scope.state.popover = div;\n },\n };\n});\n\n\n//# sourceURL=webpack://ng-antd/./build/Popover/Popover.js?"); | |
294 | +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Popover_html__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Popover.html */ \"./build/Popover/Popover.html\");\n/* harmony import */ var antd_lib_popover_style_index_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! antd/lib/popover/style/index.css */ \"./node_modules/antd/lib/popover/style/index.css\");\n\n\nangular\n .module(\"esNgAntd\")\n .directive(\"esPopover\", function ($compile, esNgAntd) {\n return {\n controllerAs: \"esPopover\",\n restrict: \"E\",\n transclude: true,\n replace: true,\n scope: {\n title: \"@\",\n content: \"@\",\n context: \"=\",\n placement: \"@\",\n getPopupContainer: \"&\",\n },\n template: _Popover_html__WEBPACK_IMPORTED_MODULE_0__[\"default\"],\n controller: function ($scope, $element, $attrs) {\n this.getContext = function () {\n return $scope;\n };\n\n $scope.state = {\n visible: false,\n content: $scope.content ? $scope.content : \"\",\n clickTarget: null,\n };\n\n $scope.myEvent = function () {\n setTimeout(() => {\n $scope.state.visible = false;\n $scope.$apply();\n document.body.removeEventListener(\n \"click\",\n $scope.myEvent\n );\n }, 0);\n };\n\n $scope.handleClick = function () {\n if ($scope.state.visible === false) {\n // 气泡层(显示)\n $scope.state.visible = true; // 处理位置\n\n $scope.handlePosition(); // 事件绑定\n\n document.body.addEventListener(\"click\", $scope.myEvent);\n } else {\n setTimeout(() => {\n $scope.state.visible = false;\n $scope.$apply();\n document.body.removeEventListener(\n \"click\",\n $scope.myEvent\n );\n }, 0);\n }\n };\n\n $scope.handlePosition = function () {\n setTimeout(function () {\n let popover =\n $scope.state.popover.querySelector(\".ant-popover\");\n\n if ($scope.placement === \"top\") {\n popover.style[\"top\"] = $scope.getTop();\n } else if ($scope.placement === \"bottom\") {\n popover.style[\"top\"] = $scope.getTop();\n }\n\n popover.style.left = $scope.getLeft() + \"px\";\n }, 0);\n };\n\n $scope.getLeft = function () {\n let parent = $scope.getPopupContainer();\n let popover =\n $scope.state.popover.querySelector(\".ant-popover\");\n let target = $scope.state.target;\n\n if (parent) {\n return -(\n popover.clientWidth / 2 -\n target.clientWidth / 2\n );\n } else {\n let offset = esNgAntd.getOffset(target);\n return (\n offset.left -\n (popover.clientWidth / 2 - target.clientWidth / 2)\n );\n }\n };\n\n $scope.getTop = function () {\n let parent = $scope.getPopupContainer();\n let popover =\n $scope.state.popover.querySelector(\".ant-popover\");\n let target = $scope.state.target;\n\n if (parent) {\n if ($scope.placement === \"top\") {\n return -popover.clientHeight + \"px\";\n } else if ($scope.placement === \"bottom\") {\n }\n } else {\n let offset = esNgAntd.getOffset(target);\n\n if ($scope.placement === \"top\") {\n return offset.top - popover.clientHeight - 4 + \"px\";\n } else if ($scope.placement === \"bottom\") {\n return offset.top + target.clientHeight + 4 + \"px\";\n }\n }\n };\n },\n link: function (\n $scope,\n $element,\n $attrs,\n $controllers,\n $transclude\n ) {\n esNgAntd.createStyle(\"ant-popover\", antd_lib_popover_style_index_css__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n $scope.state.target = $element[0];\n let title = $scope.title\n ? `<div class=\"ant-popover-title\"><span>${$scope.title}</span></div>`\n : \"\";\n let content = `<div>\n <div style=\"outline:none\" ng-class=\"'ant-popover ant-popover-placement-${$scope.placement}'+(!state.visible?' ant-popover-hidden': '')+(state.visible?' ant-zoom-big-enter ant-zoom-big-enter-active': '')\">\n <div class=\"ant-popover-content\">\n <div class=\"ant-popover-arrow\">\n <span class=\"ant-popover-arrow-content\"></span>\n </div>\n <div class=\"ant-popover-inner\">\n <div>\n ${title}\n <div class=\"ant-popover-inner-content\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>`;\n let div = document.createElement(\"div\");\n\n if (typeof $scope.getPopupContainer() === \"function\") {\n $scope.state.popupContainer = $scope.getPopupContainer()();\n }\n\n if (!$scope.state.popupContainer) {\n div.style.position = \"absolute\";\n div.style.top = \"0px\";\n div.style.left = \"0px\";\n div.style.width = \"100%\";\n div.innerHTML = content;\n document.body.appendChild(div);\n } else {\n $scope.state.popupContainer.appendChild(div);\n }\n\n div.addEventListener(\"click\", function (event) {\n event.stopPropagation();\n });\n $scope.state.target.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n });\n $compile(div)($scope);\n div.querySelector(\".ant-popover-inner-content\").innerHTML =\n $scope.state.content;\n $compile(div.querySelector(\".ant-popover-inner-content\"))(\n $scope.$parent\n );\n $scope.state.popover = div;\n },\n };\n });\n\n\n//# sourceURL=webpack://ng-antd/./build/Popover/Popover.js?"); | |
295 | 295 | |
296 | 296 | /***/ }), |
297 | 297 | |
... | ... | @@ -9302,6 +9302,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac |
9302 | 9302 | |
9303 | 9303 | /***/ }), |
9304 | 9304 | |
9305 | +/***/ "./node_modules/antd/lib/popover/style/index.css": | |
9306 | +/*!*******************************************************!*\ | |
9307 | + !*** ./node_modules/antd/lib/popover/style/index.css ***! | |
9308 | + \*******************************************************/ | |
9309 | +/***/ ((module, __webpack_exports__, __webpack_require__) => { | |
9310 | + | |
9311 | +"use strict"; | |
9312 | +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\\n/* stylelint-disable no-duplicate-selectors */\\n/* stylelint-disable */\\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\\n.ant-popover {\\n box-sizing: border-box;\\n margin: 0;\\n padding: 0;\\n color: rgba(0, 0, 0, 0.85);\\n font-size: 14px;\\n font-variant: tabular-nums;\\n line-height: 1.5715;\\n list-style: none;\\n font-feature-settings: 'tnum';\\n position: absolute;\\n top: 0;\\n left: 0;\\n z-index: 1030;\\n font-weight: normal;\\n white-space: normal;\\n text-align: left;\\n cursor: auto;\\n -webkit-user-select: text;\\n -moz-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n}\\n.ant-popover::after {\\n position: absolute;\\n background: rgba(255, 255, 255, 0.01);\\n content: '';\\n}\\n.ant-popover-hidden {\\n display: none;\\n}\\n.ant-popover-placement-top,\\n.ant-popover-placement-topLeft,\\n.ant-popover-placement-topRight {\\n padding-bottom: 10px;\\n}\\n.ant-popover-placement-right,\\n.ant-popover-placement-rightTop,\\n.ant-popover-placement-rightBottom {\\n padding-left: 10px;\\n}\\n.ant-popover-placement-bottom,\\n.ant-popover-placement-bottomLeft,\\n.ant-popover-placement-bottomRight {\\n padding-top: 10px;\\n}\\n.ant-popover-placement-left,\\n.ant-popover-placement-leftTop,\\n.ant-popover-placement-leftBottom {\\n padding-right: 10px;\\n}\\n.ant-popover-inner {\\n background-color: #fff;\\n background-clip: padding-box;\\n border-radius: 2px;\\n box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);\\n box-shadow: 0 0 8px rgba(0, 0, 0, 0.15) \\\\9;\\n}\\n@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {\\n .ant-popover {\\n /* IE10+ */\\n }\\n .ant-popover-inner {\\n box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);\\n }\\n}\\n.ant-popover-title {\\n min-width: 177px;\\n min-height: 32px;\\n margin: 0;\\n padding: 5px 16px 4px;\\n color: rgba(0, 0, 0, 0.85);\\n font-weight: 500;\\n border-bottom: 1px solid #f0f0f0;\\n}\\n.ant-popover-inner-content {\\n padding: 12px 16px;\\n color: rgba(0, 0, 0, 0.85);\\n}\\n.ant-popover-message {\\n position: relative;\\n padding: 4px 0 12px;\\n color: rgba(0, 0, 0, 0.85);\\n font-size: 14px;\\n}\\n.ant-popover-message > .anticon {\\n position: absolute;\\n top: 8.0005px;\\n color: #faad14;\\n font-size: 14px;\\n}\\n.ant-popover-message-title {\\n padding-left: 22px;\\n}\\n.ant-popover-buttons {\\n margin-bottom: 4px;\\n text-align: right;\\n}\\n.ant-popover-buttons button {\\n margin-left: 8px;\\n}\\n.ant-popover-arrow {\\n position: absolute;\\n display: block;\\n width: 8.48528137px;\\n height: 8.48528137px;\\n overflow: hidden;\\n background: transparent;\\n pointer-events: none;\\n}\\n.ant-popover-arrow-content {\\n position: absolute;\\n top: 0;\\n right: 0;\\n bottom: 0;\\n left: 0;\\n display: block;\\n width: 6px;\\n height: 6px;\\n margin: auto;\\n background-color: #fff;\\n content: '';\\n pointer-events: auto;\\n}\\n.ant-popover-placement-top .ant-popover-arrow,\\n.ant-popover-placement-topLeft .ant-popover-arrow,\\n.ant-popover-placement-topRight .ant-popover-arrow {\\n bottom: 1.51471863px;\\n}\\n.ant-popover-placement-top .ant-popover-arrow-content,\\n.ant-popover-placement-topLeft .ant-popover-arrow-content,\\n.ant-popover-placement-topRight .ant-popover-arrow-content {\\n box-shadow: 3px 3px 7px rgba(0, 0, 0, 0.07);\\n transform: translateY(-4.24264069px) rotate(45deg);\\n}\\n.ant-popover-placement-top .ant-popover-arrow {\\n left: 50%;\\n transform: translateX(-50%);\\n}\\n.ant-popover-placement-topLeft .ant-popover-arrow {\\n left: 16px;\\n}\\n.ant-popover-placement-topRight .ant-popover-arrow {\\n right: 16px;\\n}\\n.ant-popover-placement-right .ant-popover-arrow,\\n.ant-popover-placement-rightTop .ant-popover-arrow,\\n.ant-popover-placement-rightBottom .ant-popover-arrow {\\n left: 1.51471863px;\\n}\\n.ant-popover-placement-right .ant-popover-arrow-content,\\n.ant-popover-placement-rightTop .ant-popover-arrow-content,\\n.ant-popover-placement-rightBottom .ant-popover-arrow-content {\\n box-shadow: -3px 3px 7px rgba(0, 0, 0, 0.07);\\n transform: translateX(4.24264069px) rotate(45deg);\\n}\\n.ant-popover-placement-right .ant-popover-arrow {\\n top: 50%;\\n transform: translateY(-50%);\\n}\\n.ant-popover-placement-rightTop .ant-popover-arrow {\\n top: 12px;\\n}\\n.ant-popover-placement-rightBottom .ant-popover-arrow {\\n bottom: 12px;\\n}\\n.ant-popover-placement-bottom .ant-popover-arrow,\\n.ant-popover-placement-bottomLeft .ant-popover-arrow,\\n.ant-popover-placement-bottomRight .ant-popover-arrow {\\n top: 1.51471863px;\\n}\\n.ant-popover-placement-bottom .ant-popover-arrow-content,\\n.ant-popover-placement-bottomLeft .ant-popover-arrow-content,\\n.ant-popover-placement-bottomRight .ant-popover-arrow-content {\\n box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.06);\\n transform: translateY(4.24264069px) rotate(45deg);\\n}\\n.ant-popover-placement-bottom .ant-popover-arrow {\\n left: 50%;\\n transform: translateX(-50%);\\n}\\n.ant-popover-placement-bottomLeft .ant-popover-arrow {\\n left: 16px;\\n}\\n.ant-popover-placement-bottomRight .ant-popover-arrow {\\n right: 16px;\\n}\\n.ant-popover-placement-left .ant-popover-arrow,\\n.ant-popover-placement-leftTop .ant-popover-arrow,\\n.ant-popover-placement-leftBottom .ant-popover-arrow {\\n right: 1.51471863px;\\n}\\n.ant-popover-placement-left .ant-popover-arrow-content,\\n.ant-popover-placement-leftTop .ant-popover-arrow-content,\\n.ant-popover-placement-leftBottom .ant-popover-arrow-content {\\n box-shadow: 3px -3px 7px rgba(0, 0, 0, 0.07);\\n transform: translateX(-4.24264069px) rotate(45deg);\\n}\\n.ant-popover-placement-left .ant-popover-arrow {\\n top: 50%;\\n transform: translateY(-50%);\\n}\\n.ant-popover-placement-leftTop .ant-popover-arrow {\\n top: 12px;\\n}\\n.ant-popover-placement-leftBottom .ant-popover-arrow {\\n bottom: 12px;\\n}\\n.ant-popover-pink .ant-popover-inner {\\n background-color: #eb2f96;\\n}\\n.ant-popover-pink .ant-popover-arrow-content {\\n background-color: #eb2f96;\\n}\\n.ant-popover-magenta .ant-popover-inner {\\n background-color: #eb2f96;\\n}\\n.ant-popover-magenta .ant-popover-arrow-content {\\n background-color: #eb2f96;\\n}\\n.ant-popover-red .ant-popover-inner {\\n background-color: #f5222d;\\n}\\n.ant-popover-red .ant-popover-arrow-content {\\n background-color: #f5222d;\\n}\\n.ant-popover-volcano .ant-popover-inner {\\n background-color: #fa541c;\\n}\\n.ant-popover-volcano .ant-popover-arrow-content {\\n background-color: #fa541c;\\n}\\n.ant-popover-orange .ant-popover-inner {\\n background-color: #fa8c16;\\n}\\n.ant-popover-orange .ant-popover-arrow-content {\\n background-color: #fa8c16;\\n}\\n.ant-popover-yellow .ant-popover-inner {\\n background-color: #fadb14;\\n}\\n.ant-popover-yellow .ant-popover-arrow-content {\\n background-color: #fadb14;\\n}\\n.ant-popover-gold .ant-popover-inner {\\n background-color: #faad14;\\n}\\n.ant-popover-gold .ant-popover-arrow-content {\\n background-color: #faad14;\\n}\\n.ant-popover-cyan .ant-popover-inner {\\n background-color: #13c2c2;\\n}\\n.ant-popover-cyan .ant-popover-arrow-content {\\n background-color: #13c2c2;\\n}\\n.ant-popover-lime .ant-popover-inner {\\n background-color: #a0d911;\\n}\\n.ant-popover-lime .ant-popover-arrow-content {\\n background-color: #a0d911;\\n}\\n.ant-popover-green .ant-popover-inner {\\n background-color: #52c41a;\\n}\\n.ant-popover-green .ant-popover-arrow-content {\\n background-color: #52c41a;\\n}\\n.ant-popover-blue .ant-popover-inner {\\n background-color: #1890ff;\\n}\\n.ant-popover-blue .ant-popover-arrow-content {\\n background-color: #1890ff;\\n}\\n.ant-popover-geekblue .ant-popover-inner {\\n background-color: #2f54eb;\\n}\\n.ant-popover-geekblue .ant-popover-arrow-content {\\n background-color: #2f54eb;\\n}\\n.ant-popover-purple .ant-popover-inner {\\n background-color: #722ed1;\\n}\\n.ant-popover-purple .ant-popover-arrow-content {\\n background-color: #722ed1;\\n}\\n.ant-popover-rtl {\\n direction: rtl;\\n text-align: right;\\n}\\n.ant-popover-rtl .ant-popover-message-title {\\n padding-right: 22px;\\n padding-left: 16px;\\n}\\n.ant-popover-rtl .ant-popover-buttons {\\n text-align: left;\\n}\\n.ant-popover-rtl .ant-popover-buttons button {\\n margin-right: 8px;\\n margin-left: 0;\\n}\\n\", \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://ng-antd/./node_modules/antd/lib/popover/style/index.css?"); | |
9313 | + | |
9314 | +/***/ }), | |
9315 | + | |
9305 | 9316 | /***/ "./node_modules/antd/lib/radio/style/index.css": |
9306 | 9317 | /*!*****************************************************!*\ |
9307 | 9318 | !*** ./node_modules/antd/lib/radio/style/index.css ***! | ... | ... |
example/popover.html
... | ... | @@ -4,59 +4,36 @@ |
4 | 4 | <head> |
5 | 5 | <meta charset="UTF-8" /> |
6 | 6 | <title></title> |
7 | - <link href="https://cdn.staticfile.org/antd/3.26.9/antd.css" rel="stylesheet" /> | |
8 | - <style> | |
9 | - | |
10 | - </style> | |
11 | 7 | </head> |
12 | 8 | |
13 | 9 | <body> |
14 | - <div ng-app="essa" ng-controller="mainCtrl"> | |
10 | + <div ng-app="esNgAntd" ng-controller="mainCtrl"> | |
15 | 11 | <div class="container" style="margin: 200px"> |
16 | - <es-popover placement="bottom" content="{{content}}" context="context"> | |
17 | - <button>Hover me</button> | |
12 | + <es-popover placement="bottom" content="{{content}}" title="Title"> | |
13 | + <es-button>Hover me</es-button> | |
18 | 14 | </es-popover> |
19 | - <es-popover placement="top" content="{{content}}" context="context"> | |
15 | + <!-- <es-popover placement="top" content="{{content}}" context="context"> | |
20 | 16 | <button>Top</button> |
21 | 17 | </es-popover> |
22 | 18 | <es-popover style="position: fixed; left: 200px; top: 200px" placement="top" content="{{content}}" context="context" get-popup-container="handlePopupContainer" id="test"> |
23 | 19 | <button>Fixed</button> |
24 | - </es-popover> | |
20 | + </es-popover> --> | |
25 | 21 | </div> |
26 | 22 | </div> |
27 | 23 | <script src="https://cdn.staticfile.org/angular.js/1.2.28/angular.min.js"></script> |
28 | - <script src="https://cdn.staticfile.org/jquery/3.3.0/jquery.min.js"></script> | |
24 | + <script src="../dist/ng-antd.js"></script> | |
29 | 25 | <script> |
30 | 26 | angular |
31 | - .module("essa", []) | |
27 | + .module("esNgAntd") | |
32 | 28 | .controller("mainCtrl", function ($scope) { |
33 | - $scope.context = $scope; | |
34 | - $scope.dataSource = [{ | |
35 | - id: 1, | |
36 | - name: "aaa" | |
37 | - }, | |
38 | - { | |
39 | - id: 2, | |
40 | - name: "bbb" | |
41 | - }] | |
42 | - $scope.handleAbc = function() { | |
43 | - alert(123123); | |
44 | - } | |
45 | - $scope.renderItem = function (item) { | |
46 | - return `<es-list-item> | |
47 | - <span>${item.name}</span> | |
48 | - <button ng-click="$scope.handleAbc()">Link</button> | |
49 | - </es-list-item>`; | |
50 | - } | |
51 | - $scope.content = `<es-list d-source="$scope.dataSource" render-item="$scope.renderItem(item)" context="context"></es-list>`; | |
52 | - // $scope.content = `<button ng-click="handleAbc()">1324123</button>`; | |
29 | + | |
30 | + $scope.content = `<div><p>Content</p><p>Content</p></div>`; | |
53 | 31 | |
54 | - $scope.handlePopupContainer = function() { | |
55 | - return document.querySelector("#test"); | |
32 | + $scope.handleClick = function () { | |
33 | + alert("I am click"); | |
56 | 34 | } |
57 | 35 | }); |
58 | 36 | </script> |
59 | - <script src="../dist/ng-antd.bundle.js"></script> | |
60 | 37 | </body> |
61 | 38 | |
62 | 39 | </html> |
63 | 40 | \ No newline at end of file | ... | ... |
src/Common/Common.js
1 | 1 | import baseStyle from "antd/lib/style/index.css"; |
2 | 2 | |
3 | -angular.module("esNgAntd").service("esNgAntd", ["$compile", function ($compile) { | |
4 | - this.styleSheets = null; | |
3 | +angular.module("esNgAntd").service("esNgAntd", [ | |
4 | + "$compile", | |
5 | + function ($compile) { | |
6 | + this.styleSheets = null; | |
5 | 7 | |
6 | - this.createStyle = function (key, style) { | |
7 | - if (!document.querySelector("#antd")) { | |
8 | - let styleElement = document.createElement("style"); | |
9 | - styleElement.setAttribute("id", "antd"); | |
10 | - styleElement.setAttribute("type", "text/css"); | |
11 | - styleElement.innerHTML = baseStyle.toString(); | |
12 | - document.head.appendChild(styleElement); | |
13 | - } | |
14 | - if (!document.querySelector("#" + key)) { | |
15 | - let styleElement = document.createElement("style"); | |
16 | - styleElement.setAttribute("id", key); | |
17 | - styleElement.setAttribute("type", "text/css"); | |
18 | - styleElement.innerHTML = style.toString(); | |
19 | - document.head.appendChild(styleElement); | |
20 | - if (this.styleSheets) { | |
21 | - this.disableStyle(key); | |
8 | + this.createStyle = function (key, style) { | |
9 | + if (!document.querySelector("#antd")) { | |
10 | + let styleElement = document.createElement("style"); | |
11 | + styleElement.setAttribute("id", "antd"); | |
12 | + styleElement.setAttribute("type", "text/css"); | |
13 | + styleElement.innerHTML = baseStyle.toString(); | |
14 | + document.head.appendChild(styleElement); | |
22 | 15 | } |
23 | - } | |
24 | - }; | |
16 | + if (!document.querySelector("#" + key)) { | |
17 | + let styleElement = document.createElement("style"); | |
18 | + styleElement.setAttribute("id", key); | |
19 | + styleElement.setAttribute("type", "text/css"); | |
20 | + styleElement.innerHTML = style.toString(); | |
21 | + document.head.appendChild(styleElement); | |
22 | + if (this.styleSheets) { | |
23 | + this.disableStyle(key); | |
24 | + } | |
25 | + } | |
26 | + }; | |
25 | 27 | |
26 | - this.disableStyle = function (name) { | |
27 | - for (let i = 0; i < this.styleSheets.cssRules.length; i++) { | |
28 | - let rule = this.styleSheets.cssRules[i]; | |
29 | - if (rule.selectorText && rule.selectorText.indexOf(name) !== -1) { | |
30 | - rule.selectorText = rule.selectorText.replace( | |
31 | - /\.ant\-/g, | |
32 | - ".disabled-ant-" | |
33 | - ); | |
34 | - console.log(rule.selectorText); | |
28 | + this.disableStyle = function (name) { | |
29 | + for (let i = 0; i < this.styleSheets.cssRules.length; i++) { | |
30 | + let rule = this.styleSheets.cssRules[i]; | |
31 | + if ( | |
32 | + rule.selectorText && | |
33 | + rule.selectorText.indexOf(name) !== -1 | |
34 | + ) { | |
35 | + rule.selectorText = rule.selectorText.replace( | |
36 | + /\.ant\-/g, | |
37 | + ".disabled-ant-" | |
38 | + ); | |
39 | + console.log(rule.selectorText); | |
40 | + } | |
35 | 41 | } |
36 | - } | |
37 | - }; | |
42 | + }; | |
38 | 43 | |
39 | - this.conflict = function (filename) { | |
40 | - for (let i = 0; i < document.styleSheets.length; i++) { | |
41 | - const element = document.styleSheets[i]; | |
42 | - if (element.href && element.href.indexOf(filename) !== -1) { | |
43 | - this.styleSheets = element; | |
44 | + this.conflict = function (filename) { | |
45 | + for (let i = 0; i < document.styleSheets.length; i++) { | |
46 | + const element = document.styleSheets[i]; | |
47 | + if (element.href && element.href.indexOf(filename) !== -1) { | |
48 | + this.styleSheets = element; | |
49 | + } | |
44 | 50 | } |
45 | - } | |
46 | - }; | |
51 | + }; | |
52 | + | |
53 | + this.createLayer = function (content, scope) { | |
54 | + let div = document.createElement("div"); | |
55 | + div.innerHTML = content; | |
56 | + document.body.appendChild(div); | |
57 | + $compile(div)(scope); | |
58 | + }; | |
47 | 59 | |
48 | - this.createLayer = function (content, scope) { | |
49 | - let div = document.createElement("div"); | |
50 | - div.innerHTML = content; | |
51 | - document.body.appendChild(div); | |
52 | - $compile(div)(scope); | |
53 | - }; | |
54 | -}]); | |
60 | + this.getOffset = function (ele) { | |
61 | + if (!ele || ele.nodeType != 1) { | |
62 | + return; | |
63 | + } | |
64 | + let rect = ele.getBoundingClientRect(); | |
65 | + let doc = ele.ownerDocument.documentElement; | |
66 | + return { | |
67 | + top: rect.top + window.pageYOffset - doc.clientTop, | |
68 | + left: rect.left + window.pageXOffset - doc.clientLeft, | |
69 | + }; | |
70 | + }; | |
71 | + }, | |
72 | +]); | ... | ... |
src/Popover/Popover.js
1 | 1 | import template from "./Popover.html"; |
2 | +import style from "antd/lib/popover/style/index.css"; | |
2 | 3 | |
3 | 4 | class Popover { |
5 | + | |
6 | + template = template; | |
7 | + | |
8 | + useModules = ["$compile", "esNgAntd"]; | |
9 | + | |
4 | 10 | props = { |
5 | 11 | title: String, |
6 | 12 | content: String, |
... | ... | @@ -15,11 +21,8 @@ class Popover { |
15 | 21 | clickTarget: null, |
16 | 22 | }; |
17 | 23 | |
18 | - template = template; | |
19 | - | |
20 | - useModules = ["$compile"]; | |
21 | - | |
22 | 24 | constructor() { |
25 | + esNgAntd.createStyle("ant-popover", style); | |
23 | 26 | this.state.target = $element[0]; |
24 | 27 | let title = this.props.title |
25 | 28 | ? `<div class="ant-popover-title"><span>${this.props.title}</span></div>` |
... | ... | @@ -27,18 +30,15 @@ class Popover { |
27 | 30 | let content = `<div> |
28 | 31 | <div style="outline:none" ng-class="'ant-popover ant-popover-placement-${ |
29 | 32 | this.props.placement |
30 | - }'+(!state.visible?' ant-popover-hidden': '')"> | |
33 | + }'+(!state.visible?' ant-popover-hidden': '')+(state.visible?' ant-zoom-big-enter ant-zoom-big-enter-active': '')"> | |
31 | 34 | <div class="ant-popover-content"> |
32 | - <div class="ant-popover-arrow"></div> | |
35 | + <div class="ant-popover-arrow"> | |
36 | + <span class="ant-popover-arrow-content"></span> | |
37 | + </div> | |
33 | 38 | <div class="ant-popover-inner"> |
34 | 39 | <div> |
35 | 40 | ${title} |
36 | - <div class="ant-popover-inner-content"> | |
37 | - ${this.state.content.replace( | |
38 | - /\$scope/g, | |
39 | - "context" | |
40 | - )} | |
41 | - </div> | |
41 | + <div class="ant-popover-inner-content"></div> | |
42 | 42 | </div> |
43 | 43 | </div> |
44 | 44 | </div> |
... | ... | @@ -56,7 +56,6 @@ class Popover { |
56 | 56 | div.innerHTML = content; |
57 | 57 | document.body.appendChild(div); |
58 | 58 | } else { |
59 | - div.innerHTML = content; | |
60 | 59 | this.state.popupContainer.appendChild(div); |
61 | 60 | } |
62 | 61 | div.addEventListener("click", function (event) { |
... | ... | @@ -66,6 +65,8 @@ class Popover { |
66 | 65 | e.stopPropagation(); |
67 | 66 | }); |
68 | 67 | $compile(div)($scope); |
68 | + div.querySelector(".ant-popover-inner-content").innerHTML = this.state.content; | |
69 | + $compile(div.querySelector(".ant-popover-inner-content"))($scope.$parent) | |
69 | 70 | this.state.popover = div; |
70 | 71 | } |
71 | 72 | |
... | ... | @@ -81,7 +82,7 @@ class Popover { |
81 | 82 | if (this.state.visible === false) { |
82 | 83 | // 气泡层(显示) |
83 | 84 | this.state.visible = true; |
84 | - // j | |
85 | + // 处理位置 | |
85 | 86 | this.handlePosition(); |
86 | 87 | // 事件绑定 |
87 | 88 | document.body.addEventListener("click", this.myEvent); |
... | ... | @@ -94,11 +95,6 @@ class Popover { |
94 | 95 | } |
95 | 96 | } |
96 | 97 | |
97 | - showPopover() { | |
98 | - let popover = this.state.popover; | |
99 | - popover.classList.remove("ant-popover-hidden"); | |
100 | - } | |
101 | - | |
102 | 98 | handlePosition() { |
103 | 99 | setTimeout(function () { |
104 | 100 | let popover = this.state.popover.querySelector(".ant-popover"); |
... | ... | @@ -118,9 +114,9 @@ class Popover { |
118 | 114 | if (parent) { |
119 | 115 | return -(popover.clientWidth / 2 - target.clientWidth / 2); |
120 | 116 | } else { |
117 | + let offset = esNgAntd.getOffset(target); | |
121 | 118 | return ( |
122 | - $(target).offset().left - | |
123 | - (popover.clientWidth / 2 - target.clientWidth / 2) | |
119 | + offset.left - (popover.clientWidth / 2 - target.clientWidth / 2) | |
124 | 120 | ); |
125 | 121 | } |
126 | 122 | } |
... | ... | @@ -135,10 +131,11 @@ class Popover { |
135 | 131 | } else if (this.props.placement === "bottom") { |
136 | 132 | } |
137 | 133 | } else { |
134 | + let offset = esNgAntd.getOffset(target); | |
138 | 135 | if (this.props.placement === "top") { |
139 | - return $(target).offset().top - popover.clientHeight - 4 + "px"; | |
136 | + return offset.top - popover.clientHeight - 4 + "px"; | |
140 | 137 | } else if (this.props.placement === "bottom") { |
141 | - return $(target).offset().top + target.clientHeight + 4 + "px"; | |
138 | + return offset.top + target.clientHeight + 4 + "px"; | |
142 | 139 | } |
143 | 140 | } |
144 | 141 | } | ... | ... |