Use the clip
property to crop the borders and the arrow of the select
element, then add your own replacement styles to the wrapper:
<!DOCTYPE html>_x000D_
<html>_x000D_
<head>_x000D_
<style>_x000D_
select { position: absolute; clip:rect(2px 49px 19px 2px); z-index:2; }_x000D_
body > span { display:block; position: relative; width: 64px; height: 21px; border: 2px solid green; background: url(http://www.stackoverflow.com/favicon.ico) right 1px no-repeat; }_x000D_
</style>_x000D_
</head>_x000D_
<span>_x000D_
<select>_x000D_
<option value="">Alpha</option>_x000D_
<option value="">Beta</option>_x000D_
<option value="">Charlie</option>_x000D_
</select>_x000D_
</span>_x000D_
</html>
_x000D_
Use a second select with zero opacity to make the button clickable:
<!DOCTYPE html>_x000D_
<html>_x000D_
<head>_x000D_
<style>_x000D_
#real { position: absolute; clip:rect(2px 51px 19px 2px); z-index:2; }_x000D_
#fake { position: absolute; opacity: 0; }_x000D_
_x000D_
body > span { display:block; position: relative; width: 64px; height: 21px; background: url(http://www.stackoverflow.com/favicon.ico) right 1px no-repeat; }_x000D_
</style>_x000D_
</head>_x000D_
<span>_x000D_
<select id="real">_x000D_
<option value="">Alpha</option>_x000D_
<option value="">Beta</option>_x000D_
<option value="">Charlie</option>_x000D_
</select>_x000D_
<select id="fake">_x000D_
<option value="">Alpha</option>_x000D_
<option value="">Beta</option>_x000D_
<option value="">Charlie</option>_x000D_
</select>_x000D_
</span>_x000D_
</html>
_x000D_
Coordinates differ between Webkit and other browsers, but a @media query can cover that.
References