├── .github └── ISSUE_TEMPLATE │ └── bug_report.md ├── LICENSE ├── README.md ├── img └── logo │ ├── chrome.png │ ├── firefox.png │ ├── opera.png │ └── safari.png ├── index.html ├── remove_web_limits.user.js └── style.css /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | 5 | --- 6 | 7 | # 暂停维护 8 | 本人上班比较忙没时间维护,遇到 bug 之类的可以考虑更换替代脚本: 9 | 1. [网页限制解除(改)](https://greasyfork.org/scripts/28497) 10 | 2. [unlock-keyboard-and-mouse](https://chromewebstore.google.com/detail/unlock-keyboard-mouse/ijngdimmjkngoglcjaheoadciaalbafl) 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | 9 | This version of the GNU Lesser General Public License incorporates 10 | the terms and conditions of version 3 of the GNU General Public 11 | License, supplemented by the additional permissions listed below. 12 | 13 | 0. Additional Definitions. 14 | 15 | As used herein, "this License" refers to version 3 of the GNU Lesser 16 | General Public License, and the "GNU GPL" refers to version 3 of the GNU 17 | General Public License. 18 | 19 | "The Library" refers to a covered work governed by this License, 20 | other than an Application or a Combined Work as defined below. 21 | 22 | An "Application" is any work that makes use of an interface provided 23 | by the Library, but which is not otherwise based on the Library. 24 | Defining a subclass of a class defined by the Library is deemed a mode 25 | of using an interface provided by the Library. 26 | 27 | A "Combined Work" is a work produced by combining or linking an 28 | Application with the Library. The particular version of the Library 29 | with which the Combined Work was made is also called the "Linked 30 | Version". 31 | 32 | The "Minimal Corresponding Source" for a Combined Work means the 33 | Corresponding Source for the Combined Work, excluding any source code 34 | for portions of the Combined Work that, considered in isolation, are 35 | based on the Application, and not on the Linked Version. 36 | 37 | The "Corresponding Application Code" for a Combined Work means the 38 | object code and/or source code for the Application, including any data 39 | and utility programs needed for reproducing the Combined Work from the 40 | Application, but excluding the System Libraries of the Combined Work. 41 | 42 | 1. Exception to Section 3 of the GNU GPL. 43 | 44 | You may convey a covered work under sections 3 and 4 of this License 45 | without being bound by section 3 of the GNU GPL. 46 | 47 | 2. Conveying Modified Versions. 48 | 49 | If you modify a copy of the Library, and, in your modifications, a 50 | facility refers to a function or data to be supplied by an Application 51 | that uses the facility (other than as an argument passed when the 52 | facility is invoked), then you may convey a copy of the modified 53 | version: 54 | 55 | a) under this License, provided that you make a good faith effort to 56 | ensure that, in the event an Application does not supply the 57 | function or data, the facility still operates, and performs 58 | whatever part of its purpose remains meaningful, or 59 | 60 | b) under the GNU GPL, with none of the additional permissions of 61 | this License applicable to that copy. 62 | 63 | 3. Object Code Incorporating Material from Library Header Files. 64 | 65 | The object code form of an Application may incorporate material from 66 | a header file that is part of the Library. You may convey such object 67 | code under terms of your choice, provided that, if the incorporated 68 | material is not limited to numerical parameters, data structure 69 | layouts and accessors, or small macros, inline functions and templates 70 | (ten or fewer lines in length), you do both of the following: 71 | 72 | a) Give prominent notice with each copy of the object code that the 73 | Library is used in it and that the Library and its use are 74 | covered by this License. 75 | 76 | b) Accompany the object code with a copy of the GNU GPL and this license 77 | document. 78 | 79 | 4. Combined Works. 80 | 81 | You may convey a Combined Work under terms of your choice that, 82 | taken together, effectively do not restrict modification of the 83 | portions of the Library contained in the Combined Work and reverse 84 | engineering for debugging such modifications, if you also do each of 85 | the following: 86 | 87 | a) Give prominent notice with each copy of the Combined Work that 88 | the Library is used in it and that the Library and its use are 89 | covered by this License. 90 | 91 | b) Accompany the Combined Work with a copy of the GNU GPL and this license 92 | document. 93 | 94 | c) For a Combined Work that displays copyright notices during 95 | execution, include the copyright notice for the Library among 96 | these notices, as well as a reference directing the user to the 97 | copies of the GNU GPL and this license document. 98 | 99 | d) Do one of the following: 100 | 101 | 0) Convey the Minimal Corresponding Source under the terms of this 102 | License, and the Corresponding Application Code in a form 103 | suitable for, and under terms that permit, the user to 104 | recombine or relink the Application with a modified version of 105 | the Linked Version to produce a modified Combined Work, in the 106 | manner specified by section 6 of the GNU GPL for conveying 107 | Corresponding Source. 108 | 109 | 1) Use a suitable shared library mechanism for linking with the 110 | Library. A suitable mechanism is one that (a) uses at run time 111 | a copy of the Library already present on the user's computer 112 | system, and (b) will operate properly with a modified version 113 | of the Library that is interface-compatible with the Linked 114 | Version. 115 | 116 | e) Provide Installation Information, but only if you would otherwise 117 | be required to provide such information under section 6 of the 118 | GNU GPL, and only to the extent that such information is 119 | necessary to install and execute a modified version of the 120 | Combined Work produced by recombining or relinking the 121 | Application with a modified version of the Linked Version. (If 122 | you use option 4d0, the Installation Information must accompany 123 | the Minimal Corresponding Source and Corresponding Application 124 | Code. If you use option 4d1, you must provide the Installation 125 | Information in the manner specified by section 6 of the GNU GPL 126 | for conveying Corresponding Source.) 127 | 128 | 5. Combined Libraries. 129 | 130 | You may place library facilities that are a work based on the 131 | Library side by side in a single library together with other library 132 | facilities that are not Applications and are not covered by this 133 | License, and convey such a combined library under terms of your 134 | choice, if you do both of the following: 135 | 136 | a) Accompany the combined library with a copy of the same work based 137 | on the Library, uncombined with any other library facilities, 138 | conveyed under the terms of this License. 139 | 140 | b) Give prominent notice with the combined library that part of it 141 | is a work based on the Library, and explaining where to find the 142 | accompanying uncombined form of the same work. 143 | 144 | 6. Revised Versions of the GNU Lesser General Public License. 145 | 146 | The Free Software Foundation may publish revised and/or new versions 147 | of the GNU Lesser General Public License from time to time. Such new 148 | versions will be similar in spirit to the present version, but may 149 | differ in detail to address new problems or concerns. 150 | 151 | Each version is given a distinguishing version number. If the 152 | Library as you received it specifies that a certain numbered version 153 | of the GNU Lesser General Public License "or any later version" 154 | applies to it, you have the option of following the terms and 155 | conditions either of that published version or of any later version 156 | published by the Free Software Foundation. If the Library as you 157 | received it does not specify a version number of the GNU Lesser 158 | General Public License, you may choose any version of the GNU Lesser 159 | General Public License ever published by the Free Software Foundation. 160 | 161 | If the Library as you received it specifies that a proxy can decide 162 | whether future versions of the GNU Lesser General Public License shall 163 | apply, that proxy's public statement of acceptance of any version is 164 | permanent authorization for you to choose that version for the 165 | Library. 166 | 167 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # remove-web-limits(网页限制解除) 2 | 通杀大部分网站,可以解除禁止复制、剪切、选择文本、右键菜单的限制。 3 | 4 | # 暂停维护 5 | 本人上班比较忙没时间维护,遇到 bug 之类的可以考虑更换这个脚本:https://greasyfork.org/scripts/28497 6 | 7 | # 脚本安装地址: 8 | 1. [项目主页](https://cat7373.github.io/remove-web-limits/) 9 | 2. [GreasyFork](https://greasyfork.org/scripts/14146) 10 | 11 | # 说明: 12 | * 基本不影响网页正常功能,如果影响了任何功能,可以暂时禁用脚本解决。 13 | 14 | # 手动安装步骤: 15 | 1. 安装扩展程序 16 | * Chrome 浏览器需要安装 [TamperMonkey](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo) 扩展程序。 17 | * Firefox 浏览器需要安装 [GreaseMonkey](https://addons.mozilla.org/zh-CN/firefox/addon/greasemonkey/) 附加组件。 18 | * Opera 浏览器需要安装 [TamperMonkey Beta](https://addons.opera.com/zh-cn/extensions/details/tampermonkey-beta/) 扩展。 19 | * Safari 浏览器需要安装 [TamperMonkey](http://tampermonkey.net/index.php?ext=dhdg&browser=safari) 扩展。 20 | 2. [点击这里安装脚本](https://cat7373.github.io/remove-web-limits/remove_web_limits.user.js). 21 | -------------------------------------------------------------------------------- /img/logo/chrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cat7373/remove-web-limits/71a564a7ea0c6a4b4d58bf9b166703ac2e3d0b26/img/logo/chrome.png -------------------------------------------------------------------------------- /img/logo/firefox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cat7373/remove-web-limits/71a564a7ea0c6a4b4d58bf9b166703ac2e3d0b26/img/logo/firefox.png -------------------------------------------------------------------------------- /img/logo/opera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cat7373/remove-web-limits/71a564a7ea0c6a4b4d58bf9b166703ac2e3d0b26/img/logo/opera.png -------------------------------------------------------------------------------- /img/logo/safari.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cat7373/remove-web-limits/71a564a7ea0c6a4b4d58bf9b166703ac2e3d0b26/img/logo/safari.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 网页限制解除 7 | 8 | 9 | 10 | 11 |
12 |
13 |
14 |

网页限制解除

15 |

解除一些网站的禁止 选择、复制、右键 等限制

16 | 安装脚本 17 |
18 | 报告问题  19 | 协助开发
20 | Gitub:  21 | Fork  22 | Star 23 |
24 |
25 | 26 |

安装脚本

27 |
28 |
29 | Chrome 浏览器 30 |
31 | Chrome 浏览器需要安装 TamperMonkey 扩展程序 来运行用户脚本。
32 | 如果您已经安装了上述扩展程序,您可以点此安装脚本,并根据扩展程序的提示确认安装。 33 |
34 |
35 | 36 |
37 | Firefox 浏览器 38 |
39 | Firefox 浏览器需要安装 GreaseMonkey 附加组件 来运行用户脚本。
40 | 如果您已经安装了上述附加组件,您可以点此安装脚本,并根据附加组件的提示确认安装。 41 |
42 |
43 | 44 |
45 | Opera 浏览器 46 |
47 | Opera 浏览器需要安装 TamperMonkey Beta 扩展 来运行用户脚本。
48 | 如果您已经安装了上述扩展,您可以点此安装脚本,并根据扩展的提示确认安装。 49 |
50 |
51 | 52 |
53 | Safari 浏览器 54 |
55 | Safari 浏览器需要安装 TamperMonkey 扩展 来运行用户脚本。
56 | 如果您已经安装了上述扩展,您可以点此安装脚本,并根据扩展的提示确认安装。 57 |
58 |
59 |
60 |
61 | 62 | 63 | -------------------------------------------------------------------------------- /remove_web_limits.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @namespace https://www.github.com/Cat7373/ 3 | 4 | // @name 网页限制解除 5 | // @name:en Remove web limits 6 | // @name:zh 网页限制解除 7 | // @name:zh-CN 网页限制解除 8 | // @name:zh-TW 網頁限制解除 9 | // @name:ja ウェブの規制緩和 10 | 11 | // @description 通杀大部分网站,可以解除禁止复制、剪切、选择文本、右键菜单的限制。 12 | // @description:en Pass to kill most of the site, you can lift the restrictions prohibited to copy, cut, select the text, right-click menu. 13 | // @description:zh 通杀大部分网站,可以解除禁止复制、剪切、选择文本、右键菜单的限制。 14 | // @description:zh-CN 通杀大部分网站,可以解除禁止复制、剪切、选择文本、右键菜单的限制。 15 | // @description:zh-TW 通殺大部分網站,可以解除禁止復制、剪切、選擇文本、右鍵菜單的限制。 16 | // @description:ja サイトのほとんどを殺すために渡し、あなたは、コピー切り取り、テキスト、右クリックメニューを選択することは禁止の制限を解除することができます。 17 | 18 | // @homepageURL https://cat7373.github.io/remove-web-limits/ 19 | // @supportURL https://github.com/Cat7373/remove-web-limits/issues/ 20 | // @updateURL https://cat7373.github.io/remove-web-limits/remove_web_limits.user.js 21 | 22 | // @author Cat73 23 | // @version 1.3 24 | // @license LGPLv3 25 | 26 | // @compatible chrome Chrome_46.0.2490.86 + TamperMonkey + 脚本_1.3 测试通过 27 | // @compatible firefox Firefox_42.0 + GreaseMonkey + 脚本_1.2.1 测试通过 28 | // @compatible opera Opera_33.0.1990.115 + TamperMonkey + 脚本_1.1.3 测试通过 29 | // @compatible safari 未测试 30 | 31 | // @match *://*/* 32 | // @grant none 33 | // @run-at document-start 34 | // ==/UserScript== 35 | (function() { 36 | 'use strict'; 37 | 38 | // 域名规则列表 39 | var rules = { 40 | black_rule: { 41 | name: "black", 42 | hook_eventNames: "", 43 | unhook_eventNames: "" 44 | }, 45 | default_rule: { 46 | name: "default", 47 | hook_eventNames: "contextmenu|select|selectstart|copy|cut|dragstart", 48 | unhook_eventNames: "mousedown|mouseup|keydown|keyup", 49 | dom0: true, 50 | hook_addEventListener: true, 51 | hook_preventDefault: true, 52 | hook_set_returnValue: true, 53 | add_css: true 54 | } 55 | }; 56 | // 域名列表 57 | var lists = { 58 | // 黑名单 59 | black_list: [ 60 | /.*\.youtube\.com.*/, 61 | /.*\.wikipedia\.org.*/, 62 | /mail\.qq\.com.*/, 63 | /translate\.google\..*/ 64 | ] 65 | }; 66 | 67 | // 要处理的 event 列表 68 | var hook_eventNames, unhook_eventNames, eventNames; 69 | // 储存名称 70 | var storageName = getRandStr('qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM', parseInt(Math.random() * 12 + 8)); 71 | // 储存被 Hook 的函数 72 | var EventTarget_addEventListener = EventTarget.prototype.addEventListener; 73 | var document_addEventListener = document.addEventListener; 74 | var Event_preventDefault = Event.prototype.preventDefault; 75 | 76 | // Hook addEventListener proc 77 | function addEventListener(type, func, useCapture) { 78 | var _addEventListener = this === document ? document_addEventListener : EventTarget_addEventListener; 79 | if(hook_eventNames.indexOf(type) >= 0) { 80 | _addEventListener.apply(this, [type, returnTrue, useCapture]); 81 | } else if(this && unhook_eventNames.indexOf(type) >= 0) { 82 | var funcsName = storageName + type + (useCapture ? 't' : 'f'); 83 | 84 | if(this[funcsName] === undefined) { 85 | this[funcsName] = []; 86 | _addEventListener.apply(this, [type, useCapture ? unhook_t : unhook_f, useCapture]); 87 | } 88 | 89 | this[funcsName].push(func); 90 | } else { 91 | _addEventListener.apply(this, arguments); 92 | } 93 | } 94 | 95 | // 清理循环 96 | function clearLoop() { 97 | var elements = getElements(); 98 | 99 | for(var i in elements) { 100 | for(var j in eventNames) { 101 | var name = 'on' + eventNames[j]; 102 | if(elements[i][name] !== null && elements[i][name] !== onxxx) { 103 | if(unhook_eventNames.indexOf(eventNames[j]) >= 0) { 104 | elements[i][storageName + name] = elements[i][name]; 105 | elements[i][name] = onxxx; 106 | } else { 107 | elements[i][name] = null; 108 | } 109 | } 110 | } 111 | } 112 | } 113 | 114 | // 返回true的函数 115 | function returnTrue(e) { 116 | return true; 117 | } 118 | function unhook_t(e) { 119 | return unhook(e, this, storageName + e.type + 't'); 120 | } 121 | function unhook_f(e) { 122 | return unhook(e, this, storageName + e.type + 'f'); 123 | } 124 | function unhook(e, self, funcsName) { 125 | var list = self[funcsName]; 126 | for(var i in list) { 127 | list[i](e); 128 | } 129 | 130 | e.returnValue = true; 131 | return true; 132 | } 133 | function onxxx(e) { 134 | var name = storageName + 'on' + e.type; 135 | this[name](e); 136 | 137 | e.returnValue = true; 138 | return true; 139 | } 140 | 141 | // 获取随机字符串 142 | function getRandStr(chs, len) { 143 | var str = ''; 144 | 145 | while(len--) { 146 | str += chs[parseInt(Math.random() * chs.length)]; 147 | } 148 | 149 | return str; 150 | } 151 | 152 | // 获取所有元素 包括document 153 | function getElements() { 154 | var elements = Array.prototype.slice.call(document.getElementsByTagName('*')); 155 | elements.push(document); 156 | 157 | return elements; 158 | } 159 | 160 | // 添加css 161 | function addStyle(css) { 162 | var style = document.createElement('style'); 163 | style.innerHTML = css; 164 | document.head.appendChild(style); 165 | } 166 | 167 | // 获取目标域名应该使用的规则 168 | function getRule(url) { 169 | function testUrl(list, url) { 170 | for(var i in list) { 171 | if(list[i].test(url)) { 172 | return true; 173 | } 174 | } 175 | 176 | return false; 177 | } 178 | 179 | if(testUrl(lists.black_list, url)) { 180 | return rules.black_rule; 181 | } 182 | 183 | return rules.default_rule; 184 | } 185 | 186 | // 初始化 187 | function init() { 188 | // 获取当前域名的规则 189 | var url = window.location.host + window.location.pathname; 190 | var rule = getRule(url); 191 | 192 | // 设置 event 列表 193 | hook_eventNames = rule.hook_eventNames.split("|"); 194 | // TODO Allowed to return value 195 | unhook_eventNames = rule.unhook_eventNames.split("|"); 196 | eventNames = hook_eventNames.concat(unhook_eventNames); 197 | 198 | // 调用清理 DOM0 event 方法的循环 199 | if(rule.dom0) { 200 | setInterval(clearLoop, 30 * 1000); 201 | setTimeout(clearLoop, 2500); 202 | window.addEventListener('load', clearLoop, true); 203 | clearLoop(); 204 | } 205 | 206 | // hook addEventListener 207 | if(rule.hook_addEventListener) { 208 | EventTarget.prototype.addEventListener = addEventListener; 209 | document.addEventListener = addEventListener; 210 | } 211 | 212 | // hook preventDefault 213 | if(rule.hook_preventDefault) { 214 | Event.prototype.preventDefault = function() { 215 | if(eventNames.indexOf(this.type) < 0) { 216 | Event_preventDefault.apply(this, arguments); 217 | } 218 | }; 219 | } 220 | 221 | // Hook set returnValue 222 | if(rule.hook_set_returnValue) { 223 | Event.prototype.__defineSetter__('returnValue', function() { 224 | if(this.returnValue !== true && eventNames.indexOf(this.type) >= 0) { 225 | this.returnValue = true; 226 | } 227 | }); 228 | } 229 | 230 | console.debug('url: ' + url, 'storageName:' + storageName, 'rule: ' + rule.name); 231 | 232 | // 添加CSS 233 | if(rule.add_css) { 234 | addStyle('html, * {-webkit-user-select:text!important; -moz-user-select:text!important; user-select:text!important; -ms-user-select:text!important; -khtml-user-select:text!important;}'); 235 | } 236 | } 237 | 238 | init(); 239 | })(); -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | line-height: 24px; 3 | margin: 0; 4 | padding: 0; 5 | } 6 | 7 | body { 8 | background: #eef2f5; 9 | padding-bottom: 40px; 10 | } 11 | 12 | #main-body { 13 | width: 960px; 14 | margin: 0 auto; 15 | } 16 | 17 | h1, h2, h3, h4, h5, h6 { 18 | margin: 0; 19 | padding: 0; 20 | font-size: 100%; 21 | font-weight: normal; 22 | } 23 | 24 | a, a:hover, a:active, a:visited { 25 | text-decoration: none; 26 | color: #026b76; 27 | outline: none; 28 | } 29 | 30 | a img { 31 | border: none; 32 | } 33 | 34 | #background { 35 | width: 100%; 36 | height: 400px; 37 | margin-bottom: -400px; 38 | background: #037ad8; 39 | } 40 | 41 | header, h3 { 42 | font-family: "Microsoft YaHei", Helvetica,Arial, sans-serif; 43 | font-size: 16px; 44 | font-weight: normal; 45 | display: block; 46 | } 47 | 48 | header { 49 | height: 400px; 50 | width: 100%; 51 | } 52 | 53 | header ::selection { 54 | background: white; 55 | color: #037ad8; 56 | } 57 | 58 | h1 { 59 | color: #ffffff; 60 | font-size: 48px; 61 | line-height: 60px; 62 | margin: 0; 63 | padding: 120px 100px 0; 64 | font-weight: bold; 65 | } 66 | 67 | h2 { 68 | line-height: 30px; 69 | font-size: 24px; 70 | margin: 40px 0 0 100px; 71 | font-weight: bold; 72 | color: #ffffff; 73 | font-weight: normal; 74 | } 75 | 76 | #install { 77 | background: #80c3f7; 78 | border: 1px solid #1d80cf; 79 | border-radius: 5px; 80 | box-shadow: 0 1px 0 rgba(255, 255, 255, 0.3) inset, 0 1px 1px rgba(50, 50, 50, 0.05); 81 | color: #fff; 82 | cursor: pointer; 83 | display: block; 84 | font-size: 28px; 85 | line-height: 58px; 86 | outline: 0 none; 87 | padding: 0 15px; 88 | text-align: center; 89 | text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); 90 | width: 300px; 91 | margin: -130px 100px 0; 92 | float: right; 93 | } 94 | 95 | #install:active { 96 | border: 1px solid #0971c5; 97 | box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset, 0 1px 0 rgba(255, 255, 255, 0.1); 98 | color: #eee; 99 | } 100 | 101 | #report { 102 | float: right; 103 | width: 400px; 104 | height: 70px; 105 | padding: 0; 106 | display: block; 107 | font-size: 16px; 108 | text-align: right; 109 | margin: 0 100px; 110 | color: #ffffff; 111 | } 112 | 113 | #report a { 114 | color: #fff; 115 | } 116 | 117 | h3 { 118 | font-size: 24px; 119 | font-weight: bold; 120 | border-bottom: 2px #ccc solid; 121 | padding: 10px 20px 10px 10px; 122 | margin: 20px 0 10px; 123 | color: #333; 124 | } 125 | 126 | #browsers { 127 | font-size: 18px; 128 | line-height: 150%;float: right; 129 | clear: right; 130 | width: 54%; 131 | padding: 40px 0; 132 | } 133 | 134 | #browsers { 135 | padding: 0; 136 | width: 100%; 137 | } 138 | 139 | .browser > div > a, .browser > div > span > a { 140 | font-weight: bold; 141 | } 142 | 143 | .browser { 144 | margin: 10px 20px 30px 0; 145 | padding: 0 0 0 96px; 146 | } 147 | 148 | .browser .browser-icon { 149 | display: block; 150 | width: 64px; 151 | height: 64px; 152 | margin: 0 0 -64px -80px; 153 | } 154 | 155 | .needfill, .notfill { 156 | display: none; 157 | } 158 | --------------------------------------------------------------------------------