Many themes come with a dropdown as the default size selector. Here’s how to change this to, for example, a list of buttons, similar to a color swatch. In this example I’m using Shopify’s Venture theme, but it should be similar for most other themes.

In the product-template.liquid file in the sections folder search for the code beginning with:

 {% unless product.has_only_default_variant %}

and ending with :

{% endunless %}

and replaace everything between with this code:

 {% unless product.has_only_default_variant %}
            {% for option in product.options_with_values %}

              <div class="selector-wrapper js product-form__item">

                {% if option.name == "Size" %}
                <label>{{ option.name }}</label>

                {% assign index = forloop.index %}

                <div class="size-swatch">
                {% for value in option.values %}

                    {% assign variant_label_state = true %}
                      {% if product.options.size == 1 %}
                      {% unless product.variants[forloop.index0].available  %}
                      {% assign variant_label_state = false %}
                      {% endunless %}
                      {% endif %}

                	<input class="single-option-selector-{{ section.id }}"
                           id="size-{{forloop.index}}"
                           type="radio"
                           name="size"
                           value="{{ value | escape }}"
                           data-index="option{{ index }}"
                           {% if option.selected_value == value %} checked="checked"{% endif %}
                           {% unless variant_label_state %} disabled="disabled"{% endunless %}
              		/>
                    <label for="size-{{forloop.index}}">{{value}}</label>

                {% endfor %}
                </div>

                {% else %}
                <!-- default selector start-->
                <label {% if option.name == 'default' %}class="label--hidden" {% endif %}for="SingleOptionSelector-{{ section.id }}-{{ forloop.index0 }}">{{ option.name }}</label>
                <select class="single-option-selector single-option-selector-{{ section.id }} product-form__input"
                  id="SingleOptionSelector-{{ forloop.index0 }}"
                  data-name="{{ option.name }}"
                  data-index="option{{ forloop.index }}">
                  {% for value in option.values %}
                    <option value="{{ value | escape }}"{% if option.selected_value == value %}
                            selected="selected"{% endif %}>{{ value }}</option>
                  {% endfor %}
                </select>
                 <!-- default selector end-->
                {% endif %}

              </div>
            {% endfor %}
          {% endunless %}

Add styling to the end of the theme.css file in the assets folder; something like this:

                  .size-swatch{
                    display: flex;

                  }
                  .size-swatch input{
                    opacity: 0;
                    width: 0;
                    height: 0;
                  }
                  .size-swatch label{
                    padding:1em;
                    max-height:44px;
                    border: 1px solid lightgray;
                    display: block;


                  }
                 .size-swatch input:disabled + label {
                   opacity: 0.35;
                   cursor: default;
                   text-decoration: line-through;
                  }

                  .size-swatch input:focus + label {
                    box-shadow: 0 0 0 0.05em #fff, 0 0 0.15em 0.1em green;
                  }