Encryption with Web Crypto API (SubtleCrypto) I want to end-to-end encrypt items in a stateless environment. These items have an identifier (random string). Now I want to add encryption by adding a random key. The URL could be https://server.tld/item#key which users can share with each other.
I want to only use Web Crypto API (SubtleCrypto) without any additional libraries.
My idea so far:

Generate random key: window.crypto.getRandomValues() window.crypto.subtle.generateKey()
Base64 encode/decode for URI fragment: btoa()/atob()
Create key object: window.crypto.subtle.importKey()
Encrypt/Decrypt using AES-CBC: window.crypto.subtle.encrypt()

Now I need an iv. I thought about using the hash of the item identifier via window.crypto.subtle.digest(). However AES-CBC needs 16 bytes.
Is it a good idea to use the first 16 bytes of SHA-1 (20 bytes long) as IV?
Is it a good idea [from a security perspective] to use the first 16 bytes of SHA-1 (20 bytes long) as IV?

It depends.
For CBC, the main requirements is the IV are that it should be unpredictable for the attacker. In particular, you should never ever use the same IV more than once for encrypting messages under the same key.
This implies that, in your system, it should be impossible to edit or overwrite these items. If editing an item is ever possible, then deriving the IV from the item identifier is definitely a bad idea.
If you want to support the editing of items, you should always generate a (pseudo-random) IV. (I.e. it should not be predictable for an attacker.)