看得见的和看不见的

课堂回顾:
经济学是一门研究比较和选择的学问。一个人聪明有很多种,记忆力好、想象力丰富、模仿能力强等等都是聪明,但是有一种非常重要、不可或缺的聪明,那就是在关键时刻能够做出正确的选择。

要做出正确选择,你首先得把要比较的东西拿出来,放在天秤两边去对比。经济学则教你,在比较的时候不仅要看见那些看得见的东西,同时也要看见那些看不见的东西。

在北大教经济学,每当教入门课的时候,我给学生推荐的第一篇文章,总是法国经济学家巴斯夏( Frédéric Bastiat ,1801-1850 )100多年前写的一篇文章《看得见的和看不见的( What Is Seen and What Is Not Seen,1848 )》,这也是巴斯夏去世前写的最后一篇文章。

我们知道经济学家分很多种,有分学界的,有分业界的;有做宏观的,有做微观的;有奥地利学派,有凯恩斯学派,有芝加哥学派,还有各种各样的学派。但还有一种分法,就是好的经济学家和坏的经济学家。

巴斯夏在他的文章开头,就斩钉截铁地说,好经济学家和坏经济学家的区别只有一个,那就是坏的经济学家仅仅能看到那些可以看见的后果,而好的经济学家却能同时考虑那些可以看得见的后果,以及那些只能通过推测看得到的后果。

也可以说,这是一个人有没有接受好的经济学训练的重要的标志。
1.破窗理论的故事

我们都听说过破窗理论的故事。它说的是,一个顽童把窗户打破了,这时候窗户的主人,就要去买窗户,这将刺激窗户的生产。制造窗户的工人接到订单,有了钱以后,他可以去买面包。面包工人又可以去买衣服。这样就推动了一连串的生产。所以破窗理论的支持者说,有破坏才有进步,破坏本身是好的。

这种思维在社会中非常常见。每一次社会经历灾难,每当有飓风、地震、海啸,总会有那么一些经济学者走出来,说这个灾难虽然造成很大的伤害,但它又为下一轮就业和GDP增长带来了机会。

这种说法真的有道理吗?多难真的能够兴邦吗?如果多难能够兴邦的话,那些避免了灾难的国家,岂不是吃亏了?

2.破窗理论变种之一:国家发展

这种破窗理论有一个变种,它说的是有些国家走了很大弯路,做了一些很错的事情,但回过头来看,幸好做了这些错事,这个国家后来才发展了。他们举例说,德国经历了二战,日本挨了几个原子弹,所以后来发展得很快。

一个事情发生在前,另外一个事情发生在后,我们当然不能假定,如果这个国家没有前面的话,后面会怎么样。但是,我们可以问一个问题,如果其他国家也想像德国、日本那样有高速发展的经济,那它们是不是也得像德国那样,先被二战摧残一遍,像日本那样,先挨几个原子弹?显然不是。

其实这两个国家如果不遭遇那些创伤,资本的积累会更丰富,经济基础会更好。同样的道理,刚才那个破窗的故事,如果窗户没有被打破的话,这户主人所拥有的资源,其实可以拿来做其他生产,可以带来更多的财富。这是我们不容易看见的。

3.破窗理论变种之二:工人就业

破窗理论还有一种变种,是关于工作机会的。这种说法说,老人不早点退休,不把职位让出来,年轻人就不会有工作。同样的,他们说机器会替代工人,如果机器太好的话,工人就没有工作做。所以,机器太先进、老人工作时间太长,对社会发展也不是好事。

让我们倒过来想想。我们的社会本来是有推土机的,现在不用推土机,我们改用勺子挖土了,这样的话,我们的社会是会变得更富裕,还是更贫困呢?如果我们所有的人,都提前20年退休,那整个社会是会变得更富裕,还是变得更贫困呢?
4.认识破窗谬误的难点

前面讲的各种破窗理论的变种,它共同的错误,就在于只看到由于自然灾害、人为破坏、人的衰老、工具落后——那些本身我们要应付问题所造就的就业机会。

如果我们避免了自然灾害、人为破坏,如果人能生活得更健康,如果机器更先进的话,那么省下来的时间、资源和劳动力,本来可以用在生产其他更有效的东西上面,那样我们的生活会更加富足。

问题在于,我们眼睛能够看见的,是那些已经存在的工作,而那些能省下来的人力、时间和资源能放到什么新的工作和生产上,这一点经济学家也说不清楚,只能靠想象。认识破窗谬误的难点就在这。这是一个通过推理,我们明确知道肯定存在的东西,但是谁都说不清楚它在哪。
5.看见看不见的东西要靠想象力

巴斯夏还曾经用反讽的方式写过一篇文章《蜡烛制造商关于禁止太阳光线的陈情书(The Candlemaker’ s Petition,1845 )》。这文章说,阳光照射在地球上以后,蜡烛工人的工作减少了,所以蜡烛商希望国会议员阻止大家使用阳光。

确实如此,如果大家都尽量采用阳光,蜡烛工人的工作是会减少。但实际上,有了阳光以后,蜡烛工人不会永远失业,不会永远找不到工作,蜡烛工人可以做别的工作,问题是别的工作是什么呢?没有人能够说出来,这得靠想象。

马车跟汽车之间的替代也是一样的。有了汽车,马车夫就要失业了。经济学家会说,我看得见那些看不见的东西,我预测马车夫最后能找到工作,问题是新的工作是什么呢?没人知道,只能想象。

巴斯夏还问,国家应不应该补贴高雅艺术,很多人都会说当然应该。但巴斯夏回答说,当国家用纳税人的钱去补贴高雅艺术的时候,那些钱就不能用到别的地方去了,就肯定有人在别的地方受损了。

我们要比较的,不仅仅是那些高雅艺术本身,我们不仅要看到那些高雅艺术带来的效应,还要看到那些丧失了的效应。至于那些丧失的效应到底是什么,我们也说不出来,而只能依靠推测。去看到那些看不见的东西,是需要通过经济学来寻找的一种眼光。

6.做决策时要充分考虑看不见的东西

芝加哥大学的史蒂芬·列维特( Steven Levitt 1967- )写过一本名著《魔鬼经济学( Freakonomics ,2005 )》,这本书在罗胖这也卖得相当好,这书里面有个例子:

今天有很多环保主义者,都反对我们用大量的塑料袋来包食物,因为这会造成很大的浪费。但这位经济学家说,塑料袋用得越多,那么食物保鲜的时间就越长,食物的浪费就越小。我们要看到的,不仅仅是用了多少塑料袋,还要看到,如果不用塑料袋的话,你要扔掉多少食物。你到底想要多扔一点塑料袋,还是多扔一点食物呢?你得做个比较。

当然,有必要专门澄清一下,我并不是说凡是看不见的都比看得见的重要。我只是说,每当我们做决策的时候,还要充分考虑那些暂时还看不见的,甚至是永远也看不见的因素。

课堂小结

经济学关心的一个最核心问题是比较和选择。而要做好比较和选择,一个重要前提,就是不仅要看见那些看得见的东西,还要尽量去看见那些不容易看见的东西,那些需要通过推测才能看得见的东西。

课后思考

请你举出一个例子,有什么东西,是我们看不见,但实际上又非常重要,在我们做决策时不容忽视的。

欢迎你给我留言,咱们下次课见。

<think>好的,我现在需要解决用户的问题:如何让元素不可见但仍然可以点击。用户提到了使用CSS或JavaScript的解决方案。首先,我得回忆一下常见的隐藏元素的方法,然后分析哪些方法在隐藏后仍然保留元素的点击事件。 首先,常见的隐藏方式包括设置`display: none`、`visibility: hidden`、`opacity: 0`,或者使用定位将元素移到可视区域外。其中,`display: none`会完全从文档流中移除元素,导致元素不可见且不占据空间,同时元素的事件监听也会失效,所以这个方法不行。`visibility: hidden`会让元素不可见,但占据空间,不过同样,大多数情况下点击事件不会被触发,因为元素被隐藏了。`opacity: 0`则是将元素变为完全透明,但元素仍然存在于布局中,理论上应该可以触发事件,但可能需要检查是否有其他因素影响,比如父元素的遮挡或者事件是否被正确绑定。 另外,使用`clip-path`或者`clip`属性来裁剪元素,使其不可见,但元素本身仍然存在。例如,`clip: rect(0 0 0 0)`可以将元素裁剪到不可见,同时保持位置,但这种方法可能过时了,现在更推荐使用`clip-path`。但需要测试这些方法是否会影响点击事件。 还有一种方法是将元素的位置移到屏幕外,比如设置`position: absolute; left: -9999px;`,这样元素在视口外不可见,但可能仍然可以被点击,不过实际效果可能因浏览器的处理方式而异,特别是触摸设备上可能无法点击。 接下来,我需要验证这些方法的可行性。首先,`opacity: 0`结合`pointer-events: auto`可能有效,因为`opacity`不影响元素的事件,但需要确保元素没有被其他样式覆盖。不过,当父元素有`opacity: 0`时,子元素可能也会受到影响,但单独设置元素为透明应该没问题。 另外,使用CSS的`visibility: hidden`时,元素的事件默认不会被触发,但有没有办法覆盖这个行为?可能需要结合其他属性,比如设置`pointer-events: auto`,但可能不起作用,因为`visibility: hidden`本身会禁用事件。因此,可能需要避免使用`visibility: hidden`。 然后,JavaScript的解决方案可能是在隐藏元素的同时,通过事件委托或者调整事件监听的方式,让父元素代理点击事件。例如,将事件监听器绑定到父元素,然后通过判断事件目标来触发对应的操作。或者,使用透明的覆盖层,覆盖在可见元素上方,但这样可能需要调整布局结构。 例如,可以创建一个透明的div覆盖在某个区域,当用户点击该区域时,触发隐藏元素的事件。或者,将隐藏元素设置为透明,但位于其他元素的上方,通过z-index调整层级,确保它可以被点击。 还需要考虑兼容性问题,比如旧版IE是否支持某些CSS属性,但用户之前的引用提到了IE7、8的问题,可能需要提供兼容性更好的方案,比如使用定位移出屏幕的方法,或者在JavaScript中进行处理。 总结可能的解决方案: 1. **CSS透明+保留事件**:设置`opacity: 0``pointer-events: auto`,确保元素透明但可点击。需要注意父容器的overflow设置是否允许点击区域可见,以及元素是否被其他元素遮挡。 2. **移出视口**:使用绝对定位将元素移到屏幕外,如`left: -9999px`,这样元素不可见但可能仍可点击,但可能影响可访问性布局。 3. **覆盖透明层**:创建一个透明的覆盖层,覆盖在需要点击的区域,通过JavaScript监听该层的点击事件,然后触发隐藏元素的操作。 4. **事件委托**:在父元素上监听点击事件,通过事件冒泡来判断是否点击了隐藏元素的位置,从而触发相应的处理函数。 5. **使用clip-path或裁剪**:将元素裁剪到不可见区域,但保持其存在,可能保留点击事件。 接下来,需要测试这些方法的实际效果,并考虑兼容性可访问性。例如,`pointer-events`属性在IE中的支持情况,IE11部分支持,更早版本可能不支持。所以如果需要支持旧版IE,可能需要使用JavaScript方法,比如事件委托或者移出视口的方式。 另外,使用`opacity: 0`时,元素虽然不可见,但仍然占据布局空间,可能会影响页面结构,而移出视口的方法则不会占据视觉空间,但可能会影响屏幕阅读器等辅助技术的访问。 用户的问题中提到元素不可见但可点击,可能需要根据具体情况选择最合适的方法。如果兼容性不是问题,现代浏览器中推荐使用`opacity: 0`加上`pointer-events: auto`,或者使用透明度并结合正确的事件处理。 在JavaScript方面,可以动态地隐藏元素并处理事件。例如,设置元素的样式为隐藏,但通过JavaScript在父元素或另一个元素上监听事件,然后模拟触发隐藏元素的事件。 例如,隐藏一个按钮,然后在某个可见元素上绑定点击事件,触发隐藏按钮的点击处理。但这可能不符合用户希望元素本身仍可点击的需求,而是通过代理实现。 或者,使用`visibility: hidden`但结合`pointer-events: auto`,但根据测试,`visibility: hidden`的元素即使设置了`pointer-events: auto`,仍然无法接收事件。因此,这种方法可能无效。 所以,可行的CSS方案是: - `opacity: 0; pointer-events: auto;`:元素透明,可点击。 - `position: absolute; clip: rect(0 0 0 0);`:裁剪元素,但保留位置,可能可点击,但需要测试。 - 使用`width: 0; height: 0; overflow: hidden;`,但这样元素尺寸为零,可能无法点击,除非子元素有尺寸,但不可见。 或者,设置`visibility: hidden`但结合其他方法,但可能无效。 所以,最佳方案可能是使用`opacity: 0``pointer-events: auto`,并确保元素的位置尺寸正确,不被其他元素遮挡。 在JavaScript方案中,可以考虑事件委托,或者将元素透明度设为0,但保留其事件监听。 最后,给出具体的代码示例,并说明注意事项,比如兼容性、布局影响等。</think>### 元素不可见但仍可点击的解决方案 要实现元素不可见但保留点击功能,可通过以下方法实现: --- #### **方法1:CSS透明度+事件保留** 设置元素的透明度为0,并通过`pointer-events: auto`确保事件可触发。 ```css .invisible-clickable { opacity: 0; pointer-events: auto; /* 确保点击事件有效 */ cursor: pointer; /* 可选:显示指针光标 */ } ``` **注意**: - 元素仍占据布局空间,可能影响页面结构[^3]。 - 兼容性:`pointer-events`在IE11+支持,低版本需替代方案[^1]。 --- #### **方法2:移出视口(屏幕外隐藏)** 通过绝对定位将元素移到屏幕外,保留事件响应。 ```css .offscreen-clickable { position: absolute; left: -9999px; top: -9999px; /* 元素不可见但DOM存在 */ } ``` **注意**: - 元素不占据可视区域空间,但可能影响屏幕阅读器识别。 - 适用于无需视觉交互的场景。 --- #### **方法3:透明覆盖层代理事件** 创建一个透明层覆盖在目标区域,通过JavaScript代理点击事件。 ```html <div class="overlay" onclick="handleClick()"></div> ``` ```css .overlay { position: absolute; width: 100px; height: 40px; opacity: 0; z-index: 100; /* 确保层级在顶部 */ } ``` --- #### **方法4:事件委托(推荐兼容方案)** 通过父元素监听事件,判断目标位置触发操作。 ```javascript document.getElementById("parent").addEventListener("click", function(e) { if (e.target.dataset.invisible === "true") { // 触发隐藏元素的逻辑 } }); ``` --- ### **注意事项** 1. **可访问性**:隐藏元素可能导致屏幕阅读器无法识别,需配合ARIA标签[^3]。 2. **兼容性**:低版本IE推荐使用移出视口或事件委托[^1]。 3. **布局影响**:`opacity: 0`会保留元素空间,需根据场景选择方法。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值