Skip to main content



QR Code generator library

一款 JavaScript QR代码生成库


This JavaScript demo application visualizes in detailed steps, how a text string is encoded into a QR Code barcode symbol. The content of this page essentially explains and justifies how my QR Code generator library works internally.


Ultrasonic payments

本文介绍超声波支付的相关技术,并用 JavaScript 实现了一个小的项目。


Why experiment with this?

With the growth in adoption of contactless payments, I wanted to look into alternatives to NFC technology. The COVID-19 pandemic made people more concerned about touching surfaces, including in stores, and even though NFC is contactless, the distance between a merchant's terminal and a customer’s phone or card is quite small. NFC technology enables communication between two electronic devices over a distance of 4 cm (1.5 inches) or less. Ultrasonic payment solutions would enable communication over a greater distance.

Moreover, this technology transmitting data through sounds also means that it does not require the devices to be connected to the internet, potentially making this more secure. To process payments, a connection would end up being needed but there could be other opportunities than payments where it would be a valid solution.

CSS 滚动阴影

使用纯 CSS 实现滚动阴影(Scroll Shadows)效果。


.scroll-shadows {
max-height: 200px;
overflow: auto;
-webkit-overflow-scrolling: touch;
overflow-scrolling: touch;

/* Shadow Cover TOP */
white 30%,
rgba(255, 255, 255, 0)
) center top,

/* Shadow Cover BOTTOM */
rgba(255, 255, 255, 0),
white 70%
) center bottom,

/* Shadow TOP */
farthest-side at 50% 0,
rgba(0, 0, 0, 0.2),
rgba(0, 0, 0, 0)
) center top,

/* Shadow BOTTOM */
farthest-side at 50% 100%,
rgba(0, 0, 0, 0.2),
rgba(0, 0, 0, 0)
) center bottom;

background-repeat: no-repeat;
background-size: 100% 40px, 100% 40px, 100% 14px, 100% 14px;
background-attachment: local, local, scroll, scroll;

How browsers work

现代 Web 浏览器的幕后故事 - 讲述浏览器是如何工作的


It's important to understand that this is a gradual process. For better user experience, the rendering engine will try to display contents on the screen as soon as possible. It will not wait until all HTML is parsed before starting to build and layout the render tree. Parts of the content will be parsed and displayed, while the process continues with the rest of the contents that keeps coming from the network.