Since IPv6 has such a large number of possible IPs, routers will assign a different v6 IP to each device on its network (ipv4 is NAT’d because the address space is exhausted). Try https://goo.gl/search/my+ip on two different devices on the same network and you’ll see they have different IPs except for the first 4 groups/64 bits with a /64 from your ISP, although a /56 is possible and a /48 is usually given to businesses.
Support for blocking via an entire v6 subnet is sparse because v6 isn’t widely deployed (CF is helping push this), but an example of doing it in python (with something like a django website):
# get the ipv6 64 prefix
# we actually don't know if they have
# a /64, /56, or /48 but most US residential IPs assign a /64.
b = ipaddress.ip_network('2001:0db8:85a3:0000:0000:8a2e:0370:7334')
# we now know that v6 range
# now to ban future visitors on that network
visitor_ip = '2001:0db8:85a3:0000:0000:8a2e:ffff:0001'
ipaddress.ip_address(visitor_ip) in ipaddress.IPv6Network('2001:db8:85a3::/64')
Note that getting the above done in another language may not be as easy as it is in Python.