The comma is a logical OR in selector syntax. Thus, each element will be matched with each part of your selector at a time, and if it satisfies at least one of these parts, the rule applies.
So in your case this happens:
input[type='button'] will match your selector form input:not([type='submit'])
input[type='submit'] will match your selector form input:not([type='button'])
input[type='text'] will (obviously) match both selectors
This is why your rule applies to all form inputs.
If you want to combine both negatives, concatenate them like this instead of using a comma separated list:
form input:not([type='button']):not([type='submit']) { width: 200px }
source share